From 7b185799acadeaef8cb206b5d33b9f5e63c7ee52 Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:41:19 +0000 Subject: [PATCH 01/29] fix: remove unused state variable in LSP8 (#827) --- .../LSP8IdentifiableDigitalAssetCore.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol index d10720d8b..538638740 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol @@ -77,8 +77,6 @@ abstract contract LSP8IdentifiableDigitalAssetCore is // Mapping a `tokenId` to its authorized operator addresses. mapping(bytes32 => EnumerableSet.AddressSet) internal _operators; - mapping(address => EnumerableSet.Bytes32Set) internal _tokenIdsForOperator; - // --- Token queries /** From 00a3142fa90bf780e28612511e243967778492ab Mon Sep 17 00:00:00 2001 From: Felix Hildebrandt <61689369+fhildeb@users.noreply.github.com> Date: Wed, 3 Jan 2024 11:18:16 +0100 Subject: [PATCH 02/29] docs: update LSP16 description (#838) --- .../LSP16UniversalFactory/LSP16UniversalFactory.sol | 10 ++++------ .../LSP16UniversalFactory/LSP16UniversalFactory.md | 10 +++++----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol b/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol index 7c7f469ab..946724cbc 100644 --- a/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol +++ b/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol @@ -79,7 +79,7 @@ contract LSP16UniversalFactory { ); /** - * @notice Contract deployed. Salt, `providedSalt`, used. + * @notice Contract deployed. Salt, `providedSalt`, are used. * * @dev Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the {computeAddress} function. * @@ -118,7 +118,7 @@ contract LSP16UniversalFactory { } /** - * @notice Contract deployed. Salt, `providedSalt`, used. + * @notice Contract deployed. Salt, `providedSalt`, are used. * * @dev Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the {computeAddress} function. * @@ -177,7 +177,7 @@ contract LSP16UniversalFactory { } /** - * @notice Proxy deployed. Salt, `providedSalt`, used. + * @notice Proxy deployed. Salt, `providedSalt`, are used. * * @dev Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the {computeERC1167Address} function. * @@ -185,8 +185,6 @@ contract LSP16UniversalFactory { * * The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See {generateSalt} function for more details. * - * See {generateSalt} function for more details. - * * Using the same `implementationContract` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. * * Sending value to the contract created is not possible since the constructor of the ERC1167 minimal proxy is not payable. @@ -218,7 +216,7 @@ contract LSP16UniversalFactory { } /** - * @notice Proxy deployed & initialized. Salt, `providedSalt`, used. + * @notice Proxy deployed & initialized. Salt, `providedSalt`, are used. * * @dev Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed * can be known in advance via the {computeERC1167Address} function. diff --git a/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md b/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md index 2478c481f..e3da4b6a3 100644 --- a/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md +++ b/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md @@ -129,7 +129,7 @@ function deployCreate2( ) external payable returns (address); ``` -_Contract deployed. Salt, `providedSalt`, used._ +_Contract deployed. Salt, `providedSalt`, are used._ Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeAddress`](#computeaddress) function. This function deploys contracts without initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `byteCode` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. If the constructor of the contract to deploy is payable, value can be sent to this function to fund the created contract. However, sending value to this function while the constructor is not payable will result in a revert. @@ -169,7 +169,7 @@ function deployCreate2AndInitialize( ) external payable returns (address); ``` -_Contract deployed. Salt, `providedSalt`, used._ +_Contract deployed. Salt, `providedSalt`, are used._ Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeAddress`](#computeaddress) function. This function deploys contracts with initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(true, initializeCalldata, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `byteCode`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. If the constructor or the initialize function of the contract to deploy is payable, value can be sent along with the deployment/initialization to fund the created contract. However, sending value to this function while the constructor/initialize function is not payable will result in a revert. Will revert if the `msg.value` sent to the function is not equal to the sum of `constructorMsgValue` and `initializeCalldataMsgValue`. @@ -209,9 +209,9 @@ function deployERC1167Proxy( ) external nonpayable returns (address); ``` -_Proxy deployed. Salt, `providedSalt`, used._ +_Proxy deployed. Salt, `providedSalt`, are used._ -Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeERC1167Address`](#computeerc1167address) function. This function deploys contracts without initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. See [`generateSalt`](#generatesalt) function for more details. Using the same `implementationContract` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. Sending value to the contract created is not possible since the constructor of the ERC1167 minimal proxy is not payable. +Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeERC1167Address`](#computeerc1167address) function. This function deploys contracts without initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `implementationContract` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. Sending value to the contract created is not possible since the constructor of the ERC1167 minimal proxy is not payable. #### Parameters @@ -247,7 +247,7 @@ function deployERC1167ProxyAndInitialize( ) external payable returns (address); ``` -_Proxy deployed & initialized. Salt, `providedSalt`, used._ +_Proxy deployed & initialized. Salt, `providedSalt`, are used._ Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeERC1167Address`](#computeerc1167address) function. This function deploys contracts with initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(true, initializeCalldata, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `implementationContract`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. If the initialize function of the contract to deploy is payable, value can be sent along to fund the created contract while initializing. However, sending value to this function while the initialize function is not payable will result in a revert. From b947ab3d7d0fd1d502d1a08b7734afddabfd6a65 Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Tue, 9 Jan 2024 10:53:24 +0200 Subject: [PATCH 03/29] chore: add `virtual` keyword in burn() in LSP8Burnable (#835) Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- .../LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol b/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol index 678a7710b..a588ee90b 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol @@ -21,7 +21,7 @@ abstract contract LSP8Burnable is LSP8IdentifiableDigitalAsset { * @param tokenId The tokenId to burn. * @param data Any extra data to be sent alongside burning the tokenId. */ - function burn(bytes32 tokenId, bytes memory data) public { + function burn(bytes32 tokenId, bytes memory data) public virtual { if (!_isOperatorOrOwner(msg.sender, tokenId)) { revert LSP8NotTokenOperator(tokenId, msg.sender); } From 9795fed1a13e475b2428ee74ffa0d33485cd457e Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Tue, 9 Jan 2024 11:08:02 +0200 Subject: [PATCH 04/29] refactor: [L-05] tokenIds and dataKeys can have different lengths in getDataBatchForTokenIds() (#836) * refactor: add array length check for getDataBatchForTokenIds in LSP8 * test: add test for array length check for getDataBatchForTokenIds in LSP8 --------- Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- .../LSP8IdentifiableDigitalAssetCore.sol | 4 ++++ .../LSP8IdentifiableDigitalAsset.behaviour.ts | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol index 538638740..fed9ad27d 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol @@ -140,6 +140,10 @@ abstract contract LSP8IdentifiableDigitalAssetCore is bytes32[] memory tokenIds, bytes32[] memory dataKeys ) public view virtual override returns (bytes[] memory dataValues) { + if (tokenIds.length != dataKeys.length) { + revert LSP8TokenIdsDataLengthMismatch(); + } + dataValues = new bytes[](tokenIds.length); for (uint256 i; i < tokenIds.length; ) { diff --git a/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts b/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts index 95a9abc4f..56cb3dc70 100644 --- a/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts +++ b/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts @@ -188,6 +188,23 @@ export const shouldBehaveLikeLSP8 = ( }); }); + describe('when getting data for a tokenId', () => { + const tokenIdsLength3 = [tokenIdAsBytes32(42), tokenIdAsBytes32(43), tokenIdAsBytes32(44)]; + + const dataKeysLength2 = [ + ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), + ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Second Key')), + ]; + + it('should revert when providing arrays of tokenIds and data keys of different length', async () => { + await expect( + context.lsp8 + .connect(context.accounts.owner) + .getDataBatchForTokenIds(tokenIdsLength3, dataKeysLength2), + ).to.be.revertedWithCustomError(context.lsp8, 'LSP8TokenIdsDataLengthMismatch'); + }); + }); + describe('when minting tokens', () => { before(async () => { await context.lsp8.mint( From 99e9ffade6a5b51b4cf0eeea973df95d6dfe2fca Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Tue, 9 Jan 2024 14:52:06 +0200 Subject: [PATCH 05/29] docs: [L-06] revokeOperator() does not protect against the double-spending allowance attack (#834) * Advise use of increase/decrease allowance in LSP7 * docs: generate docs * docs: fix minor natspec issue --------- Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol | 9 ++------- docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md | 2 +- .../LSP7DigitalAsset/extensions/LSP7Burnable.md | 2 +- .../LSP7DigitalAsset/extensions/LSP7CappedSupply.md | 2 +- .../LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md | 2 +- .../presets/LSP7CompatibleERC20Mintable.md | 2 +- docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md | 2 +- 7 files changed, 8 insertions(+), 13 deletions(-) diff --git a/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol b/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol index 5a8ece823..99aa553aa 100644 --- a/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol +++ b/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol @@ -48,9 +48,6 @@ import { * @dev Core Implementation of a LSP7 compliant contract. * * This contract implement the core logic of the functions for the {ILSP7DigitalAsset} interface. - * - * Similar to ERC20, the non-standard {increaseAllowance} and {decreaseAllowance} functions - * have been added to mitigate the well-known issues around setting allowances. */ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { using EnumerableSet for EnumerableSet.AddressSet; @@ -143,10 +140,8 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { * @inheritdoc ILSP7DigitalAsset * * @custom:danger To avoid front-running and Allowance Double-Spend Exploit when - * increasing or decreasing the authorized amount of an operator, it is advised to: - * - * 1. either call {revokeOperator} first, and then re-call {authorizeOperator} with the new amount. - * 2. or use the non-standard functions {increaseAllowance} or {decreaseAllowance}. + * increasing or decreasing the authorized amount of an operator, it is advised to + * use the {increaseAllowance} and {decreaseAllowance} functions. * * For more information, see: * https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ diff --git a/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md b/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md index 215bc9363..691daae1a 100644 --- a/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md +++ b/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md @@ -90,7 +90,7 @@ Reverts whenever someone tries to send native tokens to a LSP7 contract. :::danger -To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to: 1. either call [`revokeOperator`](#revokeoperator) first, and then re-call [`authorizeOperator`](#authorizeoperator) with the new amount. 2. or use the non-standard functions [`increaseAllowance`](#increaseallowance) or [`decreaseAllowance`](#decreaseallowance). For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ +To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to use the [`increaseAllowance`](#increaseallowance) and [`decreaseAllowance`](#decreaseallowance) functions. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ ::: diff --git a/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md b/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md index c53234b94..ac6cbe517 100644 --- a/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md +++ b/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md @@ -88,7 +88,7 @@ Reverts whenever someone tries to send native tokens to a LSP7 contract. :::danger -To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to: 1. either call [`revokeOperator`](#revokeoperator) first, and then re-call [`authorizeOperator`](#authorizeoperator) with the new amount. 2. or use the non-standard functions [`increaseAllowance`](#increaseallowance) or [`decreaseAllowance`](#decreaseallowance). For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ +To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to use the [`increaseAllowance`](#increaseallowance) and [`decreaseAllowance`](#decreaseallowance) functions. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ ::: diff --git a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md b/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md index 16a39f574..9d9823443 100644 --- a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md +++ b/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md @@ -88,7 +88,7 @@ Reverts whenever someone tries to send native tokens to a LSP7 contract. :::danger -To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to: 1. either call [`revokeOperator`](#revokeoperator) first, and then re-call [`authorizeOperator`](#authorizeoperator) with the new amount. 2. or use the non-standard functions [`increaseAllowance`](#increaseallowance) or [`decreaseAllowance`](#decreaseallowance). For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ +To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to use the [`increaseAllowance`](#increaseallowance) and [`decreaseAllowance`](#decreaseallowance) functions. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ ::: diff --git a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md b/docs/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md index 0e36d9b66..c19ca619d 100644 --- a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md +++ b/docs/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md @@ -158,7 +158,7 @@ Approval function from th ERC20 standard interface. :::danger -To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to: 1. either call [`revokeOperator`](#revokeoperator) first, and then re-call [`authorizeOperator`](#authorizeoperator) with the new amount. 2. or use the non-standard functions [`increaseAllowance`](#increaseallowance) or [`decreaseAllowance`](#decreaseallowance). For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ +To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to use the [`increaseAllowance`](#increaseallowance) and [`decreaseAllowance`](#decreaseallowance) functions. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ ::: diff --git a/docs/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.md b/docs/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.md index 7ef5aeaf3..a1c1124a3 100644 --- a/docs/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.md +++ b/docs/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.md @@ -165,7 +165,7 @@ Approval function from th ERC20 standard interface. :::danger -To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to: 1. either call [`revokeOperator`](#revokeoperator) first, and then re-call [`authorizeOperator`](#authorizeoperator) with the new amount. 2. or use the non-standard functions [`increaseAllowance`](#increaseallowance) or [`decreaseAllowance`](#decreaseallowance). For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ +To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to use the [`increaseAllowance`](#increaseallowance) and [`decreaseAllowance`](#decreaseallowance) functions. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ ::: diff --git a/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md b/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md index 74d5eaed5..00e9cb8e7 100644 --- a/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md +++ b/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md @@ -121,7 +121,7 @@ Reverts whenever someone tries to send native tokens to a LSP7 contract. :::danger -To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to: 1. either call [`revokeOperator`](#revokeoperator) first, and then re-call [`authorizeOperator`](#authorizeoperator) with the new amount. 2. or use the non-standard functions [`increaseAllowance`](#increaseallowance) or [`decreaseAllowance`](#decreaseallowance). For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ +To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to use the [`increaseAllowance`](#increaseallowance) and [`decreaseAllowance`](#decreaseallowance) functions. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ ::: From eb1f5e26e17af1f74c510203fc7b8eb6df15233c Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Tue, 9 Jan 2024 16:44:58 +0200 Subject: [PATCH 06/29] chore: remove duplicated check in isOperatorFor in LSP8 (#837) Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- .../LSP8IdentifiableDigitalAssetCore.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol index fed9ad27d..5b00006f8 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol @@ -331,8 +331,6 @@ abstract contract LSP8IdentifiableDigitalAssetCore is address operator, bytes32 tokenId ) public view virtual override returns (bool) { - _existsOrError(tokenId); - return _isOperatorOrOwner(operator, tokenId); } From 482c7b2631791b5aafbe9e131e535dd8c5e0a18e Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Tue, 9 Jan 2024 16:52:13 +0200 Subject: [PATCH 07/29] refactor: adjust LSP16 natspec and parameter name (#839) * refactor: adjust natspec and parameters name for LSP16 * docs: add a README for LSP16 * docs: generate LSP16 docs * docs: Emphasize on bytecode stability in LSP16 --------- Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- .../LSP16UniversalFactory.md | 20 ++++++++ .../LSP16UniversalFactory.sol | 40 ++++++++-------- .../LSP16UniversalFactory.md | 46 +++++++++---------- 3 files changed, 63 insertions(+), 43 deletions(-) create mode 100644 contracts/LSP16UniversalFactory/LSP16UniversalFactory.md diff --git a/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md b/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md new file mode 100644 index 000000000..0a5a2a603 --- /dev/null +++ b/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md @@ -0,0 +1,20 @@ +# LSP16UniversalFactory.sol + +## Overview + +According to [LSP16-UniversalFactory](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-16-UniversalFactory.md) specification, [`LSP16UniversalFactory.sol`](./LSP16UniversalFactory.sol) is a universal factory smart contract, that will allow to deploy different types of smart contracts using [CREATE2] opcode after being deployed with [Nick Factory] in order to produce the same address on different chains. + +## Bytecode Stability + +**It is crucial to note that the bytecode of this factory must remain unchanged. Therefore, any modifications to the contract's code are not permitted.** While contributions in the form of new features, ideas, or adjustments to the Natspec documentation are appreciated, such changes are unfortunately not feasible. This is because any alteration to the contract would result in a new bytecode, which contradicts the contract's fundamental design principle. + +## Deployment Guidelines + +The factory should not be deployed directly from a floating branch in the repository or the package. Instead, it must be deployed from a specific commit, adhering to the configuration listed below: + +- Openzeppelin package version: `"@openzeppelin/contracts": "^4.9.2"` +- The source code is generated with `0.8.17` compiler version and with `9999999` optimization runs. +- Checkout to `PLACE_HOLDER` commit in the [lsp-smart-contract](https://github.com/lukso-network/lsp-smart-contracts) repo to obtain the exact copy of the code, change the compiler settings in `hardhat.config.ts` and compile to produce the same bytecode. + +[CREATE2]: https://eips.ethereum.org/EIPS/eip-1014 +[Nick Factory]: https://github.com/Arachnid/deterministic-deployment-proxy diff --git a/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol b/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol index 946724cbc..939bd2daf 100644 --- a/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol +++ b/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol @@ -27,7 +27,7 @@ error InvalidValueSum(); * The UniversalFactory will be deployed using Nick's Factory (0x4e59b44847b379578588920ca78fbf26c0b4956c) * * The deployed address can be found in the LSP16 specification. - * Please refer to the LSP16 Specification to obtain the exact bytecode and salt that + * Please refer to the LSP16 Specification to obtain the exact creation bytecode and salt that * should be used to produce the address of the UniversalFactory on different chains. * * This factory contract is designed to deploy contracts at the same address on multiple chains. @@ -79,7 +79,7 @@ contract LSP16UniversalFactory { ); /** - * @notice Contract deployed. Salt, `providedSalt`, are used. + * @notice Deploys a smart contract. * * @dev Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the {computeAddress} function. * @@ -87,24 +87,24 @@ contract LSP16UniversalFactory { * * The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See {generateSalt} function for more details. * - * Using the same `byteCode` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. + * Using the same `creationBytecode` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. * * If the constructor of the contract to deploy is payable, value can be sent to this function to fund the created contract. However, sending value to this function while the constructor is not payable will result in a revert. * - * @param byteCode The bytecode of the contract to be deployed + * @param creationBytecode The creation bytecode of the contract to be deployed * @param providedSalt The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment * * @return The address of the deployed contract */ function deployCreate2( - bytes calldata byteCode, + bytes calldata creationBytecode, bytes32 providedSalt ) public payable virtual returns (address) { bytes32 generatedSalt = generateSalt(providedSalt, false, _EMPTY_BYTE); address contractCreated = Create2.deploy( msg.value, generatedSalt, - byteCode + creationBytecode ); emit ContractCreated( contractCreated, @@ -118,7 +118,7 @@ contract LSP16UniversalFactory { } /** - * @notice Contract deployed. Salt, `providedSalt`, are used. + * @notice Deploys a smart contract and initializes it. * * @dev Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the {computeAddress} function. * @@ -126,13 +126,13 @@ contract LSP16UniversalFactory { * * The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(true, initializeCalldata, providedSalt))`. See {generateSalt} function for more details. * - * Using the same `byteCode`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. + * Using the same `creationBytecode`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. * * If the constructor or the initialize function of the contract to deploy is payable, value can be sent along with the deployment/initialization to fund the created contract. However, sending value to this function while the constructor/initialize function is not payable will result in a revert. * * Will revert if the `msg.value` sent to the function is not equal to the sum of `constructorMsgValue` and `initializeCalldataMsgValue`. * - * @param byteCode The bytecode of the contract to be deployed + * @param creationBytecode The creation bytecode of the contract to be deployed * @param providedSalt The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment * @param initializeCalldata The calldata to be executed on the created contract * @param constructorMsgValue The value sent to the contract during deployment @@ -141,7 +141,7 @@ contract LSP16UniversalFactory { * @return The address of the deployed contract */ function deployCreate2AndInitialize( - bytes calldata byteCode, + bytes calldata creationBytecode, bytes32 providedSalt, bytes calldata initializeCalldata, uint256 constructorMsgValue, @@ -158,7 +158,7 @@ contract LSP16UniversalFactory { address contractCreated = Create2.deploy( constructorMsgValue, generatedSalt, - byteCode + creationBytecode ); emit ContractCreated( contractCreated, @@ -177,7 +177,7 @@ contract LSP16UniversalFactory { } /** - * @notice Proxy deployed. Salt, `providedSalt`, are used. + * @notice Deploys a proxy smart contract. * * @dev Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the {computeERC1167Address} function. * @@ -216,7 +216,7 @@ contract LSP16UniversalFactory { } /** - * @notice Proxy deployed & initialized. Salt, `providedSalt`, are used. + * @notice Deploys a proxy smart contract and initializes it. * * @dev Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed * can be known in advance via the {computeERC1167Address} function. @@ -272,7 +272,7 @@ contract LSP16UniversalFactory { * * Any change in one of these parameters will result in a different address. When the `initializable` boolean is set to `false`, `initializeCalldata` will not affect the function output. * - * @param byteCodeHash The keccak256 hash of the bytecode to be deployed + * @param creationBytecodeHash The keccak256 hash of the creation bytecode to be deployed * @param providedSalt The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment * @param initializable A boolean that indicates whether an external call should be made to initialize the contract after deployment * @param initializeCalldata The calldata to be executed on the created contract if `initializable` is set to `true` @@ -280,7 +280,7 @@ contract LSP16UniversalFactory { * @return The address where the contract will be deployed */ function computeAddress( - bytes32 byteCodeHash, + bytes32 creationBytecodeHash, bytes32 providedSalt, bool initializable, bytes calldata initializeCalldata @@ -290,7 +290,7 @@ contract LSP16UniversalFactory { initializable, initializeCalldata ); - return Create2.computeAddress(generatedSalt, byteCodeHash); + return Create2.computeAddress(generatedSalt, creationBytecodeHash); } /** @@ -347,16 +347,16 @@ contract LSP16UniversalFactory { * at the same address. * * - However, for non-initializable contracts, if the constructor has arguments that specify the deployment behavior, they - * will be included in the bytecode. Any change in the constructor arguments will lead to a different contract's bytecode + * will be included in the creation bytecode. Any change in the constructor arguments will lead to a different contract's creation bytecode * which will result in a different address on other chains. * * 2. Example (for non-initializable contracts) * - * - If a contract is deployed with specific constructor arguments on chain 1, these arguments are embedded within the bytecode. + * - If a contract is deployed with specific constructor arguments on chain 1, these arguments are embedded within the creation bytecode. * For instance, if contract B is deployed with a specific `tokenName` and `tokenSymbol` on chain 1, and a user wants to deploy * the same contract with the same `tokenName` and `tokenSymbol` on chain 2, they must use the same constructor arguments to - * produce the same bytecode. This ensures that the same deployment behaviour is maintained across different chains, - * as long as the same bytecode is used. + * produce the same creation bytecode. This ensures that the same deployment behaviour is maintained across different chains, + * as long as the same creation bytecode is used. * * - If another user Z, tries to deploy the same contract B at the same address on chain 2 using the same `providedSalt` * but different constructor arguments (a different `tokenName` and/or `tokenSymbol`), the generated address will be different. diff --git a/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md b/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md index e3da4b6a3..6d2ba2d47 100644 --- a/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md +++ b/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md @@ -18,7 +18,7 @@ Factory contract to deploy different types of contracts using the CREATE2 opcode standardized as LSP16 -- UniversalFactory: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-16-UniversalFactory.md The UniversalFactory will be deployed using Nick's Factory (0x4e59b44847b379578588920ca78fbf26c0b4956c) The deployed address can be found in the LSP16 specification. Please refer to the LSP16 Specification to obtain the exact bytecode and salt that should be used to produce the address of the UniversalFactory on different chains. This factory contract is designed to deploy contracts at the same address on multiple chains. The UniversalFactory can deploy 2 types of contracts: +- UniversalFactory: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-16-UniversalFactory.md The UniversalFactory will be deployed using Nick's Factory (0x4e59b44847b379578588920ca78fbf26c0b4956c) The deployed address can be found in the LSP16 specification. Please refer to the LSP16 Specification to obtain the exact creation bytecode and salt that should be used to produce the address of the UniversalFactory on different chains. This factory contract is designed to deploy contracts at the same address on multiple chains. The UniversalFactory can deploy 2 types of contracts: - non-initializable (normal deployment) @@ -46,7 +46,7 @@ When marked as 'public', a method can be called both externally and internally, ```solidity function computeAddress( - bytes32 byteCodeHash, + bytes32 creationBytecodeHash, bytes32 providedSalt, bool initializable, bytes initializeCalldata @@ -57,12 +57,12 @@ Computes the address of a contract to be deployed using CREATE2, based on the in #### Parameters -| Name | Type | Description | -| -------------------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `byteCodeHash` | `bytes32` | The keccak256 hash of the bytecode to be deployed | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | -| `initializable` | `bool` | A boolean that indicates whether an external call should be made to initialize the contract after deployment | -| `initializeCalldata` | `bytes` | The calldata to be executed on the created contract if `initializable` is set to `true` | +| Name | Type | Description | +| ---------------------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| `creationBytecodeHash` | `bytes32` | The keccak256 hash of the creation bytecode to be deployed | +| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | +| `initializable` | `bool` | A boolean that indicates whether an external call should be made to initialize the contract after deployment | +| `initializeCalldata` | `bytes` | The calldata to be executed on the created contract if `initializable` is set to `true` | #### Returns @@ -124,21 +124,21 @@ Computes the address of an ERC1167 proxy contract based on the input parameters. ```solidity function deployCreate2( - bytes byteCode, + bytes creationBytecode, bytes32 providedSalt ) external payable returns (address); ``` -_Contract deployed. Salt, `providedSalt`, are used._ +_Deploys a smart contract._ -Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeAddress`](#computeaddress) function. This function deploys contracts without initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `byteCode` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. If the constructor of the contract to deploy is payable, value can be sent to this function to fund the created contract. However, sending value to this function while the constructor is not payable will result in a revert. +Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeAddress`](#computeaddress) function. This function deploys contracts without initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `creationBytecode` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. If the constructor of the contract to deploy is payable, value can be sent to this function to fund the created contract. However, sending value to this function while the constructor is not payable will result in a revert. #### Parameters -| Name | Type | Description | -| -------------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `byteCode` | `bytes` | The bytecode of the contract to be deployed | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | +| Name | Type | Description | +| ------------------ | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| `creationBytecode` | `bytes` | The creation bytecode of the contract to be deployed | +| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | #### Returns @@ -161,7 +161,7 @@ Deploys a contract using the CREATE2 opcode. The address where the contract will ```solidity function deployCreate2AndInitialize( - bytes byteCode, + bytes creationBytecode, bytes32 providedSalt, bytes initializeCalldata, uint256 constructorMsgValue, @@ -169,15 +169,15 @@ function deployCreate2AndInitialize( ) external payable returns (address); ``` -_Contract deployed. Salt, `providedSalt`, are used._ +_Deploys a smart contract and initializes it._ -Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeAddress`](#computeaddress) function. This function deploys contracts with initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(true, initializeCalldata, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `byteCode`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. If the constructor or the initialize function of the contract to deploy is payable, value can be sent along with the deployment/initialization to fund the created contract. However, sending value to this function while the constructor/initialize function is not payable will result in a revert. Will revert if the `msg.value` sent to the function is not equal to the sum of `constructorMsgValue` and `initializeCalldataMsgValue`. +Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeAddress`](#computeaddress) function. This function deploys contracts with initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(true, initializeCalldata, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `creationBytecode`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. If the constructor or the initialize function of the contract to deploy is payable, value can be sent along with the deployment/initialization to fund the created contract. However, sending value to this function while the constructor/initialize function is not payable will result in a revert. Will revert if the `msg.value` sent to the function is not equal to the sum of `constructorMsgValue` and `initializeCalldataMsgValue`. #### Parameters | Name | Type | Description | | ---------------------------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `byteCode` | `bytes` | The bytecode of the contract to be deployed | +| `creationBytecode` | `bytes` | The creation bytecode of the contract to be deployed | | `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | | `initializeCalldata` | `bytes` | The calldata to be executed on the created contract | | `constructorMsgValue` | `uint256` | The value sent to the contract during deployment | @@ -209,7 +209,7 @@ function deployERC1167Proxy( ) external nonpayable returns (address); ``` -_Proxy deployed. Salt, `providedSalt`, are used._ +_Deploys a proxy smart contract._ Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeERC1167Address`](#computeerc1167address) function. This function deploys contracts without initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `implementationContract` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. Sending value to the contract created is not possible since the constructor of the ERC1167 minimal proxy is not payable. @@ -247,7 +247,7 @@ function deployERC1167ProxyAndInitialize( ) external payable returns (address); ``` -_Proxy deployed & initialized. Salt, `providedSalt`, are used._ +_Deploys a proxy smart contract and initializes it._ Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeERC1167Address`](#computeerc1167address) function. This function deploys contracts with initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(true, initializeCalldata, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `implementationContract`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. If the initialize function of the contract to deploy is payable, value can be sent along to fund the created contract while initializing. However, sending value to this function while the initialize function is not payable will result in a revert. @@ -308,11 +308,11 @@ Generates the salt used to deploy the contract by hashing the following paramete - For instance, if another user, Y, tries to deploy the contract at the same address on chain 2 using the same providedSalt, but with a different initializeCalldata to make Y the owner instead of X, the generated address would be different, preventing Y from deploying the contract with different ownership at the same address. -- However, for non-initializable contracts, if the constructor has arguments that specify the deployment behavior, they will be included in the bytecode. Any change in the constructor arguments will lead to a different contract's bytecode which will result in a different address on other chains. +- However, for non-initializable contracts, if the constructor has arguments that specify the deployment behavior, they will be included in the creation bytecode. Any change in the constructor arguments will lead to a different contract's creation bytecode which will result in a different address on other chains. 2. Example (for non-initializable contracts) -- If a contract is deployed with specific constructor arguments on chain 1, these arguments are embedded within the bytecode. For instance, if contract B is deployed with a specific `tokenName` and `tokenSymbol` on chain 1, and a user wants to deploy the same contract with the same `tokenName` and `tokenSymbol` on chain 2, they must use the same constructor arguments to produce the same bytecode. This ensures that the same deployment behaviour is maintained across different chains, as long as the same bytecode is used. +- If a contract is deployed with specific constructor arguments on chain 1, these arguments are embedded within the creation bytecode. For instance, if contract B is deployed with a specific `tokenName` and `tokenSymbol` on chain 1, and a user wants to deploy the same contract with the same `tokenName` and `tokenSymbol` on chain 2, they must use the same constructor arguments to produce the same creation bytecode. This ensures that the same deployment behaviour is maintained across different chains, as long as the same creation bytecode is used. - If another user Z, tries to deploy the same contract B at the same address on chain 2 using the same `providedSalt` but different constructor arguments (a different `tokenName` and/or `tokenSymbol`), the generated address will be different. This prevents user Z from deploying the contract with different constructor arguments at the same address on chain 2. From 0a96dd4b7a8925dbd5a9da30b9abb00c476ad232 Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Tue, 9 Jan 2024 17:25:10 +0200 Subject: [PATCH 08/29] ci: change event triggers for benchmark CI to include forks (#840) Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- .github/workflows/benchmark.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index edb5a2057..d54087852 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -8,7 +8,7 @@ on: # enable to run workflow manually workflow_dispatch: - pull_request: + pull_request_target: types: [opened] # compare gas diff only when editing Solidity smart contract code From bca670f9f21942f5ca1d5c528b3b59defb645ec7 Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Wed, 10 Jan 2024 12:17:12 +0200 Subject: [PATCH 09/29] ci: revert changes related to Benchmark CI (#842) --- .github/workflows/benchmark.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index d54087852..edb5a2057 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -8,7 +8,7 @@ on: # enable to run workflow manually workflow_dispatch: - pull_request_target: + pull_request: types: [opened] # compare gas diff only when editing Solidity smart contract code From 7dec730661a76d9e6f62ca810ce97673929dc747 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 10 Jan 2024 16:21:58 +0100 Subject: [PATCH 10/29] fix: restrict owner change in _beforeTokenTransfer --- .../LSP8Errors.sol | 9 ++++ .../LSP8IdentifiableDigitalAssetCore.sol | 23 ++++++--- .../Mocks/Tokens/LSP8TransferOwnerChange.sol | 51 +++++++++++++++++++ .../LSP8IdentifiableDigitalAsset.md | 31 +++++++++++ .../extensions/LSP8Burnable.md | 31 +++++++++++ .../extensions/LSP8CappedSupply.md | 31 +++++++++++ .../extensions/LSP8CompatibleERC721.md | 37 ++++++++++++-- .../extensions/LSP8Enumerable.md | 31 +++++++++++ .../presets/LSP8CompatibleERC721Mintable.md | 37 ++++++++++++-- .../presets/LSP8Mintable.md | 31 +++++++++++ .../LSP8Mintable.behaviour.ts | 43 ++++++++++++++++ 11 files changed, 341 insertions(+), 14 deletions(-) create mode 100644 contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol b/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol index 7bbf06ba0..472ce6016 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol @@ -103,3 +103,12 @@ error LSP8TokenIdsDataEmptyArray(); * @notice Batch call failed. */ error LSP8BatchCallFailed(uint256 callIndex); + +/** + * @dev Reverts when the token owner changed inside the {_beforeTokenTransfer} hook. + */ +error LSP8TokenOwnerChanged( + bytes32 tokenId, + address oldOwner, + address newOwner +); diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol index 5b00006f8..54e1a2350 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol @@ -41,7 +41,8 @@ import { LSP8NotifyTokenReceiverIsEOA, LSP8TokenIdsDataLengthMismatch, LSP8TokenIdsDataEmptyArray, - LSP8BatchCallFailed + LSP8BatchCallFailed, + LSP8TokenOwnerChanged } from "./LSP8Errors.sol"; // constants @@ -634,9 +635,15 @@ abstract contract LSP8IdentifiableDigitalAssetCore is _beforeTokenTransfer(from, to, tokenId, data); - // Re-fetch and update `tokenOwner` in case `tokenId` - // was transferred inside the `_beforeTokenTransfer` hook - tokenOwner = tokenOwnerOf(tokenId); + // Check that `tokenId`'s owner was not changed inside the `_beforeTokenTransfer` hook + address currentTokenOwner = tokenOwnerOf(tokenId); + if (tokenOwner != currentTokenOwner) { + revert LSP8TokenOwnerChanged( + tokenId, + tokenOwner, + currentTokenOwner + ); + } _clearOperators(from, tokenId); @@ -721,8 +728,8 @@ abstract contract LSP8IdentifiableDigitalAssetCore is * @dev Attempt to notify the operator `operator` about the `tokenId` being authorized. * This is done by calling its {universalReceiver} function with the `_TYPEID_LSP8_TOKENOPERATOR` as typeId, if `operator` is a contract that supports the LSP1 interface. * If `operator` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - - * @param operator The address to call the {universalReceiver} function on. + + * @param operator The address to call the {universalReceiver} function on. * @param lsp1Data the data to be sent to the `operator` address in the `universalReceiver` call. */ function _notifyTokenOperator( @@ -740,8 +747,8 @@ abstract contract LSP8IdentifiableDigitalAssetCore is * @dev Attempt to notify the token sender `from` about the `tokenId` being transferred. * This is done by calling its {universalReceiver} function with the `_TYPEID_LSP8_TOKENSSENDER` as typeId, if `from` is a contract that supports the LSP1 interface. * If `from` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - - * @param from The address to call the {universalReceiver} function on. + + * @param from The address to call the {universalReceiver} function on. * @param lsp1Data the data to be sent to the `from` address in the `universalReceiver` call. */ function _notifyTokenSender( diff --git a/contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol b/contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol new file mode 100644 index 000000000..3f595f65a --- /dev/null +++ b/contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.4; + +// modules +import { + LSP8IdentifiableDigitalAsset +} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol"; +import { + LSP8Burnable +} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol"; + +contract LSP8TransferOwnerChange is LSP8IdentifiableDigitalAsset, LSP8Burnable { + // solhint-disable-next-line no-empty-blocks + constructor( + string memory name_, + string memory symbol_, + address newOwner_, + uint256 lsp4TokenType_, + uint256 lsp8TokenIdFormat_ + ) + LSP8IdentifiableDigitalAsset( + name_, + symbol_, + newOwner_, + lsp4TokenType_, + lsp8TokenIdFormat_ + ) + {} + + function mint( + address to, + bytes32 tokenId, + bool force, + bytes memory data + ) public { + _mint(to, tokenId, force, data); + } + + function _beforeTokenTransfer( + address, + address, + bytes32 tokenId, + bytes memory + ) internal override { + // if tokenID exist transfer token ownership to this contract + if (_exists(tokenId)) { + _tokenOwners[tokenId] = address(this); + } + } +} diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md b/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md index f58cf9036..708d6a325 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md @@ -2066,6 +2066,37 @@ Reverts when trying to authorize or revoke the token's owner as an operator.
+### LSP8TokenOwnerChanged + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` +- Error hash: `0x5a9c31d3` + +::: + +```solidity +error LSP8TokenOwnerChanged( + bytes32 tokenId, + address oldOwner, + address newOwner +); +``` + +Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. + +#### Parameters + +| Name | Type | Description | +| ---------- | :-------: | ----------- | +| `tokenId` | `bytes32` | - | +| `oldOwner` | `address` | - | +| `newOwner` | `address` | - | + +
+ ### NoExtensionFoundForFunctionSelector :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md index b6ac5fb1b..56f4230c9 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md @@ -2092,6 +2092,37 @@ Reverts when trying to authorize or revoke the token's owner as an operator.
+### LSP8TokenOwnerChanged + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` +- Error hash: `0x5a9c31d3` + +::: + +```solidity +error LSP8TokenOwnerChanged( + bytes32 tokenId, + address oldOwner, + address newOwner +); +``` + +Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. + +#### Parameters + +| Name | Type | Description | +| ---------- | :-------: | ----------- | +| `tokenId` | `bytes32` | - | +| `oldOwner` | `address` | - | +| `newOwner` | `address` | - | + +
+ ### NoExtensionFoundForFunctionSelector :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md index cd7d4f6bd..372210480 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md @@ -2108,6 +2108,37 @@ Reverts when trying to authorize or revoke the token's owner as an operator.
+### LSP8TokenOwnerChanged + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` +- Error hash: `0x5a9c31d3` + +::: + +```solidity +error LSP8TokenOwnerChanged( + bytes32 tokenId, + address oldOwner, + address newOwner +); +``` + +Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. + +#### Parameters + +| Name | Type | Description | +| ---------- | :-------: | ----------- | +| `tokenId` | `bytes32` | - | +| `oldOwner` | `address` | - | +| `newOwner` | `address` | - | + +
+ ### NoExtensionFoundForFunctionSelector :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md index 885463cc7..f6ddd11d0 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md @@ -1677,7 +1677,7 @@ Approve `operator` to operate on all tokens of `tokensOwner`. event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); ``` -Emitted when the allowance of a `spender` for an `owner` is set by a call to [`approve`](#approve). `value` is the new allowance. +Emitted when `owner` enables `approved` to manage the `tokenId` token. #### Parameters @@ -1704,7 +1704,7 @@ Emitted when the allowance of a `spender` for an `owner` is set by a call to [`a event ApprovalForAll(address indexed owner, address indexed operator, bool approved); ``` -Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`. +Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. #### Parameters @@ -1897,7 +1897,7 @@ Emitted when `tokenId` token is transferred from the `from` to the `to` address. event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); ``` -Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero. +Emitted when `tokenId` token is transferred from `from` to `to`. #### Parameters @@ -2457,6 +2457,37 @@ Reverts when trying to authorize or revoke the token's owner as an operator.
+### LSP8TokenOwnerChanged + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) +- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` +- Error hash: `0x5a9c31d3` + +::: + +```solidity +error LSP8TokenOwnerChanged( + bytes32 tokenId, + address oldOwner, + address newOwner +); +``` + +Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. + +#### Parameters + +| Name | Type | Description | +| ---------- | :-------: | ----------- | +| `tokenId` | `bytes32` | - | +| `oldOwner` | `address` | - | +| `newOwner` | `address` | - | + +
+ ### NoExtensionFoundForFunctionSelector :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md index f04d2e4b6..9495edf7f 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md @@ -2094,6 +2094,37 @@ Reverts when trying to authorize or revoke the token's owner as an operator.
+### LSP8TokenOwnerChanged + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` +- Error hash: `0x5a9c31d3` + +::: + +```solidity +error LSP8TokenOwnerChanged( + bytes32 tokenId, + address oldOwner, + address newOwner +); +``` + +Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. + +#### Parameters + +| Name | Type | Description | +| ---------- | :-------: | ----------- | +| `tokenId` | `bytes32` | - | +| `oldOwner` | `address` | - | +| `newOwner` | `address` | - | + +
+ ### NoExtensionFoundForFunctionSelector :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md index 01b0bfd1f..46f2ebdb6 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md @@ -1721,7 +1721,7 @@ Approve `operator` to operate on all tokens of `tokensOwner`. event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); ``` -Emitted when the allowance of a `spender` for an `owner` is set by a call to [`approve`](#approve). `value` is the new allowance. +Emitted when `owner` enables `approved` to manage the `tokenId` token. #### Parameters @@ -1748,7 +1748,7 @@ Emitted when the allowance of a `spender` for an `owner` is set by a call to [`a event ApprovalForAll(address indexed owner, address indexed operator, bool approved); ``` -Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`. +Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. #### Parameters @@ -1941,7 +1941,7 @@ Emitted when `tokenId` token is transferred from the `from` to the `to` address. event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); ``` -Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero. +Emitted when `tokenId` token is transferred from `from` to `to`. #### Parameters @@ -2526,6 +2526,37 @@ Reverts when trying to authorize or revoke the token's owner as an operator.
+### LSP8TokenOwnerChanged + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) +- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` +- Error hash: `0x5a9c31d3` + +::: + +```solidity +error LSP8TokenOwnerChanged( + bytes32 tokenId, + address oldOwner, + address newOwner +); +``` + +Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. + +#### Parameters + +| Name | Type | Description | +| ---------- | :-------: | ----------- | +| `tokenId` | `bytes32` | - | +| `oldOwner` | `address` | - | +| `newOwner` | `address` | - | + +
+ ### NoExtensionFoundForFunctionSelector :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md index e5d4d8dd9..1a1c1ee76 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md @@ -2157,6 +2157,37 @@ Reverts when trying to authorize or revoke the token's owner as an operator.
+### LSP8TokenOwnerChanged + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` +- Error hash: `0x5a9c31d3` + +::: + +```solidity +error LSP8TokenOwnerChanged( + bytes32 tokenId, + address oldOwner, + address newOwner +); +``` + +Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. + +#### Parameters + +| Name | Type | Description | +| ---------- | :-------: | ----------- | +| `tokenId` | `bytes32` | - | +| `oldOwner` | `address` | - | +| `newOwner` | `address` | - | + +
+ ### NoExtensionFoundForFunctionSelector :::note References diff --git a/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts b/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts index e5061c0d4..1b5605961 100644 --- a/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts +++ b/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts @@ -3,6 +3,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { LSP8Mintable, + LSP8TransferOwnerChange, UniversalProfile, LSP6KeyManager, UniversalReceiverDelegateTokenReentrant__factory, @@ -166,4 +167,46 @@ export const shouldBehaveLikeLSP8Mintable = ( expect(tokenIdsOfUP[1]).to.equal(ethers.utils.hexlify(secondRandomTokenId)); }); }); + describe('when there is an owner change in the _beforeTokenTransfer hook', () => { + it('should revert', async () => { + // deploy LSP8TransferOwnerChange contract + const LSP8TransferOwnerChange = await ethers.getContractFactory('LSP8TransferOwnerChange'); + const lsp8TransferOwnerChange = (await LSP8TransferOwnerChange.deploy( + 'RandomName', + 'RandomSymbol', + context.accounts.owner.address, + 0, // token type + 0, // token id format + )) as LSP8TransferOwnerChange; + + const randomTokenId = ethers.utils.randomBytes(32); + + // // mint a token tokenReceiver + await lsp8TransferOwnerChange.connect(context.accounts.owner).mint( + context.accounts.tokenReceiver.address, + randomTokenId, + true, // beneficiary is an EOA, so we need to force minting + '0x', + ); + + // transfer ownership to lsp8TransferOwnerChange + await expect( + lsp8TransferOwnerChange + .connect(context.accounts.tokenReceiver) + .transfer( + context.accounts.tokenReceiver.address, + context.accounts.owner.address, + randomTokenId, + true, + '0x', + ), + ) + .to.be.revertedWithCustomError(lsp8TransferOwnerChange, 'LSP8TokenOwnerChanged') + .withArgs( + randomTokenId, + context.accounts.tokenReceiver.address, + lsp8TransferOwnerChange.address, + ); + }); + }); }; From b6de95148168d7711ed694196411ee2054a95ffa Mon Sep 17 00:00:00 2001 From: Skima Harvey <64636974+skimaharvey@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:14:00 +0000 Subject: [PATCH 11/29] fix: move _beforeTokenTransfer before balance check (#843) --- .../LSP7DigitalAsset/LSP7DigitalAssetCore.sol | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol b/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol index 99aa553aa..f396cd570 100644 --- a/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol +++ b/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol @@ -482,13 +482,12 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { revert LSP7CannotSendWithAddressZero(); } + _beforeTokenTransfer(from, address(0), amount, data); + uint256 balance = _tokenOwnerBalances[from]; if (amount > balance) { revert LSP7AmountExceedsBalance(balance, from, amount); } - - _beforeTokenTransfer(from, address(0), amount, data); - // tokens being burnt _existingTokens -= amount; @@ -594,13 +593,13 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { revert LSP7CannotSendWithAddressZero(); } + _beforeTokenTransfer(from, to, amount, data); + uint256 balance = _tokenOwnerBalances[from]; if (amount > balance) { revert LSP7AmountExceedsBalance(balance, from, amount); } - _beforeTokenTransfer(from, to, amount, data); - _tokenOwnerBalances[from] -= amount; _tokenOwnerBalances[to] += amount; @@ -657,8 +656,8 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { * @dev Attempt to notify the operator `operator` about the `amount` tokens being authorized with. * This is done by calling its {universalReceiver} function with the `_TYPEID_LSP7_TOKENOPERATOR` as typeId, if `operator` is a contract that supports the LSP1 interface. * If `operator` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - - * @param operator The address to call the {universalReceiver} function on. + + * @param operator The address to call the {universalReceiver} function on. * @param lsp1Data the data to be sent to the `operator` address in the `universalReceiver` call. */ function _notifyTokenOperator( @@ -676,8 +675,8 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { * @dev Attempt to notify the token sender `from` about the `amount` of tokens being transferred. * This is done by calling its {universalReceiver} function with the `_TYPEID_LSP7_TOKENSSENDER` as typeId, if `from` is a contract that supports the LSP1 interface. * If `from` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - - * @param from The address to call the {universalReceiver} function on. + + * @param from The address to call the {universalReceiver} function on. * @param lsp1Data the data to be sent to the `from` address in the `universalReceiver` call. */ function _notifyTokenSender( From cb696c95b495870cd615173ddd74ea243ce6f5d9 Mon Sep 17 00:00:00 2001 From: Skima Harvey <64636974+skimaharvey@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:22:44 +0000 Subject: [PATCH 12/29] fix: add existence check before the _beforeTokenTransfer hook (#844) Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- .../LSP8IdentifiableDigitalAssetCore.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol index 54e1a2350..89f57b15d 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol @@ -507,6 +507,11 @@ abstract contract LSP8IdentifiableDigitalAssetCore is revert LSP8CannotSendToAddressZero(); } + // Check that `tokenId` is not already minted + if (_exists(tokenId)) { + revert LSP8TokenIdAlreadyMinted(tokenId); + } + _beforeTokenTransfer(address(0), to, tokenId, data); // Check that `tokenId` was not minted inside the `_beforeTokenTransfer` hook From 8605f9950b4373755f729ab88fa8135cde890c4a Mon Sep 17 00:00:00 2001 From: CJ42 Date: Thu, 11 Jan 2024 10:04:23 +0000 Subject: [PATCH 13/29] docs: update auto-generated docs --- .../extensions/LSP8CompatibleERC721.md | 2 +- .../presets/LSP8CompatibleERC721Mintable.md | 2 +- tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md index f6ddd11d0..7ba22f61f 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md @@ -1704,7 +1704,7 @@ Emitted when `owner` enables `approved` to manage the `tokenId` token. event ApprovalForAll(address indexed owner, address indexed operator, bool approved); ``` -Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. +Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`. #### Parameters diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md index 46f2ebdb6..b1d7a566b 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md @@ -1748,7 +1748,7 @@ Emitted when `owner` enables `approved` to manage the `tokenId` token. event ApprovalForAll(address indexed owner, address indexed operator, bool approved); ``` -Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. +Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`. #### Parameters diff --git a/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts b/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts index 1b5605961..fe97b05f2 100644 --- a/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts +++ b/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts @@ -179,7 +179,7 @@ export const shouldBehaveLikeLSP8Mintable = ( 0, // token id format )) as LSP8TransferOwnerChange; - const randomTokenId = ethers.utils.randomBytes(32); + const randomTokenId = ethers.utils.hexlify(ethers.utils.randomBytes(32)); // // mint a token tokenReceiver await lsp8TransferOwnerChange.connect(context.accounts.owner).mint( From d0436432e37e611c2df626e2c91fc0597a8051f4 Mon Sep 17 00:00:00 2001 From: "b00ste.lyx" <62855857+b00ste@users.noreply.github.com> Date: Fri, 12 Jan 2024 10:46:48 +0200 Subject: [PATCH 14/29] refactor: remove LSP7 & LSP8 compatible contracts (#845) --- .github/workflows/solc_version.yml | 2 +- .mythx.yml | 8 - .../extensions/LSP7CompatibleERC20.sol | 260 -- .../LSP7CompatibleERC20InitAbstract.sol | 273 -- .../presets/LSP7CompatibleERC20Mintable.sol | 37 - .../LSP7CompatibleERC20MintableInit.sol | 44 - ...SP7CompatibleERC20MintableInitAbstract.sol | 43 - .../extensions/LSP8CompatibleERC721.sol | 512 ---- .../LSP8CompatibleERC721InitAbstract.sol | 514 ---- .../presets/LSP8CompatibleERC721Mintable.sol | 54 - .../LSP8CompatibleERC721MintableInit.sol | 47 - ...P8CompatibleERC721MintableInitAbstract.sol | 52 - .../Tokens/LSP7CompatibleERC20InitTester.sol | 40 - .../Tokens/LSP7CompatibleERC20Tester.sol | 26 - .../Tokens/LSP8CompatibleERC721Tester.sol | 43 - .../Tokens/LSP8CompatibleERC721TesterInit.sol | 50 - .../extensions/LSP7CompatibleERC20.md | 1991 ------------- .../presets/LSP7CompatibleERC20Mintable.md | 2031 ------------- .../extensions/LSP8CompatibleERC721.md | 2558 ---------------- .../presets/LSP8CompatibleERC721Mintable.md | 2627 ----------------- dodoc/config.ts | 4 - hardhat.config.ts | 10 - .../LSP7CompatibleERC20.behaviour.ts | 1330 --------- .../proxy/LSP7CompatibleERC20Init.test.ts | 136 - .../standard/LSP7CompatibleERC20.test.ts | 61 - .../LSP8CompatibleERC721.behaviour.ts | 1337 --------- .../proxy/LSP8CompatibleERC721Init.test.ts | 143 - .../standard/LSP8CompatibleERC721.test.ts | 71 - 28 files changed, 1 insertion(+), 14303 deletions(-) delete mode 100644 contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol delete mode 100644 contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20InitAbstract.sol delete mode 100644 contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol delete mode 100644 contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInit.sol delete mode 100644 contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInitAbstract.sol delete mode 100644 contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol delete mode 100644 contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721InitAbstract.sol delete mode 100644 contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol delete mode 100644 contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInit.sol delete mode 100644 contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInitAbstract.sol delete mode 100644 contracts/Mocks/Tokens/LSP7CompatibleERC20InitTester.sol delete mode 100644 contracts/Mocks/Tokens/LSP7CompatibleERC20Tester.sol delete mode 100644 contracts/Mocks/Tokens/LSP8CompatibleERC721Tester.sol delete mode 100644 contracts/Mocks/Tokens/LSP8CompatibleERC721TesterInit.sol delete mode 100644 docs/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md delete mode 100644 docs/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.md delete mode 100644 docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md delete mode 100644 docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md delete mode 100644 tests/LSP7DigitalAsset/LSP7CompatibleERC20.behaviour.ts delete mode 100644 tests/LSP7DigitalAsset/proxy/LSP7CompatibleERC20Init.test.ts delete mode 100644 tests/LSP7DigitalAsset/standard/LSP7CompatibleERC20.test.ts delete mode 100644 tests/LSP8IdentifiableDigitalAsset/LSP8CompatibleERC721.behaviour.ts delete mode 100644 tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CompatibleERC721Init.test.ts delete mode 100644 tests/LSP8IdentifiableDigitalAsset/standard/LSP8CompatibleERC721.test.ts diff --git a/.github/workflows/solc_version.yml b/.github/workflows/solc_version.yml index ee936f4ed..4aad0e860 100644 --- a/.github/workflows/solc_version.yml +++ b/.github/workflows/solc_version.yml @@ -76,7 +76,7 @@ jobs: run: | if [[ "<" == "${{ steps.comparison.outputs.comparison-result }}" ]] then - solc $(ls contracts/**/*.sol | grep -v "Compatible\|Extension4337\|contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset") \ + solc $(ls contracts/**/*.sol | grep -v "Extension4337\|contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset") \ --allow-paths $(pwd)/node_modules/ \ @=node_modules/@ \ solidity-bytes-utils/=node_modules/solidity-bytes-utils/ \ diff --git a/.mythx.yml b/.mythx.yml index 2469541ca..ce2c2cb35 100644 --- a/.mythx.yml +++ b/.mythx.yml @@ -28,16 +28,12 @@ analyze: - contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol - contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol - contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol - - contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol - contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol - contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol - - contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol - contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol - contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol - - contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol - - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol # - Vault & Social Recovery - contracts/LSP9Vault/LSP9Vault.sol @@ -52,13 +48,9 @@ analyze: # - Tokens & NFTs - contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol - contracts/LSP7DigitalAsset/presets/LSP7MintableInit.sol - - contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInit.sol - - contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20InitAbstract.sol - contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol - contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInit.sol - - contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInit.sol - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol - - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721InitAbstract.sol - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol # - Vault & Social Recovery - contracts/LSP9Vault/LSP9VaultInit.sol diff --git a/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol b/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol deleted file mode 100644 index e07bdbbe8..000000000 --- a/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol +++ /dev/null @@ -1,260 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.7; - -// interfaces -import { - IERC20Metadata, - IERC20 -} from "@openzeppelin/contracts/interfaces/IERC20Metadata.sol"; - -// modules -import {LSP7DigitalAssetCore, LSP7DigitalAsset} from "../LSP7DigitalAsset.sol"; - -// constants -import { - _LSP4_TOKEN_NAME_KEY, - _LSP4_TOKEN_SYMBOL_KEY -} from "../../LSP4DigitalAssetMetadata/LSP4Constants.sol"; - -/** - * @dev LSP7 extension, for compatibility for clients / tools that expect ERC20. - */ -abstract contract LSP7CompatibleERC20 is IERC20Metadata, LSP7DigitalAsset { - /** - * @notice Deploying a `LSP7CompatibleERC20` token contract with: token name = `name_`, token symbol = `symbol_`, and - * address `newOwner_` as the token contract owner. - * - * @param name_ The name of the token. - * @param symbol_ The symbol of the token. - * @param newOwner_ The owner of the token contract. - * @param lsp4TokenType_ The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). - */ - constructor( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_ - ) LSP7DigitalAsset(name_, symbol_, newOwner_, lsp4TokenType_, false) {} - - /** - * @inheritdoc IERC20Metadata - * @dev Returns the name of the token. - * For compatibility with clients & tools that expect ERC20. - * - * @return The name of the token - */ - function name() public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_TOKEN_NAME_KEY); - return string(data); - } - - /** - * @inheritdoc IERC20Metadata - * @dev Returns the symbol of the token, usually a shorter version of the name. - * For compatibility with clients & tools that expect ERC20. - * - * @return The symbol of the token - */ - function symbol() public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_TOKEN_SYMBOL_KEY); - return string(data); - } - - /** - * @inheritdoc LSP7DigitalAssetCore - */ - function decimals() - public - view - virtual - override(IERC20Metadata, LSP7DigitalAssetCore) - returns (uint8) - { - return super.decimals(); - } - - /** - * @inheritdoc LSP7DigitalAssetCore - */ - function totalSupply() - public - view - virtual - override(IERC20, LSP7DigitalAssetCore) - returns (uint256) - { - return super.totalSupply(); - } - - /** - * @inheritdoc LSP7DigitalAssetCore - */ - function balanceOf( - address tokenOwner - ) - public - view - virtual - override(IERC20, LSP7DigitalAssetCore) - returns (uint256) - { - return super.balanceOf(tokenOwner); - } - - /** - * @inheritdoc LSP7DigitalAsset - */ - function supportsInterface( - bytes4 interfaceId - ) public view virtual override returns (bool) { - return - interfaceId == type(IERC20).interfaceId || - interfaceId == type(IERC20Metadata).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @inheritdoc IERC20 - * @dev Function to get operator allowance allowed to spend on behalf of `tokenOwner` from the ERC20 standard interface. - * - * @param tokenOwner The address of the token owner - * @param operator The address approved by the `tokenOwner` - * - * @return The amount `operator` is approved by `tokenOwner` - */ - function allowance( - address tokenOwner, - address operator - ) public view virtual returns (uint256) { - return authorizedAmountFor(operator, tokenOwner); - } - - /** - * @inheritdoc IERC20 - * @dev Approval function from th ERC20 standard interface. - * - * @param operator The address to approve for `amount` - * @param amount The amount to approve. - * - * @return `true` on successful approval. - */ - function approve( - address operator, - uint256 amount - ) public virtual returns (bool) { - if (amount != 0) { - authorizeOperator(operator, amount, ""); - } else { - revokeOperator(operator, false, ""); - } - - return true; - } - - /** - * @inheritdoc IERC20 - * @dev Transfer functions for operators from the ERC20 standard interface. - * - * @param from The address sending tokens. - * @param to The address receiving tokens. - * @param amount The amount of tokens to transfer. - * - * @return `true` on successful transfer. - * - * @custom:info This function uses the `force` parameter as `true` so that EOA and any contract can receive tokens. - */ - function transferFrom( - address from, - address to, - uint256 amount - ) public virtual returns (bool) { - transfer(from, to, amount, true, ""); - return true; - } - - // --- Overrides - - /** - * @inheritdoc IERC20 - * @dev Transfer function from the ERC20 standard interface. - - * @param to The address receiving tokens. - * @param amount The amount of tokens to transfer. - * - * @return `true` on successful transfer. - * - * @custom:info This function uses the `force` parameter as `true` so that EOA and any contract can receive tokens. - */ - function transfer( - address to, - uint256 amount - ) public virtual override returns (bool) { - transfer(msg.sender, to, amount, true, ""); - return true; - } - - /** - * @inheritdoc LSP7DigitalAssetCore - */ - function _updateOperator( - address tokenOwner, - address operator, - uint256 amount, - bool notified, - bytes memory operatorNotificationData - ) internal virtual override { - super._updateOperator( - tokenOwner, - operator, - amount, - notified, - operatorNotificationData - ); - emit IERC20.Approval(tokenOwner, operator, amount); - } - - /** - * @custom:events - * - LSP7 {Transfer} event. - * - ERC20 {Transfer} event. - */ - function _transfer( - address from, - address to, - uint256 amount, - bool force, - bytes memory data - ) internal virtual override { - emit IERC20.Transfer(from, to, amount); - super._transfer(from, to, amount, force, data); - } - - /** - * @custom:events - * - LSP7 {Transfer} event with `address(0)` as `from`. - * - ERC20 {Transfer} event with `address(0)` as `from`. - */ - function _mint( - address to, - uint256 amount, - bool force, - bytes memory data - ) internal virtual override { - emit IERC20.Transfer(address(0), to, amount); - super._mint(to, amount, force, data); - } - - /** - * @custom:events - * - LSP7 {Transfer} event with `address(0)` as the `to` address. - * - ERC20 {Transfer} event with `address(0)` as the `to` address. - */ - function _burn( - address from, - uint256 amount, - bytes memory data - ) internal virtual override { - emit IERC20.Transfer(from, address(0), amount); - super._burn(from, amount, data); - } -} diff --git a/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20InitAbstract.sol b/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20InitAbstract.sol deleted file mode 100644 index b97ab39aa..000000000 --- a/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20InitAbstract.sol +++ /dev/null @@ -1,273 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.7; - -// interfaces -import { - IERC20Metadata, - IERC20 -} from "@openzeppelin/contracts/interfaces/IERC20Metadata.sol"; - -// modules -import { - LSP7DigitalAssetCore, - LSP7DigitalAssetInitAbstract -} from "../LSP7DigitalAssetInitAbstract.sol"; - -// constants -import { - _LSP4_TOKEN_NAME_KEY, - _LSP4_TOKEN_SYMBOL_KEY -} from "../../LSP4DigitalAssetMetadata/LSP4Constants.sol"; - -/** - * @dev LSP7 extension, for compatibility for clients / tools that expect ERC20. - */ -abstract contract LSP7CompatibleERC20InitAbstract is - IERC20Metadata, - LSP7DigitalAssetInitAbstract -{ - /** - * @notice Initializing a `LSP7CompatibleERC20` token contract with: token name = `name_`, token symbol = `symbol_`, and - * address `newOwner_` as the token contract owner. - * - * @param name_ The name of the token. - * @param symbol_ The symbol of the token. - * @param newOwner_ The owner of the token. - * @param lsp4TokenType_ The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). - */ - function _initialize( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_ - ) internal virtual override onlyInitializing { - LSP7DigitalAssetInitAbstract._initialize( - name_, - symbol_, - newOwner_, - lsp4TokenType_, - false - ); - } - - /** - * @inheritdoc IERC20Metadata - * @dev Returns the name of the token. - * For compatibility with clients & tools that expect ERC20. - * - * @return The name of the token - */ - function name() public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_TOKEN_NAME_KEY); - return string(data); - } - - /** - * @inheritdoc IERC20Metadata - * @dev Returns the symbol of the token, usually a shorter version of the name. - * For compatibility with clients & tools that expect ERC20. - * - * @return The symbol of the token - */ - function symbol() public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_TOKEN_SYMBOL_KEY); - return string(data); - } - - /** - * @inheritdoc LSP7DigitalAssetCore - */ - function decimals() - public - view - virtual - override(IERC20Metadata, LSP7DigitalAssetCore) - returns (uint8) - { - return super.decimals(); - } - - /** - * @inheritdoc LSP7DigitalAssetCore - */ - function totalSupply() - public - view - virtual - override(IERC20, LSP7DigitalAssetCore) - returns (uint256) - { - return super.totalSupply(); - } - - /** - * @inheritdoc LSP7DigitalAssetCore - */ - function balanceOf( - address tokenOwner - ) - public - view - virtual - override(IERC20, LSP7DigitalAssetCore) - returns (uint256) - { - return super.balanceOf(tokenOwner); - } - - /** - * @inheritdoc LSP7DigitalAssetInitAbstract - */ - function supportsInterface( - bytes4 interfaceId - ) public view virtual override returns (bool) { - return - interfaceId == type(IERC20).interfaceId || - interfaceId == type(IERC20Metadata).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @inheritdoc IERC20 - * @dev Function to get operator allowance allowed to spend on behalf of `tokenOwner` from the ERC20 standard interface. - * - * @param tokenOwner The address of the token owner - * @param operator The address approved by the `tokenOwner` - * - * @return The amount `operator` is approved by `tokenOwner` - */ - function allowance( - address tokenOwner, - address operator - ) public view virtual override returns (uint256) { - return authorizedAmountFor(operator, tokenOwner); - } - - /** - * @inheritdoc IERC20 - * @dev Approval function from th ERC20 standard interface. - * - * @param operator The address to approve for `amount` - * @param amount The amount to approve. - * - * @return `true` on successful approval. - */ - function approve( - address operator, - uint256 amount - ) public virtual returns (bool) { - if (amount != 0) { - authorizeOperator(operator, amount, ""); - } else { - revokeOperator(operator, false, ""); - } - return true; - } - - /** - * @inheritdoc IERC20 - * @dev Transfer functions for operators from the ERC20 standard interface. - * - * @param from The address sending tokens. - * @param to The address receiving tokens. - * @param amount The amount of tokens to transfer. - * - * @return `true` on successful transfer. - * - * @custom:info This function uses the `force` parameter as `true` so that EOA and any contract can receive tokens. - */ - function transferFrom( - address from, - address to, - uint256 amount - ) public virtual returns (bool) { - transfer(from, to, amount, true, ""); - return true; - } - - // --- Overrides - - /** - * @inheritdoc IERC20 - * @dev Transfer function from the ERC20 standard interface. - * - * @param to The address receiving tokens. - * @param amount The amount of tokens to transfer. - * - * @return `true` on successful transfer. - * - * @custom:info This function uses the `force` parameter as `true` so that EOA and any contract can receive tokens. - */ - function transfer( - address to, - uint256 amount - ) public virtual override returns (bool) { - transfer(msg.sender, to, amount, true, ""); - return true; - } - - /** - * @inheritdoc LSP7DigitalAssetCore - */ - function _updateOperator( - address tokenOwner, - address operator, - uint256 amount, - bool notified, - bytes memory operatorNotificationData - ) internal virtual override { - super._updateOperator( - tokenOwner, - operator, - amount, - notified, - operatorNotificationData - ); - emit IERC20.Approval(tokenOwner, operator, amount); - } - - /** - * @custom:events - * - LSP7 {Transfer} event. - * - ERC20 {Transfer} event. - */ - function _transfer( - address from, - address to, - uint256 amount, - bool force, - bytes memory data - ) internal virtual override { - emit IERC20.Transfer(from, to, amount); - super._transfer(from, to, amount, force, data); - } - - /** - * @custom:events - * - LSP7 {Transfer} event with `address(0)` as `from`. - * - ERC20 {Transfer} event with `address(0)` as `from`. - */ - function _mint( - address to, - uint256 amount, - bool force, - bytes memory data - ) internal virtual override { - emit IERC20.Transfer(address(0), to, amount); - super._mint(to, amount, force, data); - } - - /** - * @custom:events - * - LSP7 {Transfer} event with `address(0)` as the `to` address. - * - ERC20 {Transfer} event with `address(0)` as the `to` address. - */ - function _burn( - address from, - uint256 amount, - bytes memory data - ) internal virtual override { - emit IERC20.Transfer(from, address(0), amount); - super._burn(from, amount, data); - } -} diff --git a/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol b/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol deleted file mode 100644 index 4d1bfd865..000000000 --- a/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.7; - -import {LSP7CompatibleERC20} from "../extensions/LSP7CompatibleERC20.sol"; - -/** - * @title LSP7CompatibleERC20 deployable preset contract with a public {mint} function callable only by the contract {owner}. - */ -contract LSP7CompatibleERC20Mintable is LSP7CompatibleERC20 { - /** - * @notice Deploying a `LSP7CompatibleERC20Mintable` token contract with: token name = `name_`, token symbol = `symbol_`, and - * address `newOwner_` as the token contract owner. - * - * @param name_ The name of the token. - * @param symbol_ The symbol of the token. - * @param newOwner_ The owner of the token contract. - * @param lsp4TokenType_ The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). - */ - constructor( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_ - ) LSP7CompatibleERC20(name_, symbol_, newOwner_, lsp4TokenType_) {} - - /** - * @dev Public {_mint} function only callable by the {owner}. - */ - function mint( - address to, - uint256 amount, - bool force, - bytes memory data - ) public virtual onlyOwner { - _mint(to, amount, force, data); - } -} diff --git a/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInit.sol b/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInit.sol deleted file mode 100644 index d0116fa01..000000000 --- a/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInit.sol +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.7; - -// modules -import { - LSP7CompatibleERC20MintableInitAbstract -} from "./LSP7CompatibleERC20MintableInitAbstract.sol"; - -/** - * @title LSP7 deployable preset contract (proxy version) with a public mint function callable only by the contract {owner} - */ -contract LSP7CompatibleERC20MintableInit is - LSP7CompatibleERC20MintableInitAbstract -{ - /** - * @dev initialize (= lock) base implementation contract on deployment - */ - constructor() { - _disableInitializers(); - } - - /** - * @notice Initializing a `LSP7CompatibleERC20MintableInit` token contract with: token name = `name_`, token symbol = `symbol_`, and - * address `newOwner_` as the token contract owner. - * - * @param name_ The name of the token. - * @param symbol_ The symbol of the token. - * @param newOwner_ The owner of the token contract. - * @param lsp4TokenType_ The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). - */ - function initialize( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_ - ) external virtual initializer { - LSP7CompatibleERC20MintableInitAbstract._initialize( - name_, - symbol_, - newOwner_, - lsp4TokenType_ - ); - } -} diff --git a/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInitAbstract.sol b/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInitAbstract.sol deleted file mode 100644 index ca390db9a..000000000 --- a/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20MintableInitAbstract.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.7; - -// modules -import { - LSP7CompatibleERC20InitAbstract -} from "../extensions/LSP7CompatibleERC20InitAbstract.sol"; - -/** - * @title LSP7 preset contract (inheritable proxy version) with a public mint function callable only by the contract {owner} - */ -abstract contract LSP7CompatibleERC20MintableInitAbstract is - LSP7CompatibleERC20InitAbstract -{ - /** - * @inheritdoc LSP7CompatibleERC20InitAbstract - */ - function _initialize( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_ - ) internal virtual override onlyInitializing { - LSP7CompatibleERC20InitAbstract._initialize( - name_, - symbol_, - newOwner_, - lsp4TokenType_ - ); - } - - /** - * @dev Public {_mint} function only callable by the {owner}. - */ - function mint( - address to, - uint256 amount, - bool force, - bytes memory data - ) public virtual onlyOwner { - _mint(to, amount, force, data); - } -} diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol b/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol deleted file mode 100644 index 9a140cd0c..000000000 --- a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol +++ /dev/null @@ -1,512 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.12; - -// interfaces -import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; -import { - IERC721Receiver -} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; -import { - IERC721Metadata, - IERC721 -} from "@openzeppelin/contracts/interfaces/IERC721Metadata.sol"; - -// libraries -import {BytesLib} from "solidity-bytes-utils/contracts/BytesLib.sol"; -import { - EnumerableSet -} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; -import {LSP1Utils} from "../../LSP1UniversalReceiver/LSP1Utils.sol"; - -// modules -import { - LSP8IdentifiableDigitalAssetCore, - LSP8IdentifiableDigitalAsset -} from "../LSP8IdentifiableDigitalAsset.sol"; - -// errors -import { - LSP8NotTokenOwner, - LSP8CannotUseAddressZeroAsOperator, - LSP8TokenOwnerCannotBeOperator, - LSP8OperatorAlreadyAuthorized, - LSP8NotTokenOperator -} from "../LSP8Errors.sol"; - -// constants -import { - _LSP4_METADATA_KEY, - _LSP4_TOKEN_NAME_KEY, - _LSP4_TOKEN_SYMBOL_KEY -} from "../../LSP4DigitalAssetMetadata/LSP4Constants.sol"; -import {_TYPEID_LSP8_TOKENOPERATOR} from "../LSP8Constants.sol"; - -/** - * @dev LSP8 extension, for compatibility for clients / tools that expect ERC721. - */ -abstract contract LSP8CompatibleERC721 is - IERC721Metadata, - LSP8IdentifiableDigitalAsset -{ - using BytesLib for bytes; - using EnumerableSet for EnumerableSet.AddressSet; - using LSP1Utils for address; - - /** - * @dev Mapping from owner to operator approvals for backward compatibility with ERC721 - */ - mapping(address => mapping(address => bool)) private _operatorApprovals; - - /** - * @notice Deploying a `LSP8CompatibleERC721` token contract with: token name = `name_`, token symbol = `symbol_`, and - * address `newOwner_` as the token contract owner. - * - * @param name_ The name of the token. - * @param symbol_ The symbol of the token. - * @param newOwner_ The owner of the token contract. - * @param lsp4TokenType_ The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). - * @param lsp8TokenIdFormat_ The format of tokenIds (= NFTs) that this contract will create. - */ - constructor( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_, - uint256 lsp8TokenIdFormat_ - ) - LSP8IdentifiableDigitalAsset( - name_, - symbol_, - newOwner_, - lsp4TokenType_, - lsp8TokenIdFormat_ - ) - {} - - /** - * @inheritdoc IERC721Metadata - * @dev Returns the name of the token. - * For compatibility with clients & tools that expect ERC721. - * - * @return The name of the token - */ - function name() public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_TOKEN_NAME_KEY); - return string(data); - } - - /** - * @inheritdoc IERC721Metadata - * @dev Returns the symbol of the token, usually a shorter version of the name. - * For compatibility with clients & tools that expect ERC721. - * - * @return The symbol of the token - */ - function symbol() public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_TOKEN_SYMBOL_KEY); - return string(data); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - */ - function balanceOf( - address tokenOwner - ) - public - view - virtual - override(IERC721, LSP8IdentifiableDigitalAssetCore) - returns (uint256) - { - return super.balanceOf(tokenOwner); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAsset - */ - function supportsInterface( - bytes4 interfaceId - ) - public - view - virtual - override(IERC165, LSP8IdentifiableDigitalAsset) - returns (bool) - { - return - interfaceId == type(IERC721).interfaceId || - interfaceId == type(IERC721Metadata).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @inheritdoc IERC721Metadata - * @notice Retrieving the token URI of tokenId `tokenId`. - * - * @dev Compatible with ERC721Metadata tokenURI. Retrieve the tokenURI for a specific `tokenId`. - * - * @return The token URI. - */ - function tokenURI( - uint256 /* tokenId */ - ) public view virtual returns (string memory) { - bytes memory data = _getData(_LSP4_METADATA_KEY); - - // offset = bytes4(hashSig) + bytes32(contentHash) -> 4 + 32 = 36 - uint256 offset = 36; - - bytes memory uriBytes = data.slice(offset, data.length - offset); - return string(uriBytes); - } - - /** - * @inheritdoc IERC721 - * @notice Retrieving the address that own tokenId `tokenId`. - * - * @dev Compatible with ERC721 ownerOf. - * - * @param tokenId The tokenId to query. - * @return The owner of the tokenId. - */ - function ownerOf( - uint256 tokenId - ) public view virtual override returns (address) { - return tokenOwnerOf(bytes32(tokenId)); - } - - /** - * @inheritdoc IERC721 - * @notice Retrieving the address other than the token owner that is approved to transfer tokenId `tokenId` on behalf of its owner. - * - * @dev Compatible with ERC721 getApproved. - * - * @param tokenId The tokenId to query. - * @return The address of the operator for `tokenId`. - */ - function getApproved( - uint256 tokenId - ) public view virtual override returns (address) { - bytes32 tokenIdAsBytes32 = bytes32(tokenId); - _existsOrError(tokenIdAsBytes32); - - address[] memory operatorsForTokenId = getOperatorsOf(tokenIdAsBytes32); - uint256 operatorListLength = operatorsForTokenId.length; - - if (operatorListLength == 0) { - return address(0); - } else { - // Read the last added operator authorized to provide "best" compatibility. - // In ERC721 there is one operator address at a time for a tokenId, so multiple calls to - // `approve` would cause `getApproved` to return the last added operator. In this - // compatibility version the same is true, when the authorized operators were not previously - // authorized. If addresses are removed, then `getApproved` returned address can change due - // to implementation of `EnumberableSet._remove`. - return operatorsForTokenId[operatorListLength - 1]; - } - } - - /** - * @inheritdoc IERC721 - * @notice Checking if address `operator` is approved to transfer any tokenId owned by address `owner`. - * - * @dev Compatible with ERC721 isApprovedForAll. - * - * @param tokenOwner The tokenOwner address to query. - * @param operator The operator address to query. - * - * @return Returns if the `operator` is allowed to manage all of the assets of `owner` - */ - function isApprovedForAll( - address tokenOwner, - address operator - ) public view virtual override returns (bool) { - return _operatorApprovals[tokenOwner][operator]; - } - - /** - * @inheritdoc IERC721 - * @notice Calling `approve` function to approve operator at address `operator` to transfer tokenId `tokenId` on behalf of its owner. - * - * @dev Approval function compatible with ERC721 `approve(address,uint256)`. - * - * @param operator The address to approve for `tokenId`. - * @param tokenId The tokenId to approve. - */ - function approve( - address operator, - uint256 tokenId - ) public virtual override { - authorizeOperator(operator, bytes32(tokenId), ""); - } - - /** - * @inheritdoc IERC721 - * @notice Setting the "approval for all" status of operator `_operator` to `_approved` to allow it to transfer any tokenIds on behalf of `msg.sender`. - * - * @dev Enable or disable approval for a third party ("operator") to manage all of `msg.sender`'s assets. The contract MUST allow multiple operators per owner. - * See {_setApprovalForAll} - * - * @param operator Address to add to the set of authorized operators. - * @param approved True if the operator is approved, false to revoke approval. - * - * @custom:events {ApprovalForAll} event - */ - function setApprovalForAll( - address operator, - bool approved - ) public virtual override { - _setApprovalForAll(msg.sender, operator, approved); - } - - /** - * @inheritdoc IERC721 - * @notice Calling `transferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`. - * - * @dev Transfer functions from the ERC721 standard interface. - * - * @param from The sending address. - * @param to The receiving address. - * @param tokenId The tokenId to transfer. - * - * @custom:info This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - */ - function transferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { - _transfer(from, to, bytes32(tokenId), true, ""); - } - - /** - * @inheritdoc IERC721 - * @notice Calling `safeTransferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`. - * - * @dev Safe Transfer function without optional data from the ERC721 standard interface. - * - * @param from The sending address. - * @param to The receiving address. - * @param tokenId The tokenId to transfer. - * - * @custom:info This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { - _safeTransfer(from, to, tokenId, ""); - } - - /** - * @inheritdoc IERC721 - * @notice Calling `safeTransferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`. - * - * @dev Safe Transfer function with optional data from the ERC721 standard interface. - * - * @param from The sending address. - * @param to The receiving address. - * @param tokenId The tokenId to transfer. - * @param data The data to be sent with the transfer. - * - * @custom:info This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes memory data - ) public virtual override { - _safeTransfer(from, to, tokenId, data); - } - - // --- Overrides - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - * - * @custom:events - * - LSP7 {OperatorAuthorizationChanged} event. - * - ERC721 {Approval} event. - */ - function authorizeOperator( - address operator, - bytes32 tokenId, - bytes memory operatorNotificationData - ) public virtual override { - address tokenOwner = tokenOwnerOf(tokenId); - - if ( - tokenOwner != msg.sender && - !isApprovedForAll(tokenOwner, msg.sender) - ) { - revert LSP8NotTokenOwner(tokenOwner, tokenId, msg.sender); - } - - if (operator == address(0)) { - revert LSP8CannotUseAddressZeroAsOperator(); - } - - if (tokenOwner == operator) { - revert LSP8TokenOwnerCannotBeOperator(); - } - - bool isAdded = _operators[tokenId].add(operator); - if (!isAdded) revert LSP8OperatorAlreadyAuthorized(operator, tokenId); - - emit OperatorAuthorizationChanged( - operator, - tokenOwner, - tokenId, - operatorNotificationData - ); - emit Approval(tokenOwnerOf(tokenId), operator, uint256(tokenId)); - - bytes memory lsp1Data = abi.encode( - msg.sender, - tokenId, - operatorNotificationData - ); - operator.notifyUniversalReceiver(_TYPEID_LSP8_TOKENOPERATOR, lsp1Data); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - * - * @custom:events - * - LSP8 {Transfer} event. - * - ERC721 {Transfer} event. - */ - function _transfer( - address from, - address to, - bytes32 tokenId, - bool force, - bytes memory data - ) internal virtual override { - if ( - !isApprovedForAll(from, msg.sender) && - !_isOperatorOrOwner(msg.sender, tokenId) - ) { - revert LSP8NotTokenOperator(tokenId, msg.sender); - } - - emit Transfer(from, to, uint256(tokenId)); - super._transfer(from, to, tokenId, force, data); - } - - /** - * @dev Transfer the `tokenId` from `from` to `to` and check if the `to` recipient address is - * a contract that implements the `IERC721Received` interface and return the right magic value. - * See {_checkOnERC721Received} for more infos. - */ - function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes memory data - ) internal virtual { - _transfer(from, to, bytes32(tokenId), true, data); - require( - _checkOnERC721Received(from, to, tokenId, data), - "LSP8CompatibleERC721: transfer to non ERC721Receiver implementer" - ); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - * - * @custom:events - * - LSP8 {Transfer} event with `address(0)` as `from`. - * - ERC721 {Transfer} event with `address(0)` as `from`. - */ - function _mint( - address to, - bytes32 tokenId, - bool force, - bytes memory data - ) internal virtual override { - emit Transfer(address(0), to, uint256(tokenId)); - super._mint(to, tokenId, force, data); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - * - * @custom:events - * - LSP8 {Transfer} event with `address(0)` as the `to` address. - * - ERC721 {Transfer} event with `address(0)` as the `to` address. - */ - function _burn( - bytes32 tokenId, - bytes memory data - ) internal virtual override { - address tokenOwner = tokenOwnerOf(tokenId); - - emit Transfer(tokenOwner, address(0), uint256(tokenId)); - super._burn(tokenId, data); - } - - /** - * @dev Approve `operator` to operate on all tokens of `tokensOwner`. - * - * @custom:events {ApprovalForAll} event. - */ - function _setApprovalForAll( - address tokensOwner, - address operator, - bool approved - ) internal virtual { - require( - tokensOwner != operator, - "LSP8CompatibleERC721: approve to caller" - ); - _operatorApprovals[tokensOwner][operator] = approved; - emit ApprovalForAll(tokensOwner, operator, approved); - } - - /** - * @dev Internal function to invoke `IERC721Receiver.onERC721Received(...)` function on a target address. - * The call is not executed if the target address is not a contract. - * - * @param from address representing the previous owner of the given `tokenId`. - * @param to target address that will receive the token. - * @param tokenId uint256 ID of the token to be transferred. - * @param data bytes optional data to send along with the call. - * @return bool whether the call correctly returned the expected magic value. - */ - function _checkOnERC721Received( - address from, - address to, - uint256 tokenId, - bytes memory data - ) private returns (bool) { - if (to.code.length == 0) { - return true; - } - - try - IERC721Receiver(to).onERC721Received( - msg.sender, - from, - tokenId, - data - ) - returns (bytes4 retval) { - return retval == IERC721Receiver.onERC721Received.selector; - } catch (bytes memory reason) { - if (reason.length == 0) { - revert( - "LSP8CompatibleERC721: transfer to non ERC721Receiver implementer" - ); - } else { - // solhint-disable no-inline-assembly - /// @solidity memory-safe-assembly - assembly { - revert(add(32, reason), mload(reason)) - } - } - } - } -} diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721InitAbstract.sol b/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721InitAbstract.sol deleted file mode 100644 index 3a685f0d9..000000000 --- a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721InitAbstract.sol +++ /dev/null @@ -1,514 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.12; - -// interfaces -import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol"; -import { - IERC721Receiver -} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; -import { - IERC721Metadata, - IERC721 -} from "@openzeppelin/contracts/interfaces/IERC721Metadata.sol"; - -// libraries -import {BytesLib} from "solidity-bytes-utils/contracts/BytesLib.sol"; -import { - EnumerableSet -} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; -import {LSP1Utils} from "../../LSP1UniversalReceiver/LSP1Utils.sol"; - -// modules -import { - LSP8IdentifiableDigitalAssetCore, - LSP8IdentifiableDigitalAssetInitAbstract -} from "../LSP8IdentifiableDigitalAssetInitAbstract.sol"; - -// errors -import { - LSP8NotTokenOwner, - LSP8CannotUseAddressZeroAsOperator, - LSP8TokenOwnerCannotBeOperator, - LSP8OperatorAlreadyAuthorized, - LSP8NotTokenOperator -} from "../LSP8Errors.sol"; - -// constants -import { - _LSP4_METADATA_KEY, - _LSP4_TOKEN_NAME_KEY, - _LSP4_TOKEN_SYMBOL_KEY -} from "../../LSP4DigitalAssetMetadata/LSP4Constants.sol"; -import {_TYPEID_LSP8_TOKENOPERATOR} from "../LSP8Constants.sol"; - -/** - * @dev LSP8 extension, for compatibility for clients / tools that expect ERC721. - */ -abstract contract LSP8CompatibleERC721InitAbstract is - IERC721Metadata, - LSP8IdentifiableDigitalAssetInitAbstract -{ - using BytesLib for bytes; - using EnumerableSet for EnumerableSet.AddressSet; - using LSP1Utils for address; - - /** - * @dev Mapping from owner to operator approvals for backward compatibility with ERC721 - */ - mapping(address => mapping(address => bool)) private _operatorApprovals; - - /** - * @notice Initialize a `LSP8CompatibleERC721InitAbstract` token contract with: token name = `name_`, token symbol = `symbol_`, and - * address `newOwner_` as the token contract owner. - * - * @param name_ The name of the token. - * @param symbol_ The symbol of the token. - * @param newOwner_ The owner of the token contract. - * @param lsp4TokenType_ The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). - * @param lsp8TokenIdFormat_ The format of tokenIds (= NFTs) that this contract will create. - */ - - function _initialize( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_, - uint256 lsp8TokenIdFormat_ - ) internal virtual override onlyInitializing { - LSP8IdentifiableDigitalAssetInitAbstract._initialize( - name_, - symbol_, - newOwner_, - lsp4TokenType_, - lsp8TokenIdFormat_ - ); - } - - /** - * @inheritdoc IERC721Metadata - * @dev Returns the name of the token. - * For compatibility with clients & tools that expect ERC721. - * - * @return The name of the token - */ - function name() public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_TOKEN_NAME_KEY); - return string(data); - } - - /** - * @inheritdoc IERC721Metadata - * @dev Returns the symbol of the token, usually a shorter version of the name. - * For compatibility with clients & tools that expect ERC721. - * - * @return The symbol of the token - */ - function symbol() public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_TOKEN_SYMBOL_KEY); - return string(data); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - */ - function balanceOf( - address tokenOwner - ) - public - view - virtual - override(IERC721, LSP8IdentifiableDigitalAssetCore) - returns (uint256) - { - return super.balanceOf(tokenOwner); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetInitAbstract - */ - function supportsInterface( - bytes4 interfaceId - ) - public - view - virtual - override(IERC165, LSP8IdentifiableDigitalAssetInitAbstract) - returns (bool) - { - return - interfaceId == type(IERC721).interfaceId || - interfaceId == type(IERC721Metadata).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @inheritdoc IERC721Metadata - * @notice Retrieving the token URI of tokenId `tokenId`. - * - * @dev Compatible with ERC721Metadata tokenURI. Retrieve the tokenURI for a specific `tokenId`. - * - * @return The token URI. - */ - function tokenURI( - uint256 /* tokenId */ - ) public view virtual override returns (string memory) { - bytes memory data = _getData(_LSP4_METADATA_KEY); - - // offset = bytes4(hashSig) + bytes32(contentHash) -> 4 + 32 = 36 - uint256 offset = 36; - - bytes memory uriBytes = data.slice(offset, data.length - offset); - return string(uriBytes); - } - - /** - * @inheritdoc IERC721 - * @notice Retrieving the address that own tokenId `tokenId`. - * - * @dev Compatible with ERC721 ownerOf. - * - * @param tokenId The tokenId to query. - * @return The owner of the tokenId. - */ - function ownerOf( - uint256 tokenId - ) public view virtual override returns (address) { - return tokenOwnerOf(bytes32(tokenId)); - } - - /** - * @inheritdoc IERC721 - * @notice Retrieving the address other than the token owner that is approved to transfer tokenId `tokenId` on behalf of its owner. - * - * @dev Compatible with ERC721 getApproved. - * - * @param tokenId The tokenId to query. - * @return The address of the operator for `tokenId`. - */ - function getApproved( - uint256 tokenId - ) public view virtual override returns (address) { - bytes32 tokenIdAsBytes32 = bytes32(tokenId); - _existsOrError(tokenIdAsBytes32); - - address[] memory operatorsForTokenId = getOperatorsOf(tokenIdAsBytes32); - uint256 operatorListLength = operatorsForTokenId.length; - - if (operatorListLength == 0) { - return address(0); - } else { - // Read the last added operator authorized to provide "best" compatibility. - // In ERC721 there is one operator address at a time for a tokenId, so multiple calls to - // `approve` would cause `getApproved` to return the last added operator. In this - // compatibility version the same is true, when the authorized operators were not previously - // authorized. If addresses are removed, then `getApproved` returned address can change due - // to implementation of `EnumberableSet._remove`. - return operatorsForTokenId[operatorListLength - 1]; - } - } - - /** - * @inheritdoc IERC721 - * @notice Checking if address `operator` is approved to transfer any tokenId owned by address `owner`. - * - * @dev Compatible with ERC721 isApprovedForAll. - * - * @param tokenOwner The tokenOwner address to query. - * @param operator The operator address to query. - * - * @return Returns if the `operator` is allowed to manage all of the assets of `owner` - */ - function isApprovedForAll( - address tokenOwner, - address operator - ) public view virtual override returns (bool) { - return _operatorApprovals[tokenOwner][operator]; - } - - /** - * @inheritdoc IERC721 - * @notice Calling `approve` function to approve operator at address `operator` to transfer tokenId `tokenId` on behalf of its owner. - * - * @dev Approval function compatible with ERC721 `approve(address,uint256)`. - * - * @param operator The address to approve for `tokenId`. - * @param tokenId The tokenId to approve. - */ - function approve( - address operator, - uint256 tokenId - ) public virtual override { - authorizeOperator(operator, bytes32(tokenId), ""); - emit Approval(tokenOwnerOf(bytes32(tokenId)), operator, tokenId); - } - - /** - * @inheritdoc IERC721 - * @notice Setting the "approval for all" status of operator `_operator` to `_approved` to allow it to transfer any tokenIds on behalf of `msg.sender`. - * - * @dev Enable or disable approval for a third party ("operator") to manage all of `msg.sender`'s assets. The contract MUST allow multiple operators per owner. - * See {_setApprovalForAll} - * - * @param operator Address to add to the set of authorized operators. - * @param approved True if the operator is approved, false to revoke approval. - * - * @custom:events {ApprovalForAll} event - */ - function setApprovalForAll( - address operator, - bool approved - ) public virtual override { - _setApprovalForAll(msg.sender, operator, approved); - } - - /** - * @inheritdoc IERC721 - * @notice Calling `transferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`. - * - * @dev Transfer functions from the ERC721 standard interface. - * - * @param from The sending address. - * @param to The receiving address. - * @param tokenId The tokenId to transfer. - * - * @custom:info This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - */ - function transferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { - _transfer(from, to, bytes32(tokenId), true, ""); - } - - /** - * @inheritdoc IERC721 - * @notice Calling `safeTransferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`. - * - * @dev Safe Transfer function without optional data from the ERC721 standard interface. - * - * @param from The sending address. - * @param to The receiving address. - * @param tokenId The tokenId to transfer. - * - * @custom:info This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { - _safeTransfer(from, to, tokenId, ""); - } - - /** - * @inheritdoc IERC721 - * @notice Calling `safeTransferFrom` function with `data` to transfer tokenId `tokenId` from address `from` to address `to`. - * - * @dev Safe Transfer function with optional data from the ERC721 standard interface. - * - * @param from The sending address. - * @param to The receiving address. - * @param tokenId The tokenId to transfer. - * @param data The data to be sent with the transfer. - * - * @custom:info This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes memory data - ) public virtual override { - _safeTransfer(from, to, tokenId, data); - } - - // --- Overrides - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - * - * @custom:events - * - LSP7 {OperatorAuthorizationChanged} event. - * - ERC721 {Approval} event. - */ - function authorizeOperator( - address operator, - bytes32 tokenId, - bytes memory operatorNotificationData - ) public virtual override { - address tokenOwner = tokenOwnerOf(tokenId); - - if ( - tokenOwner != msg.sender && - !isApprovedForAll(tokenOwner, msg.sender) - ) { - revert LSP8NotTokenOwner(tokenOwner, tokenId, msg.sender); - } - - if (operator == address(0)) { - revert LSP8CannotUseAddressZeroAsOperator(); - } - - if (tokenOwner == operator) { - revert LSP8TokenOwnerCannotBeOperator(); - } - - bool isAdded = _operators[tokenId].add(operator); - if (!isAdded) revert LSP8OperatorAlreadyAuthorized(operator, tokenId); - - emit OperatorAuthorizationChanged( - operator, - tokenOwner, - tokenId, - operatorNotificationData - ); - emit Approval(tokenOwnerOf(tokenId), operator, uint256(tokenId)); - - bytes memory lsp1Data = abi.encode( - msg.sender, - tokenId, - operatorNotificationData - ); - operator.notifyUniversalReceiver(_TYPEID_LSP8_TOKENOPERATOR, lsp1Data); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - * - * @custom:events - * - LSP8 {Transfer} event. - * - ERC721 {Transfer} event. - */ - function _transfer( - address from, - address to, - bytes32 tokenId, - bool force, - bytes memory data - ) internal virtual override { - if ( - !isApprovedForAll(from, msg.sender) && - !_isOperatorOrOwner(msg.sender, tokenId) - ) { - revert LSP8NotTokenOperator(tokenId, msg.sender); - } - - emit Transfer(from, to, uint256(tokenId)); - super._transfer(from, to, tokenId, force, data); - } - - /** - * @dev Transfer the `tokenId` from `from` to `to` and check if the `to` recipient address is - * a contract that implements the `IERC721Received` interface and return the right magic value. - * See {_checkOnERC721Received} for more infos. - */ - function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes memory data - ) internal virtual { - _transfer(from, to, bytes32(tokenId), true, data); - require( - _checkOnERC721Received(from, to, tokenId, data), - "LSP8CompatibleERC721: transfer to non ERC721Receiver implementer" - ); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - * - * @custom:events - * - LSP8 {Transfer} event with `address(0)` as `from`. - * - ERC721 {Transfer} event with `address(0)` as `from`. - */ - function _mint( - address to, - bytes32 tokenId, - bool force, - bytes memory data - ) internal virtual override { - emit Transfer(address(0), to, uint256(tokenId)); - super._mint(to, tokenId, force, data); - } - - /** - * @inheritdoc LSP8IdentifiableDigitalAssetCore - * - * @custom:events - * - LSP8 {Transfer} event with `address(0)` as the `to` address. - * - ERC721 {Transfer} event with `address(0)` as the `to` address. - */ - function _burn( - bytes32 tokenId, - bytes memory data - ) internal virtual override { - address tokenOwner = tokenOwnerOf(tokenId); - - emit Transfer(tokenOwner, address(0), uint256(tokenId)); - super._burn(tokenId, data); - } - - /** - * @dev Approve `operator` to operate on all tokens of `tokensOwner`. - * - * @custom:events {ApprovalForAll} event. - */ - function _setApprovalForAll( - address tokensOwner, - address operator, - bool approved - ) internal virtual { - require( - tokensOwner != operator, - "LSP8CompatibleERC721: approve to caller" - ); - _operatorApprovals[tokensOwner][operator] = approved; - emit ApprovalForAll(tokensOwner, operator, approved); - } - - /** - * @dev Internal function to invoke `IERC721Receiver.onERC721Received(...)` function on a target address. - * The call is not executed if the target address is not a contract. - * - * @param from address representing the previous owner of the given `tokenId`. - * @param to target address that will receive the token. - * @param tokenId uint256 ID of the token to be transferred. - * @param data bytes optional data to send along with the call. - * @return bool whether the call correctly returned the expected magic value. - */ - function _checkOnERC721Received( - address from, - address to, - uint256 tokenId, - bytes memory data - ) private returns (bool) { - if (to.code.length == 0) { - return true; - } - - try - IERC721Receiver(to).onERC721Received( - msg.sender, - from, - tokenId, - data - ) - returns (bytes4 retval) { - return retval == IERC721Receiver.onERC721Received.selector; - } catch (bytes memory reason) { - if (reason.length == 0) { - revert( - "LSP8CompatibleERC721: transfer to non ERC721Receiver implementer" - ); - } else { - // solhint-disable no-inline-assembly - /// @solidity memory-safe-assembly - assembly { - revert(add(32, reason), mload(reason)) - } - } - } - } -} diff --git a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol b/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol deleted file mode 100644 index 981ee1a61..000000000 --- a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.12; - -import {LSP8CompatibleERC721} from "../extensions/LSP8CompatibleERC721.sol"; - -/** - * @title LSP8CompatibleERC721Mintable deployable preset contract with a public {mint} function callable only by the contract {owner}. - */ -contract LSP8CompatibleERC721Mintable is LSP8CompatibleERC721 { - /** - * @notice Deploying a `LSP8CompatibleERC721Mintable` token contract with: token name = `name_`, token symbol = `symbol_`, and - * address `newOwner_` as the token contract owner. - * - * @param name_ The name of the token. - * @param symbol_ The symbol of the token. - * @param newOwner_ The owner of the token contract. - * @param lsp4TokenType_ The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). - * @param lsp8TokenIdFormat_ The format of tokenIds (= NFTs) that this contract will create. - */ - constructor( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_, - uint256 lsp8TokenIdFormat_ - ) - LSP8CompatibleERC721( - name_, - symbol_, - newOwner_, - lsp4TokenType_, - lsp8TokenIdFormat_ - ) - {} - - /** - * @notice Minting tokenId `tokenId` for address `to` with the additional data `data` (Note: allow non-LSP1 recipient is set to `force`). - * - * @dev Public {_mint} function only callable by the {owner}. - * - * @param to The address that will receive the minted `tokenId`. - * @param tokenId The tokenId to mint. - * @param force Set to `false` to ensure that you are minting for a recipient that implements LSP1, `false` otherwise for forcing the minting. - * @param data Any addition data to be sent alongside the minting. - */ - function mint( - address to, - bytes32 tokenId, - bool force, - bytes memory data - ) public virtual onlyOwner { - _mint(to, tokenId, force, data); - } -} diff --git a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInit.sol b/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInit.sol deleted file mode 100644 index 9f82cdbf1..000000000 --- a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInit.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.12; - -// modules -import { - LSP8CompatibleERC721MintableInitAbstract -} from "./LSP8CompatibleERC721MintableInitAbstract.sol"; - -/** - * @title LSP8CompatibleERC721MintableInit deployable preset contract (proxy version) with a public mint function callable only by the contract {owner} - */ -contract LSP8CompatibleERC721MintableInit is - LSP8CompatibleERC721MintableInitAbstract -{ - /** - * @dev initialize (= lock) base implementation contract on deployment - */ - constructor() { - _disableInitializers(); - } - - /** - * @notice Initializing a `LSP8CompatibleERC721MintableInit` token contract with: token name = `name_`, token symbol = `symbol_`, and - * address `newOwner_` as the token contract owner. - * - * @param name_ The name of the token. - * @param symbol_ The symbol of the token. - * @param newOwner_ The owner of the token contract. - * @param lsp4TokenType_ The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). - * @param lsp8TokenIdFormat_ The format of tokenIds (= NFTs) that this contract will create. - */ - function initialize( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_, - uint256 lsp8TokenIdFormat_ - ) external virtual initializer { - LSP8CompatibleERC721MintableInitAbstract._initialize( - name_, - symbol_, - newOwner_, - lsp4TokenType_, - lsp8TokenIdFormat_ - ); - } -} diff --git a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInitAbstract.sol b/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInitAbstract.sol deleted file mode 100644 index 462e52d9b..000000000 --- a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721MintableInitAbstract.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.12; - -// modules -import { - LSP8CompatibleERC721InitAbstract -} from "../extensions/LSP8CompatibleERC721InitAbstract.sol"; - -/** - * @title LSP8CompatibleERC721MintableInitAbstract preset contract (inheritable proxy version) with a public mint function callable only by the contract {owner} - */ -contract LSP8CompatibleERC721MintableInitAbstract is - LSP8CompatibleERC721InitAbstract -{ - /** - * @inheritdoc LSP8CompatibleERC721InitAbstract - */ - function _initialize( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_, - uint256 lsp8TokenIdFormat_ - ) internal virtual override onlyInitializing { - LSP8CompatibleERC721InitAbstract._initialize( - name_, - symbol_, - newOwner_, - lsp4TokenType_, - lsp8TokenIdFormat_ - ); - } - - /** - * @notice Minting tokenId `tokenId` for address `to` with the additional data `data` (Note: allow non-LSP1 recipient is set to `force`). - * - * @dev Public {_mint} function only callable by the {owner}. - * - * @param to The address that will receive the minted `tokenId`. - * @param tokenId The tokenId to mint. - * @param force Set to `false` to ensure that you are minting for a recipient that implements LSP1, `false` otherwise for forcing the minting. - * @param data Any addition data to be sent alongside the minting. - */ - function mint( - address to, - bytes32 tokenId, - bool force, - bytes memory data - ) public virtual onlyOwner { - _mint(to, tokenId, force, data); - } -} diff --git a/contracts/Mocks/Tokens/LSP7CompatibleERC20InitTester.sol b/contracts/Mocks/Tokens/LSP7CompatibleERC20InitTester.sol deleted file mode 100644 index bf5b86e7e..000000000 --- a/contracts/Mocks/Tokens/LSP7CompatibleERC20InitTester.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.4; - -// modules -import { - LSP7CompatibleERC20InitAbstract -} from "../../LSP7DigitalAsset/extensions/LSP7CompatibleERC20InitAbstract.sol"; - -contract LSP7CompatibleERC20InitTester is LSP7CompatibleERC20InitAbstract { - /** - * @dev initialize (= lock) base implementation contract on deployment - */ - constructor() { - _disableInitializers(); - } - - function initialize( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_ - ) public initializer { - LSP7CompatibleERC20InitAbstract._initialize( - name_, - symbol_, - newOwner_, - lsp4TokenType_ - ); - } - - function mint(address to, uint256 amount, bytes calldata data) public { - // using force=true so we can send to EOA in test - _mint(to, amount, true, data); - } - - function burn(address from, uint256 amount, bytes calldata data) public { - _burn(from, amount, data); - } -} diff --git a/contracts/Mocks/Tokens/LSP7CompatibleERC20Tester.sol b/contracts/Mocks/Tokens/LSP7CompatibleERC20Tester.sol deleted file mode 100644 index 7a2bd280b..000000000 --- a/contracts/Mocks/Tokens/LSP7CompatibleERC20Tester.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.4; - -// modules -import { - LSP7CompatibleERC20 -} from "../../LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol"; - -contract LSP7CompatibleERC20Tester is LSP7CompatibleERC20 { - constructor( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_ - ) LSP7CompatibleERC20(name_, symbol_, newOwner_, lsp4TokenType_) {} - - function mint(address to, uint256 amount, bytes calldata data) public { - // using force=true so we can send to EOA in test - _mint(to, amount, true, data); - } - - function burn(address from, uint256 amount, bytes calldata data) public { - _burn(from, amount, data); - } -} diff --git a/contracts/Mocks/Tokens/LSP8CompatibleERC721Tester.sol b/contracts/Mocks/Tokens/LSP8CompatibleERC721Tester.sol deleted file mode 100644 index 29e32729e..000000000 --- a/contracts/Mocks/Tokens/LSP8CompatibleERC721Tester.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.4; - -// modules -import { - LSP8CompatibleERC721 -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol"; - -// constants -import { - _LSP4_METADATA_KEY -} from "../../LSP4DigitalAssetMetadata/LSP4Constants.sol"; - -contract LSP8CompatibleERC721Tester is LSP8CompatibleERC721 { - constructor( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_, - uint256 lsp8TokenIdFormat_, - bytes memory tokenURIValue_ - ) - LSP8CompatibleERC721( - name_, - symbol_, - newOwner_, - lsp4TokenType_, - lsp8TokenIdFormat_ - ) - { - _setData(_LSP4_METADATA_KEY, tokenURIValue_); - } - - function mint(address to, uint256 tokenId, bytes calldata data) public { - // using force=true so we can send to EOA in test - _mint(to, bytes32(tokenId), true, data); - } - - function burn(uint256 tokenId, bytes calldata data) public { - _burn(bytes32(tokenId), data); - } -} diff --git a/contracts/Mocks/Tokens/LSP8CompatibleERC721TesterInit.sol b/contracts/Mocks/Tokens/LSP8CompatibleERC721TesterInit.sol deleted file mode 100644 index ddcab4dfd..000000000 --- a/contracts/Mocks/Tokens/LSP8CompatibleERC721TesterInit.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.4; - -// modules -import { - LSP8CompatibleERC721InitAbstract -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721InitAbstract.sol"; - -// constants -import { - _LSP4_METADATA_KEY -} from "../../LSP4DigitalAssetMetadata/LSP4Constants.sol"; - -contract LSP8CompatibleERC721InitTester is LSP8CompatibleERC721InitAbstract { - /** - * @dev initialize (= lock) base implementation contract on deployment - */ - constructor() { - _disableInitializers(); - } - - function initialize( - string memory name_, - string memory symbol_, - address newOwner_, - uint256 lsp4TokenType_, - uint256 lsp8TokenIdFormat_, - bytes memory tokenURIValue_ - ) public virtual initializer { - LSP8CompatibleERC721InitAbstract._initialize( - name_, - symbol_, - newOwner_, - lsp4TokenType_, - lsp8TokenIdFormat_ - ); - - _setData(_LSP4_METADATA_KEY, tokenURIValue_); - } - - function mint(address to, uint256 tokenId, bytes calldata data) public { - // using force=true so we can send to EOA in test - _mint(to, bytes32(tokenId), true, data); - } - - function burn(uint256 tokenId, bytes calldata data) public { - _burn(bytes32(tokenId), data); - } -} diff --git a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md b/docs/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md deleted file mode 100644 index c19ca619d..000000000 --- a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.md +++ /dev/null @@ -1,1991 +0,0 @@ - - - -# LSP7CompatibleERC20 - -:::info Standard Specifications - -[`LSP-7-DigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md) - -::: -:::info Solidity implementation - -[`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) - -::: - -LSP7 extension, for compatibility for clients / tools that expect ERC20. - -## Public Methods - -Public methods are accessible externally from users, allowing interaction with this function from dApps or other smart contracts. -When marked as 'public', a method can be called both externally and internally, on the other hand, when marked as 'external', a method can only be called externally. - -### fallback - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#fallback) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) - -::: - -```solidity -fallback(bytes calldata callData) external payable returns (bytes memory); -``` - -_The `fallback` function was called with the following amount of native tokens: `msg.value`; and the following calldata: `callData`._ - -Achieves the goal of [LSP-17-ContractExtension] standard by extending the contract to handle calls of functions that do not exist natively, -forwarding the function call to the extension address mapped to the function being called. -This function is executed when: - -- Sending data of length less than 4 bytes to the contract. - -- The first 4 bytes of the calldata do not match any publicly callable functions from the contract ABI. - -- Receiving native tokens - -1. If the data is equal or longer than 4 bytes, the [ERC-725Y] storage is queried with the following data key: [_LSP17_EXTENSION_PREFIX] + `bytes4(msg.sig)` (Check [LSP-2-ERC725YJSONSchema] for encoding the data key) - -- If there is no address stored under the following data key, revert with [`NoExtensionFoundForFunctionSelector(bytes4)`](#noextensionfoundforfunctionselector). The data key relative to `bytes4(0)` is an exception, where no reverts occurs if there is no extension address stored under. This exception is made to allow users to send random data (graffiti) to the account and to be able to react on it. - -- If there is an address, forward the `msg.data` to the extension using the CALL opcode, appending 52 bytes (20 bytes of `msg.sender` and 32 bytes of `msg.value`). Return what the calls returns, or revert if the call failed. - -2. If the data sent to this function is of length less than 4 bytes (not a function selector), revert. - -
- -### receive - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#receive) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) - -::: - -```solidity -receive() external payable; -``` - -_LSP7 contract cannot receive native tokens._ - -Reverts whenever someone tries to send native tokens to a LSP7 contract. - -
- -### allowance - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#allowance) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `allowance(address,address)` -- Function selector: `0xdd62ed3e` - -::: - -```solidity -function allowance( - address tokenOwner, - address operator -) external view returns (uint256); -``` - -Function to get operator allowance allowed to spend on behalf of `tokenOwner` from the ERC20 standard interface. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ---------------------------------------- | -| `tokenOwner` | `address` | The address of the token owner | -| `operator` | `address` | The address approved by the `tokenOwner` | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------------------- | -| `0` | `uint256` | The amount `operator` is approved by `tokenOwner` | - -
- -### approve - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#approve) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `approve(address,uint256)` -- Function selector: `0x095ea7b3` - -::: - -```solidity -function approve( - address operator, - uint256 amount -) external nonpayable returns (bool); -``` - -Approval function from th ERC20 standard interface. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------------------------------- | -| `operator` | `address` | The address to approve for `amount` | -| `amount` | `uint256` | The amount to approve. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ------------------------------ | -| `0` | `bool` | `true` on successful approval. | - -
- -### authorizeOperator - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `authorizeOperator(address,uint256,bytes)` -- Function selector: `0xb49506fd` - -::: - -:::danger - -To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to use the [`increaseAllowance`](#increaseallowance) and [`decreaseAllowance`](#decreaseallowance) functions. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ - -::: - -```solidity -function authorizeOperator( - address operator, - uint256 amount, - bytes operatorNotificationData -) external nonpayable; -``` - -Sets an `amount` of tokens that an `operator` has access from the caller's balance (allowance). See [`authorizedAmountFor`](#authorizedamountfor). Notify the operator based on the LSP1-UniversalReceiver standard - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ------------------------------------------------------ | -| `operator` | `address` | The address to authorize as an operator. | -| `amount` | `uint256` | The allowance amount of tokens operator has access to. | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### authorizedAmountFor - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `authorizedAmountFor(address,address)` -- Function selector: `0x65aeaa95` - -::: - -```solidity -function authorizedAmountFor( - address operator, - address tokenOwner -) external view returns (uint256); -``` - -Get the amount of tokens `operator` address has access to from `tokenOwner`. Operators can send and burn tokens on behalf of their owners. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ---------------------------------------------------------- | -| `operator` | `address` | The operator's address to query the authorized amount for. | -| `tokenOwner` | `address` | The token owner that `operator` has allowance on. | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | --------------------------------------------------------------------------------------- | -| `0` | `uint256` | The amount of tokens the `operator`'s address has access on the `tokenOwner`'s balance. | - -
- -### balanceOf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#balanceof) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `balanceOf(address)` -- Function selector: `0x70a08231` - -::: - -```solidity -function balanceOf(address tokenOwner) external view returns (uint256); -``` - -Get the number of tokens owned by `tokenOwner`. If the token is divisible (the [`decimals`](#decimals) function returns `18`), the amount returned should be divided by 1e18 to get a better picture of the actual balance of the `tokenOwner`. _Example:_ `balanceOf(someAddress) -> 42_000_000_000_000_000_000 / 1e18 = 42 tokens` - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | --------------------------------------------------------- | -| `tokenOwner` | `address` | The address of the token holder to query the balance for. | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------------- | -| `0` | `uint256` | The amount of tokens owned by `tokenOwner`. | - -
- -### batchCalls - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `batchCalls(bytes[])` -- Function selector: `0x6963d438` - -::: - -:::info - -It's not possible to send value along the functions call due to the use of `delegatecall`. - -::: - -```solidity -function batchCalls(bytes[] data) external nonpayable returns (bytes[] results); -``` - -_Executing the following batch of abi-encoded function calls on the contract: `data`._ - -Allows a caller to batch different function calls in one call. Perform a `delegatecall` on self, to call different functions with preserving the context. - -#### Parameters - -| Name | Type | Description | -| ------ | :-------: | -------------------------------------------------------------------- | -| `data` | `bytes[]` | An array of ABI encoded function calls to be called on the contract. | - -#### Returns - -| Name | Type | Description | -| --------- | :-------: | ---------------------------------------------------------------- | -| `results` | `bytes[]` | An array of abi-encoded data returned by the functions executed. | - -
- -### decimals - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decimals) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `decimals()` -- Function selector: `0x313ce567` - -::: - -```solidity -function decimals() external view returns (uint8); -``` - -Returns the number of decimals used to get its user representation. If the asset contract has been set to be non-divisible via the `isNonDivisible_` parameter in the `constructor`, the decimals returned wiil be `0`. Otherwise `18` is the common value. - -#### Returns - -| Name | Type | Description | -| ---- | :-----: | ----------------------------------------------------------------------- | -| `0` | `uint8` | the number of decimals. If `0` is returned, the asset is non-divisible. | - -
- -### decreaseAllowance - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `decreaseAllowance(address,uint256,bytes)` -- Function selector: `0x7b204c4e` - -::: - -```solidity -function decreaseAllowance( - address operator, - uint256 subtractedAmount, - bytes operatorNotificationData -) external nonpayable; -``` - -_Decrease the allowance of `operator` by -`subtractedAmount`_ - -Atomically decreases the allowance granted to `operator` by the caller. This is an alternative approach to [`authorizeOperator`](#authorizeoperator) that can be used as a mitigation for the double spending allowance problem. Notify the operator based on the LSP1-UniversalReceiver standard - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ------------------------------------------------------ | -| `operator` | `address` | The operator to decrease allowance for `msg.sender` | -| `subtractedAmount` | `uint256` | The amount to decrease by in the operator's allowance. | -| `operatorNotificationData` | `bytes` | - | - -
- -### getData - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdata) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `getData(bytes32)` -- Function selector: `0x54f6127f` - -::: - -```solidity -function getData(bytes32 dataKey) external view returns (bytes dataValue); -``` - -_Reading the ERC725Y storage for data key `dataKey` returned the following value: `dataValue`._ - -Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey`. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | --------------------------------------------- | -| `dataKey` | `bytes32` | The data key for which to retrieve the value. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ---------------------------------------------------- | -| `dataValue` | `bytes` | The bytes value stored under the specified data key. | - -
- -### getDataBatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `getDataBatch(bytes32[])` -- Function selector: `0xdedff9c6` - -::: - -```solidity -function getDataBatch( - bytes32[] dataKeys -) external view returns (bytes[] dataValues); -``` - -_Reading the ERC725Y storage for data keys `dataKeys` returned the following values: `dataValues`._ - -Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :---------: | ------------------------------------------ | -| `dataKeys` | `bytes32[]` | The array of keys which values to retrieve | - -#### Returns - -| Name | Type | Description | -| ------------ | :-------: | ----------------------------------------- | -| `dataValues` | `bytes[]` | The array of data stored at multiple keys | - -
- -### getOperatorsOf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `getOperatorsOf(address)` -- Function selector: `0xd72fc29a` - -::: - -```solidity -function getOperatorsOf(address tokenOwner) external view returns (address[]); -``` - -Returns all `operator` addresses that are allowed to transfer or burn on behalf of `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ----------------------------------------- | -| `tokenOwner` | `address` | The token owner to get the operators for. | - -#### Returns - -| Name | Type | Description | -| ---- | :---------: | ----------------------------------------------------------------------------------- | -| `0` | `address[]` | An array of operators allowed to transfer or burn tokens on behalf of `tokenOwner`. | - -
- -### increaseAllowance - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `increaseAllowance(address,uint256,bytes)` -- Function selector: `0x2bc1da82` - -::: - -```solidity -function increaseAllowance( - address operator, - uint256 addedAmount, - bytes operatorNotificationData -) external nonpayable; -``` - -_Increase the allowance of `operator` by +`addedAmount`_ - -Atomically increases the allowance granted to `operator` by the caller. This is an alternative approach to [`authorizeOperator`](#authorizeoperator) that can be used as a mitigation for the double spending allowance problem. Notify the operator based on the LSP1-UniversalReceiver standard - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ----------------------------------------------------------------------- | -| `operator` | `address` | The operator to increase the allowance for `msg.sender` | -| `addedAmount` | `uint256` | The additional amount to add on top of the current operator's allowance | -| `operatorNotificationData` | `bytes` | - | - -
- -### name - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#name) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `name()` -- Function selector: `0x06fdde03` - -::: - -```solidity -function name() external view returns (string); -``` - -Returns the name of the token. For compatibility with clients & tools that expect ERC20. - -#### Returns - -| Name | Type | Description | -| ---- | :------: | --------------------- | -| `0` | `string` | The name of the token | - -
- -### owner - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#owner) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `owner()` -- Function selector: `0x8da5cb5b` - -::: - -```solidity -function owner() external view returns (address); -``` - -Returns the address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------- | -| `0` | `address` | - | - -
- -### renounceOwnership - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `renounceOwnership()` -- Function selector: `0x715018a6` - -::: - -```solidity -function renounceOwnership() external nonpayable; -``` - -Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner. - -
- -### revokeOperator - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `revokeOperator(address,bool,bytes)` -- Function selector: `0x4521748e` - -::: - -```solidity -function revokeOperator( - address operator, - bool notify, - bytes operatorNotificationData -) external nonpayable; -``` - -Removes the `operator` address as an operator of callers tokens, disallowing it to send any amount of tokens on behalf of the token owner (the caller of the function `msg.sender`). See also [`authorizedAmountFor`](#authorizedamountfor). - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | --------------------------------------------------------- | -| `operator` | `address` | The address to revoke as an operator. | -| `notify` | `bool` | Boolean indicating whether to notify the operator or not. | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### setData - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdata) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `setData(bytes32,bytes)` -- Function selector: `0x7f23690c` - -::: - -:::caution Warning - -**Note for developers:** despite the fact that this function is set as `payable`, if the function is not intended to receive value (= native tokens), **an additional check should be implemented to ensure that `msg.value` sent was equal to 0**. - -::: - -```solidity -function setData(bytes32 dataKey, bytes dataValue) external payable; -``` - -_Setting the following data key value pair in the ERC725Y storage. Data key: `dataKey`, data value: `dataValue`._ - -Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data key `dataKey`. The function is marked as payable to enable flexibility on child contracts. For instance to implement a fee mechanism for setting specific data. - -
- -**Requirements:** - -- SHOULD only be callable by the [`owner`](#owner). - -
- -
- -**Emitted events:** - -- [`DataChanged`](#datachanged) event. - -
- -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ------------------------------------------ | -| `dataKey` | `bytes32` | The data key for which to set a new value. | -| `dataValue` | `bytes` | The new bytes value to set. | - -
- -### setDataBatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `setDataBatch(bytes32[],bytes[])` -- Function selector: `0x97902421` - -::: - -:::caution Warning - -**Note for developers:** despite the fact that this function is set as `payable`, if the function is not intended to receive value (= native tokens), **an additional check should be implemented to ensure that `msg.value` sent was equal to 0**. - -::: - -```solidity -function setDataBatch(bytes32[] dataKeys, bytes[] dataValues) external payable; -``` - -_Setting the following data key value pairs in the ERC725Y storage. Data keys: `dataKeys`, data values: `dataValues`._ - -Batch data setting function that behaves the same as [`setData`](#setdata) but allowing to set multiple data key/value pairs in the ERC725Y storage in the same transaction. - -
- -**Requirements:** - -- SHOULD only be callable by the [`owner`](#owner) of the contract. - -
- -
- -**Emitted events:** - -- [`DataChanged`](#datachanged) event **for each data key/value pair set**. - -
- -#### Parameters - -| Name | Type | Description | -| ------------ | :---------: | ---------------------------------------------------- | -| `dataKeys` | `bytes32[]` | An array of data keys to set bytes values for. | -| `dataValues` | `bytes[]` | An array of bytes values to set for each `dataKeys`. | - -
- -### supportsInterface - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `supportsInterface(bytes4)` -- Function selector: `0x01ffc9a7` - -::: - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool); -``` - -Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas. - -#### Parameters - -| Name | Type | Description | -| ------------- | :------: | ----------- | -| `interfaceId` | `bytes4` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ----------- | -| `0` | `bool` | - | - -
- -### symbol - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#symbol) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `symbol()` -- Function selector: `0x95d89b41` - -::: - -```solidity -function symbol() external view returns (string); -``` - -Returns the symbol of the token, usually a shorter version of the name. For compatibility with clients & tools that expect ERC20. - -#### Returns - -| Name | Type | Description | -| ---- | :------: | ----------------------- | -| `0` | `string` | The symbol of the token | - -
- -### totalSupply - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `totalSupply()` -- Function selector: `0x18160ddd` - -::: - -```solidity -function totalSupply() external view returns (uint256); -``` - -Returns the number of existing tokens that have been minted in this contract. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------ | -| `0` | `uint256` | The number of existing tokens. | - -
- -### transfer - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `transfer(address,address,uint256,bool,bytes)` -- Function selector: `0x760d9bba` - -::: - -```solidity -function transfer( - address from, - address to, - uint256 amount, - bool force, - bytes data -) external nonpayable; -``` - -Transfers an `amount` of tokens from the `from` address to the `to` address and notify both sender and recipients via the LSP1 [`universalReceiver(...)`](#`universalreceiver) function. If the tokens are transferred by an operator on behalf of a token holder, the allowance for the operator will be decreased by `amount` once the token transfer has been completed (See [`authorizedAmountFor`](#authorizedamountfor)). - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | `address` | The sender address. | -| `to` | `address` | The recipient address. | -| `amount` | `uint256` | The amount of tokens to transfer. | -| `force` | `bool` | When set to `true`, the `to` address CAN be any address. When set to `false`, the `to` address MUST be a contract that supports the LSP1 UniversalReceiver standard. | -| `data` | `bytes` | Any additional data the caller wants included in the emitted event, and sent in the hooks of the `from` and `to` addresses. | - -
- -### transfer - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `transfer(address,uint256)` -- Function selector: `0xa9059cbb` - -::: - -:::info - -This function uses the `force` parameter as `true` so that EOA and any contract can receive tokens. - -::: - -```solidity -function transfer( - address to, - uint256 amount -) external nonpayable returns (bool); -``` - -Transfer function from the ERC20 standard interface. - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | --------------------------------- | -| `to` | `address` | The address receiving tokens. | -| `amount` | `uint256` | The amount of tokens to transfer. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ------------------------------ | -| `0` | `bool` | `true` on successful transfer. | - -
- -### transferBatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `transferBatch(address[],address[],uint256[],bool[],bytes[])` -- Function selector: `0x2d7667c9` - -::: - -```solidity -function transferBatch( - address[] from, - address[] to, - uint256[] amount, - bool[] force, - bytes[] data -) external nonpayable; -``` - -Same as [`transfer(...)`](#`transfer) but transfer multiple tokens based on the arrays of `from`, `to`, `amount`. - -#### Parameters - -| Name | Type | Description | -| -------- | :---------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | `address[]` | An array of sending addresses. | -| `to` | `address[]` | An array of receiving addresses. | -| `amount` | `uint256[]` | An array of amount of tokens to transfer for each `from -> to` transfer. | -| `force` | `bool[]` | For each transfer, when set to `true`, the `to` address CAN be any address. When set to `false`, the `to` address MUST be a contract that supports the LSP1 UniversalReceiver standard. | -| `data` | `bytes[]` | An array of additional data the caller wants included in the emitted event, and sent in the hooks to `from` and `to` addresses. | - -
- -### transferFrom - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferfrom) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `transferFrom(address,address,uint256)` -- Function selector: `0x23b872dd` - -::: - -:::info - -This function uses the `force` parameter as `true` so that EOA and any contract can receive tokens. - -::: - -```solidity -function transferFrom( - address from, - address to, - uint256 amount -) external nonpayable returns (bool); -``` - -Transfer functions for operators from the ERC20 standard interface. - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | --------------------------------- | -| `from` | `address` | The address sending tokens. | -| `to` | `address` | The address receiving tokens. | -| `amount` | `uint256` | The amount of tokens to transfer. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ------------------------------ | -| `0` | `bool` | `true` on successful transfer. | - -
- -### transferOwnership - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferownership) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Function signature: `transferOwnership(address)` -- Function selector: `0xf2fde38b` - -::: - -```solidity -function transferOwnership(address newOwner) external nonpayable; -``` - -Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `newOwner` | `address` | - | - -
- -## Internal Methods - -Any method labeled as `internal` serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs. - -Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities. - -### \_checkOwner - -```solidity -function _checkOwner() internal view; -``` - -Throws if the sender is not the owner. - -
- -### \_setOwner - -```solidity -function _setOwner(address newOwner) internal nonpayable; -``` - -Changes the owner if `newOwner` and oldOwner are different -This pattern is useful in inheritance. - -
- -### \_getData - -```solidity -function _getData(bytes32 dataKey) internal view returns (bytes dataValue); -``` - -Read the value stored under a specific `dataKey` inside the underlying ERC725Y storage, -represented as a mapping of `bytes32` data keys mapped to their `bytes` data values. - -```solidity -mapping(bytes32 => bytes) _store -``` - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------------------------------------------------------------------- | -| `dataKey` | `bytes32` | A bytes32 data key to read the associated `bytes` value from the store. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ----------------------------------------------------------------------------- | -| `dataValue` | `bytes` | The `bytes` value associated with the given `dataKey` in the ERC725Y storage. | - -
- -### \_setData - -```solidity -function _setData(bytes32 dataKey, bytes dataValue) internal nonpayable; -``` - -The ERC725Y data keys `LSP4TokenName` and `LSP4TokenSymbol` cannot be changed -via this function once the digital asset contract has been deployed. - -
- -### \_updateOperator - -```solidity -function _updateOperator( - address tokenOwner, - address operator, - uint256 amount, - bool notified, - bytes operatorNotificationData -) internal nonpayable; -``` - -
- -### \_mint - -```solidity -function _mint( - address to, - uint256 amount, - bool force, - bytes data -) internal nonpayable; -``` - -
- -### \_burn - -```solidity -function _burn(address from, uint256 amount, bytes data) internal nonpayable; -``` - -
- -### \_spendAllowance - -```solidity -function _spendAllowance( - address operator, - address tokenOwner, - uint256 amountToSpend -) internal nonpayable; -``` - -Spend `amountToSpend` from the `operator`'s authorized on behalf of the `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ------------------------------------------------------------------- | -| `operator` | `address` | The address of the operator to decrease the allowance of. | -| `tokenOwner` | `address` | The address that granted an allowance on its balance to `operator`. | -| `amountToSpend` | `uint256` | The amount of tokens to substract in allowance of `operator`. | - -
- -### \_transfer - -```solidity -function _transfer( - address from, - address to, - uint256 amount, - bool force, - bytes data -) internal nonpayable; -``` - -
- -### \_beforeTokenTransfer - -```solidity -function _beforeTokenTransfer( - address from, - address to, - uint256 amount, - bytes data -) internal nonpayable; -``` - -Hook that is called before any token transfer, including minting and burning. -Allows to run custom logic before updating balances and notifiying sender/recipient by overriding this function. - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | ------------------------------------ | -| `from` | `address` | The sender address | -| `to` | `address` | The recipient address | -| `amount` | `uint256` | The amount of token to transfer | -| `data` | `bytes` | The data sent alongside the transfer | - -
- -### \_afterTokenTransfer - -```solidity -function _afterTokenTransfer( - address from, - address to, - uint256 amount, - bytes data -) internal nonpayable; -``` - -Hook that is called after any token transfer, including minting and burning. -Allows to run custom logic after updating balances, but **before notifiying sender/recipient** by overriding this function. - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | ------------------------------------ | -| `from` | `address` | The sender address | -| `to` | `address` | The recipient address | -| `amount` | `uint256` | The amount of token to transfer | -| `data` | `bytes` | The data sent alongside the transfer | - -
- -### \_notifyTokenOperator - -```solidity -function _notifyTokenOperator( - address operator, - bytes lsp1Data -) internal nonpayable; -``` - -Attempt to notify the operator `operator` about the `amount` tokens being authorized with. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP7_TOKENOPERATOR` as typeId, if `operator` is a contract that supports the LSP1 interface. -If `operator` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------------------------ | -| `operator` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `lsp1Data` | `bytes` | the data to be sent to the `operator` address in the `universalReceiver` call. | - -
- -### \_notifyTokenSender - -```solidity -function _notifyTokenSender(address from, bytes lsp1Data) internal nonpayable; -``` - -Attempt to notify the token sender `from` about the `amount` of tokens being transferred. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP7_TOKENSSENDER` as typeId, if `from` is a contract that supports the LSP1 interface. -If `from` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------------------------ | -| `from` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `lsp1Data` | `bytes` | the data to be sent to the `from` address in the `universalReceiver` call. | - -
- -### \_notifyTokenReceiver - -```solidity -function _notifyTokenReceiver( - address to, - bool force, - bytes lsp1Data -) internal nonpayable; -``` - -Attempt to notify the token receiver `to` about the `amount` tokens being received. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP7_TOKENSRECIPIENT` as typeId, if `to` is a contract that supports the LSP1 interface. -If `to` is is an EOA or a contract that does not support the LSP1 interface, the behaviour will depend on the `force` boolean flag. - -- if `force` is set to `true`, nothing will happen and no notification will be sent. - -- if `force` is set to `false, the transaction will revert. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | --------------------------------------------------------------------------------------------------- | -| `to` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `force` | `bool` | A boolean that describe if transfer to a `to` address that does not support LSP1 is allowed or not. | -| `lsp1Data` | `bytes` | The data to be sent to the `to` address in the `universalReceiver(...)` call. | - -
- -### \_supportsInterfaceInERC165Extension - -```solidity -function _supportsInterfaceInERC165Extension( - bytes4 interfaceId -) internal view returns (bool); -``` - -Returns whether the interfaceId being checked is supported in the extension of the -[`supportsInterface`](#supportsinterface) selector. -To be used by extendable contracts wishing to extend the ERC165 interfaceIds originally -supported by reading whether the interfaceId queried is supported in the `supportsInterface` -extension if the extension is set, if not it returns false. - -
- -### \_getExtensionAndForwardValue - -```solidity -function _getExtensionAndForwardValue( - bytes4 functionSelector -) internal view returns (address, bool); -``` - -Returns the extension address stored under the following data key: - -- [`_LSP17_EXTENSION_PREFIX`](#_lsp17_extension_prefix) + `` (Check [LSP2-ERC725YJSONSchema] for encoding the data key). - -- If no extension is stored, returns the address(0). - -- we do not check that payable bool as in lsp7 standard we will always forward the value to the extension - -
- -### \_fallbackLSP17Extendable - -:::info - -The LSP7 Token contract should not hold any native tokens. Any native tokens received by the contract -will be forwarded to the extension address mapped to the selector from `msg.sig`. - -::: - -```solidity -function _fallbackLSP17Extendable( - bytes callData -) internal nonpayable returns (bytes); -``` - -Forwards the call with the received value to an extension mapped to a function selector. -Calls [`_getExtensionAndForwardValue`](#_getextensionandforwardvalue) to get the address of the extension mapped to the function selector being -called on the account. If there is no extension, the address(0) will be returned. -Forwards the value if the extension is payable. -Reverts if there is no extension for the function being called. -If there is an extension for the function selector being called, it calls the extension with the -CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of the [`msg.sender`](#msg.sender) and -32 bytes of the [`msg.value`](#msg.value) - -
- -## Events - -### Approval - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#approval) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Event signature: `Approval(address,address,uint256)` -- Event topic hash: `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` - -::: - -```solidity -event Approval(address indexed owner, address indexed spender, uint256 value); -``` - -Emitted when the allowance of a `spender` for an `owner` is set by a call to [`approve`](#approve). `value` is the new allowance. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | ----------- | -| `owner` **`indexed`** | `address` | - | -| `spender` **`indexed`** | `address` | - | -| `value` | `uint256` | - | - -
- -### DataChanged - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#datachanged) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Event signature: `DataChanged(bytes32,bytes)` -- Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` - -::: - -```solidity -event DataChanged(bytes32 indexed dataKey, bytes dataValue); -``` - -_The following data key/value pair has been changed in the ERC725Y storage: Data key: `dataKey`, data value: `dataValue`._ - -Emitted when data at a specific `dataKey` was changed to a new value `dataValue`. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | -------------------------------------------- | -| `dataKey` **`indexed`** | `bytes32` | The data key for which a bytes value is set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### OperatorAuthorizationChanged - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Event signature: `OperatorAuthorizationChanged(address,address,uint256,bytes)` -- Event topic hash: `0xf772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d` - -::: - -```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, uint256 indexed amount, bytes operatorNotificationData); -``` - -Emitted when `tokenOwner` enables `operator` for `amount` tokens. - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ----------------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address authorized as an operator | -| `tokenOwner` **`indexed`** | `address` | The token owner | -| `amount` **`indexed`** | `uint256` | The amount of tokens `operator` address has access to from `tokenOwner` | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### OperatorRevoked - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Event signature: `OperatorRevoked(address,address,bool,bytes)` -- Event topic hash: `0x0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167` - -::: - -```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bool indexed notified, bytes operatorNotificationData); -``` - -Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [`authorizedAmountFor(...)`](#`authorizedamountfor) to `0`. - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address revoked from operating | -| `tokenOwner` **`indexed`** | `address` | The token owner | -| `notified` **`indexed`** | `bool` | Bool indicating whether the operator has been notified or not | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### OwnershipTransferred - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Event signature: `OwnershipTransferred(address,address)` -- Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` - -::: - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------------- | :-------: | ----------- | -| `previousOwner` **`indexed`** | `address` | - | -| `newOwner` **`indexed`** | `address` | - | - -
- -### Transfer - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Event signature: `Transfer(address,address,address,uint256,bool,bytes)` -- Event topic hash: `0x3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a6` - -::: - -```solidity -event Transfer(address indexed operator, address indexed from, address indexed to, uint256 amount, bool force, bytes data); -``` - -Emitted when the `from` transferred successfully `amount` of tokens to `to`. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | ---------------------------------------------------------------------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address of the operator that executed the transfer. | -| `from` **`indexed`** | `address` | The address which tokens were sent from (balance decreased by `-amount`). | -| `to` **`indexed`** | `address` | The address that received the tokens (balance increased by `+amount`). | -| `amount` | `uint256` | The amount of tokens transferred. | -| `force` | `bool` | if the transferred enforced the `to` recipient address to be a contract that implements the LSP1 standard or not. | -| `data` | `bytes` | Any additional data included by the caller during the transfer, and sent in the LSP1 hooks to the `from` and `to` addresses. | - -
- -### Transfer - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Event signature: `Transfer(address,address,uint256)` -- Event topic hash: `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` - -::: - -```solidity -event Transfer(address indexed from, address indexed to, uint256 value); -``` - -Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero. - -#### Parameters - -| Name | Type | Description | -| -------------------- | :-------: | ----------- | -| `from` **`indexed`** | `address` | - | -| `to` **`indexed`** | `address` | - | -| `value` | `uint256` | - | - -
- -## Errors - -### ERC725Y_DataKeysValuesEmptyArray - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `ERC725Y_DataKeysValuesEmptyArray()` -- Error hash: `0x97da5f95` - -::: - -```solidity -error ERC725Y_DataKeysValuesEmptyArray(); -``` - -Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabatch) function is an empty array. - -
- -### ERC725Y_DataKeysValuesLengthMismatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` -- Error hash: `0x3bcc8979` - -::: - -```solidity -error ERC725Y_DataKeysValuesLengthMismatch(); -``` - -Reverts when there is not the same number of elements in the `datakeys` and `dataValues` array parameters provided when calling the [`setDataBatch`](#setdatabatch) function. - -
- -### ERC725Y_MsgValueDisallowed - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `ERC725Y_MsgValueDisallowed()` -- Error hash: `0xf36ba737` - -::: - -```solidity -error ERC725Y_MsgValueDisallowed(); -``` - -Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#setdatabatch) function. - -
- -### InvalidExtensionAddress - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `InvalidExtensionAddress(bytes)` -- Error hash: `0x42bfe79f` - -::: - -```solidity -error InvalidExtensionAddress(bytes storedData); -``` - -reverts when the bytes retrieved from the LSP17 data key is not a valid address (not 20 bytes) - -#### Parameters - -| Name | Type | Description | -| ------------ | :-----: | ----------- | -| `storedData` | `bytes` | - | - -
- -### InvalidFunctionSelector - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `InvalidFunctionSelector(bytes)` -- Error hash: `0xe5099ee3` - -::: - -```solidity -error InvalidFunctionSelector(bytes data); -``` - -reverts when the contract is called with a function selector not valid (less than 4 bytes of data) - -#### Parameters - -| Name | Type | Description | -| ------ | :-----: | ----------- | -| `data` | `bytes` | - | - -
- -### LSP4TokenNameNotEditable - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP4TokenNameNotEditable()` -- Error hash: `0x85c169bd` - -::: - -```solidity -error LSP4TokenNameNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenName` after the digital asset contract has been deployed / initialized. The `LSP4TokenName` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP4TokenSymbolNotEditable - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP4TokenSymbolNotEditable()` -- Error hash: `0x76755b38` - -::: - -```solidity -error LSP4TokenSymbolNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital asset contract has been deployed / initialized. The `LSP4TokenSymbol` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP4TokenTypeNotEditable - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP4TokenTypeNotEditable()` -- Error hash: `0x4ef6d7fb` - -::: - -```solidity -error LSP4TokenTypeNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenType` after the digital asset contract has been deployed / initialized. The `LSP4TokenType` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor / initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP7AmountExceedsAuthorizedAmount - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7AmountExceedsAuthorizedAmount(address,uint256,address,uint256)` -- Error hash: `0xf3a6b691` - -::: - -```solidity -error LSP7AmountExceedsAuthorizedAmount( - address tokenOwner, - uint256 authorizedAmount, - address operator, - uint256 amount -); -``` - -reverts when `operator` of `tokenOwner` send an `amount` of tokens larger than the `authorizedAmount`. - -#### Parameters - -| Name | Type | Description | -| ------------------ | :-------: | ----------- | -| `tokenOwner` | `address` | - | -| `authorizedAmount` | `uint256` | - | -| `operator` | `address` | - | -| `amount` | `uint256` | - | - -
- -### LSP7AmountExceedsBalance - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7AmountExceedsBalance(uint256,address,uint256)` -- Error hash: `0x08d47949` - -::: - -```solidity -error LSP7AmountExceedsBalance( - uint256 balance, - address tokenOwner, - uint256 amount -); -``` - -reverts when sending an `amount` of tokens larger than the current `balance` of the `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ----------- | -| `balance` | `uint256` | - | -| `tokenOwner` | `address` | - | -| `amount` | `uint256` | - | - -
- -### LSP7BatchCallFailed - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7BatchCallFailed(uint256)` -- Error hash: `0xb774c284` - -::: - -```solidity -error LSP7BatchCallFailed(uint256 callIndex); -``` - -_Batch call failed._ - -Reverts when a batch call failed. - -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ----------- | -| `callIndex` | `uint256` | - | - -
- -### LSP7CannotSendToSelf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7CannotSendToSelf()` -- Error hash: `0xb9afb000` - -::: - -```solidity -error LSP7CannotSendToSelf(); -``` - -reverts when specifying the same address for `from` or `to` in a token transfer. - -
- -### LSP7CannotSendWithAddressZero - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7CannotSendWithAddressZero()` -- Error hash: `0xd2d5ec30` - -::: - -```solidity -error LSP7CannotSendWithAddressZero(); -``` - -reverts when trying to: - -- mint tokens to the zero address. - -- burn tokens from the zero address. - -- transfer tokens from or to the zero address. - -
- -### LSP7CannotUseAddressZeroAsOperator - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7CannotUseAddressZeroAsOperator()` -- Error hash: `0x6355e766` - -::: - -```solidity -error LSP7CannotUseAddressZeroAsOperator(); -``` - -reverts when trying to set the zero address as an operator. - -
- -### LSP7DecreasedAllowanceBelowZero - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7DecreasedAllowanceBelowZero()` -- Error hash: `0x0ef76c35` - -::: - -```solidity -error LSP7DecreasedAllowanceBelowZero(); -``` - -Reverts when trying to decrease an operator's allowance to more than its current allowance. - -
- -### LSP7InvalidTransferBatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7InvalidTransferBatch()` -- Error hash: `0x263eee8d` - -::: - -```solidity -error LSP7InvalidTransferBatch(); -``` - -reverts when the array parameters used in [`transferBatch`](#transferbatch) have different lengths. - -
- -### LSP7NotifyTokenReceiverContractMissingLSP1Interface - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7NotifyTokenReceiverContractMissingLSP1Interface(address)` -- Error hash: `0xa608fbb6` - -::: - -```solidity -error LSP7NotifyTokenReceiverContractMissingLSP1Interface( - address tokenReceiver -); -``` - -reverts if the `tokenReceiver` does not implement LSP1 when minting or transferring tokens with `bool force` set as `false`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ----------- | -| `tokenReceiver` | `address` | - | - -
- -### LSP7NotifyTokenReceiverIsEOA - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7NotifyTokenReceiverIsEOA(address)` -- Error hash: `0x26c247f4` - -::: - -```solidity -error LSP7NotifyTokenReceiverIsEOA(address tokenReceiver); -``` - -reverts if the `tokenReceiver` is an EOA when minting or transferring tokens with `bool force` set as `false`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ----------- | -| `tokenReceiver` | `address` | - | - -
- -### LSP7TokenContractCannotHoldValue - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7TokenContractCannotHoldValue()` -- Error hash: `0x388f5adc` - -::: - -```solidity -error LSP7TokenContractCannotHoldValue(); -``` - -_LSP7 contract cannot receive native tokens._ - -Error occurs when sending native tokens to the LSP7 contract without sending any data. E.g. Sending value without passing a bytes4 function selector to call a LSP17 Extension. - -
- -### LSP7TokenOwnerCannotBeOperator - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `LSP7TokenOwnerCannotBeOperator()` -- Error hash: `0xdab75047` - -::: - -```solidity -error LSP7TokenOwnerCannotBeOperator(); -``` - -reverts when trying to authorize or revoke the token's owner as an operator. - -
- -### NoExtensionFoundForFunctionSelector - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` -- Error hash: `0xbb370b2b` - -::: - -```solidity -error NoExtensionFoundForFunctionSelector(bytes4 functionSelector); -``` - -reverts when there is no extension for the function selector being called with - -#### Parameters - -| Name | Type | Description | -| ------------------ | :------: | ----------- | -| `functionSelector` | `bytes4` | - | - -
- -### OperatorAllowanceCannotBeIncreasedFromZero - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `OperatorAllowanceCannotBeIncreasedFromZero(address)` -- Error hash: `0xcba6e977` - -::: - -```solidity -error OperatorAllowanceCannotBeIncreasedFromZero(address operator); -``` - -Reverts when token owner call [`increaseAllowance`](#increaseallowance) for an operator that does not have any allowance - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `operator` | `address` | - | - -
- -### OwnableCallerNotTheOwner - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `OwnableCallerNotTheOwner(address)` -- Error hash: `0xbf1169c5` - -::: - -```solidity -error OwnableCallerNotTheOwner(address callerAddress); -``` - -Reverts when only the owner is allowed to call the function. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ---------------------------------------- | -| `callerAddress` | `address` | The address that tried to make the call. | - -
- -### OwnableCannotSetZeroAddressAsOwner - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP7CompatibleERC20.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol) -- Error signature: `OwnableCannotSetZeroAddressAsOwner()` -- Error hash: `0x1ad8836c` - -::: - -```solidity -error OwnableCannotSetZeroAddressAsOwner(); -``` - -Reverts when trying to set `address(0)` as the contract owner when deploying the contract, initializing it or transferring ownership of the contract. - -
diff --git a/docs/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.md b/docs/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.md deleted file mode 100644 index a1c1124a3..000000000 --- a/docs/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.md +++ /dev/null @@ -1,2031 +0,0 @@ - - - -# LSP7CompatibleERC20Mintable - -:::info Standard Specifications - -[`LSP-7-DigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md) - -::: -:::info Solidity implementation - -[`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) - -::: - -> LSP7CompatibleERC20 deployable preset contract with a public [`mint`](#mint) function callable only by the contract [`owner`](#owner). - -## Public Methods - -Public methods are accessible externally from users, allowing interaction with this function from dApps or other smart contracts. -When marked as 'public', a method can be called both externally and internally, on the other hand, when marked as 'external', a method can only be called externally. - -### constructor - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#constructor) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) - -::: - -```solidity -constructor( - string name_, - string symbol_, - address newOwner_, - uint256 lsp4TokenType_ -); -``` - -_Deploying a `LSP7CompatibleERC20Mintable` token contract with: token name = `name_`, token symbol = `symbol_`, and address `newOwner_` as the token contract owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------- | :-------: | ---------------------------------------------------------------------------------------------------- | -| `name_` | `string` | The name of the token. | -| `symbol_` | `string` | The symbol of the token. | -| `newOwner_` | `address` | The owner of the token contract. | -| `lsp4TokenType_` | `uint256` | The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). | - -
- -### fallback - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#fallback) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) - -::: - -```solidity -fallback() external payable; -``` - -
- -### receive - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#receive) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) - -::: - -```solidity -receive() external payable; -``` - -
- -### allowance - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#allowance) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `allowance(address,address)` -- Function selector: `0xdd62ed3e` - -::: - -```solidity -function allowance( - address tokenOwner, - address operator -) external view returns (uint256); -``` - -Function to get operator allowance allowed to spend on behalf of `tokenOwner` from the ERC20 standard interface. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ---------------------------------------- | -| `tokenOwner` | `address` | The address of the token owner | -| `operator` | `address` | The address approved by the `tokenOwner` | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------------------- | -| `0` | `uint256` | The amount `operator` is approved by `tokenOwner` | - -
- -### approve - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#approve) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `approve(address,uint256)` -- Function selector: `0x095ea7b3` - -::: - -```solidity -function approve( - address operator, - uint256 amount -) external nonpayable returns (bool); -``` - -Approval function from th ERC20 standard interface. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------------------------------- | -| `operator` | `address` | The address to approve for `amount` | -| `amount` | `uint256` | The amount to approve. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ------------------------------ | -| `0` | `bool` | `true` on successful approval. | - -
- -### authorizeOperator - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `authorizeOperator(address,uint256,bytes)` -- Function selector: `0xb49506fd` - -::: - -:::danger - -To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to use the [`increaseAllowance`](#increaseallowance) and [`decreaseAllowance`](#decreaseallowance) functions. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ - -::: - -```solidity -function authorizeOperator( - address operator, - uint256 amount, - bytes operatorNotificationData -) external nonpayable; -``` - -Sets an `amount` of tokens that an `operator` has access from the caller's balance (allowance). See [`authorizedAmountFor`](#authorizedamountfor). Notify the operator based on the LSP1-UniversalReceiver standard - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ------------------------------------------------------ | -| `operator` | `address` | The address to authorize as an operator. | -| `amount` | `uint256` | The allowance amount of tokens operator has access to. | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### authorizedAmountFor - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `authorizedAmountFor(address,address)` -- Function selector: `0x65aeaa95` - -::: - -```solidity -function authorizedAmountFor( - address operator, - address tokenOwner -) external view returns (uint256); -``` - -Get the amount of tokens `operator` address has access to from `tokenOwner`. Operators can send and burn tokens on behalf of their owners. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ---------------------------------------------------------- | -| `operator` | `address` | The operator's address to query the authorized amount for. | -| `tokenOwner` | `address` | The token owner that `operator` has allowance on. | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | --------------------------------------------------------------------------------------- | -| `0` | `uint256` | The amount of tokens the `operator`'s address has access on the `tokenOwner`'s balance. | - -
- -### balanceOf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#balanceof) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `balanceOf(address)` -- Function selector: `0x70a08231` - -::: - -```solidity -function balanceOf(address tokenOwner) external view returns (uint256); -``` - -Get the number of tokens owned by `tokenOwner`. If the token is divisible (the [`decimals`](#decimals) function returns `18`), the amount returned should be divided by 1e18 to get a better picture of the actual balance of the `tokenOwner`. _Example:_ `balanceOf(someAddress) -> 42_000_000_000_000_000_000 / 1e18 = 42 tokens` - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | --------------------------------------------------------- | -| `tokenOwner` | `address` | The address of the token holder to query the balance for. | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------------- | -| `0` | `uint256` | The amount of tokens owned by `tokenOwner`. | - -
- -### batchCalls - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `batchCalls(bytes[])` -- Function selector: `0x6963d438` - -::: - -:::info - -It's not possible to send value along the functions call due to the use of `delegatecall`. - -::: - -```solidity -function batchCalls(bytes[] data) external nonpayable returns (bytes[] results); -``` - -_Executing the following batch of abi-encoded function calls on the contract: `data`._ - -Allows a caller to batch different function calls in one call. Perform a `delegatecall` on self, to call different functions with preserving the context. - -#### Parameters - -| Name | Type | Description | -| ------ | :-------: | -------------------------------------------------------------------- | -| `data` | `bytes[]` | An array of ABI encoded function calls to be called on the contract. | - -#### Returns - -| Name | Type | Description | -| --------- | :-------: | ---------------------------------------------------------------- | -| `results` | `bytes[]` | An array of abi-encoded data returned by the functions executed. | - -
- -### decimals - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decimals) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `decimals()` -- Function selector: `0x313ce567` - -::: - -```solidity -function decimals() external view returns (uint8); -``` - -Returns the number of decimals used to get its user representation. If the asset contract has been set to be non-divisible via the `isNonDivisible_` parameter in the `constructor`, the decimals returned wiil be `0`. Otherwise `18` is the common value. - -#### Returns - -| Name | Type | Description | -| ---- | :-----: | ----------------------------------------------------------------------- | -| `0` | `uint8` | the number of decimals. If `0` is returned, the asset is non-divisible. | - -
- -### decreaseAllowance - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `decreaseAllowance(address,uint256,bytes)` -- Function selector: `0x7b204c4e` - -::: - -```solidity -function decreaseAllowance( - address operator, - uint256 subtractedAmount, - bytes operatorNotificationData -) external nonpayable; -``` - -_Decrease the allowance of `operator` by -`subtractedAmount`_ - -Atomically decreases the allowance granted to `operator` by the caller. This is an alternative approach to [`authorizeOperator`](#authorizeoperator) that can be used as a mitigation for the double spending allowance problem. Notify the operator based on the LSP1-UniversalReceiver standard - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ------------------------------------------------------ | -| `operator` | `address` | The operator to decrease allowance for `msg.sender` | -| `subtractedAmount` | `uint256` | The amount to decrease by in the operator's allowance. | -| `operatorNotificationData` | `bytes` | - | - -
- -### getData - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdata) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `getData(bytes32)` -- Function selector: `0x54f6127f` - -::: - -```solidity -function getData(bytes32 dataKey) external view returns (bytes dataValue); -``` - -_Reading the ERC725Y storage for data key `dataKey` returned the following value: `dataValue`._ - -Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey`. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | --------------------------------------------- | -| `dataKey` | `bytes32` | The data key for which to retrieve the value. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ---------------------------------------------------- | -| `dataValue` | `bytes` | The bytes value stored under the specified data key. | - -
- -### getDataBatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `getDataBatch(bytes32[])` -- Function selector: `0xdedff9c6` - -::: - -```solidity -function getDataBatch( - bytes32[] dataKeys -) external view returns (bytes[] dataValues); -``` - -_Reading the ERC725Y storage for data keys `dataKeys` returned the following values: `dataValues`._ - -Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :---------: | ------------------------------------------ | -| `dataKeys` | `bytes32[]` | The array of keys which values to retrieve | - -#### Returns - -| Name | Type | Description | -| ------------ | :-------: | ----------------------------------------- | -| `dataValues` | `bytes[]` | The array of data stored at multiple keys | - -
- -### getOperatorsOf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `getOperatorsOf(address)` -- Function selector: `0xd72fc29a` - -::: - -```solidity -function getOperatorsOf(address tokenOwner) external view returns (address[]); -``` - -Returns all `operator` addresses that are allowed to transfer or burn on behalf of `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ----------------------------------------- | -| `tokenOwner` | `address` | The token owner to get the operators for. | - -#### Returns - -| Name | Type | Description | -| ---- | :---------: | ----------------------------------------------------------------------------------- | -| `0` | `address[]` | An array of operators allowed to transfer or burn tokens on behalf of `tokenOwner`. | - -
- -### increaseAllowance - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `increaseAllowance(address,uint256,bytes)` -- Function selector: `0x2bc1da82` - -::: - -```solidity -function increaseAllowance( - address operator, - uint256 addedAmount, - bytes operatorNotificationData -) external nonpayable; -``` - -_Increase the allowance of `operator` by +`addedAmount`_ - -Atomically increases the allowance granted to `operator` by the caller. This is an alternative approach to [`authorizeOperator`](#authorizeoperator) that can be used as a mitigation for the double spending allowance problem. Notify the operator based on the LSP1-UniversalReceiver standard - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ----------------------------------------------------------------------- | -| `operator` | `address` | The operator to increase the allowance for `msg.sender` | -| `addedAmount` | `uint256` | The additional amount to add on top of the current operator's allowance | -| `operatorNotificationData` | `bytes` | - | - -
- -### mint - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#mint) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `mint(address,uint256,bool,bytes)` -- Function selector: `0x7580d920` - -::: - -```solidity -function mint( - address to, - uint256 amount, - bool force, - bytes data -) external nonpayable; -``` - -Public [`_mint`](#_mint) function only callable by the [`owner`](#owner). - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | ----------- | -| `to` | `address` | - | -| `amount` | `uint256` | - | -| `force` | `bool` | - | -| `data` | `bytes` | - | - -
- -### name - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#name) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `name()` -- Function selector: `0x06fdde03` - -::: - -```solidity -function name() external view returns (string); -``` - -Returns the name of the token. For compatibility with clients & tools that expect ERC20. - -#### Returns - -| Name | Type | Description | -| ---- | :------: | --------------------- | -| `0` | `string` | The name of the token | - -
- -### owner - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#owner) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `owner()` -- Function selector: `0x8da5cb5b` - -::: - -```solidity -function owner() external view returns (address); -``` - -Returns the address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------- | -| `0` | `address` | - | - -
- -### renounceOwnership - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `renounceOwnership()` -- Function selector: `0x715018a6` - -::: - -```solidity -function renounceOwnership() external nonpayable; -``` - -Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner. - -
- -### revokeOperator - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `revokeOperator(address,bool,bytes)` -- Function selector: `0x4521748e` - -::: - -```solidity -function revokeOperator( - address operator, - bool notify, - bytes operatorNotificationData -) external nonpayable; -``` - -Removes the `operator` address as an operator of callers tokens, disallowing it to send any amount of tokens on behalf of the token owner (the caller of the function `msg.sender`). See also [`authorizedAmountFor`](#authorizedamountfor). - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | --------------------------------------------------------- | -| `operator` | `address` | The address to revoke as an operator. | -| `notify` | `bool` | Boolean indicating whether to notify the operator or not. | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### setData - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdata) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `setData(bytes32,bytes)` -- Function selector: `0x7f23690c` - -::: - -:::caution Warning - -**Note for developers:** despite the fact that this function is set as `payable`, if the function is not intended to receive value (= native tokens), **an additional check should be implemented to ensure that `msg.value` sent was equal to 0**. - -::: - -```solidity -function setData(bytes32 dataKey, bytes dataValue) external payable; -``` - -_Setting the following data key value pair in the ERC725Y storage. Data key: `dataKey`, data value: `dataValue`._ - -Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data key `dataKey`. The function is marked as payable to enable flexibility on child contracts. For instance to implement a fee mechanism for setting specific data. - -
- -**Requirements:** - -- SHOULD only be callable by the [`owner`](#owner). - -
- -
- -**Emitted events:** - -- [`DataChanged`](#datachanged) event. - -
- -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ------------------------------------------ | -| `dataKey` | `bytes32` | The data key for which to set a new value. | -| `dataValue` | `bytes` | The new bytes value to set. | - -
- -### setDataBatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `setDataBatch(bytes32[],bytes[])` -- Function selector: `0x97902421` - -::: - -:::caution Warning - -**Note for developers:** despite the fact that this function is set as `payable`, if the function is not intended to receive value (= native tokens), **an additional check should be implemented to ensure that `msg.value` sent was equal to 0**. - -::: - -```solidity -function setDataBatch(bytes32[] dataKeys, bytes[] dataValues) external payable; -``` - -_Setting the following data key value pairs in the ERC725Y storage. Data keys: `dataKeys`, data values: `dataValues`._ - -Batch data setting function that behaves the same as [`setData`](#setdata) but allowing to set multiple data key/value pairs in the ERC725Y storage in the same transaction. - -
- -**Requirements:** - -- SHOULD only be callable by the [`owner`](#owner) of the contract. - -
- -
- -**Emitted events:** - -- [`DataChanged`](#datachanged) event **for each data key/value pair set**. - -
- -#### Parameters - -| Name | Type | Description | -| ------------ | :---------: | ---------------------------------------------------- | -| `dataKeys` | `bytes32[]` | An array of data keys to set bytes values for. | -| `dataValues` | `bytes[]` | An array of bytes values to set for each `dataKeys`. | - -
- -### supportsInterface - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `supportsInterface(bytes4)` -- Function selector: `0x01ffc9a7` - -::: - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool); -``` - -Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas. - -#### Parameters - -| Name | Type | Description | -| ------------- | :------: | ----------- | -| `interfaceId` | `bytes4` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ----------- | -| `0` | `bool` | - | - -
- -### symbol - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#symbol) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `symbol()` -- Function selector: `0x95d89b41` - -::: - -```solidity -function symbol() external view returns (string); -``` - -Returns the symbol of the token, usually a shorter version of the name. For compatibility with clients & tools that expect ERC20. - -#### Returns - -| Name | Type | Description | -| ---- | :------: | ----------------------- | -| `0` | `string` | The symbol of the token | - -
- -### totalSupply - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `totalSupply()` -- Function selector: `0x18160ddd` - -::: - -```solidity -function totalSupply() external view returns (uint256); -``` - -Returns the number of existing tokens that have been minted in this contract. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------ | -| `0` | `uint256` | The number of existing tokens. | - -
- -### transfer - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `transfer(address,address,uint256,bool,bytes)` -- Function selector: `0x760d9bba` - -::: - -```solidity -function transfer( - address from, - address to, - uint256 amount, - bool force, - bytes data -) external nonpayable; -``` - -Transfers an `amount` of tokens from the `from` address to the `to` address and notify both sender and recipients via the LSP1 [`universalReceiver(...)`](#`universalreceiver) function. If the tokens are transferred by an operator on behalf of a token holder, the allowance for the operator will be decreased by `amount` once the token transfer has been completed (See [`authorizedAmountFor`](#authorizedamountfor)). - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | `address` | The sender address. | -| `to` | `address` | The recipient address. | -| `amount` | `uint256` | The amount of tokens to transfer. | -| `force` | `bool` | When set to `true`, the `to` address CAN be any address. When set to `false`, the `to` address MUST be a contract that supports the LSP1 UniversalReceiver standard. | -| `data` | `bytes` | Any additional data the caller wants included in the emitted event, and sent in the hooks of the `from` and `to` addresses. | - -
- -### transfer - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `transfer(address,uint256)` -- Function selector: `0xa9059cbb` - -::: - -:::info - -This function uses the `force` parameter as `true` so that EOA and any contract can receive tokens. - -::: - -```solidity -function transfer( - address to, - uint256 amount -) external nonpayable returns (bool); -``` - -Transfer function from the ERC20 standard interface. - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | --------------------------------- | -| `to` | `address` | The address receiving tokens. | -| `amount` | `uint256` | The amount of tokens to transfer. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ------------------------------ | -| `0` | `bool` | `true` on successful transfer. | - -
- -### transferBatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `transferBatch(address[],address[],uint256[],bool[],bytes[])` -- Function selector: `0x2d7667c9` - -::: - -```solidity -function transferBatch( - address[] from, - address[] to, - uint256[] amount, - bool[] force, - bytes[] data -) external nonpayable; -``` - -Same as [`transfer(...)`](#`transfer) but transfer multiple tokens based on the arrays of `from`, `to`, `amount`. - -#### Parameters - -| Name | Type | Description | -| -------- | :---------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | `address[]` | An array of sending addresses. | -| `to` | `address[]` | An array of receiving addresses. | -| `amount` | `uint256[]` | An array of amount of tokens to transfer for each `from -> to` transfer. | -| `force` | `bool[]` | For each transfer, when set to `true`, the `to` address CAN be any address. When set to `false`, the `to` address MUST be a contract that supports the LSP1 UniversalReceiver standard. | -| `data` | `bytes[]` | An array of additional data the caller wants included in the emitted event, and sent in the hooks to `from` and `to` addresses. | - -
- -### transferFrom - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferfrom) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `transferFrom(address,address,uint256)` -- Function selector: `0x23b872dd` - -::: - -:::info - -This function uses the `force` parameter as `true` so that EOA and any contract can receive tokens. - -::: - -```solidity -function transferFrom( - address from, - address to, - uint256 amount -) external nonpayable returns (bool); -``` - -Transfer functions for operators from the ERC20 standard interface. - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | --------------------------------- | -| `from` | `address` | The address sending tokens. | -| `to` | `address` | The address receiving tokens. | -| `amount` | `uint256` | The amount of tokens to transfer. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ------------------------------ | -| `0` | `bool` | `true` on successful transfer. | - -
- -### transferOwnership - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferownership) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Function signature: `transferOwnership(address)` -- Function selector: `0xf2fde38b` - -::: - -```solidity -function transferOwnership(address newOwner) external nonpayable; -``` - -Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `newOwner` | `address` | - | - -
- -## Internal Methods - -Any method labeled as `internal` serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs. - -Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities. - -### \_checkOwner - -```solidity -function _checkOwner() internal view; -``` - -Throws if the sender is not the owner. - -
- -### \_setOwner - -```solidity -function _setOwner(address newOwner) internal nonpayable; -``` - -Changes the owner if `newOwner` and oldOwner are different -This pattern is useful in inheritance. - -
- -### \_getData - -```solidity -function _getData(bytes32 dataKey) internal view returns (bytes dataValue); -``` - -Read the value stored under a specific `dataKey` inside the underlying ERC725Y storage, -represented as a mapping of `bytes32` data keys mapped to their `bytes` data values. - -```solidity -mapping(bytes32 => bytes) _store -``` - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------------------------------------------------------------------- | -| `dataKey` | `bytes32` | A bytes32 data key to read the associated `bytes` value from the store. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ----------------------------------------------------------------------------- | -| `dataValue` | `bytes` | The `bytes` value associated with the given `dataKey` in the ERC725Y storage. | - -
- -### \_setData - -```solidity -function _setData(bytes32 dataKey, bytes dataValue) internal nonpayable; -``` - -The ERC725Y data keys `LSP4TokenName` and `LSP4TokenSymbol` cannot be changed -via this function once the digital asset contract has been deployed. - -
- -### \_updateOperator - -```solidity -function _updateOperator( - address tokenOwner, - address operator, - uint256 amount, - bool notified, - bytes operatorNotificationData -) internal nonpayable; -``` - -
- -### \_mint - -```solidity -function _mint( - address to, - uint256 amount, - bool force, - bytes data -) internal nonpayable; -``` - -
- -### \_burn - -```solidity -function _burn(address from, uint256 amount, bytes data) internal nonpayable; -``` - -
- -### \_spendAllowance - -```solidity -function _spendAllowance( - address operator, - address tokenOwner, - uint256 amountToSpend -) internal nonpayable; -``` - -Spend `amountToSpend` from the `operator`'s authorized on behalf of the `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ------------------------------------------------------------------- | -| `operator` | `address` | The address of the operator to decrease the allowance of. | -| `tokenOwner` | `address` | The address that granted an allowance on its balance to `operator`. | -| `amountToSpend` | `uint256` | The amount of tokens to substract in allowance of `operator`. | - -
- -### \_transfer - -```solidity -function _transfer( - address from, - address to, - uint256 amount, - bool force, - bytes data -) internal nonpayable; -``` - -
- -### \_beforeTokenTransfer - -```solidity -function _beforeTokenTransfer( - address from, - address to, - uint256 amount, - bytes data -) internal nonpayable; -``` - -Hook that is called before any token transfer, including minting and burning. -Allows to run custom logic before updating balances and notifiying sender/recipient by overriding this function. - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | ------------------------------------ | -| `from` | `address` | The sender address | -| `to` | `address` | The recipient address | -| `amount` | `uint256` | The amount of token to transfer | -| `data` | `bytes` | The data sent alongside the transfer | - -
- -### \_afterTokenTransfer - -```solidity -function _afterTokenTransfer( - address from, - address to, - uint256 amount, - bytes data -) internal nonpayable; -``` - -Hook that is called after any token transfer, including minting and burning. -Allows to run custom logic after updating balances, but **before notifiying sender/recipient** by overriding this function. - -#### Parameters - -| Name | Type | Description | -| -------- | :-------: | ------------------------------------ | -| `from` | `address` | The sender address | -| `to` | `address` | The recipient address | -| `amount` | `uint256` | The amount of token to transfer | -| `data` | `bytes` | The data sent alongside the transfer | - -
- -### \_notifyTokenOperator - -```solidity -function _notifyTokenOperator( - address operator, - bytes lsp1Data -) internal nonpayable; -``` - -Attempt to notify the operator `operator` about the `amount` tokens being authorized with. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP7_TOKENOPERATOR` as typeId, if `operator` is a contract that supports the LSP1 interface. -If `operator` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------------------------ | -| `operator` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `lsp1Data` | `bytes` | the data to be sent to the `operator` address in the `universalReceiver` call. | - -
- -### \_notifyTokenSender - -```solidity -function _notifyTokenSender(address from, bytes lsp1Data) internal nonpayable; -``` - -Attempt to notify the token sender `from` about the `amount` of tokens being transferred. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP7_TOKENSSENDER` as typeId, if `from` is a contract that supports the LSP1 interface. -If `from` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------------------------ | -| `from` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `lsp1Data` | `bytes` | the data to be sent to the `from` address in the `universalReceiver` call. | - -
- -### \_notifyTokenReceiver - -```solidity -function _notifyTokenReceiver( - address to, - bool force, - bytes lsp1Data -) internal nonpayable; -``` - -Attempt to notify the token receiver `to` about the `amount` tokens being received. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP7_TOKENSRECIPIENT` as typeId, if `to` is a contract that supports the LSP1 interface. -If `to` is is an EOA or a contract that does not support the LSP1 interface, the behaviour will depend on the `force` boolean flag. - -- if `force` is set to `true`, nothing will happen and no notification will be sent. - -- if `force` is set to `false, the transaction will revert. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | --------------------------------------------------------------------------------------------------- | -| `to` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `force` | `bool` | A boolean that describe if transfer to a `to` address that does not support LSP1 is allowed or not. | -| `lsp1Data` | `bytes` | The data to be sent to the `to` address in the `universalReceiver(...)` call. | - -
- -### \_supportsInterfaceInERC165Extension - -```solidity -function _supportsInterfaceInERC165Extension( - bytes4 interfaceId -) internal view returns (bool); -``` - -Returns whether the interfaceId being checked is supported in the extension of the -[`supportsInterface`](#supportsinterface) selector. -To be used by extendable contracts wishing to extend the ERC165 interfaceIds originally -supported by reading whether the interfaceId queried is supported in the `supportsInterface` -extension if the extension is set, if not it returns false. - -
- -### \_getExtensionAndForwardValue - -```solidity -function _getExtensionAndForwardValue( - bytes4 functionSelector -) internal view returns (address, bool); -``` - -Returns the extension address stored under the following data key: - -- [`_LSP17_EXTENSION_PREFIX`](#_lsp17_extension_prefix) + `` (Check [LSP2-ERC725YJSONSchema] for encoding the data key). - -- If no extension is stored, returns the address(0). - -- we do not check that payable bool as in lsp7 standard we will always forward the value to the extension - -
- -### \_fallbackLSP17Extendable - -:::info - -The LSP7 Token contract should not hold any native tokens. Any native tokens received by the contract -will be forwarded to the extension address mapped to the selector from `msg.sig`. - -::: - -```solidity -function _fallbackLSP17Extendable( - bytes callData -) internal nonpayable returns (bytes); -``` - -Forwards the call with the received value to an extension mapped to a function selector. -Calls [`_getExtensionAndForwardValue`](#_getextensionandforwardvalue) to get the address of the extension mapped to the function selector being -called on the account. If there is no extension, the address(0) will be returned. -Forwards the value if the extension is payable. -Reverts if there is no extension for the function being called. -If there is an extension for the function selector being called, it calls the extension with the -CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of the [`msg.sender`](#msg.sender) and -32 bytes of the [`msg.value`](#msg.value) - -
- -## Events - -### Approval - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#approval) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Event signature: `Approval(address,address,uint256)` -- Event topic hash: `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` - -::: - -```solidity -event Approval(address indexed owner, address indexed spender, uint256 value); -``` - -Emitted when the allowance of a `spender` for an `owner` is set by a call to [`approve`](#approve). `value` is the new allowance. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | ----------- | -| `owner` **`indexed`** | `address` | - | -| `spender` **`indexed`** | `address` | - | -| `value` | `uint256` | - | - -
- -### DataChanged - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#datachanged) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Event signature: `DataChanged(bytes32,bytes)` -- Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` - -::: - -```solidity -event DataChanged(bytes32 indexed dataKey, bytes dataValue); -``` - -_The following data key/value pair has been changed in the ERC725Y storage: Data key: `dataKey`, data value: `dataValue`._ - -Emitted when data at a specific `dataKey` was changed to a new value `dataValue`. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | -------------------------------------------- | -| `dataKey` **`indexed`** | `bytes32` | The data key for which a bytes value is set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### OperatorAuthorizationChanged - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Event signature: `OperatorAuthorizationChanged(address,address,uint256,bytes)` -- Event topic hash: `0xf772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d` - -::: - -```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, uint256 indexed amount, bytes operatorNotificationData); -``` - -Emitted when `tokenOwner` enables `operator` for `amount` tokens. - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ----------------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address authorized as an operator | -| `tokenOwner` **`indexed`** | `address` | The token owner | -| `amount` **`indexed`** | `uint256` | The amount of tokens `operator` address has access to from `tokenOwner` | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### OperatorRevoked - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Event signature: `OperatorRevoked(address,address,bool,bytes)` -- Event topic hash: `0x0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167` - -::: - -```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bool indexed notified, bytes operatorNotificationData); -``` - -Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [`authorizedAmountFor(...)`](#`authorizedamountfor) to `0`. - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address revoked from operating | -| `tokenOwner` **`indexed`** | `address` | The token owner | -| `notified` **`indexed`** | `bool` | Bool indicating whether the operator has been notified or not | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### OwnershipTransferred - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Event signature: `OwnershipTransferred(address,address)` -- Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` - -::: - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------------- | :-------: | ----------- | -| `previousOwner` **`indexed`** | `address` | - | -| `newOwner` **`indexed`** | `address` | - | - -
- -### Transfer - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Event signature: `Transfer(address,address,address,uint256,bool,bytes)` -- Event topic hash: `0x3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a6` - -::: - -```solidity -event Transfer(address indexed operator, address indexed from, address indexed to, uint256 amount, bool force, bytes data); -``` - -Emitted when the `from` transferred successfully `amount` of tokens to `to`. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | ---------------------------------------------------------------------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address of the operator that executed the transfer. | -| `from` **`indexed`** | `address` | The address which tokens were sent from (balance decreased by `-amount`). | -| `to` **`indexed`** | `address` | The address that received the tokens (balance increased by `+amount`). | -| `amount` | `uint256` | The amount of tokens transferred. | -| `force` | `bool` | if the transferred enforced the `to` recipient address to be a contract that implements the LSP1 standard or not. | -| `data` | `bytes` | Any additional data included by the caller during the transfer, and sent in the LSP1 hooks to the `from` and `to` addresses. | - -
- -### Transfer - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Event signature: `Transfer(address,address,uint256)` -- Event topic hash: `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` - -::: - -```solidity -event Transfer(address indexed from, address indexed to, uint256 value); -``` - -Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero. - -#### Parameters - -| Name | Type | Description | -| -------------------- | :-------: | ----------- | -| `from` **`indexed`** | `address` | - | -| `to` **`indexed`** | `address` | - | -| `value` | `uint256` | - | - -
- -## Errors - -### ERC725Y_DataKeysValuesEmptyArray - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `ERC725Y_DataKeysValuesEmptyArray()` -- Error hash: `0x97da5f95` - -::: - -```solidity -error ERC725Y_DataKeysValuesEmptyArray(); -``` - -Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabatch) function is an empty array. - -
- -### ERC725Y_DataKeysValuesLengthMismatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` -- Error hash: `0x3bcc8979` - -::: - -```solidity -error ERC725Y_DataKeysValuesLengthMismatch(); -``` - -Reverts when there is not the same number of elements in the `datakeys` and `dataValues` array parameters provided when calling the [`setDataBatch`](#setdatabatch) function. - -
- -### ERC725Y_MsgValueDisallowed - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `ERC725Y_MsgValueDisallowed()` -- Error hash: `0xf36ba737` - -::: - -```solidity -error ERC725Y_MsgValueDisallowed(); -``` - -Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#setdatabatch) function. - -
- -### InvalidExtensionAddress - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `InvalidExtensionAddress(bytes)` -- Error hash: `0x42bfe79f` - -::: - -```solidity -error InvalidExtensionAddress(bytes storedData); -``` - -reverts when the bytes retrieved from the LSP17 data key is not a valid address (not 20 bytes) - -#### Parameters - -| Name | Type | Description | -| ------------ | :-----: | ----------- | -| `storedData` | `bytes` | - | - -
- -### InvalidFunctionSelector - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `InvalidFunctionSelector(bytes)` -- Error hash: `0xe5099ee3` - -::: - -```solidity -error InvalidFunctionSelector(bytes data); -``` - -reverts when the contract is called with a function selector not valid (less than 4 bytes of data) - -#### Parameters - -| Name | Type | Description | -| ------ | :-----: | ----------- | -| `data` | `bytes` | - | - -
- -### LSP4TokenNameNotEditable - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP4TokenNameNotEditable()` -- Error hash: `0x85c169bd` - -::: - -```solidity -error LSP4TokenNameNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenName` after the digital asset contract has been deployed / initialized. The `LSP4TokenName` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP4TokenSymbolNotEditable - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP4TokenSymbolNotEditable()` -- Error hash: `0x76755b38` - -::: - -```solidity -error LSP4TokenSymbolNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital asset contract has been deployed / initialized. The `LSP4TokenSymbol` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP4TokenTypeNotEditable - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP4TokenTypeNotEditable()` -- Error hash: `0x4ef6d7fb` - -::: - -```solidity -error LSP4TokenTypeNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenType` after the digital asset contract has been deployed / initialized. The `LSP4TokenType` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor / initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP7AmountExceedsAuthorizedAmount - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7AmountExceedsAuthorizedAmount(address,uint256,address,uint256)` -- Error hash: `0xf3a6b691` - -::: - -```solidity -error LSP7AmountExceedsAuthorizedAmount( - address tokenOwner, - uint256 authorizedAmount, - address operator, - uint256 amount -); -``` - -reverts when `operator` of `tokenOwner` send an `amount` of tokens larger than the `authorizedAmount`. - -#### Parameters - -| Name | Type | Description | -| ------------------ | :-------: | ----------- | -| `tokenOwner` | `address` | - | -| `authorizedAmount` | `uint256` | - | -| `operator` | `address` | - | -| `amount` | `uint256` | - | - -
- -### LSP7AmountExceedsBalance - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7AmountExceedsBalance(uint256,address,uint256)` -- Error hash: `0x08d47949` - -::: - -```solidity -error LSP7AmountExceedsBalance( - uint256 balance, - address tokenOwner, - uint256 amount -); -``` - -reverts when sending an `amount` of tokens larger than the current `balance` of the `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ----------- | -| `balance` | `uint256` | - | -| `tokenOwner` | `address` | - | -| `amount` | `uint256` | - | - -
- -### LSP7BatchCallFailed - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7BatchCallFailed(uint256)` -- Error hash: `0xb774c284` - -::: - -```solidity -error LSP7BatchCallFailed(uint256 callIndex); -``` - -_Batch call failed._ - -Reverts when a batch call failed. - -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ----------- | -| `callIndex` | `uint256` | - | - -
- -### LSP7CannotSendToSelf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7CannotSendToSelf()` -- Error hash: `0xb9afb000` - -::: - -```solidity -error LSP7CannotSendToSelf(); -``` - -reverts when specifying the same address for `from` or `to` in a token transfer. - -
- -### LSP7CannotSendWithAddressZero - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7CannotSendWithAddressZero()` -- Error hash: `0xd2d5ec30` - -::: - -```solidity -error LSP7CannotSendWithAddressZero(); -``` - -reverts when trying to: - -- mint tokens to the zero address. - -- burn tokens from the zero address. - -- transfer tokens from or to the zero address. - -
- -### LSP7CannotUseAddressZeroAsOperator - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7CannotUseAddressZeroAsOperator()` -- Error hash: `0x6355e766` - -::: - -```solidity -error LSP7CannotUseAddressZeroAsOperator(); -``` - -reverts when trying to set the zero address as an operator. - -
- -### LSP7DecreasedAllowanceBelowZero - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7DecreasedAllowanceBelowZero()` -- Error hash: `0x0ef76c35` - -::: - -```solidity -error LSP7DecreasedAllowanceBelowZero(); -``` - -Reverts when trying to decrease an operator's allowance to more than its current allowance. - -
- -### LSP7InvalidTransferBatch - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7InvalidTransferBatch()` -- Error hash: `0x263eee8d` - -::: - -```solidity -error LSP7InvalidTransferBatch(); -``` - -reverts when the array parameters used in [`transferBatch`](#transferbatch) have different lengths. - -
- -### LSP7NotifyTokenReceiverContractMissingLSP1Interface - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7NotifyTokenReceiverContractMissingLSP1Interface(address)` -- Error hash: `0xa608fbb6` - -::: - -```solidity -error LSP7NotifyTokenReceiverContractMissingLSP1Interface( - address tokenReceiver -); -``` - -reverts if the `tokenReceiver` does not implement LSP1 when minting or transferring tokens with `bool force` set as `false`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ----------- | -| `tokenReceiver` | `address` | - | - -
- -### LSP7NotifyTokenReceiverIsEOA - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7NotifyTokenReceiverIsEOA(address)` -- Error hash: `0x26c247f4` - -::: - -```solidity -error LSP7NotifyTokenReceiverIsEOA(address tokenReceiver); -``` - -reverts if the `tokenReceiver` is an EOA when minting or transferring tokens with `bool force` set as `false`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ----------- | -| `tokenReceiver` | `address` | - | - -
- -### LSP7TokenContractCannotHoldValue - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7TokenContractCannotHoldValue()` -- Error hash: `0x388f5adc` - -::: - -```solidity -error LSP7TokenContractCannotHoldValue(); -``` - -_LSP7 contract cannot receive native tokens._ - -Error occurs when sending native tokens to the LSP7 contract without sending any data. E.g. Sending value without passing a bytes4 function selector to call a LSP17 Extension. - -
- -### LSP7TokenOwnerCannotBeOperator - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `LSP7TokenOwnerCannotBeOperator()` -- Error hash: `0xdab75047` - -::: - -```solidity -error LSP7TokenOwnerCannotBeOperator(); -``` - -reverts when trying to authorize or revoke the token's owner as an operator. - -
- -### NoExtensionFoundForFunctionSelector - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` -- Error hash: `0xbb370b2b` - -::: - -```solidity -error NoExtensionFoundForFunctionSelector(bytes4 functionSelector); -``` - -reverts when there is no extension for the function selector being called with - -#### Parameters - -| Name | Type | Description | -| ------------------ | :------: | ----------- | -| `functionSelector` | `bytes4` | - | - -
- -### OperatorAllowanceCannotBeIncreasedFromZero - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `OperatorAllowanceCannotBeIncreasedFromZero(address)` -- Error hash: `0xcba6e977` - -::: - -```solidity -error OperatorAllowanceCannotBeIncreasedFromZero(address operator); -``` - -Reverts when token owner call [`increaseAllowance`](#increaseallowance) for an operator that does not have any allowance - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `operator` | `address` | - | - -
- -### OwnableCallerNotTheOwner - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `OwnableCallerNotTheOwner(address)` -- Error hash: `0xbf1169c5` - -::: - -```solidity -error OwnableCallerNotTheOwner(address callerAddress); -``` - -Reverts when only the owner is allowed to call the function. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ---------------------------------------- | -| `callerAddress` | `address` | The address that tried to make the call. | - -
- -### OwnableCannotSetZeroAddressAsOwner - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP7CompatibleERC20Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol) -- Error signature: `OwnableCannotSetZeroAddressAsOwner()` -- Error hash: `0x1ad8836c` - -::: - -```solidity -error OwnableCannotSetZeroAddressAsOwner(); -``` - -Reverts when trying to set `address(0)` as the contract owner when deploying the contract, initializing it or transferring ownership of the contract. - -
diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md deleted file mode 100644 index 7ba22f61f..000000000 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.md +++ /dev/null @@ -1,2558 +0,0 @@ - - - -# LSP8CompatibleERC721 - -:::info Standard Specifications - -[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) - -::: -:::info Solidity implementation - -[`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) - -::: - -LSP8 extension, for compatibility for clients / tools that expect ERC721. - -## Public Methods - -Public methods are accessible externally from users, allowing interaction with this function from dApps or other smart contracts. -When marked as 'public', a method can be called both externally and internally, on the other hand, when marked as 'external', a method can only be called externally. - -### fallback - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) - -::: - -```solidity -fallback(bytes calldata callData) external payable returns (bytes memory); -``` - -_The `fallback` function was called with the following amount of native tokens: `msg.value`; and the following calldata: `callData`._ - -Achieves the goal of [LSP-17-ContractExtension] standard by extending the contract to handle calls of functions that do not exist natively, -forwarding the function call to the extension address mapped to the function being called. -This function is executed when: - -- Sending data of length less than 4 bytes to the contract. - -- The first 4 bytes of the calldata do not match any publicly callable functions from the contract ABI. - -- Receiving native tokens - -1. If the data is equal or longer than 4 bytes, the [ERC-725Y] storage is queried with the following data key: [_LSP17_EXTENSION_PREFIX] + `bytes4(msg.sig)` (Check [LSP-2-ERC725YJSONSchema] for encoding the data key) - -- If there is no address stored under the following data key, revert with [`NoExtensionFoundForFunctionSelector(bytes4)`](#noextensionfoundforfunctionselector). The data key relative to `bytes4(0)` is an exception, where no reverts occurs if there is no extension address stored under. This exception is made to allow users to send random data (graffiti) to the account and to be able to react on it. - -- If there is an address, forward the `msg.data` to the extension using the CALL opcode, appending 52 bytes (20 bytes of `msg.sender` and 32 bytes of `msg.value`). Return what the calls returns, or revert if the call failed. - -2. If the data sent to this function is of length less than 4 bytes (not a function selector), revert. - -
- -### receive - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) - -::: - -```solidity -receive() external payable; -``` - -_LSP8 contract cannot receive native tokens._ - -Reverts whenever someone tries to send native tokens to a LSP8 contract. - -
- -### approve - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#approve) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `approve(address,uint256)` -- Function selector: `0x095ea7b3` - -::: - -```solidity -function approve(address operator, uint256 tokenId) external nonpayable; -``` - -_Calling `approve` function to approve operator at address `operator` to transfer tokenId `tokenId` on behalf of its owner._ - -Approval function compatible with ERC721 `approve(address,uint256)`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------- | -| `operator` | `address` | The address to approve for `tokenId`. | -| `tokenId` | `uint256` | The tokenId to approve. | - -
- -### authorizeOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `authorizeOperator(address,bytes32,bytes)` -- Function selector: `0x86a10ddd` - -::: - -```solidity -function authorizeOperator( - address operator, - bytes32 tokenId, - bytes operatorNotificationData -) external nonpayable; -``` - -Allow an `operator` address to transfer or burn a specific `tokenId` on behalf of its token owner. See [`isOperatorFor`](#isoperatorfor). Notify the operator based on the LSP1-UniversalReceiver standard - -
- -**Emitted events:** - -- LSP7 [`OperatorAuthorizationChanged`](#operatorauthorizationchanged) event. -- ERC721 [`Approval`](#approval) event. - -
- -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ----------------------------------------------- | -| `operator` | `address` | The address to authorize as an operator. | -| `tokenId` | `bytes32` | The token ID operator has access to. | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### balanceOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `balanceOf(address)` -- Function selector: `0x70a08231` - -::: - -```solidity -function balanceOf(address tokenOwner) external view returns (uint256); -``` - -Get the number of token IDs owned by `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ----------------------- | -| `tokenOwner` | `address` | The address to query \* | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------------------------------------------------- | -| `0` | `uint256` | The total number of token IDs that `tokenOwner` owns. | - -
- -### batchCalls - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `batchCalls(bytes[])` -- Function selector: `0x6963d438` - -::: - -:::info - -It's not possible to send value along the functions call due to the use of `delegatecall`. - -::: - -```solidity -function batchCalls(bytes[] data) external nonpayable returns (bytes[] results); -``` - -_Executing the following batch of abi-encoded function calls on the contract: `data`._ - -Allows a caller to batch different function calls in one call. Perform a `delegatecall` on self, to call different functions with preserving the context. - -#### Parameters - -| Name | Type | Description | -| ------ | :-------: | -------------------------------------------------------------------- | -| `data` | `bytes[]` | An array of ABI encoded function calls to be called on the contract. | - -#### Returns - -| Name | Type | Description | -| --------- | :-------: | ---------------------------------------------------------------- | -| `results` | `bytes[]` | An array of abi-encoded data returned by the functions executed. | - -
- -### getApproved - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getapproved) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `getApproved(uint256)` -- Function selector: `0x081812fc` - -::: - -```solidity -function getApproved(uint256 tokenId) external view returns (address); -``` - -_Retrieving the address other than the token owner that is approved to transfer tokenId `tokenId` on behalf of its owner._ - -Compatible with ERC721 getApproved. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | --------------------- | -| `tokenId` | `uint256` | The tokenId to query. | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------------ | -| `0` | `address` | The address of the operator for `tokenId`. | - -
- -### getData - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `getData(bytes32)` -- Function selector: `0x54f6127f` - -::: - -```solidity -function getData(bytes32 dataKey) external view returns (bytes dataValue); -``` - -_Reading the ERC725Y storage for data key `dataKey` returned the following value: `dataValue`._ - -Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey`. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | --------------------------------------------- | -| `dataKey` | `bytes32` | The data key for which to retrieve the value. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ---------------------------------------------------- | -| `dataValue` | `bytes` | The bytes value stored under the specified data key. | - -
- -### getDataBatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `getDataBatch(bytes32[])` -- Function selector: `0xdedff9c6` - -::: - -```solidity -function getDataBatch( - bytes32[] dataKeys -) external view returns (bytes[] dataValues); -``` - -_Reading the ERC725Y storage for data keys `dataKeys` returned the following values: `dataValues`._ - -Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :---------: | ------------------------------------------ | -| `dataKeys` | `bytes32[]` | The array of keys which values to retrieve | - -#### Returns - -| Name | Type | Description | -| ------------ | :-------: | ----------------------------------------- | -| `dataValues` | `bytes[]` | The array of data stored at multiple keys | - -
- -### getDataBatchForTokenIds - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `getDataBatchForTokenIds(bytes32[],bytes32[])` -- Function selector: `0x1d26fce6` - -::: - -```solidity -function getDataBatchForTokenIds( - bytes32[] tokenIds, - bytes32[] dataKeys -) external view returns (bytes[] dataValues); -``` - -_Retrieves data in batch for multiple `tokenId` and `dataKey` pairs._ - -#### Parameters - -| Name | Type | Description | -| ---------- | :---------: | ----------------------------------------------------- | -| `tokenIds` | `bytes32[]` | An array of token IDs. | -| `dataKeys` | `bytes32[]` | An array of data keys corresponding to the token IDs. | - -#### Returns - -| Name | Type | Description | -| ------------ | :-------: | ----------------------------------------------------------------- | -| `dataValues` | `bytes[]` | An array of data values for each pair of `tokenId` and `dataKey`. | - -
- -### getDataForTokenId - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `getDataForTokenId(bytes32,bytes32)` -- Function selector: `0x16e023b3` - -::: - -```solidity -function getDataForTokenId( - bytes32 tokenId, - bytes32 dataKey -) external view returns (bytes dataValue); -``` - -_Retrieves data for a specific `tokenId` and `dataKey`._ - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ---------------------------------- | -| `tokenId` | `bytes32` | The unique identifier for a token. | -| `dataKey` | `bytes32` | The key for the data to retrieve. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ----------------------------------------------------------------- | -| `dataValue` | `bytes` | The data value associated with the given `tokenId` and `dataKey`. | - -
- -### getOperatorsOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `getOperatorsOf(bytes32)` -- Function selector: `0x49a6078d` - -::: - -```solidity -function getOperatorsOf(bytes32 tokenId) external view returns (address[]); -``` - -Returns all `operator` addresses that are allowed to transfer or burn a specific `tokenId` on behalf of its owner. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------- | -| `tokenId` | `bytes32` | The token ID to get the operators for. | - -#### Returns - -| Name | Type | Description | -| ---- | :---------: | ------------------------------------------------------------------------------------------------------------ | -| `0` | `address[]` | An array of operators allowed to transfer or burn a specific `tokenId`. Requirements - `tokenId` must exist. | - -
- -### isApprovedForAll - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isapprovedforall) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `isApprovedForAll(address,address)` -- Function selector: `0xe985e9c5` - -::: - -```solidity -function isApprovedForAll( - address tokenOwner, - address operator -) external view returns (bool); -``` - -_Checking if address `operator` is approved to transfer any tokenId owned by address `owner`._ - -Compatible with ERC721 isApprovedForAll. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | -------------------------------- | -| `tokenOwner` | `address` | The tokenOwner address to query. | -| `operator` | `address` | The operator address to query. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | --------------------------------------------------------------------------- | -| `0` | `bool` | Returns if the `operator` is allowed to manage all of the assets of `owner` | - -
- -### isOperatorFor - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `isOperatorFor(address,bytes32)` -- Function selector: `0x2a3654a4` - -::: - -```solidity -function isOperatorFor( - address operator, - bytes32 tokenId -) external view returns (bool); -``` - -Returns whether `operator` address is an operator for a given `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------- | -| `operator` | `address` | The address to query operator status for. | -| `tokenId` | `bytes32` | The token ID to check if `operator` is allowed to operate on. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | --------------------------------------------------------------------- | -| `0` | `bool` | `true` if `operator` is an operator for `tokenId`, `false` otherwise. | - -
- -### name - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#name) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `name()` -- Function selector: `0x06fdde03` - -::: - -```solidity -function name() external view returns (string); -``` - -Returns the name of the token. For compatibility with clients & tools that expect ERC721. - -#### Returns - -| Name | Type | Description | -| ---- | :------: | --------------------- | -| `0` | `string` | The name of the token | - -
- -### owner - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `owner()` -- Function selector: `0x8da5cb5b` - -::: - -```solidity -function owner() external view returns (address); -``` - -Returns the address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------- | -| `0` | `address` | - | - -
- -### ownerOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownerof) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `ownerOf(uint256)` -- Function selector: `0x6352211e` - -::: - -```solidity -function ownerOf(uint256 tokenId) external view returns (address); -``` - -_Retrieving the address that own tokenId `tokenId`._ - -Compatible with ERC721 ownerOf. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | --------------------- | -| `tokenId` | `uint256` | The tokenId to query. | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------- | -| `0` | `address` | The owner of the tokenId. | - -
- -### renounceOwnership - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `renounceOwnership()` -- Function selector: `0x715018a6` - -::: - -```solidity -function renounceOwnership() external nonpayable; -``` - -Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner. - -
- -### revokeOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `revokeOperator(address,bytes32,bool,bytes)` -- Function selector: `0xdb8c9663` - -::: - -```solidity -function revokeOperator( - address operator, - bytes32 tokenId, - bool notify, - bytes operatorNotificationData -) external nonpayable; -``` - -Remove access of `operator` for a given `tokenId`, disallowing it to transfer `tokenId` on behalf of its owner. See also [`isOperatorFor`](#isoperatorfor). - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | -------------------------------------------------------- | -| `operator` | `address` | The address to revoke as an operator. | -| `tokenId` | `bytes32` | The tokenId `operator` is revoked from operating on. | -| `notify` | `bool` | Boolean indicating whether to notify the operator or not | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### safeTransferFrom - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#safetransferfrom) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `safeTransferFrom(address,address,uint256)` -- Function selector: `0x42842e0e` - -::: - -:::info - -This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - -::: - -```solidity -function safeTransferFrom( - address from, - address to, - uint256 tokenId -) external nonpayable; -``` - -_Calling `safeTransferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`._ - -Safe Transfer function without optional data from the ERC721 standard interface. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ------------------------ | -| `from` | `address` | The sending address. | -| `to` | `address` | The receiving address. | -| `tokenId` | `uint256` | The tokenId to transfer. | - -
- -### safeTransferFrom - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#safetransferfrom) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `safeTransferFrom(address,address,uint256,bytes)` -- Function selector: `0xb88d4fde` - -::: - -:::info - -This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - -::: - -```solidity -function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes data -) external nonpayable; -``` - -_Calling `safeTransferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`._ - -Safe Transfer function with optional data from the ERC721 standard interface. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------- | -| `from` | `address` | The sending address. | -| `to` | `address` | The receiving address. | -| `tokenId` | `uint256` | The tokenId to transfer. | -| `data` | `bytes` | The data to be sent with the transfer. | - -
- -### setApprovalForAll - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setapprovalforall) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `setApprovalForAll(address,bool)` -- Function selector: `0xa22cb465` - -::: - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable; -``` - -_Setting the "approval for all" status of operator `_operator` to `_approved` to allow it to transfer any tokenIds on behalf of `msg.sender`._ - -Enable or disable approval for a third party ("operator") to manage all of `msg.sender`'s assets. The contract MUST allow multiple operators per owner. See [`_setApprovalForAll`](#_setapprovalforall) - -
- -**Emitted events:** - -- [`ApprovalForAll`](#approvalforall) event - -
- -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------------------------------------------------------- | -| `operator` | `address` | Address to add to the set of authorized operators. | -| `approved` | `bool` | True if the operator is approved, false to revoke approval. | - -
- -### setData - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `setData(bytes32,bytes)` -- Function selector: `0x7f23690c` - -::: - -:::caution Warning - -**Note for developers:** despite the fact that this function is set as `payable`, if the function is not intended to receive value (= native tokens), **an additional check should be implemented to ensure that `msg.value` sent was equal to 0**. - -::: - -```solidity -function setData(bytes32 dataKey, bytes dataValue) external payable; -``` - -_Setting the following data key value pair in the ERC725Y storage. Data key: `dataKey`, data value: `dataValue`._ - -Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data key `dataKey`. The function is marked as payable to enable flexibility on child contracts. For instance to implement a fee mechanism for setting specific data. - -
- -**Requirements:** - -- SHOULD only be callable by the [`owner`](#owner). - -
- -
- -**Emitted events:** - -- [`DataChanged`](#datachanged) event. - -
- -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ------------------------------------------ | -| `dataKey` | `bytes32` | The data key for which to set a new value. | -| `dataValue` | `bytes` | The new bytes value to set. | - -
- -### setDataBatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `setDataBatch(bytes32[],bytes[])` -- Function selector: `0x97902421` - -::: - -:::caution Warning - -**Note for developers:** despite the fact that this function is set as `payable`, if the function is not intended to receive value (= native tokens), **an additional check should be implemented to ensure that `msg.value` sent was equal to 0**. - -::: - -```solidity -function setDataBatch(bytes32[] dataKeys, bytes[] dataValues) external payable; -``` - -_Setting the following data key value pairs in the ERC725Y storage. Data keys: `dataKeys`, data values: `dataValues`._ - -Batch data setting function that behaves the same as [`setData`](#setdata) but allowing to set multiple data key/value pairs in the ERC725Y storage in the same transaction. - -
- -**Requirements:** - -- SHOULD only be callable by the [`owner`](#owner) of the contract. - -
- -
- -**Emitted events:** - -- [`DataChanged`](#datachanged) event **for each data key/value pair set**. - -
- -#### Parameters - -| Name | Type | Description | -| ------------ | :---------: | ---------------------------------------------------- | -| `dataKeys` | `bytes32[]` | An array of data keys to set bytes values for. | -| `dataValues` | `bytes[]` | An array of bytes values to set for each `dataKeys`. | - -
- -### setDataBatchForTokenIds - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `setDataBatchForTokenIds(bytes32[],bytes32[],bytes[])` -- Function selector: `0xbe9f0e6f` - -::: - -```solidity -function setDataBatchForTokenIds( - bytes32[] tokenIds, - bytes32[] dataKeys, - bytes[] dataValues -) external nonpayable; -``` - -_Sets data in batch for multiple `tokenId` and `dataKey` pairs._ - -#### Parameters - -| Name | Type | Description | -| ------------ | :---------: | ----------------------------------------------------- | -| `tokenIds` | `bytes32[]` | An array of token IDs. | -| `dataKeys` | `bytes32[]` | An array of data keys corresponding to the token IDs. | -| `dataValues` | `bytes[]` | An array of values to set for the given data keys. | - -
- -### setDataForTokenId - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `setDataForTokenId(bytes32,bytes32,bytes)` -- Function selector: `0xd6c1407c` - -::: - -```solidity -function setDataForTokenId( - bytes32 tokenId, - bytes32 dataKey, - bytes dataValue -) external nonpayable; -``` - -_Sets data for a specific `tokenId` and `dataKey`._ - -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ---------------------------------------- | -| `tokenId` | `bytes32` | The unique identifier for a token. | -| `dataKey` | `bytes32` | The key for the data to set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### supportsInterface - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `supportsInterface(bytes4)` -- Function selector: `0x01ffc9a7` - -::: - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool); -``` - -Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas. - -#### Parameters - -| Name | Type | Description | -| ------------- | :------: | ----------- | -| `interfaceId` | `bytes4` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ----------- | -| `0` | `bool` | - | - -
- -### symbol - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#symbol) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `symbol()` -- Function selector: `0x95d89b41` - -::: - -```solidity -function symbol() external view returns (string); -``` - -Returns the symbol of the token, usually a shorter version of the name. For compatibility with clients & tools that expect ERC721. - -#### Returns - -| Name | Type | Description | -| ---- | :------: | ----------------------- | -| `0` | `string` | The symbol of the token | - -
- -### tokenIdsOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `tokenIdsOf(address)` -- Function selector: `0xa3b261f2` - -::: - -```solidity -function tokenIdsOf(address tokenOwner) external view returns (bytes32[]); -``` - -Returns the list of token IDs that the `tokenOwner` address owns. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ---------------------------------------------------------- | -| `tokenOwner` | `address` | The address that we want to get the list of token IDs for. | - -#### Returns - -| Name | Type | Description | -| ---- | :---------: | ------------------------------------------------------- | -| `0` | `bytes32[]` | An array of `bytes32[] tokenIds` owned by `tokenOwner`. | - -
- -### tokenOwnerOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `tokenOwnerOf(bytes32)` -- Function selector: `0x217b2270` - -::: - -```solidity -function tokenOwnerOf(bytes32 tokenId) external view returns (address); -``` - -Returns the list of `tokenIds` for the `tokenOwner` address. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------------- | -| `tokenId` | `bytes32` | tokenOwner The address to query owned tokens | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------------------------------------- | -| `0` | `address` | The owner address of the given `tokenId`. | - -
- -### tokenURI - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenuri) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `tokenURI(uint256)` -- Function selector: `0xc87b56dd` - -::: - -```solidity -function tokenURI(uint256) external view returns (string); -``` - -_Retrieving the token URI of tokenId `tokenId`._ - -Compatible with ERC721Metadata tokenURI. Retrieve the tokenURI for a specific `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ---- | :-------: | ----------- | -| `_0` | `uint256` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :------: | -------------- | -| `0` | `string` | The token URI. | - -
- -### totalSupply - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `totalSupply()` -- Function selector: `0x18160ddd` - -::: - -```solidity -function totalSupply() external view returns (uint256); -``` - -Returns the number of existing tokens that have been minted in this contract. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------ | -| `0` | `uint256` | The number of existing tokens. | - -
- -### transfer - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `transfer(address,address,bytes32,bool,bytes)` -- Function selector: `0x511b6952` - -::: - -```solidity -function transfer( - address from, - address to, - bytes32 tokenId, - bool force, - bytes data -) external nonpayable; -``` - -Transfer a given `tokenId` token from the `from` address to the `to` address. If operators are set for a specific `tokenId`, all the operators are revoked after the tokenId have been transferred. The `force` parameter MUST be set to `true` when transferring tokens to Externally Owned Accounts (EOAs) or contracts that do not implement the LSP1 standard. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | `address` | The address that owns the given `tokenId`. | -| `to` | `address` | The address that will receive the `tokenId`. | -| `tokenId` | `bytes32` | The token ID to transfer. | -| `force` | `bool` | When set to `true`, the `to` address CAN be any addres. When set to `false`, the `to` address MUST be a contract that supports the LSP1 UniversalReceiver standard. | -| `data` | `bytes` | Any additional data the caller wants included in the emitted event, and sent in the hooks of the `from` and `to` addresses. | - -
- -### transferBatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `transferBatch(address[],address[],bytes32[],bool[],bytes[])` -- Function selector: `0x7e87632c` - -::: - -```solidity -function transferBatch( - address[] from, - address[] to, - bytes32[] tokenId, - bool[] force, - bytes[] data -) external nonpayable; -``` - -Transfers multiple tokens at once based on the arrays of `from`, `to` and `tokenId`. If any transfer fails, the whole call will revert. - -#### Parameters - -| Name | Type | Description | -| --------- | :---------: | ----------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | `address[]` | An array of sending addresses. | -| `to` | `address[]` | An array of recipient addresses. | -| `tokenId` | `bytes32[]` | An array of token IDs to transfer. | -| `force` | `bool[]` | When set to `true`, `to` may be any address. When set to `false`, `to` must be a contract that supports the LSP1 standard and not revert. | -| `data` | `bytes[]` | Any additional data the caller wants included in the emitted event, and sent in the hooks to the `from` and `to` addresses. | - -
- -### transferFrom - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferfrom) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `transferFrom(address,address,uint256)` -- Function selector: `0x23b872dd` - -::: - -:::info - -This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - -::: - -```solidity -function transferFrom( - address from, - address to, - uint256 tokenId -) external nonpayable; -``` - -_Calling `transferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`._ - -Transfer functions from the ERC721 standard interface. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ------------------------ | -| `from` | `address` | The sending address. | -| `to` | `address` | The receiving address. | -| `tokenId` | `uint256` | The tokenId to transfer. | - -
- -### transferOwnership - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Function signature: `transferOwnership(address)` -- Function selector: `0xf2fde38b` - -::: - -```solidity -function transferOwnership(address newOwner) external nonpayable; -``` - -Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `newOwner` | `address` | - | - -
- -## Internal Methods - -Any method labeled as `internal` serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs. - -Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities. - -### \_checkOwner - -```solidity -function _checkOwner() internal view; -``` - -Throws if the sender is not the owner. - -
- -### \_setOwner - -```solidity -function _setOwner(address newOwner) internal nonpayable; -``` - -Changes the owner if `newOwner` and oldOwner are different -This pattern is useful in inheritance. - -
- -### \_getData - -```solidity -function _getData(bytes32 dataKey) internal view returns (bytes dataValue); -``` - -Read the value stored under a specific `dataKey` inside the underlying ERC725Y storage, -represented as a mapping of `bytes32` data keys mapped to their `bytes` data values. - -```solidity -mapping(bytes32 => bytes) _store -``` - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------------------------------------------------------------------- | -| `dataKey` | `bytes32` | A bytes32 data key to read the associated `bytes` value from the store. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ----------------------------------------------------------------------------- | -| `dataValue` | `bytes` | The `bytes` value associated with the given `dataKey` in the ERC725Y storage. | - -
- -### \_setData - -```solidity -function _setData(bytes32 dataKey, bytes dataValue) internal nonpayable; -``` - -The ERC725Y data key `_LSP8_TOKENID_FORMAT_KEY` cannot be changed -once the identifiable digital asset contract has been deployed. - -
- -### \_isOperatorOrOwner - -```solidity -function _isOperatorOrOwner( - address caller, - bytes32 tokenId -) internal view returns (bool); -``` - -verifies if the `caller` is operator or owner for the `tokenId` - -#### Returns - -| Name | Type | Description | -| ---- | :----: | -------------------------------------------- | -| `0` | `bool` | true if `caller` is either operator or owner | - -
- -### \_revokeOperator - -```solidity -function _revokeOperator( - address operator, - address tokenOwner, - bytes32 tokenId, - bool notified, - bytes operatorNotificationData -) internal nonpayable; -``` - -removes `operator` from the list of operators for the `tokenId` - -
- -### \_clearOperators - -```solidity -function _clearOperators( - address tokenOwner, - bytes32 tokenId -) internal nonpayable; -``` - -revoke all the current operators for a specific `tokenId` token which belongs to `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ------------------------------------------------- | -| `tokenOwner` | `address` | The address that is the owner of the `tokenId`. | -| `tokenId` | `bytes32` | The token to remove the associated operators for. | - -
- -### \_exists - -```solidity -function _exists(bytes32 tokenId) internal view returns (bool); -``` - -Returns whether `tokenId` exists. -Tokens start existing when they are minted ([`_mint`](#_mint)), and stop existing when they are burned ([`_burn`](#_burn)). - -
- -### \_existsOrError - -```solidity -function _existsOrError(bytes32 tokenId) internal view; -``` - -When `tokenId` does not exist then revert with an error. - -
- -### \_mint - -```solidity -function _mint( - address to, - bytes32 tokenId, - bool force, - bytes data -) internal nonpayable; -``` - -
- -### \_burn - -```solidity -function _burn(bytes32 tokenId, bytes data) internal nonpayable; -``` - -
- -### \_transfer - -```solidity -function _transfer( - address from, - address to, - bytes32 tokenId, - bool force, - bytes data -) internal nonpayable; -``` - -
- -### \_setDataForTokenId - -```solidity -function _setDataForTokenId( - bytes32 tokenId, - bytes32 dataKey, - bytes dataValue -) internal nonpayable; -``` - -Sets data for a specific `tokenId` and `dataKey` in the ERC725Y storage -The ERC725Y data key is the hash of the `tokenId` and `dataKey` concatenated - -
- -**Emitted events:** - -- [`TokenIdDataChanged`](#tokeniddatachanged) event. - -
- -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ---------------------------------------- | -| `tokenId` | `bytes32` | The unique identifier for a token. | -| `dataKey` | `bytes32` | The key for the data to set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### \_getDataForTokenId - -```solidity -function _getDataForTokenId( - bytes32 tokenId, - bytes32 dataKey -) internal view returns (bytes dataValues); -``` - -Retrieves data for a specific `tokenId` and `dataKey` from the ERC725Y storage -The ERC725Y data key is the hash of the `tokenId` and `dataKey` concatenated - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ---------------------------------- | -| `tokenId` | `bytes32` | The unique identifier for a token. | -| `dataKey` | `bytes32` | The key for the data to retrieve. | - -#### Returns - -| Name | Type | Description | -| ------------ | :-----: | ----------------------------------------------------------------- | -| `dataValues` | `bytes` | The data value associated with the given `tokenId` and `dataKey`. | - -
- -### \_beforeTokenTransfer - -```solidity -function _beforeTokenTransfer( - address from, - address to, - bytes32 tokenId, - bytes data -) internal nonpayable; -``` - -Hook that is called before any token transfer, including minting and burning. -Allows to run custom logic before updating balances and notifiying sender/recipient by overriding this function. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------- | -| `from` | `address` | The sender address | -| `to` | `address` | @param tokenId The tokenId to transfer | -| `tokenId` | `bytes32` | The tokenId to transfer | -| `data` | `bytes` | The data sent alongside the transfer | - -
- -### \_afterTokenTransfer - -```solidity -function _afterTokenTransfer( - address from, - address to, - bytes32 tokenId, - bytes data -) internal nonpayable; -``` - -Hook that is called after any token transfer, including minting and burning. -Allows to run custom logic after updating balances, but **before notifiying sender/recipient via LSP1** by overriding this function. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------- | -| `from` | `address` | The sender address | -| `to` | `address` | @param tokenId The tokenId to transfer | -| `tokenId` | `bytes32` | The tokenId to transfer | -| `data` | `bytes` | The data sent alongside the transfer | - -
- -### \_notifyTokenOperator - -```solidity -function _notifyTokenOperator( - address operator, - bytes lsp1Data -) internal nonpayable; -``` - -Attempt to notify the operator `operator` about the `tokenId` being authorized. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP8_TOKENOPERATOR` as typeId, if `operator` is a contract that supports the LSP1 interface. -If `operator` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------------------------ | -| `operator` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `lsp1Data` | `bytes` | the data to be sent to the `operator` address in the `universalReceiver` call. | - -
- -### \_notifyTokenSender - -```solidity -function _notifyTokenSender(address from, bytes lsp1Data) internal nonpayable; -``` - -Attempt to notify the token sender `from` about the `tokenId` being transferred. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP8_TOKENSSENDER` as typeId, if `from` is a contract that supports the LSP1 interface. -If `from` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------------------------ | -| `from` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `lsp1Data` | `bytes` | the data to be sent to the `from` address in the `universalReceiver` call. | - -
- -### \_notifyTokenReceiver - -```solidity -function _notifyTokenReceiver( - address to, - bool force, - bytes lsp1Data -) internal nonpayable; -``` - -Attempt to notify the token receiver `to` about the `tokenId` being received. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP8_TOKENSRECIPIENT` as typeId, if `to` is a contract that supports the LSP1 interface. -If `to` is is an EOA or a contract that does not support the LSP1 interface, the behaviour will depend on the `force` boolean flag. - -- if `force` is set to `true`, nothing will happen and no notification will be sent. - -- if `force` is set to `false, the transaction will revert. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | --------------------------------------------------------------------------------------------------- | -| `to` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `force` | `bool` | A boolean that describe if transfer to a `to` address that does not support LSP1 is allowed or not. | -| `lsp1Data` | `bytes` | The data to be sent to the `to` address in the `universalReceiver(...)` call. | - -
- -### \_supportsInterfaceInERC165Extension - -```solidity -function _supportsInterfaceInERC165Extension( - bytes4 interfaceId -) internal view returns (bool); -``` - -Returns whether the interfaceId being checked is supported in the extension of the -[`supportsInterface`](#supportsinterface) selector. -To be used by extendable contracts wishing to extend the ERC165 interfaceIds originally -supported by reading whether the interfaceId queried is supported in the `supportsInterface` -extension if the extension is set, if not it returns false. - -
- -### \_getExtensionAndForwardValue - -```solidity -function _getExtensionAndForwardValue( - bytes4 functionSelector -) internal view returns (address, bool); -``` - -Returns the extension address stored under the following data key: - -- [`_LSP17_EXTENSION_PREFIX`](#_lsp17_extension_prefix) + `` (Check [LSP2-ERC725YJSONSchema] for encoding the data key). - -- If no extension is stored, returns the address(0). - -
- -### \_fallbackLSP17Extendable - -:::info - -The LSP8 Token contract should not hold any native tokens. Any native tokens received by the contract -will be forwarded to the extension address mapped to the selector from `msg.sig`. - -::: - -```solidity -function _fallbackLSP17Extendable( - bytes callData -) internal nonpayable returns (bytes); -``` - -Forwards the call with the received value to an extension mapped to a function selector. -Calls [`_getExtensionAndForwardValue`](#_getextensionandforwardvalue) to get the address of the extension mapped to the function selector being -called on the account. If there is no extension, the address(0) will be returned. -We will always forward the value to the extension, as the LSP8 contract is not supposed to hold any native tokens. -Reverts if there is no extension for the function being called. -If there is an extension for the function selector being called, it calls the extension with the -CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of the [`msg.sender`](#msg.sender) and -32 bytes of the [`msg.value`](#msg.value) - -
- -### \_safeTransfer - -```solidity -function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes data -) internal nonpayable; -``` - -Transfer the `tokenId` from `from` to `to` and check if the `to` recipient address is -a contract that implements the `IERC721Received` interface and return the right magic value. -See [`_checkOnERC721Received`](#_checkonerc721received) for more infos. - -
- -### \_setApprovalForAll - -```solidity -function _setApprovalForAll( - address tokensOwner, - address operator, - bool approved -) internal nonpayable; -``` - -Approve `operator` to operate on all tokens of `tokensOwner`. - -
- -**Emitted events:** - -- [`ApprovalForAll`](#approvalforall) event. - -
- -
- -## Events - -### Approval - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#approval) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `Approval(address,address,uint256)` -- Event topic hash: `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` - -::: - -```solidity -event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); -``` - -Emitted when `owner` enables `approved` to manage the `tokenId` token. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | ----------- | -| `owner` **`indexed`** | `address` | - | -| `approved` **`indexed`** | `address` | - | -| `tokenId` **`indexed`** | `uint256` | - | - -
- -### ApprovalForAll - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#approvalforall) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `ApprovalForAll(address,address,bool)` -- Event topic hash: `0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31` - -::: - -```solidity -event ApprovalForAll(address indexed owner, address indexed operator, bool approved); -``` - -Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | ----------- | -| `owner` **`indexed`** | `address` | - | -| `operator` **`indexed`** | `address` | - | -| `approved` | `bool` | - | - -
- -### DataChanged - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `DataChanged(bytes32,bytes)` -- Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` - -::: - -```solidity -event DataChanged(bytes32 indexed dataKey, bytes dataValue); -``` - -_The following data key/value pair has been changed in the ERC725Y storage: Data key: `dataKey`, data value: `dataValue`._ - -Emitted when data at a specific `dataKey` was changed to a new value `dataValue`. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | -------------------------------------------- | -| `dataKey` **`indexed`** | `bytes32` | The data key for which a bytes value is set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### OperatorAuthorizationChanged - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `OperatorAuthorizationChanged(address,address,bytes32,bytes)` -- Event topic hash: `0x1b1b58aa2ec0cec2228b2d37124556d41f5a1f7b12f089171f896cc236671215` - -::: - -```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bytes operatorNotificationData); -``` - -Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | -------------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address authorized as an operator. | -| `tokenOwner` **`indexed`** | `address` | The owner of the `tokenId`. | -| `tokenId` **`indexed`** | `bytes32` | The tokenId `operator` address has access on behalf of `tokenOwner`. | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### OperatorRevoked - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `OperatorRevoked(address,address,bytes32,bool,bytes)` -- Event topic hash: `0xc78cd419d6136f9f1c1c6aec1d3fae098cffaf8bc86314a8f2685e32fe574e3c` - -::: - -```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bool notified, bytes operatorNotificationData); -``` - -Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on its behalf. - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ---------------------------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address revoked from the operator array ([`getOperatorsOf`](#getoperatorsof)). | -| `tokenOwner` **`indexed`** | `address` | The owner of the `tokenId`. | -| `tokenId` **`indexed`** | `bytes32` | The tokenId `operator` is revoked from operating on. | -| `notified` | `bool` | Bool indicating whether the operator has been notified or not | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### OwnershipTransferred - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `OwnershipTransferred(address,address)` -- Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` - -::: - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------------- | :-------: | ----------- | -| `previousOwner` **`indexed`** | `address` | - | -| `newOwner` **`indexed`** | `address` | - | - -
- -### TokenIdDataChanged - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `TokenIdDataChanged(bytes32,bytes32,bytes)` -- Event topic hash: `0xa6e4251f855f750545fe414f120db91c76b88def14d120969e5bb2d3f05debbb` - -::: - -```solidity -event TokenIdDataChanged(bytes32 indexed tokenId, bytes32 indexed dataKey, bytes dataValue); -``` - -Emitted when setting data for `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | -------------------------------------------- | -| `tokenId` **`indexed`** | `bytes32` | The tokenId which data is set for. | -| `dataKey` **`indexed`** | `bytes32` | The data key for which a bytes value is set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### Transfer - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `Transfer(address,address,address,bytes32,bool,bytes)` -- Event topic hash: `0xb333c813a7426a7a11e2b190cad52c44119421594b47f6f32ace6d8c7207b2bf` - -::: - -```solidity -event Transfer(address operator, address indexed from, address indexed to, bytes32 indexed tokenId, bool force, bytes data); -``` - -Emitted when `tokenId` token is transferred from the `from` to the `to` address. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | ---------------------------------------------------------------------------------------------------------------------------------- | -| `operator` | `address` | The address of operator that sent the `tokenId` | -| `from` **`indexed`** | `address` | The previous owner of the `tokenId` | -| `to` **`indexed`** | `address` | The new owner of `tokenId` | -| `tokenId` **`indexed`** | `bytes32` | The tokenId that was transferred | -| `force` | `bool` | If the token transfer enforces the `to` recipient address to be a contract that implements the LSP1 standard or not. | -| `data` | `bytes` | Any additional data the caller included by the caller during the transfer, and sent in the hooks to the `from` and `to` addresses. | - -
- -### Transfer - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Event signature: `Transfer(address,address,uint256)` -- Event topic hash: `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` - -::: - -```solidity -event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); -``` - -Emitted when `tokenId` token is transferred from `from` to `to`. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | ----------- | -| `from` **`indexed`** | `address` | - | -| `to` **`indexed`** | `address` | - | -| `tokenId` **`indexed`** | `uint256` | - | - -
- -## Errors - -### ERC725Y_DataKeysValuesEmptyArray - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `ERC725Y_DataKeysValuesEmptyArray()` -- Error hash: `0x97da5f95` - -::: - -```solidity -error ERC725Y_DataKeysValuesEmptyArray(); -``` - -Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabatch) function is an empty array. - -
- -### ERC725Y_DataKeysValuesLengthMismatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` -- Error hash: `0x3bcc8979` - -::: - -```solidity -error ERC725Y_DataKeysValuesLengthMismatch(); -``` - -Reverts when there is not the same number of elements in the `datakeys` and `dataValues` array parameters provided when calling the [`setDataBatch`](#setdatabatch) function. - -
- -### ERC725Y_MsgValueDisallowed - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `ERC725Y_MsgValueDisallowed()` -- Error hash: `0xf36ba737` - -::: - -```solidity -error ERC725Y_MsgValueDisallowed(); -``` - -Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#setdatabatch) function. - -
- -### InvalidExtensionAddress - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `InvalidExtensionAddress(bytes)` -- Error hash: `0x42bfe79f` - -::: - -```solidity -error InvalidExtensionAddress(bytes storedData); -``` - -reverts when the bytes retrieved from the LSP17 data key is not a valid address (not 20 bytes) - -#### Parameters - -| Name | Type | Description | -| ------------ | :-----: | ----------- | -| `storedData` | `bytes` | - | - -
- -### InvalidFunctionSelector - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `InvalidFunctionSelector(bytes)` -- Error hash: `0xe5099ee3` - -::: - -```solidity -error InvalidFunctionSelector(bytes data); -``` - -reverts when the contract is called with a function selector not valid (less than 4 bytes of data) - -#### Parameters - -| Name | Type | Description | -| ------ | :-----: | ----------- | -| `data` | `bytes` | - | - -
- -### LSP4TokenNameNotEditable - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP4TokenNameNotEditable()` -- Error hash: `0x85c169bd` - -::: - -```solidity -error LSP4TokenNameNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenName` after the digital asset contract has been deployed / initialized. The `LSP4TokenName` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP4TokenSymbolNotEditable - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP4TokenSymbolNotEditable()` -- Error hash: `0x76755b38` - -::: - -```solidity -error LSP4TokenSymbolNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital asset contract has been deployed / initialized. The `LSP4TokenSymbol` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP4TokenTypeNotEditable - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP4TokenTypeNotEditable()` -- Error hash: `0x4ef6d7fb` - -::: - -```solidity -error LSP4TokenTypeNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenType` after the digital asset contract has been deployed / initialized. The `LSP4TokenType` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor / initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP8BatchCallFailed - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8BatchCallFailed(uint256)` -- Error hash: `0x234eb819` - -::: - -```solidity -error LSP8BatchCallFailed(uint256 callIndex); -``` - -_Batch call failed._ - -Reverts when a batch call failed. - -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ----------- | -| `callIndex` | `uint256` | - | - -
- -### LSP8CannotSendToAddressZero - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8CannotSendToAddressZero()` -- Error hash: `0x24ecef4d` - -::: - -```solidity -error LSP8CannotSendToAddressZero(); -``` - -Reverts when trying to send token to the zero address. - -
- -### LSP8CannotSendToSelf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8CannotSendToSelf()` -- Error hash: `0x5d67d6c1` - -::: - -```solidity -error LSP8CannotSendToSelf(); -``` - -Reverts when specifying the same address for `from` and `to` in a token transfer. - -
- -### LSP8CannotUseAddressZeroAsOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8CannotUseAddressZeroAsOperator()` -- Error hash: `0x9577b8b3` - -::: - -```solidity -error LSP8CannotUseAddressZeroAsOperator(); -``` - -Reverts when trying to set the zero address as an operator. - -
- -### LSP8InvalidTransferBatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8InvalidTransferBatch()` -- Error hash: `0x93a83119` - -::: - -```solidity -error LSP8InvalidTransferBatch(); -``` - -Reverts when the parameters used for `transferBatch` have different lengths. - -
- -### LSP8NonExistentTokenId - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8NonExistentTokenId(bytes32)` -- Error hash: `0xae8f9a36` - -::: - -```solidity -error LSP8NonExistentTokenId(bytes32 tokenId); -``` - -Reverts when `tokenId` has not been minted. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------- | -| `tokenId` | `bytes32` | - | - -
- -### LSP8NonExistingOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8NonExistingOperator(address,bytes32)` -- Error hash: `0x4aa31a8c` - -::: - -```solidity -error LSP8NonExistingOperator(address operator, bytes32 tokenId); -``` - -Reverts when `operator` is not an operator for the `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `operator` | `address` | - | -| `tokenId` | `bytes32` | - | - -
- -### LSP8NotTokenOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8NotTokenOperator(bytes32,address)` -- Error hash: `0x1294d2a9` - -::: - -```solidity -error LSP8NotTokenOperator(bytes32 tokenId, address caller); -``` - -Reverts when `caller` is not an allowed operator for `tokenId`. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------- | -| `tokenId` | `bytes32` | - | -| `caller` | `address` | - | - -
- -### LSP8NotTokenOwner - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8NotTokenOwner(address,bytes32,address)` -- Error hash: `0x5b271ea2` - -::: - -```solidity -error LSP8NotTokenOwner(address tokenOwner, bytes32 tokenId, address caller); -``` - -Reverts when `caller` is not the `tokenOwner` of the `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ----------- | -| `tokenOwner` | `address` | - | -| `tokenId` | `bytes32` | - | -| `caller` | `address` | - | - -
- -### LSP8NotifyTokenReceiverContractMissingLSP1Interface - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8NotifyTokenReceiverContractMissingLSP1Interface(address)` -- Error hash: `0x4349776d` - -::: - -```solidity -error LSP8NotifyTokenReceiverContractMissingLSP1Interface( - address tokenReceiver -); -``` - -Reverts if the `tokenReceiver` does not implement LSP1 when minting or transferring tokens with `bool force` set as `false`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ----------- | -| `tokenReceiver` | `address` | - | - -
- -### LSP8NotifyTokenReceiverIsEOA - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8NotifyTokenReceiverIsEOA(address)` -- Error hash: `0x03173137` - -::: - -```solidity -error LSP8NotifyTokenReceiverIsEOA(address tokenReceiver); -``` - -Reverts if the `tokenReceiver` is an EOA when minting or transferring tokens with `bool force` set as `false`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ----------- | -| `tokenReceiver` | `address` | - | - -
- -### LSP8OperatorAlreadyAuthorized - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8OperatorAlreadyAuthorized(address,bytes32)` -- Error hash: `0xa7626b68` - -::: - -```solidity -error LSP8OperatorAlreadyAuthorized(address operator, bytes32 tokenId); -``` - -Reverts when `operator` is already authorized for the `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `operator` | `address` | - | -| `tokenId` | `bytes32` | - | - -
- -### LSP8TokenContractCannotHoldValue - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8TokenContractCannotHoldValue()` -- Error hash: `0x61f49442` - -::: - -```solidity -error LSP8TokenContractCannotHoldValue(); -``` - -_LSP8 contract cannot receive native tokens._ - -Error occurs when sending native tokens to the LSP8 contract without sending any data. E.g. Sending value without passing a bytes4 function selector to call a LSP17 Extension. - -
- -### LSP8TokenIdFormatNotEditable - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8TokenIdFormatNotEditable()` -- Error hash: `0x3664800a` - -::: - -```solidity -error LSP8TokenIdFormatNotEditable(); -``` - -Reverts when trying to edit the data key `LSP8TokenIdFormat` after the identifiable digital asset contract has been deployed. The `LSP8TokenIdFormat` data key is located inside the ERC725Y Data key-value store of the identifiable digital asset contract. It can be set only once inside the constructor/initializer when the identifiable digital asset contract is being deployed. - -
- -### LSP8TokenIdsDataEmptyArray - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8TokenIdsDataEmptyArray()` -- Error hash: `0x80c98305` - -::: - -```solidity -error LSP8TokenIdsDataEmptyArray(); -``` - -Reverts when empty arrays is passed to the function - -
- -### LSP8TokenIdsDataLengthMismatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8TokenIdsDataLengthMismatch()` -- Error hash: `0x2fa71dfe` - -::: - -```solidity -error LSP8TokenIdsDataLengthMismatch(); -``` - -Reverts when the length of the token IDs data arrays is not equal - -
- -### LSP8TokenOwnerCannotBeOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8TokenOwnerCannotBeOperator()` -- Error hash: `0x89fdad62` - -::: - -```solidity -error LSP8TokenOwnerCannotBeOperator(); -``` - -Reverts when trying to authorize or revoke the token's owner as an operator. - -
- -### LSP8TokenOwnerChanged - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` -- Error hash: `0x5a9c31d3` - -::: - -```solidity -error LSP8TokenOwnerChanged( - bytes32 tokenId, - address oldOwner, - address newOwner -); -``` - -Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `tokenId` | `bytes32` | - | -| `oldOwner` | `address` | - | -| `newOwner` | `address` | - | - -
- -### NoExtensionFoundForFunctionSelector - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` -- Error hash: `0xbb370b2b` - -::: - -```solidity -error NoExtensionFoundForFunctionSelector(bytes4 functionSelector); -``` - -reverts when there is no extension for the function selector being called with - -#### Parameters - -| Name | Type | Description | -| ------------------ | :------: | ----------- | -| `functionSelector` | `bytes4` | - | - -
- -### OwnableCallerNotTheOwner - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `OwnableCallerNotTheOwner(address)` -- Error hash: `0xbf1169c5` - -::: - -```solidity -error OwnableCallerNotTheOwner(address callerAddress); -``` - -Reverts when only the owner is allowed to call the function. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ---------------------------------------- | -| `callerAddress` | `address` | The address that tried to make the call. | - -
- -### OwnableCannotSetZeroAddressAsOwner - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP8CompatibleERC721.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol) -- Error signature: `OwnableCannotSetZeroAddressAsOwner()` -- Error hash: `0x1ad8836c` - -::: - -```solidity -error OwnableCannotSetZeroAddressAsOwner(); -``` - -Reverts when trying to set `address(0)` as the contract owner when deploying the contract, initializing it or transferring ownership of the contract. - -
diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md deleted file mode 100644 index b1d7a566b..000000000 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.md +++ /dev/null @@ -1,2627 +0,0 @@ - - - -# LSP8CompatibleERC721Mintable - -:::info Standard Specifications - -[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) - -::: -:::info Solidity implementation - -[`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) - -::: - -> LSP8CompatibleERC721Mintable deployable preset contract with a public [`mint`](#mint) function callable only by the contract [`owner`](#owner). - -## Public Methods - -Public methods are accessible externally from users, allowing interaction with this function from dApps or other smart contracts. -When marked as 'public', a method can be called both externally and internally, on the other hand, when marked as 'external', a method can only be called externally. - -### constructor - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#constructor) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) - -::: - -```solidity -constructor( - string name_, - string symbol_, - address newOwner_, - uint256 lsp4TokenType_, - uint256 lsp8TokenIdFormat_ -); -``` - -_Deploying a `LSP8CompatibleERC721Mintable` token contract with: token name = `name_`, token symbol = `symbol_`, and address `newOwner_` as the token contract owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | :-------: | ---------------------------------------------------------------------------------------------------- | -| `name_` | `string` | The name of the token. | -| `symbol_` | `string` | The symbol of the token. | -| `newOwner_` | `address` | The owner of the token contract. | -| `lsp4TokenType_` | `uint256` | The type of token this digital asset contract represents (`0` = Token, `1` = NFT, `2` = Collection). | -| `lsp8TokenIdFormat_` | `uint256` | The format of tokenIds (= NFTs) that this contract will create. | - -
- -### fallback - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) - -::: - -```solidity -fallback() external payable; -``` - -
- -### receive - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) - -::: - -```solidity -receive() external payable; -``` - -
- -### approve - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#approve) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `approve(address,uint256)` -- Function selector: `0x095ea7b3` - -::: - -```solidity -function approve(address operator, uint256 tokenId) external nonpayable; -``` - -_Calling `approve` function to approve operator at address `operator` to transfer tokenId `tokenId` on behalf of its owner._ - -Approval function compatible with ERC721 `approve(address,uint256)`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------- | -| `operator` | `address` | The address to approve for `tokenId`. | -| `tokenId` | `uint256` | The tokenId to approve. | - -
- -### authorizeOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `authorizeOperator(address,bytes32,bytes)` -- Function selector: `0x86a10ddd` - -::: - -```solidity -function authorizeOperator( - address operator, - bytes32 tokenId, - bytes operatorNotificationData -) external nonpayable; -``` - -Allow an `operator` address to transfer or burn a specific `tokenId` on behalf of its token owner. See [`isOperatorFor`](#isoperatorfor). Notify the operator based on the LSP1-UniversalReceiver standard - -
- -**Emitted events:** - -- LSP7 [`OperatorAuthorizationChanged`](#operatorauthorizationchanged) event. -- ERC721 [`Approval`](#approval) event. - -
- -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ----------------------------------------------- | -| `operator` | `address` | The address to authorize as an operator. | -| `tokenId` | `bytes32` | The token ID operator has access to. | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### balanceOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `balanceOf(address)` -- Function selector: `0x70a08231` - -::: - -```solidity -function balanceOf(address tokenOwner) external view returns (uint256); -``` - -Get the number of token IDs owned by `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ----------------------- | -| `tokenOwner` | `address` | The address to query \* | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------------------------------------------------- | -| `0` | `uint256` | The total number of token IDs that `tokenOwner` owns. | - -
- -### batchCalls - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `batchCalls(bytes[])` -- Function selector: `0x6963d438` - -::: - -:::info - -It's not possible to send value along the functions call due to the use of `delegatecall`. - -::: - -```solidity -function batchCalls(bytes[] data) external nonpayable returns (bytes[] results); -``` - -_Executing the following batch of abi-encoded function calls on the contract: `data`._ - -Allows a caller to batch different function calls in one call. Perform a `delegatecall` on self, to call different functions with preserving the context. - -#### Parameters - -| Name | Type | Description | -| ------ | :-------: | -------------------------------------------------------------------- | -| `data` | `bytes[]` | An array of ABI encoded function calls to be called on the contract. | - -#### Returns - -| Name | Type | Description | -| --------- | :-------: | ---------------------------------------------------------------- | -| `results` | `bytes[]` | An array of abi-encoded data returned by the functions executed. | - -
- -### getApproved - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getapproved) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `getApproved(uint256)` -- Function selector: `0x081812fc` - -::: - -```solidity -function getApproved(uint256 tokenId) external view returns (address); -``` - -_Retrieving the address other than the token owner that is approved to transfer tokenId `tokenId` on behalf of its owner._ - -Compatible with ERC721 getApproved. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | --------------------- | -| `tokenId` | `uint256` | The tokenId to query. | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------------ | -| `0` | `address` | The address of the operator for `tokenId`. | - -
- -### getData - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `getData(bytes32)` -- Function selector: `0x54f6127f` - -::: - -```solidity -function getData(bytes32 dataKey) external view returns (bytes dataValue); -``` - -_Reading the ERC725Y storage for data key `dataKey` returned the following value: `dataValue`._ - -Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey`. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | --------------------------------------------- | -| `dataKey` | `bytes32` | The data key for which to retrieve the value. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ---------------------------------------------------- | -| `dataValue` | `bytes` | The bytes value stored under the specified data key. | - -
- -### getDataBatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `getDataBatch(bytes32[])` -- Function selector: `0xdedff9c6` - -::: - -```solidity -function getDataBatch( - bytes32[] dataKeys -) external view returns (bytes[] dataValues); -``` - -_Reading the ERC725Y storage for data keys `dataKeys` returned the following values: `dataValues`._ - -Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :---------: | ------------------------------------------ | -| `dataKeys` | `bytes32[]` | The array of keys which values to retrieve | - -#### Returns - -| Name | Type | Description | -| ------------ | :-------: | ----------------------------------------- | -| `dataValues` | `bytes[]` | The array of data stored at multiple keys | - -
- -### getDataBatchForTokenIds - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `getDataBatchForTokenIds(bytes32[],bytes32[])` -- Function selector: `0x1d26fce6` - -::: - -```solidity -function getDataBatchForTokenIds( - bytes32[] tokenIds, - bytes32[] dataKeys -) external view returns (bytes[] dataValues); -``` - -_Retrieves data in batch for multiple `tokenId` and `dataKey` pairs._ - -#### Parameters - -| Name | Type | Description | -| ---------- | :---------: | ----------------------------------------------------- | -| `tokenIds` | `bytes32[]` | An array of token IDs. | -| `dataKeys` | `bytes32[]` | An array of data keys corresponding to the token IDs. | - -#### Returns - -| Name | Type | Description | -| ------------ | :-------: | ----------------------------------------------------------------- | -| `dataValues` | `bytes[]` | An array of data values for each pair of `tokenId` and `dataKey`. | - -
- -### getDataForTokenId - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `getDataForTokenId(bytes32,bytes32)` -- Function selector: `0x16e023b3` - -::: - -```solidity -function getDataForTokenId( - bytes32 tokenId, - bytes32 dataKey -) external view returns (bytes dataValue); -``` - -_Retrieves data for a specific `tokenId` and `dataKey`._ - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ---------------------------------- | -| `tokenId` | `bytes32` | The unique identifier for a token. | -| `dataKey` | `bytes32` | The key for the data to retrieve. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ----------------------------------------------------------------- | -| `dataValue` | `bytes` | The data value associated with the given `tokenId` and `dataKey`. | - -
- -### getOperatorsOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `getOperatorsOf(bytes32)` -- Function selector: `0x49a6078d` - -::: - -```solidity -function getOperatorsOf(bytes32 tokenId) external view returns (address[]); -``` - -Returns all `operator` addresses that are allowed to transfer or burn a specific `tokenId` on behalf of its owner. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------- | -| `tokenId` | `bytes32` | The token ID to get the operators for. | - -#### Returns - -| Name | Type | Description | -| ---- | :---------: | ------------------------------------------------------------------------------------------------------------ | -| `0` | `address[]` | An array of operators allowed to transfer or burn a specific `tokenId`. Requirements - `tokenId` must exist. | - -
- -### isApprovedForAll - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isapprovedforall) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `isApprovedForAll(address,address)` -- Function selector: `0xe985e9c5` - -::: - -```solidity -function isApprovedForAll( - address tokenOwner, - address operator -) external view returns (bool); -``` - -_Checking if address `operator` is approved to transfer any tokenId owned by address `owner`._ - -Compatible with ERC721 isApprovedForAll. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | -------------------------------- | -| `tokenOwner` | `address` | The tokenOwner address to query. | -| `operator` | `address` | The operator address to query. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | --------------------------------------------------------------------------- | -| `0` | `bool` | Returns if the `operator` is allowed to manage all of the assets of `owner` | - -
- -### isOperatorFor - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `isOperatorFor(address,bytes32)` -- Function selector: `0x2a3654a4` - -::: - -```solidity -function isOperatorFor( - address operator, - bytes32 tokenId -) external view returns (bool); -``` - -Returns whether `operator` address is an operator for a given `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------- | -| `operator` | `address` | The address to query operator status for. | -| `tokenId` | `bytes32` | The token ID to check if `operator` is allowed to operate on. | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | --------------------------------------------------------------------- | -| `0` | `bool` | `true` if `operator` is an operator for `tokenId`, `false` otherwise. | - -
- -### mint - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#mint) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `mint(address,bytes32,bool,bytes)` -- Function selector: `0xaf255b61` - -::: - -```solidity -function mint( - address to, - bytes32 tokenId, - bool force, - bytes data -) external nonpayable; -``` - -_Minting tokenId `tokenId` for address `to` with the additional data `data` (Note: allow non-LSP1 recipient is set to `force`)._ - -Public [`_mint`](#_mint) function only callable by the [`owner`](#owner). - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ------------------------------------------------------------------------------------------------------------------------------ | -| `to` | `address` | The address that will receive the minted `tokenId`. | -| `tokenId` | `bytes32` | The tokenId to mint. | -| `force` | `bool` | Set to `false` to ensure that you are minting for a recipient that implements LSP1, `false` otherwise for forcing the minting. | -| `data` | `bytes` | Any addition data to be sent alongside the minting. | - -
- -### name - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#name) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `name()` -- Function selector: `0x06fdde03` - -::: - -```solidity -function name() external view returns (string); -``` - -Returns the name of the token. For compatibility with clients & tools that expect ERC721. - -#### Returns - -| Name | Type | Description | -| ---- | :------: | --------------------- | -| `0` | `string` | The name of the token | - -
- -### owner - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `owner()` -- Function selector: `0x8da5cb5b` - -::: - -```solidity -function owner() external view returns (address); -``` - -Returns the address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------- | -| `0` | `address` | - | - -
- -### ownerOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownerof) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `ownerOf(uint256)` -- Function selector: `0x6352211e` - -::: - -```solidity -function ownerOf(uint256 tokenId) external view returns (address); -``` - -_Retrieving the address that own tokenId `tokenId`._ - -Compatible with ERC721 ownerOf. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | --------------------- | -| `tokenId` | `uint256` | The tokenId to query. | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------- | -| `0` | `address` | The owner of the tokenId. | - -
- -### renounceOwnership - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `renounceOwnership()` -- Function selector: `0x715018a6` - -::: - -```solidity -function renounceOwnership() external nonpayable; -``` - -Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner. - -
- -### revokeOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `revokeOperator(address,bytes32,bool,bytes)` -- Function selector: `0xdb8c9663` - -::: - -```solidity -function revokeOperator( - address operator, - bytes32 tokenId, - bool notify, - bytes operatorNotificationData -) external nonpayable; -``` - -Remove access of `operator` for a given `tokenId`, disallowing it to transfer `tokenId` on behalf of its owner. See also [`isOperatorFor`](#isoperatorfor). - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | -------------------------------------------------------- | -| `operator` | `address` | The address to revoke as an operator. | -| `tokenId` | `bytes32` | The tokenId `operator` is revoked from operating on. | -| `notify` | `bool` | Boolean indicating whether to notify the operator or not | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### safeTransferFrom - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#safetransferfrom) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `safeTransferFrom(address,address,uint256)` -- Function selector: `0x42842e0e` - -::: - -:::info - -This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - -::: - -```solidity -function safeTransferFrom( - address from, - address to, - uint256 tokenId -) external nonpayable; -``` - -_Calling `safeTransferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`._ - -Safe Transfer function without optional data from the ERC721 standard interface. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ------------------------ | -| `from` | `address` | The sending address. | -| `to` | `address` | The receiving address. | -| `tokenId` | `uint256` | The tokenId to transfer. | - -
- -### safeTransferFrom - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#safetransferfrom) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `safeTransferFrom(address,address,uint256,bytes)` -- Function selector: `0xb88d4fde` - -::: - -:::info - -This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - -::: - -```solidity -function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes data -) external nonpayable; -``` - -_Calling `safeTransferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`._ - -Safe Transfer function with optional data from the ERC721 standard interface. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------- | -| `from` | `address` | The sending address. | -| `to` | `address` | The receiving address. | -| `tokenId` | `uint256` | The tokenId to transfer. | -| `data` | `bytes` | The data to be sent with the transfer. | - -
- -### setApprovalForAll - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setapprovalforall) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `setApprovalForAll(address,bool)` -- Function selector: `0xa22cb465` - -::: - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable; -``` - -_Setting the "approval for all" status of operator `_operator` to `_approved` to allow it to transfer any tokenIds on behalf of `msg.sender`._ - -Enable or disable approval for a third party ("operator") to manage all of `msg.sender`'s assets. The contract MUST allow multiple operators per owner. See [`_setApprovalForAll`](#_setapprovalforall) - -
- -**Emitted events:** - -- [`ApprovalForAll`](#approvalforall) event - -
- -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------------------------------------------------------- | -| `operator` | `address` | Address to add to the set of authorized operators. | -| `approved` | `bool` | True if the operator is approved, false to revoke approval. | - -
- -### setData - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `setData(bytes32,bytes)` -- Function selector: `0x7f23690c` - -::: - -:::caution Warning - -**Note for developers:** despite the fact that this function is set as `payable`, if the function is not intended to receive value (= native tokens), **an additional check should be implemented to ensure that `msg.value` sent was equal to 0**. - -::: - -```solidity -function setData(bytes32 dataKey, bytes dataValue) external payable; -``` - -_Setting the following data key value pair in the ERC725Y storage. Data key: `dataKey`, data value: `dataValue`._ - -Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data key `dataKey`. The function is marked as payable to enable flexibility on child contracts. For instance to implement a fee mechanism for setting specific data. - -
- -**Requirements:** - -- SHOULD only be callable by the [`owner`](#owner). - -
- -
- -**Emitted events:** - -- [`DataChanged`](#datachanged) event. - -
- -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ------------------------------------------ | -| `dataKey` | `bytes32` | The data key for which to set a new value. | -| `dataValue` | `bytes` | The new bytes value to set. | - -
- -### setDataBatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `setDataBatch(bytes32[],bytes[])` -- Function selector: `0x97902421` - -::: - -:::caution Warning - -**Note for developers:** despite the fact that this function is set as `payable`, if the function is not intended to receive value (= native tokens), **an additional check should be implemented to ensure that `msg.value` sent was equal to 0**. - -::: - -```solidity -function setDataBatch(bytes32[] dataKeys, bytes[] dataValues) external payable; -``` - -_Setting the following data key value pairs in the ERC725Y storage. Data keys: `dataKeys`, data values: `dataValues`._ - -Batch data setting function that behaves the same as [`setData`](#setdata) but allowing to set multiple data key/value pairs in the ERC725Y storage in the same transaction. - -
- -**Requirements:** - -- SHOULD only be callable by the [`owner`](#owner) of the contract. - -
- -
- -**Emitted events:** - -- [`DataChanged`](#datachanged) event **for each data key/value pair set**. - -
- -#### Parameters - -| Name | Type | Description | -| ------------ | :---------: | ---------------------------------------------------- | -| `dataKeys` | `bytes32[]` | An array of data keys to set bytes values for. | -| `dataValues` | `bytes[]` | An array of bytes values to set for each `dataKeys`. | - -
- -### setDataBatchForTokenIds - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `setDataBatchForTokenIds(bytes32[],bytes32[],bytes[])` -- Function selector: `0xbe9f0e6f` - -::: - -```solidity -function setDataBatchForTokenIds( - bytes32[] tokenIds, - bytes32[] dataKeys, - bytes[] dataValues -) external nonpayable; -``` - -_Sets data in batch for multiple `tokenId` and `dataKey` pairs._ - -#### Parameters - -| Name | Type | Description | -| ------------ | :---------: | ----------------------------------------------------- | -| `tokenIds` | `bytes32[]` | An array of token IDs. | -| `dataKeys` | `bytes32[]` | An array of data keys corresponding to the token IDs. | -| `dataValues` | `bytes[]` | An array of values to set for the given data keys. | - -
- -### setDataForTokenId - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `setDataForTokenId(bytes32,bytes32,bytes)` -- Function selector: `0xd6c1407c` - -::: - -```solidity -function setDataForTokenId( - bytes32 tokenId, - bytes32 dataKey, - bytes dataValue -) external nonpayable; -``` - -_Sets data for a specific `tokenId` and `dataKey`._ - -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ---------------------------------------- | -| `tokenId` | `bytes32` | The unique identifier for a token. | -| `dataKey` | `bytes32` | The key for the data to set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### supportsInterface - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `supportsInterface(bytes4)` -- Function selector: `0x01ffc9a7` - -::: - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool); -``` - -Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas. - -#### Parameters - -| Name | Type | Description | -| ------------- | :------: | ----------- | -| `interfaceId` | `bytes4` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ----------- | -| `0` | `bool` | - | - -
- -### symbol - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#symbol) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `symbol()` -- Function selector: `0x95d89b41` - -::: - -```solidity -function symbol() external view returns (string); -``` - -Returns the symbol of the token, usually a shorter version of the name. For compatibility with clients & tools that expect ERC721. - -#### Returns - -| Name | Type | Description | -| ---- | :------: | ----------------------- | -| `0` | `string` | The symbol of the token | - -
- -### tokenIdsOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `tokenIdsOf(address)` -- Function selector: `0xa3b261f2` - -::: - -```solidity -function tokenIdsOf(address tokenOwner) external view returns (bytes32[]); -``` - -Returns the list of token IDs that the `tokenOwner` address owns. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ---------------------------------------------------------- | -| `tokenOwner` | `address` | The address that we want to get the list of token IDs for. | - -#### Returns - -| Name | Type | Description | -| ---- | :---------: | ------------------------------------------------------- | -| `0` | `bytes32[]` | An array of `bytes32[] tokenIds` owned by `tokenOwner`. | - -
- -### tokenOwnerOf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `tokenOwnerOf(bytes32)` -- Function selector: `0x217b2270` - -::: - -```solidity -function tokenOwnerOf(bytes32 tokenId) external view returns (address); -``` - -Returns the list of `tokenIds` for the `tokenOwner` address. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------------- | -| `tokenId` | `bytes32` | tokenOwner The address to query owned tokens | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------------------------------------- | -| `0` | `address` | The owner address of the given `tokenId`. | - -
- -### tokenURI - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenuri) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `tokenURI(uint256)` -- Function selector: `0xc87b56dd` - -::: - -```solidity -function tokenURI(uint256) external view returns (string); -``` - -_Retrieving the token URI of tokenId `tokenId`._ - -Compatible with ERC721Metadata tokenURI. Retrieve the tokenURI for a specific `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ---- | :-------: | ----------- | -| `_0` | `uint256` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :------: | -------------- | -| `0` | `string` | The token URI. | - -
- -### totalSupply - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `totalSupply()` -- Function selector: `0x18160ddd` - -::: - -```solidity -function totalSupply() external view returns (uint256); -``` - -Returns the number of existing tokens that have been minted in this contract. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------ | -| `0` | `uint256` | The number of existing tokens. | - -
- -### transfer - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `transfer(address,address,bytes32,bool,bytes)` -- Function selector: `0x511b6952` - -::: - -```solidity -function transfer( - address from, - address to, - bytes32 tokenId, - bool force, - bytes data -) external nonpayable; -``` - -Transfer a given `tokenId` token from the `from` address to the `to` address. If operators are set for a specific `tokenId`, all the operators are revoked after the tokenId have been transferred. The `force` parameter MUST be set to `true` when transferring tokens to Externally Owned Accounts (EOAs) or contracts that do not implement the LSP1 standard. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | `address` | The address that owns the given `tokenId`. | -| `to` | `address` | The address that will receive the `tokenId`. | -| `tokenId` | `bytes32` | The token ID to transfer. | -| `force` | `bool` | When set to `true`, the `to` address CAN be any addres. When set to `false`, the `to` address MUST be a contract that supports the LSP1 UniversalReceiver standard. | -| `data` | `bytes` | Any additional data the caller wants included in the emitted event, and sent in the hooks of the `from` and `to` addresses. | - -
- -### transferBatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `transferBatch(address[],address[],bytes32[],bool[],bytes[])` -- Function selector: `0x7e87632c` - -::: - -```solidity -function transferBatch( - address[] from, - address[] to, - bytes32[] tokenId, - bool[] force, - bytes[] data -) external nonpayable; -``` - -Transfers multiple tokens at once based on the arrays of `from`, `to` and `tokenId`. If any transfer fails, the whole call will revert. - -#### Parameters - -| Name | Type | Description | -| --------- | :---------: | ----------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | `address[]` | An array of sending addresses. | -| `to` | `address[]` | An array of recipient addresses. | -| `tokenId` | `bytes32[]` | An array of token IDs to transfer. | -| `force` | `bool[]` | When set to `true`, `to` may be any address. When set to `false`, `to` must be a contract that supports the LSP1 standard and not revert. | -| `data` | `bytes[]` | Any additional data the caller wants included in the emitted event, and sent in the hooks to the `from` and `to` addresses. | - -
- -### transferFrom - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferfrom) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `transferFrom(address,address,uint256)` -- Function selector: `0x23b872dd` - -::: - -:::info - -This function sets the `force` parameter to `true` so that EOAs and any contract can receive the `tokenId`. - -::: - -```solidity -function transferFrom( - address from, - address to, - uint256 tokenId -) external nonpayable; -``` - -_Calling `transferFrom` function to transfer tokenId `tokenId` from address `from` to address `to`._ - -Transfer functions from the ERC721 standard interface. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ------------------------ | -| `from` | `address` | The sending address. | -| `to` | `address` | The receiving address. | -| `tokenId` | `uint256` | The tokenId to transfer. | - -
- -### transferOwnership - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Function signature: `transferOwnership(address)` -- Function selector: `0xf2fde38b` - -::: - -```solidity -function transferOwnership(address newOwner) external nonpayable; -``` - -Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `newOwner` | `address` | - | - -
- -## Internal Methods - -Any method labeled as `internal` serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs. - -Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities. - -### \_checkOwner - -```solidity -function _checkOwner() internal view; -``` - -Throws if the sender is not the owner. - -
- -### \_setOwner - -```solidity -function _setOwner(address newOwner) internal nonpayable; -``` - -Changes the owner if `newOwner` and oldOwner are different -This pattern is useful in inheritance. - -
- -### \_getData - -```solidity -function _getData(bytes32 dataKey) internal view returns (bytes dataValue); -``` - -Read the value stored under a specific `dataKey` inside the underlying ERC725Y storage, -represented as a mapping of `bytes32` data keys mapped to their `bytes` data values. - -```solidity -mapping(bytes32 => bytes) _store -``` - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------------------------------------------------------------------- | -| `dataKey` | `bytes32` | A bytes32 data key to read the associated `bytes` value from the store. | - -#### Returns - -| Name | Type | Description | -| ----------- | :-----: | ----------------------------------------------------------------------------- | -| `dataValue` | `bytes` | The `bytes` value associated with the given `dataKey` in the ERC725Y storage. | - -
- -### \_setData - -```solidity -function _setData(bytes32 dataKey, bytes dataValue) internal nonpayable; -``` - -The ERC725Y data key `_LSP8_TOKENID_FORMAT_KEY` cannot be changed -once the identifiable digital asset contract has been deployed. - -
- -### \_isOperatorOrOwner - -```solidity -function _isOperatorOrOwner( - address caller, - bytes32 tokenId -) internal view returns (bool); -``` - -verifies if the `caller` is operator or owner for the `tokenId` - -#### Returns - -| Name | Type | Description | -| ---- | :----: | -------------------------------------------- | -| `0` | `bool` | true if `caller` is either operator or owner | - -
- -### \_revokeOperator - -```solidity -function _revokeOperator( - address operator, - address tokenOwner, - bytes32 tokenId, - bool notified, - bytes operatorNotificationData -) internal nonpayable; -``` - -removes `operator` from the list of operators for the `tokenId` - -
- -### \_clearOperators - -```solidity -function _clearOperators( - address tokenOwner, - bytes32 tokenId -) internal nonpayable; -``` - -revoke all the current operators for a specific `tokenId` token which belongs to `tokenOwner`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ------------------------------------------------- | -| `tokenOwner` | `address` | The address that is the owner of the `tokenId`. | -| `tokenId` | `bytes32` | The token to remove the associated operators for. | - -
- -### \_exists - -```solidity -function _exists(bytes32 tokenId) internal view returns (bool); -``` - -Returns whether `tokenId` exists. -Tokens start existing when they are minted ([`_mint`](#_mint)), and stop existing when they are burned ([`_burn`](#_burn)). - -
- -### \_existsOrError - -```solidity -function _existsOrError(bytes32 tokenId) internal view; -``` - -When `tokenId` does not exist then revert with an error. - -
- -### \_mint - -```solidity -function _mint( - address to, - bytes32 tokenId, - bool force, - bytes data -) internal nonpayable; -``` - -
- -### \_burn - -```solidity -function _burn(bytes32 tokenId, bytes data) internal nonpayable; -``` - -
- -### \_transfer - -```solidity -function _transfer( - address from, - address to, - bytes32 tokenId, - bool force, - bytes data -) internal nonpayable; -``` - -
- -### \_setDataForTokenId - -```solidity -function _setDataForTokenId( - bytes32 tokenId, - bytes32 dataKey, - bytes dataValue -) internal nonpayable; -``` - -Sets data for a specific `tokenId` and `dataKey` in the ERC725Y storage -The ERC725Y data key is the hash of the `tokenId` and `dataKey` concatenated - -
- -**Emitted events:** - -- [`TokenIdDataChanged`](#tokeniddatachanged) event. - -
- -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ---------------------------------------- | -| `tokenId` | `bytes32` | The unique identifier for a token. | -| `dataKey` | `bytes32` | The key for the data to set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### \_getDataForTokenId - -```solidity -function _getDataForTokenId( - bytes32 tokenId, - bytes32 dataKey -) internal view returns (bytes dataValues); -``` - -Retrieves data for a specific `tokenId` and `dataKey` from the ERC725Y storage -The ERC725Y data key is the hash of the `tokenId` and `dataKey` concatenated - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ---------------------------------- | -| `tokenId` | `bytes32` | The unique identifier for a token. | -| `dataKey` | `bytes32` | The key for the data to retrieve. | - -#### Returns - -| Name | Type | Description | -| ------------ | :-----: | ----------------------------------------------------------------- | -| `dataValues` | `bytes` | The data value associated with the given `tokenId` and `dataKey`. | - -
- -### \_beforeTokenTransfer - -```solidity -function _beforeTokenTransfer( - address from, - address to, - bytes32 tokenId, - bytes data -) internal nonpayable; -``` - -Hook that is called before any token transfer, including minting and burning. -Allows to run custom logic before updating balances and notifiying sender/recipient by overriding this function. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------- | -| `from` | `address` | The sender address | -| `to` | `address` | @param tokenId The tokenId to transfer | -| `tokenId` | `bytes32` | The tokenId to transfer | -| `data` | `bytes` | The data sent alongside the transfer | - -
- -### \_afterTokenTransfer - -```solidity -function _afterTokenTransfer( - address from, - address to, - bytes32 tokenId, - bytes data -) internal nonpayable; -``` - -Hook that is called after any token transfer, including minting and burning. -Allows to run custom logic after updating balances, but **before notifiying sender/recipient via LSP1** by overriding this function. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | -------------------------------------- | -| `from` | `address` | The sender address | -| `to` | `address` | @param tokenId The tokenId to transfer | -| `tokenId` | `bytes32` | The tokenId to transfer | -| `data` | `bytes` | The data sent alongside the transfer | - -
- -### \_notifyTokenOperator - -```solidity -function _notifyTokenOperator( - address operator, - bytes lsp1Data -) internal nonpayable; -``` - -Attempt to notify the operator `operator` about the `tokenId` being authorized. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP8_TOKENOPERATOR` as typeId, if `operator` is a contract that supports the LSP1 interface. -If `operator` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------------------------ | -| `operator` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `lsp1Data` | `bytes` | the data to be sent to the `operator` address in the `universalReceiver` call. | - -
- -### \_notifyTokenSender - -```solidity -function _notifyTokenSender(address from, bytes lsp1Data) internal nonpayable; -``` - -Attempt to notify the token sender `from` about the `tokenId` being transferred. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP8_TOKENSSENDER` as typeId, if `from` is a contract that supports the LSP1 interface. -If `from` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ------------------------------------------------------------------------------ | -| `from` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `lsp1Data` | `bytes` | the data to be sent to the `from` address in the `universalReceiver` call. | - -
- -### \_notifyTokenReceiver - -```solidity -function _notifyTokenReceiver( - address to, - bool force, - bytes lsp1Data -) internal nonpayable; -``` - -Attempt to notify the token receiver `to` about the `tokenId` being received. -This is done by calling its [`universalReceiver`](#universalreceiver) function with the `_TYPEID_LSP8_TOKENSRECIPIENT` as typeId, if `to` is a contract that supports the LSP1 interface. -If `to` is is an EOA or a contract that does not support the LSP1 interface, the behaviour will depend on the `force` boolean flag. - -- if `force` is set to `true`, nothing will happen and no notification will be sent. - -- if `force` is set to `false, the transaction will revert. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | --------------------------------------------------------------------------------------------------- | -| `to` | `address` | The address to call the [`universalReceiver`](#universalreceiver) function on. | -| `force` | `bool` | A boolean that describe if transfer to a `to` address that does not support LSP1 is allowed or not. | -| `lsp1Data` | `bytes` | The data to be sent to the `to` address in the `universalReceiver(...)` call. | - -
- -### \_supportsInterfaceInERC165Extension - -```solidity -function _supportsInterfaceInERC165Extension( - bytes4 interfaceId -) internal view returns (bool); -``` - -Returns whether the interfaceId being checked is supported in the extension of the -[`supportsInterface`](#supportsinterface) selector. -To be used by extendable contracts wishing to extend the ERC165 interfaceIds originally -supported by reading whether the interfaceId queried is supported in the `supportsInterface` -extension if the extension is set, if not it returns false. - -
- -### \_getExtensionAndForwardValue - -```solidity -function _getExtensionAndForwardValue( - bytes4 functionSelector -) internal view returns (address, bool); -``` - -Returns the extension address stored under the following data key: - -- [`_LSP17_EXTENSION_PREFIX`](#_lsp17_extension_prefix) + `` (Check [LSP2-ERC725YJSONSchema] for encoding the data key). - -- If no extension is stored, returns the address(0). - -
- -### \_fallbackLSP17Extendable - -:::info - -The LSP8 Token contract should not hold any native tokens. Any native tokens received by the contract -will be forwarded to the extension address mapped to the selector from `msg.sig`. - -::: - -```solidity -function _fallbackLSP17Extendable( - bytes callData -) internal nonpayable returns (bytes); -``` - -Forwards the call with the received value to an extension mapped to a function selector. -Calls [`_getExtensionAndForwardValue`](#_getextensionandforwardvalue) to get the address of the extension mapped to the function selector being -called on the account. If there is no extension, the address(0) will be returned. -We will always forward the value to the extension, as the LSP8 contract is not supposed to hold any native tokens. -Reverts if there is no extension for the function being called. -If there is an extension for the function selector being called, it calls the extension with the -CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of the [`msg.sender`](#msg.sender) and -32 bytes of the [`msg.value`](#msg.value) - -
- -### \_safeTransfer - -```solidity -function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes data -) internal nonpayable; -``` - -Transfer the `tokenId` from `from` to `to` and check if the `to` recipient address is -a contract that implements the `IERC721Received` interface and return the right magic value. -See [`_checkOnERC721Received`](#_checkonerc721received) for more infos. - -
- -### \_setApprovalForAll - -```solidity -function _setApprovalForAll( - address tokensOwner, - address operator, - bool approved -) internal nonpayable; -``` - -Approve `operator` to operate on all tokens of `tokensOwner`. - -
- -**Emitted events:** - -- [`ApprovalForAll`](#approvalforall) event. - -
- -
- -## Events - -### Approval - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#approval) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `Approval(address,address,uint256)` -- Event topic hash: `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` - -::: - -```solidity -event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); -``` - -Emitted when `owner` enables `approved` to manage the `tokenId` token. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | ----------- | -| `owner` **`indexed`** | `address` | - | -| `approved` **`indexed`** | `address` | - | -| `tokenId` **`indexed`** | `uint256` | - | - -
- -### ApprovalForAll - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#approvalforall) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `ApprovalForAll(address,address,bool)` -- Event topic hash: `0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31` - -::: - -```solidity -event ApprovalForAll(address indexed owner, address indexed operator, bool approved); -``` - -Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | ----------- | -| `owner` **`indexed`** | `address` | - | -| `operator` **`indexed`** | `address` | - | -| `approved` | `bool` | - | - -
- -### DataChanged - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `DataChanged(bytes32,bytes)` -- Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` - -::: - -```solidity -event DataChanged(bytes32 indexed dataKey, bytes dataValue); -``` - -_The following data key/value pair has been changed in the ERC725Y storage: Data key: `dataKey`, data value: `dataValue`._ - -Emitted when data at a specific `dataKey` was changed to a new value `dataValue`. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | -------------------------------------------- | -| `dataKey` **`indexed`** | `bytes32` | The data key for which a bytes value is set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### OperatorAuthorizationChanged - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `OperatorAuthorizationChanged(address,address,bytes32,bytes)` -- Event topic hash: `0x1b1b58aa2ec0cec2228b2d37124556d41f5a1f7b12f089171f896cc236671215` - -::: - -```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bytes operatorNotificationData); -``` - -Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | -------------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address authorized as an operator. | -| `tokenOwner` **`indexed`** | `address` | The owner of the `tokenId`. | -| `tokenId` **`indexed`** | `bytes32` | The tokenId `operator` address has access on behalf of `tokenOwner`. | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### OperatorRevoked - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `OperatorRevoked(address,address,bytes32,bool,bytes)` -- Event topic hash: `0xc78cd419d6136f9f1c1c6aec1d3fae098cffaf8bc86314a8f2685e32fe574e3c` - -::: - -```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bool notified, bytes operatorNotificationData); -``` - -Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on its behalf. - -#### Parameters - -| Name | Type | Description | -| -------------------------- | :-------: | ---------------------------------------------------------------------------------- | -| `operator` **`indexed`** | `address` | The address revoked from the operator array ([`getOperatorsOf`](#getoperatorsof)). | -| `tokenOwner` **`indexed`** | `address` | The owner of the `tokenId`. | -| `tokenId` **`indexed`** | `bytes32` | The tokenId `operator` is revoked from operating on. | -| `notified` | `bool` | Bool indicating whether the operator has been notified or not | -| `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | - -
- -### OwnershipTransferred - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `OwnershipTransferred(address,address)` -- Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` - -::: - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------------- | :-------: | ----------- | -| `previousOwner` **`indexed`** | `address` | - | -| `newOwner` **`indexed`** | `address` | - | - -
- -### TokenIdDataChanged - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `TokenIdDataChanged(bytes32,bytes32,bytes)` -- Event topic hash: `0xa6e4251f855f750545fe414f120db91c76b88def14d120969e5bb2d3f05debbb` - -::: - -```solidity -event TokenIdDataChanged(bytes32 indexed tokenId, bytes32 indexed dataKey, bytes dataValue); -``` - -Emitted when setting data for `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | -------------------------------------------- | -| `tokenId` **`indexed`** | `bytes32` | The tokenId which data is set for. | -| `dataKey` **`indexed`** | `bytes32` | The data key for which a bytes value is set. | -| `dataValue` | `bytes` | The value to set for the given data key. | - -
- -### Transfer - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `Transfer(address,address,address,bytes32,bool,bytes)` -- Event topic hash: `0xb333c813a7426a7a11e2b190cad52c44119421594b47f6f32ace6d8c7207b2bf` - -::: - -```solidity -event Transfer(address operator, address indexed from, address indexed to, bytes32 indexed tokenId, bool force, bytes data); -``` - -Emitted when `tokenId` token is transferred from the `from` to the `to` address. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | ---------------------------------------------------------------------------------------------------------------------------------- | -| `operator` | `address` | The address of operator that sent the `tokenId` | -| `from` **`indexed`** | `address` | The previous owner of the `tokenId` | -| `to` **`indexed`** | `address` | The new owner of `tokenId` | -| `tokenId` **`indexed`** | `bytes32` | The tokenId that was transferred | -| `force` | `bool` | If the token transfer enforces the `to` recipient address to be a contract that implements the LSP1 standard or not. | -| `data` | `bytes` | Any additional data the caller included by the caller during the transfer, and sent in the hooks to the `from` and `to` addresses. | - -
- -### Transfer - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Event signature: `Transfer(address,address,uint256)` -- Event topic hash: `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` - -::: - -```solidity -event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); -``` - -Emitted when `tokenId` token is transferred from `from` to `to`. - -#### Parameters - -| Name | Type | Description | -| ----------------------- | :-------: | ----------- | -| `from` **`indexed`** | `address` | - | -| `to` **`indexed`** | `address` | - | -| `tokenId` **`indexed`** | `uint256` | - | - -
- -## Errors - -### ERC725Y_DataKeysValuesEmptyArray - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `ERC725Y_DataKeysValuesEmptyArray()` -- Error hash: `0x97da5f95` - -::: - -```solidity -error ERC725Y_DataKeysValuesEmptyArray(); -``` - -Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabatch) function is an empty array. - -
- -### ERC725Y_DataKeysValuesLengthMismatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` -- Error hash: `0x3bcc8979` - -::: - -```solidity -error ERC725Y_DataKeysValuesLengthMismatch(); -``` - -Reverts when there is not the same number of elements in the `datakeys` and `dataValues` array parameters provided when calling the [`setDataBatch`](#setdatabatch) function. - -
- -### ERC725Y_MsgValueDisallowed - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `ERC725Y_MsgValueDisallowed()` -- Error hash: `0xf36ba737` - -::: - -```solidity -error ERC725Y_MsgValueDisallowed(); -``` - -Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#setdatabatch) function. - -
- -### InvalidExtensionAddress - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `InvalidExtensionAddress(bytes)` -- Error hash: `0x42bfe79f` - -::: - -```solidity -error InvalidExtensionAddress(bytes storedData); -``` - -reverts when the bytes retrieved from the LSP17 data key is not a valid address (not 20 bytes) - -#### Parameters - -| Name | Type | Description | -| ------------ | :-----: | ----------- | -| `storedData` | `bytes` | - | - -
- -### InvalidFunctionSelector - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `InvalidFunctionSelector(bytes)` -- Error hash: `0xe5099ee3` - -::: - -```solidity -error InvalidFunctionSelector(bytes data); -``` - -reverts when the contract is called with a function selector not valid (less than 4 bytes of data) - -#### Parameters - -| Name | Type | Description | -| ------ | :-----: | ----------- | -| `data` | `bytes` | - | - -
- -### LSP4TokenNameNotEditable - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP4TokenNameNotEditable()` -- Error hash: `0x85c169bd` - -::: - -```solidity -error LSP4TokenNameNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenName` after the digital asset contract has been deployed / initialized. The `LSP4TokenName` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP4TokenSymbolNotEditable - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP4TokenSymbolNotEditable()` -- Error hash: `0x76755b38` - -::: - -```solidity -error LSP4TokenSymbolNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital asset contract has been deployed / initialized. The `LSP4TokenSymbol` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP4TokenTypeNotEditable - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP4TokenTypeNotEditable()` -- Error hash: `0x4ef6d7fb` - -::: - -```solidity -error LSP4TokenTypeNotEditable(); -``` - -Reverts when trying to edit the data key `LSP4TokenType` after the digital asset contract has been deployed / initialized. The `LSP4TokenType` data key is located inside the ERC725Y data key-value store of the digital asset contract. It can be set only once inside the constructor / initializer when the digital asset contract is being deployed / initialized. - -
- -### LSP8BatchCallFailed - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8BatchCallFailed(uint256)` -- Error hash: `0x234eb819` - -::: - -```solidity -error LSP8BatchCallFailed(uint256 callIndex); -``` - -_Batch call failed._ - -Reverts when a batch call failed. - -#### Parameters - -| Name | Type | Description | -| ----------- | :-------: | ----------- | -| `callIndex` | `uint256` | - | - -
- -### LSP8CannotSendToAddressZero - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8CannotSendToAddressZero()` -- Error hash: `0x24ecef4d` - -::: - -```solidity -error LSP8CannotSendToAddressZero(); -``` - -Reverts when trying to send token to the zero address. - -
- -### LSP8CannotSendToSelf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8CannotSendToSelf()` -- Error hash: `0x5d67d6c1` - -::: - -```solidity -error LSP8CannotSendToSelf(); -``` - -Reverts when specifying the same address for `from` and `to` in a token transfer. - -
- -### LSP8CannotUseAddressZeroAsOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8CannotUseAddressZeroAsOperator()` -- Error hash: `0x9577b8b3` - -::: - -```solidity -error LSP8CannotUseAddressZeroAsOperator(); -``` - -Reverts when trying to set the zero address as an operator. - -
- -### LSP8InvalidTransferBatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8InvalidTransferBatch()` -- Error hash: `0x93a83119` - -::: - -```solidity -error LSP8InvalidTransferBatch(); -``` - -Reverts when the parameters used for `transferBatch` have different lengths. - -
- -### LSP8NonExistentTokenId - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8NonExistentTokenId(bytes32)` -- Error hash: `0xae8f9a36` - -::: - -```solidity -error LSP8NonExistentTokenId(bytes32 tokenId); -``` - -Reverts when `tokenId` has not been minted. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------- | -| `tokenId` | `bytes32` | - | - -
- -### LSP8NonExistingOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8NonExistingOperator(address,bytes32)` -- Error hash: `0x4aa31a8c` - -::: - -```solidity -error LSP8NonExistingOperator(address operator, bytes32 tokenId); -``` - -Reverts when `operator` is not an operator for the `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `operator` | `address` | - | -| `tokenId` | `bytes32` | - | - -
- -### LSP8NotTokenOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8NotTokenOperator(bytes32,address)` -- Error hash: `0x1294d2a9` - -::: - -```solidity -error LSP8NotTokenOperator(bytes32 tokenId, address caller); -``` - -Reverts when `caller` is not an allowed operator for `tokenId`. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------- | -| `tokenId` | `bytes32` | - | -| `caller` | `address` | - | - -
- -### LSP8NotTokenOwner - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8NotTokenOwner(address,bytes32,address)` -- Error hash: `0x5b271ea2` - -::: - -```solidity -error LSP8NotTokenOwner(address tokenOwner, bytes32 tokenId, address caller); -``` - -Reverts when `caller` is not the `tokenOwner` of the `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ------------ | :-------: | ----------- | -| `tokenOwner` | `address` | - | -| `tokenId` | `bytes32` | - | -| `caller` | `address` | - | - -
- -### LSP8NotifyTokenReceiverContractMissingLSP1Interface - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8NotifyTokenReceiverContractMissingLSP1Interface(address)` -- Error hash: `0x4349776d` - -::: - -```solidity -error LSP8NotifyTokenReceiverContractMissingLSP1Interface( - address tokenReceiver -); -``` - -Reverts if the `tokenReceiver` does not implement LSP1 when minting or transferring tokens with `bool force` set as `false`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ----------- | -| `tokenReceiver` | `address` | - | - -
- -### LSP8NotifyTokenReceiverIsEOA - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8NotifyTokenReceiverIsEOA(address)` -- Error hash: `0x03173137` - -::: - -```solidity -error LSP8NotifyTokenReceiverIsEOA(address tokenReceiver); -``` - -Reverts if the `tokenReceiver` is an EOA when minting or transferring tokens with `bool force` set as `false`. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ----------- | -| `tokenReceiver` | `address` | - | - -
- -### LSP8OperatorAlreadyAuthorized - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8OperatorAlreadyAuthorized(address,bytes32)` -- Error hash: `0xa7626b68` - -::: - -```solidity -error LSP8OperatorAlreadyAuthorized(address operator, bytes32 tokenId); -``` - -Reverts when `operator` is already authorized for the `tokenId`. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `operator` | `address` | - | -| `tokenId` | `bytes32` | - | - -
- -### LSP8TokenContractCannotHoldValue - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8TokenContractCannotHoldValue()` -- Error hash: `0x61f49442` - -::: - -```solidity -error LSP8TokenContractCannotHoldValue(); -``` - -_LSP8 contract cannot receive native tokens._ - -Error occurs when sending native tokens to the LSP8 contract without sending any data. E.g. Sending value without passing a bytes4 function selector to call a LSP17 Extension. - -
- -### LSP8TokenIdAlreadyMinted - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidalreadyminted) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8TokenIdAlreadyMinted(bytes32)` -- Error hash: `0x34c7b511` - -::: - -```solidity -error LSP8TokenIdAlreadyMinted(bytes32 tokenId); -``` - -Reverts when `tokenId` has already been minted. - -#### Parameters - -| Name | Type | Description | -| --------- | :-------: | ----------- | -| `tokenId` | `bytes32` | - | - -
- -### LSP8TokenIdFormatNotEditable - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8TokenIdFormatNotEditable()` -- Error hash: `0x3664800a` - -::: - -```solidity -error LSP8TokenIdFormatNotEditable(); -``` - -Reverts when trying to edit the data key `LSP8TokenIdFormat` after the identifiable digital asset contract has been deployed. The `LSP8TokenIdFormat` data key is located inside the ERC725Y Data key-value store of the identifiable digital asset contract. It can be set only once inside the constructor/initializer when the identifiable digital asset contract is being deployed. - -
- -### LSP8TokenIdsDataEmptyArray - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8TokenIdsDataEmptyArray()` -- Error hash: `0x80c98305` - -::: - -```solidity -error LSP8TokenIdsDataEmptyArray(); -``` - -Reverts when empty arrays is passed to the function - -
- -### LSP8TokenIdsDataLengthMismatch - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8TokenIdsDataLengthMismatch()` -- Error hash: `0x2fa71dfe` - -::: - -```solidity -error LSP8TokenIdsDataLengthMismatch(); -``` - -Reverts when the length of the token IDs data arrays is not equal - -
- -### LSP8TokenOwnerCannotBeOperator - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8TokenOwnerCannotBeOperator()` -- Error hash: `0x89fdad62` - -::: - -```solidity -error LSP8TokenOwnerCannotBeOperator(); -``` - -Reverts when trying to authorize or revoke the token's owner as an operator. - -
- -### LSP8TokenOwnerChanged - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` -- Error hash: `0x5a9c31d3` - -::: - -```solidity -error LSP8TokenOwnerChanged( - bytes32 tokenId, - address oldOwner, - address newOwner -); -``` - -Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_beforetokentransfer) hook. - -#### Parameters - -| Name | Type | Description | -| ---------- | :-------: | ----------- | -| `tokenId` | `bytes32` | - | -| `oldOwner` | `address` | - | -| `newOwner` | `address` | - | - -
- -### NoExtensionFoundForFunctionSelector - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` -- Error hash: `0xbb370b2b` - -::: - -```solidity -error NoExtensionFoundForFunctionSelector(bytes4 functionSelector); -``` - -reverts when there is no extension for the function selector being called with - -#### Parameters - -| Name | Type | Description | -| ------------------ | :------: | ----------- | -| `functionSelector` | `bytes4` | - | - -
- -### OwnableCallerNotTheOwner - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `OwnableCallerNotTheOwner(address)` -- Error hash: `0xbf1169c5` - -::: - -```solidity -error OwnableCallerNotTheOwner(address callerAddress); -``` - -Reverts when only the owner is allowed to call the function. - -#### Parameters - -| Name | Type | Description | -| --------------- | :-------: | ---------------------------------------- | -| `callerAddress` | `address` | The address that tried to make the call. | - -
- -### OwnableCannotSetZeroAddressAsOwner - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP8CompatibleERC721Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol) -- Error signature: `OwnableCannotSetZeroAddressAsOwner()` -- Error hash: `0x1ad8836c` - -::: - -```solidity -error OwnableCannotSetZeroAddressAsOwner(); -``` - -Reverts when trying to set `address(0)` as the contract owner when deploying the contract, initializing it or transferring ownership of the contract. - -
diff --git a/dodoc/config.ts b/dodoc/config.ts index 3f0610a40..65662a652 100644 --- a/dodoc/config.ts +++ b/dodoc/config.ts @@ -27,15 +27,11 @@ export const dodocConfig = { 'contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol', 'contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol', 'contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol', - 'contracts/LSP7DigitalAsset/extensions/LSP7CompatibleERC20.sol', - 'contracts/LSP7DigitalAsset/presets/LSP7CompatibleERC20Mintable.sol', 'contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol', 'contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol', 'contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol', 'contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol', - 'contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CompatibleERC721.sol', 'contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol', - 'contracts/LSP8IdentifiableDigitalAsset/presets/LSP8CompatibleERC721Mintable.sol', 'contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol', // libraries -------------------- diff --git a/hardhat.config.ts b/hardhat.config.ts index fa0b73099..63ab5b9e4 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -149,16 +149,6 @@ const config: HardhatUserConfig = { 'LSP8MintableInit', 'LSP9VaultInit', 'LSP11BasicSocialRecoveryInit', - // ERC Compatible tokens - // ------------------ - 'LSP7CompatibleERC20', - 'LSP7CompatibleERC20InitAbstract', - 'LSP7CompatibleERC20Mintable', - 'LSP7CompatibleERC20MintableInit', - 'LSP8CompatibleERC721', - 'LSP8CompatibleERC721InitAbstract', - 'LSP8CompatibleERC721Mintable', - 'LSP8CompatibleERC721MintableInit', // Legacy L14 // ------------------ 'UniversalReceiverAddressStore', diff --git a/tests/LSP7DigitalAsset/LSP7CompatibleERC20.behaviour.ts b/tests/LSP7DigitalAsset/LSP7CompatibleERC20.behaviour.ts deleted file mode 100644 index 1f9df0e9d..000000000 --- a/tests/LSP7DigitalAsset/LSP7CompatibleERC20.behaviour.ts +++ /dev/null @@ -1,1330 +0,0 @@ -import { ethers } from 'hardhat'; -import { expect } from 'chai'; - -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, ContractTransaction } from 'ethers'; -import type { TransactionResponse } from '@ethersproject/abstract-provider'; - -import { INTERFACE_IDS, SupportedStandards } from '../../constants'; -import { - CheckInterface__factory, - LSP7CompatibleERC20, - LSP7CompatibleERC20Tester, - TokenReceiverWithLSP1, - TokenReceiverWithLSP1__factory, - TokenReceiverWithoutLSP1, - TokenReceiverWithoutLSP1__factory, - UniversalReceiverDelegateRevert, - UniversalReceiverDelegateRevert__factory, -} from '../../types'; -import { ERC725YDataKeys } from '../../constants'; -import { abiCoder } from '../utils/helpers'; - -type LSP7CompatibleERC20TestAccounts = { - owner: SignerWithAddress; - tokenReceiver: SignerWithAddress; - operator: SignerWithAddress; - anotherOperator: SignerWithAddress; - anyone: SignerWithAddress; -}; - -export const getNamedAccounts = async (): Promise => { - const [owner, tokenReceiver, operator, anotherOperator, anyone] = await ethers.getSigners(); - return { owner, tokenReceiver, operator, anotherOperator, anyone }; -}; - -export type LSP7CompatibleERC20DeployParams = { - name: string; - symbol: string; - newOwner: string; - lsp4TokenType: number; -}; - -export type LSP7CompatibleERC20TestContext = { - accounts: LSP7CompatibleERC20TestAccounts; - lsp7CompatibleERC20: LSP7CompatibleERC20Tester; - deployParams: LSP7CompatibleERC20DeployParams; - initialSupply: BigNumber; -}; - -export type ExpectedError = { - error: string; - args: string[]; -}; - -export const shouldBehaveLikeLSP7CompatibleERC20 = ( - buildContext: () => Promise, -) => { - let context: LSP7CompatibleERC20TestContext; - - beforeEach(async () => { - context = await buildContext(); - }); - - describe('approve', () => { - describe('when operator is the zero address', () => { - it('should revert', async () => { - await expect( - context.lsp7CompatibleERC20.approve(ethers.constants.AddressZero, context.initialSupply), - ).to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7CannotUseAddressZeroAsOperator', - ); - }); - }); - - describe('when the operator had no authorized amount', () => { - it('should succeed by setting the given amount', async () => { - const operator = context.accounts.operator.address; - const tokenOwner = context.accounts.owner.address; - const authorizedAmount = 1; - - const preAllowance = await context.lsp7CompatibleERC20.allowance(tokenOwner, operator); - expect(preAllowance).to.equal(0); - - const tx = await context.lsp7CompatibleERC20.approve(operator, authorizedAmount); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'OperatorAuthorizationChanged') - .withArgs(operator, tokenOwner, authorizedAmount, '0x'); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'Approval') - .withArgs(tokenOwner, operator, authorizedAmount); - - const postAllowance = await context.lsp7CompatibleERC20.allowance(tokenOwner, operator); - expect(postAllowance).to.equal(authorizedAmount); - }); - - describe('approving an LSP1 contract', () => { - it('should succeed and inform the operator', async () => { - const tokenReceiverWithLSP1: TokenReceiverWithLSP1 = - await new TokenReceiverWithLSP1__factory(context.accounts.owner).deploy(); - const operator = tokenReceiverWithLSP1.address; - const tokenOwner = context.accounts.owner.address; - const amount = 1; - - const tx = await context.lsp7CompatibleERC20.approve(operator, amount, { - gasLimit: 2000000, - }); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'OperatorAuthorizationChanged') - .withArgs(operator, tokenOwner, amount, '0x'); - - await expect(tx).to.emit(tokenReceiverWithLSP1, 'UniversalReceiver'); - - expect( - await context.lsp7CompatibleERC20.authorizedAmountFor(operator, tokenOwner), - ).to.equal(amount); - }); - - it('should succeed and inform the operator even if the operator revert', async () => { - const operatorThatReverts: UniversalReceiverDelegateRevert = - await new UniversalReceiverDelegateRevert__factory(context.accounts.owner).deploy(); - const operator = operatorThatReverts.address; - const tokenOwner = context.accounts.owner.address; - const amount = 1; - - const tx = await context.lsp7CompatibleERC20.approve(operator, amount); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'OperatorAuthorizationChanged') - .withArgs(operator, tokenOwner, amount, '0x'); - - expect( - await context.lsp7CompatibleERC20.authorizedAmountFor(operator, tokenOwner), - ).to.equal(amount); - }); - }); - }); - - describe('when the operator had an authorized amount', () => { - describe('when the operator authorized amount is changed to another non-zero value', () => { - it('should succeed by replacing the existing amount with the given amount', async () => { - const operator = context.accounts.operator.address; - const tokenOwner = context.accounts.owner.address; - const previouslyAuthorizedAmount = '20'; - const authorizedAmount = '1'; - - await context.lsp7CompatibleERC20.approve(operator, previouslyAuthorizedAmount); - - const preAllowance = await context.lsp7CompatibleERC20.allowance(tokenOwner, operator); - expect(preAllowance).to.equal(previouslyAuthorizedAmount); - - const tx = await context.lsp7CompatibleERC20.approve(operator, authorizedAmount); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'OperatorAuthorizationChanged') - .withArgs(operator, tokenOwner, authorizedAmount, '0x'); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'Approval') - .withArgs(tokenOwner, operator, authorizedAmount); - - const postAllowance = await context.lsp7CompatibleERC20.allowance(tokenOwner, operator); - expect(postAllowance).to.equal(authorizedAmount); - }); - }); - - describe('when the operator authorized amount is changed to zero', () => { - it('should succeed by replacing the existing amount with the given amount', async () => { - const operator = context.accounts.operator.address; - const tokenOwner = context.accounts.owner.address; - const previouslyAuthorizedAmount = '20'; - const authorizedAmount = '0'; - - await context.lsp7CompatibleERC20.approve(operator, previouslyAuthorizedAmount); - - const preAllowance = await context.lsp7CompatibleERC20.allowance(tokenOwner, operator); - expect(preAllowance).to.equal(previouslyAuthorizedAmount); - - const tx = await context.lsp7CompatibleERC20.approve(operator, authorizedAmount); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'OperatorRevoked') - .withArgs(operator, tokenOwner, false, '0x'); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'Approval') - .withArgs(tokenOwner, operator, authorizedAmount); - - const postAllowance = await context.lsp7CompatibleERC20.allowance(tokenOwner, operator); - expect(postAllowance).to.equal(authorizedAmount); - }); - - describe('changing the allowance of an LSP1 contract to zero', () => { - it('should succeed and not inform the operator', async () => { - const tokenReceiverWithLSP1: TokenReceiverWithLSP1 = - await new TokenReceiverWithLSP1__factory(context.accounts.owner).deploy(); - const operator = tokenReceiverWithLSP1.address; - const tokenOwner = context.accounts.owner.address; - - const tx = await context.lsp7CompatibleERC20.approve(operator, 0, { - gasLimit: 2000000, - }); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'OperatorRevoked') - .withArgs(operator, tokenOwner, false, '0x'); - - expect(tx).to.not.emit(tokenReceiverWithLSP1, 'UniversalReceiver'); - - expect( - await context.lsp7CompatibleERC20.authorizedAmountFor(operator, tokenOwner), - ).to.equal(ethers.constants.Zero); - }); - - it('should succeed and inform the operator even if the operator revert', async () => { - const operatorThatReverts: UniversalReceiverDelegateRevert = - await new UniversalReceiverDelegateRevert__factory(context.accounts.owner).deploy(); - const operator = operatorThatReverts.address; - const tokenOwner = context.accounts.owner.address; - - const tx = await context.lsp7CompatibleERC20.approve(operator, 0); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'OperatorRevoked') - .withArgs(operator, tokenOwner, false, '0x'); - - expect( - await context.lsp7CompatibleERC20.authorizedAmountFor(operator, tokenOwner), - ).to.equal(ethers.constants.Zero); - }); - }); - }); - }); - }); - - describe('allowance', () => { - describe('when operator has been approved', () => { - it('should return approval amount', async () => { - await context.lsp7CompatibleERC20.approve( - context.accounts.operator.address, - context.initialSupply, - ); - - expect( - await context.lsp7CompatibleERC20.allowance( - context.accounts.owner.address, - context.accounts.operator.address, - ), - ).to.equal(context.initialSupply); - }); - }); - - describe('when operator has not been approved', () => { - it('should return zero', async () => { - expect( - await context.lsp7CompatibleERC20.allowance( - context.accounts.owner.address, - context.accounts.anyone.address, - ), - ).to.equal(ethers.constants.Zero); - }); - }); - }); - - describe('mint', () => { - describe('when a token is minted', () => { - it('should have expected events', async () => { - const txParams = { - to: context.accounts.owner.address, - amount: context.initialSupply, - data: ethers.utils.toUtf8Bytes('mint tokens for the owner'), - }; - const operator = context.accounts.owner; - - const tx = await context.lsp7CompatibleERC20 - .connect(operator) - .mint(txParams.to, txParams.amount, txParams.data); - - await expect(tx) - .to.emit( - context.lsp7CompatibleERC20, - 'Transfer(address,address,address,uint256,bool,bytes)', - ) - .withArgs( - operator.address, - ethers.constants.AddressZero, - txParams.to, - txParams.amount, - true, - ethers.utils.hexlify(txParams.data), - ); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'Transfer(address,address,uint256)') - .withArgs(ethers.constants.AddressZero, txParams.to, txParams.amount); - }); - }); - }); - - describe('burn', () => { - describe('when a token is burned', () => { - beforeEach(async () => { - await context.lsp7CompatibleERC20.mint( - context.accounts.owner.address, - context.initialSupply, - ethers.utils.toUtf8Bytes('mint tokens for owner'), - ); - }); - - it('should have expected events', async () => { - const txParams = { - from: context.accounts.owner.address, - amount: context.initialSupply, - data: ethers.utils.toUtf8Bytes('burn tokens from the owner'), - }; - const operator = context.accounts.owner; - - const tx = await context.lsp7CompatibleERC20 - .connect(operator) - .burn(txParams.from, txParams.amount, txParams.data); - - await expect(tx) - .to.emit( - context.lsp7CompatibleERC20, - 'Transfer(address,address,address,uint256,bool,bytes)', - ) - .withArgs( - operator.address, - txParams.from, - ethers.constants.AddressZero, - txParams.amount, - false, - ethers.utils.hexlify(txParams.data), - ); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'Transfer(address,address,uint256)') - .withArgs(txParams.from, ethers.constants.AddressZero, txParams.amount); - }); - }); - }); - - describe('transfers', () => { - type TestDeployedContracts = { - tokenReceiverWithLSP1: TokenReceiverWithLSP1; - tokenReceiverWithoutLSP1: TokenReceiverWithoutLSP1; - }; - let deployedContracts: TestDeployedContracts; - - beforeEach(async () => { - deployedContracts = { - tokenReceiverWithLSP1: await new TokenReceiverWithLSP1__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithoutLSP1: await new TokenReceiverWithoutLSP1__factory( - context.accounts.owner, - ).deploy(), - }; - }); - - beforeEach(async () => { - // setup so we have tokens to transfer - await context.lsp7CompatibleERC20.mint( - context.accounts.owner.address, - context.initialSupply, - ethers.utils.toUtf8Bytes('mint tokens for the owner'), - ); - - // setup so we can observe allowance values during transfer tests - await context.lsp7CompatibleERC20.approve( - context.accounts.operator.address, - context.initialSupply, - ); - }); - - type TransferParams = { - // we make the operator of type SignerWithAddress because it is used to sign the transaction - // when calling the contract via `contractName.connect(operator).functionName(...)` - operator: SignerWithAddress; - from: string; - to: string; - amount: BigNumber; - force?: boolean; - data?: string; - }; - - const transferSuccessScenario = async ( - txParams: TransferParams, - sendTransaction: () => Promise, - expectedData: string, - ) => { - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - const preAllowance = await context.lsp7CompatibleERC20.allowance( - txParams.from, - txParams.operator.address, - ); - - // effect - const tx = await sendTransaction(); - await expect(tx) - .to.emit( - context.lsp7CompatibleERC20, - 'Transfer(address,address,address,uint256,bool,bytes)', - ) - .withArgs( - txParams.operator.address, - txParams.from, - txParams.to, - txParams.amount, - txParams.force ?? true, - expectedData, - ); - - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'Transfer(address,address,uint256)') - .withArgs(txParams.from, txParams.to, txParams.amount); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf.sub(txParams.amount)); - - if (txParams.operator.address !== txParams.from) { - const postAllowance = await context.lsp7CompatibleERC20.allowance( - txParams.from, - txParams.operator.address, - ); - expect(postAllowance).to.equal(preAllowance.sub(txParams.amount)); - - // check for ERC20 Approval event - await expect(tx) - .to.emit(context.lsp7CompatibleERC20, 'Approval(address,address,uint256)') - .withArgs(txParams.from, txParams.operator.address, postAllowance); - } - - // if the recipient is a contract that implements LSP1, - // CHECK that it emitted the UniversalReceiver event on the receiver end. - const erc165Checker = await new CheckInterface__factory(context.accounts.owner).deploy(); - - const isLSP1Recipient = await erc165Checker.supportsERC165InterfaceUnchecked( - txParams.to, - INTERFACE_IDS.LSP1UniversalReceiver, - ); - - if (isLSP1Recipient) { - const receiver = await new TokenReceiverWithLSP1__factory(context.accounts.owner).attach( - txParams.to, - ); - - await expect(tx).to.emit(receiver, 'UniversalReceiver'); - } - }; - - describe('ERC20 -> `transfer(address,uint256)`', () => { - describe('when sender has enough balance', () => { - const transferAmount = ethers.BigNumber.from('10'); - - describe('when `to` is an EOA', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,uint256)'](txParams.to, txParams.amount), - '0x', - ); - }); - }); - - describe('when `to` is a contract', () => { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,uint256)'](txParams.to, txParams.amount), - '0x', - ); - }); - }); - - describe('when receiving contract does not support LSP1', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,uint256)'](txParams.to, txParams.amount), - '0x', - ); - }); - }); - }); - }); - - describe('when sender does not have enough balance', () => { - it("should revert with `LSP7AmountExceedsBalance` error if sending more tokens than the tokenOwner's balance", async () => { - const ownerBalance = await context.lsp7CompatibleERC20.balanceOf( - context.accounts.owner.address, - ); - - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: ownerBalance.add(1), - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.amount, - ), - ) - .to.be.revertedWithCustomError(context.lsp7CompatibleERC20, 'LSP7AmountExceedsBalance') - .withArgs(ownerBalance.toHexString(), txParams.from, txParams.amount.toHexString()); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - }); - - describe('ERC20 -> `transferFrom(address,address,uint256)`', () => { - describe('when sender has enough balance', () => { - const transferAmount = ethers.BigNumber.from('10'); - - describe('when caller (msg.sender) is the `from` address', () => { - describe('when `to` is an EOA', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - .transferFrom(txParams.from, txParams.to, txParams.amount), - '0x', - ); - }); - }); - - describe('when `to` is a contract', () => { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - .transferFrom(txParams.from, txParams.to, txParams.amount), - '0x', - ); - }); - }); - - describe('when receiving contract does not support LSP1', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - .transferFrom(txParams.from, txParams.to, txParams.amount), - '0x', - ); - }); - }); - }); - }); - - describe('when caller (msg.sender) is an operator (= Not the `from` address)', () => { - describe('when `to` is an EOA', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - .transferFrom(txParams.from, txParams.to, txParams.amount), - '0x', - ); - }); - }); - - describe('when `to` is a contract', () => { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - .transferFrom(txParams.from, txParams.to, txParams.amount), - '0x', - ); - }); - }); - - describe('when receiving contract does not support LSP1', () => { - it('should allow transfering the tokens', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: transferAmount, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - .transferFrom(txParams.from, txParams.to, txParams.amount), - '0x', - ); - }); - }); - }); - }); - }); - - describe('when sender does not have enough balance', () => { - describe('when caller (msg.sender) is the `from` address', () => { - it("should revert with `LSP7AmountExceedsBalance` error if sending more tokens than the tokenOwner's balance", async () => { - const ownerBalance = await context.lsp7CompatibleERC20.balanceOf( - context.accounts.owner.address, - ); - - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: ownerBalance.add(1), - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - .transferFrom(txParams.from, txParams.to, txParams.amount), - ) - .to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7AmountExceedsBalance', - ) - .withArgs(ownerBalance.toHexString(), txParams.from, txParams.amount.toHexString()); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - - describe('when caller (msg.sender) is an operator (= Not the `from` address)', () => { - it("should revert with `LSP7AmountExceedsAuthorizedAmount` error if sending more tokens than the tokenOwner's balance", async () => { - const ownerBalance = await context.lsp7CompatibleERC20.balanceOf( - context.accounts.owner.address, - ); - - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: ownerBalance.add(1), - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - .transferFrom(txParams.from, txParams.to, txParams.amount), - ) - .to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7AmountExceedsAuthorizedAmount', - ) - .withArgs( - context.accounts.owner.address, - ownerBalance.toHexString(), - txParams.operator.address, - txParams.amount.toHexString(), - ); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - }); - }); - - describe('LSP7 -> `transfer(address,address,uint256,bool,bytes)`', () => { - const expectedData = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('LSP7 token transfer')); - - describe('when sender has enough balance', () => { - const transferAmount = ethers.BigNumber.from('10'); - - describe('when caller (msg.sender) is the `from` address', () => { - describe('when `to` is an EOA', () => { - it('should allow transfering the tokens with `force` param = true', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - amount: transferAmount, - force: true, - data: expectedData, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - expectedData, - ); - }); - - it('should NOT allow transfering the tokens with `force` param = false', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - amount: transferAmount, - force: false, - data: expectedData, - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7NotifyTokenReceiverIsEOA', - ) - .withArgs(txParams.to); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - - describe('when `to` is a contract', () => { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering the tokens with `force` param = true', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1.address, - amount: transferAmount, - force: true, - data: expectedData, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - expectedData, - ); - }); - - it('should allow transfering the tokens with `force` param = false', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1.address, - amount: transferAmount, - force: false, - data: expectedData, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - expectedData, - ); - }); - }); - - describe('when receiving contract does not support LSP1', () => { - it('should allow transfering the tokens with `force` param = true', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: transferAmount, - force: true, - data: expectedData, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - expectedData, - ); - }); - - it('should NOT allow transfering the tokens with `force` param = false', async () => { - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: transferAmount, - force: false, - data: expectedData, - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7NotifyTokenReceiverContractMissingLSP1Interface', - ) - .withArgs(txParams.to); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - }); - }); - - describe('when caller (msg.sender) is an operator (= Not the `from` address)', () => { - describe('when `to` is an EOA', () => { - it('should allow transfering the tokens with `force` param = true', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - amount: transferAmount, - force: true, - data: expectedData, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - expectedData, - ); - }); - - it('should NOT allow transfering the tokens with `force` param = false', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - amount: transferAmount, - force: false, - data: expectedData, - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7NotifyTokenReceiverIsEOA', - ) - .withArgs(txParams.to); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - - describe('when `to` is a contract', () => { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering the tokens with `force` param = true', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1.address, - amount: transferAmount, - force: true, - data: expectedData, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - expectedData, - ); - }); - - it('should allow transfering the tokens with `force` param = false', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1.address, - amount: transferAmount, - force: false, - data: expectedData, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - expectedData, - ); - }); - }); - - describe('when receiving contract does not support LSP1', () => { - it('should allow transfering the tokens with `force` param = true', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: transferAmount, - force: true, - data: expectedData, - }; - - await transferSuccessScenario( - txParams, - () => - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - expectedData, - ); - }); - - it('should NOT allow transfering the tokens with `force` param = false', async () => { - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: transferAmount, - force: false, - data: expectedData, - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7NotifyTokenReceiverContractMissingLSP1Interface', - ) - .withArgs(txParams.to); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - }); - }); - }); - - describe('when sender does not have enough balance', () => { - describe('when caller (msg.sender) is the `from` address', () => { - it("should revert with `LSP7AmountExceedsBalance` error if sending more tokens than the tokenOwner's balance", async () => { - const ownerBalance = await context.lsp7CompatibleERC20.balanceOf( - context.accounts.owner.address, - ); - - const txParams = { - operator: context.accounts.owner, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: ownerBalance.add(1), - force: true, - data: expectedData, - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7AmountExceedsBalance', - ) - .withArgs(ownerBalance.toHexString(), txParams.from, txParams.amount.toHexString()); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - - describe('when caller (msg.sender) is an operator (= Not the `from` address)', () => { - it("should revert with `LSP7AmountExceedsAuthorizedAmount` error if sending more tokens than the tokenOwner's balance", async () => { - const ownerBalance = await context.lsp7CompatibleERC20.balanceOf( - context.accounts.owner.address, - ); - - const txParams = { - operator: context.accounts.operator, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - amount: ownerBalance.add(1), - force: true, - data: expectedData, - }; - - // pre-conditions - const preBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - - await expect( - context.lsp7CompatibleERC20 - .connect(txParams.operator) - ['transfer(address,address,uint256,bool,bytes)']( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError( - context.lsp7CompatibleERC20, - 'LSP7AmountExceedsAuthorizedAmount', - ) - .withArgs( - context.accounts.owner.address, - ownerBalance.toHexString(), - txParams.operator.address, - txParams.amount.toHexString(), - ); - - // post-conditions - const postBalanceOf = await context.lsp7CompatibleERC20.balanceOf(txParams.from); - expect(postBalanceOf).to.equal(preBalanceOf); - }); - }); - }); - }); - }); -}; - -export type LSP7InitializeTestContext = { - lsp7CompatibleERC20: LSP7CompatibleERC20; - deployParams: LSP7CompatibleERC20DeployParams; - initializeTransaction: TransactionResponse; -}; - -export const shouldInitializeLikeLSP7CompatibleERC20 = ( - buildContext: () => Promise, -) => { - let context: LSP7InitializeTestContext; - - before(async () => { - context = await buildContext(); - }); - - describe('when the contract was initialized', () => { - it('should support ERC20 interface', async () => { - expect(await context.lsp7CompatibleERC20.supportsInterface(INTERFACE_IDS.ERC20)).to.be.true; - }); - - it('should support ERC20Metadata interface', async () => { - expect(await context.lsp7CompatibleERC20.supportsInterface(INTERFACE_IDS.ERC20Metadata)).to.be - .true; - }); - - it('should support LSP7 interface', async () => { - expect(await context.lsp7CompatibleERC20.supportsInterface(INTERFACE_IDS.LSP7DigitalAsset)).to - .be.true; - }); - - it('should have set expected entries with ERC725Y.setData', async () => { - await expect(context.initializeTransaction) - .to.emit(context.lsp7CompatibleERC20, 'DataChanged') - .withArgs( - SupportedStandards.LSP4DigitalAsset.key, - SupportedStandards.LSP4DigitalAsset.value, - ); - expect( - await context.lsp7CompatibleERC20.getData(SupportedStandards.LSP4DigitalAsset.key), - ).to.equal(SupportedStandards.LSP4DigitalAsset.value); - - const nameKey = ERC725YDataKeys.LSP4.LSP4TokenName; - const expectedNameValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(context.deployParams.name), - ); - await expect(context.initializeTransaction) - .to.emit(context.lsp7CompatibleERC20, 'DataChanged') - .withArgs(nameKey, expectedNameValue); - expect(await context.lsp7CompatibleERC20.getData(nameKey)).to.equal(expectedNameValue); - - const symbolKey = ERC725YDataKeys.LSP4.LSP4TokenSymbol; - const expectedSymbolValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(context.deployParams.symbol), - ); - await expect(context.initializeTransaction) - .to.emit(context.lsp7CompatibleERC20, 'DataChanged') - .withArgs(symbolKey, expectedSymbolValue); - expect(await context.lsp7CompatibleERC20.getData(symbolKey)).to.equal(expectedSymbolValue); - - const tokenTypeKey = ERC725YDataKeys.LSP4['LSP4TokenType']; - const expectedTokenTypeValue = abiCoder.encode( - ['uint256'], - [context.deployParams.lsp4TokenType], - ); - expect(await context.lsp7CompatibleERC20.getData(tokenTypeKey)).to.equal( - expectedTokenTypeValue, - ); - }); - - describe('when using the functions from IERC20Metadata', () => { - it('should allow reading `name()`', async () => { - // using compatibility getter -> returns(string) - const nameAsString = await context.lsp7CompatibleERC20.name(); - expect(nameAsString).to.equal(context.deployParams.name); - - // using getData -> returns(bytes) - const nameAsBytes = await context.lsp7CompatibleERC20.getData( - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('LSP4TokenName')), - ); - - expect(ethers.utils.toUtf8String(nameAsBytes)).to.equal(context.deployParams.name); - }); - - it('should allow reading `symbol()`', async () => { - // using compatibility getter -> returns(string) - const symbolAsString = await context.lsp7CompatibleERC20.symbol(); - expect(symbolAsString).to.equal(context.deployParams.symbol); - - // using getData -> returns(bytes) - const symbolAsBytes = await context.lsp7CompatibleERC20.getData( - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('LSP4TokenSymbol')), - ); - - expect(ethers.utils.toUtf8String(symbolAsBytes)).to.equal(context.deployParams.symbol); - }); - }); - }); -}; diff --git a/tests/LSP7DigitalAsset/proxy/LSP7CompatibleERC20Init.test.ts b/tests/LSP7DigitalAsset/proxy/LSP7CompatibleERC20Init.test.ts deleted file mode 100644 index c98a47f2c..000000000 --- a/tests/LSP7DigitalAsset/proxy/LSP7CompatibleERC20Init.test.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { ethers } from 'hardhat'; -import { expect } from 'chai'; - -import { - LSP7CompatibleERC20InitTester__factory, - LSP7CompatibleERC20MintableInit__factory, -} from '../../../types'; - -import { - getNamedAccounts, - LSP7CompatibleERC20TestContext, - shouldInitializeLikeLSP7CompatibleERC20, - shouldBehaveLikeLSP7CompatibleERC20, -} from '../LSP7CompatibleERC20.behaviour'; - -import { deployProxy } from '../../utils/fixtures'; -import { LSP4_TOKEN_TYPES } from '../../../constants'; - -describe('LSP7CompatibleERC20Init with proxy', () => { - const buildTestContext = async (): Promise => { - const accounts = await getNamedAccounts(); - const initialSupply = ethers.BigNumber.from('1000'); - const deployParams = { - name: 'LSP7 - deployed with constructor', - symbol: 'NFT', - newOwner: accounts.owner.address, - lsp4TokenType: LSP4_TOKEN_TYPES.TOKEN, - }; - - const lsp7CompatibilityForERC20TesterInit = await new LSP7CompatibleERC20InitTester__factory( - accounts.owner, - ).deploy(); - const lsp7CompatibilityForERC20Proxy = await deployProxy( - lsp7CompatibilityForERC20TesterInit.address, - accounts.owner, - ); - const lsp7CompatibleERC20 = lsp7CompatibilityForERC20TesterInit.attach( - lsp7CompatibilityForERC20Proxy, - ); - - return { - accounts, - lsp7CompatibleERC20, - deployParams, - initialSupply, - }; - }; - - const initializeProxy = async (context: LSP7CompatibleERC20TestContext) => { - return context.lsp7CompatibleERC20['initialize(string,string,address,uint256)']( - context.deployParams.name, - context.deployParams.symbol, - context.deployParams.newOwner, - context.deployParams.lsp4TokenType, - ); - }; - - describe('when deploying the base implementation contract', () => { - it('LSP7CompatibleERC20Init: prevent any address from calling the initialize(...) function on the implementation', async () => { - const accounts = await ethers.getSigners(); - - const lsp7CompatibilityForERC20TesterInit = await new LSP7CompatibleERC20InitTester__factory( - accounts[0], - ).deploy(); - - const randomCaller = accounts[1]; - - await expect( - lsp7CompatibilityForERC20TesterInit['initialize(string,string,address,uint256)']( - 'XXXXXXXXXXX', - 'XXX', - randomCaller.address, - 12345, - ), - ).to.be.revertedWith('Initializable: contract is already initialized'); - }); - - it('LSP7CompatibleERC20MintableInit: prevent any address from calling the initialize(...) function on the implementation', async () => { - const accounts = await ethers.getSigners(); - - const lsp7CompatibleERC20MintableInit = await new LSP7CompatibleERC20MintableInit__factory( - accounts[0], - ).deploy(); - - const randomCaller = accounts[1]; - - await expect( - lsp7CompatibleERC20MintableInit['initialize(string,string,address,uint256)']( - 'XXXXXXXXXXX', - 'XXX', - randomCaller.address, - 12345, - ), - ).to.be.revertedWith('Initializable: contract is already initialized'); - }); - }); - - describe('when deploying the contract as proxy', () => { - let context: LSP7CompatibleERC20TestContext; - - before(async () => { - context = await buildTestContext(); - }); - - describe('when initializing the contract', () => { - shouldInitializeLikeLSP7CompatibleERC20(async () => { - const { lsp7CompatibleERC20, deployParams } = context; - const initializeTransaction = await initializeProxy(context); - - return { - lsp7CompatibleERC20, - deployParams, - initializeTransaction, - }; - }); - }); - - describe('when calling initialize more than once', () => { - it('should revert', async () => { - await expect(initializeProxy(context)).to.be.revertedWith( - 'Initializable: contract is already initialized', - ); - }); - }); - }); - - describe('when testing deployed contract', () => { - shouldBehaveLikeLSP7CompatibleERC20(() => - buildTestContext().then(async (context) => { - await initializeProxy(context); - - return context; - }), - ); - }); -}); diff --git a/tests/LSP7DigitalAsset/standard/LSP7CompatibleERC20.test.ts b/tests/LSP7DigitalAsset/standard/LSP7CompatibleERC20.test.ts deleted file mode 100644 index 0c37f48ea..000000000 --- a/tests/LSP7DigitalAsset/standard/LSP7CompatibleERC20.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { ethers } from 'hardhat'; - -import { LSP7CompatibleERC20Tester__factory } from '../../../types'; - -import { - getNamedAccounts, - LSP7CompatibleERC20TestContext, - shouldInitializeLikeLSP7CompatibleERC20, - shouldBehaveLikeLSP7CompatibleERC20, -} from '../LSP7CompatibleERC20.behaviour'; -import { LSP4_TOKEN_TYPES } from '../../../constants'; - -describe('LSP7CompatibleERC20 with constructor', () => { - const buildTestContext = async (): Promise => { - const accounts = await getNamedAccounts(); - const initialSupply = ethers.BigNumber.from('1000'); - const deployParams = { - name: 'Compat for ERC20', - symbol: 'NFT', - newOwner: accounts.owner.address, - lsp4TokenType: LSP4_TOKEN_TYPES.TOKEN, - }; - - const lsp7CompatibleERC20 = await new LSP7CompatibleERC20Tester__factory(accounts.owner).deploy( - deployParams.name, - deployParams.symbol, - deployParams.newOwner, - deployParams.lsp4TokenType, - ); - - return { - accounts, - lsp7CompatibleERC20, - deployParams, - initialSupply, - }; - }; - - describe('when deploying the contract', () => { - let context: LSP7CompatibleERC20TestContext; - - before(async () => { - context = await buildTestContext(); - }); - - describe('when initializing the contract', () => { - shouldInitializeLikeLSP7CompatibleERC20(async () => { - const { lsp7CompatibleERC20, deployParams } = context; - return { - lsp7CompatibleERC20, - deployParams, - initializeTransaction: context.lsp7CompatibleERC20.deployTransaction, - }; - }); - }); - }); - - describe('when testing deployed contract', () => { - shouldBehaveLikeLSP7CompatibleERC20(buildTestContext); - }); -}); diff --git a/tests/LSP8IdentifiableDigitalAsset/LSP8CompatibleERC721.behaviour.ts b/tests/LSP8IdentifiableDigitalAsset/LSP8CompatibleERC721.behaviour.ts deleted file mode 100644 index efe527a77..000000000 --- a/tests/LSP8IdentifiableDigitalAsset/LSP8CompatibleERC721.behaviour.ts +++ /dev/null @@ -1,1337 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { ethers } from 'hardhat'; -import { expect } from 'chai'; - -import { - LSP8CompatibleERC721Tester, - TokenReceiverWithLSP1, - TokenReceiverWithLSP1__factory, - TokenReceiverWithoutLSP1__factory, - TokenReceiverWithoutLSP1, - TokenReceiverWithLSP1WithERC721ReceivedRevert, - TokenReceiverWithLSP1WithERC721ReceivedRevert__factory, - TokenReceiverWithLSP1WithERC721ReceivedInvalid, - TokenReceiverWithLSP1WithERC721ReceivedInvalid__factory, - TokenReceiverWithLSP1WithERC721Received, - TokenReceiverWithLSP1WithERC721Received__factory, - TokenReceiverWithoutLSP1WithERC721ReceivedRevert, - TokenReceiverWithoutLSP1WithERC721ReceivedRevert__factory, - TokenReceiverWithoutLSP1WithERC721ReceivedInvalid, - TokenReceiverWithoutLSP1WithERC721ReceivedInvalid__factory, - TokenReceiverWithoutLSP1WithERC721Received, - TokenReceiverWithoutLSP1WithERC721Received__factory, - UniversalReceiverDelegateRevert, - UniversalReceiverDelegateRevert__factory, -} from '../../types'; -import { tokenIdAsBytes32 } from '../utils/tokens'; -import { ERC725YDataKeys, INTERFACE_IDS, SupportedStandards } from '../../constants'; - -import type { BytesLike } from 'ethers'; -import type { TransactionResponse } from '@ethersproject/abstract-provider'; -import { abiCoder } from '../utils/helpers'; - -export type LSP8CompatibleERC721TestAccounts = { - owner: SignerWithAddress; - tokenReceiver: SignerWithAddress; - operator: SignerWithAddress; - anotherOperator: SignerWithAddress; - anyone: SignerWithAddress; -}; - -export const getNamedAccounts = async (): Promise => { - const [owner, tokenReceiver, operator, anotherOperator, anyone] = await ethers.getSigners(); - return { owner, tokenReceiver, operator, anotherOperator, anyone }; -}; - -type LSP8CompatibleERC721DeployParams = { - name: string; - symbol: string; - newOwner: string; - lsp4TokenType: number; - lsp8TokenIdFormat: number; - lsp4MetadataValue: string; -}; - -export type LSP8CompatibleERC721TestContext = { - accounts: LSP8CompatibleERC721TestAccounts; - lsp8CompatibleERC721: LSP8CompatibleERC721Tester; - deployParams: LSP8CompatibleERC721DeployParams; -}; - -export type ExpectedError = { - error: string; - args: string[]; -}; - -const mintedTokenId = '10'; -const neverMintedTokenId = '1010110'; - -export const shouldBehaveLikeLSP8CompatibleERC721 = ( - buildContext: () => Promise, -) => { - let context: LSP8CompatibleERC721TestContext; - - beforeEach(async () => { - context = await buildContext(); - }); - - describe('when setting data', () => { - it('should not allow to update the `lsp8TokenIdFormat` after deployment', async () => { - await expect( - context.lsp8CompatibleERC721.setData(ERC725YDataKeys.LSP8.LSP8TokenIdFormat, '0xdeadbeef'), - ).to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8TokenIdFormatNotEditable'); - }); - }); - - describe('when setting data', () => { - it('should not allow to update the `lsp8TokenIdFormat` after deployment', async () => { - await expect( - context.lsp8CompatibleERC721.setData(ERC725YDataKeys.LSP8.LSP8TokenIdFormat, '0xdeadbeef'), - ).to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8TokenIdFormatNotEditable'); - }); - }); - - describe('when checking supported ERC165 interfaces', () => { - it('should support ERC721', async () => { - expect(await context.lsp8CompatibleERC721.supportsInterface(INTERFACE_IDS.ERC721)).to.equal( - true, - ); - }); - - it('should support ERC721Metadata', async () => { - expect( - await context.lsp8CompatibleERC721.supportsInterface(INTERFACE_IDS.ERC721Metadata), - ).to.equal(true); - }); - }); - - describe('name', () => { - it('should allow reading name', async () => { - // using compatibility getter -> returns(string) - const nameAsString = await context.lsp8CompatibleERC721.name(); - expect(nameAsString).to.equal(context.deployParams.name); - - // using getData -> returns(bytes) - const nameAsBytes = await context.lsp8CompatibleERC721['getData(bytes32)']( - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('LSP4TokenName')), - ); - expect(ethers.utils.toUtf8String(nameAsBytes)).to.equal(context.deployParams.name); - }); - }); - - describe('symbol', () => { - it('should allow reading symbol', async () => { - // using compatibility getter -> returns(string) - const symbolAsString = await context.lsp8CompatibleERC721.symbol(); - expect(symbolAsString).to.equal(context.deployParams.symbol); - - // using getData -> returns(bytes) - const symbolAsBytes = await context.lsp8CompatibleERC721['getData(bytes32)']( - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('LSP4TokenSymbol')), - ); - expect(ethers.utils.toUtf8String(symbolAsBytes)).to.equal(context.deployParams.symbol); - }); - }); - - describe('tokenURI', () => { - it('should allow reading tokenURI', async () => { - // using compatibility getter -> returns(string) - const tokenURIAsString = await context.lsp8CompatibleERC721.tokenURI(mintedTokenId); - // offset = bytes4(hashSig) + bytes32(contentHash) -> 4 + 32 = 36 + 2 for prefix = 38 - const offset = 36 * 2 + 2; - expect(tokenURIAsString).to.equal( - ethers.utils.toUtf8String(`0x${context.deployParams.lsp4MetadataValue.slice(offset)}`), - ); - - // using getData -> returns(bytes) - const lsp4MetadataValueAsBytes = await context.lsp8CompatibleERC721['getData(bytes32)']( - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('LSP4Metadata')), - ); - expect(lsp4MetadataValueAsBytes).to.equal(context.deployParams.lsp4MetadataValue); - }); - }); - - describe('ownerOf', () => { - describe('when tokenId has not been minted', () => { - it('should revert', async () => { - await expect(context.lsp8CompatibleERC721.ownerOf(neverMintedTokenId)) - .to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8NonExistentTokenId') - .withArgs(tokenIdAsBytes32(neverMintedTokenId)); - }); - }); - - describe('when tokenId has been minted', () => { - it('should return owner address', async () => { - await context.lsp8CompatibleERC721.mint( - context.accounts.owner.address, - mintedTokenId, - ethers.utils.toUtf8Bytes('mint a token for the owner'), - ); - - expect(await context.lsp8CompatibleERC721.ownerOf(mintedTokenId)).to.equal( - context.accounts.owner.address, - ); - }); - }); - }); - - describe('approve', () => { - describe('when tokenId has not been minted', () => { - it('should revert', async () => { - await expect( - context.lsp8CompatibleERC721 - .connect(context.accounts.anyone) - .approve(context.accounts.operator.address, neverMintedTokenId), - ) - .to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8NonExistentTokenId') - .withArgs(tokenIdAsBytes32(neverMintedTokenId)); - }); - }); - - describe('when the tokenId has been minted', () => { - beforeEach(async () => { - await context.lsp8CompatibleERC721.mint( - context.accounts.owner.address, - mintedTokenId, - ethers.utils.toUtf8Bytes('mint a token for the owner'), - ); - }); - - describe('when caller is not owner of tokenId', () => { - it('should revert', async () => { - await expect( - context.lsp8CompatibleERC721 - .connect(context.accounts.anyone) - .approve(context.accounts.operator.address, mintedTokenId), - ) - .to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8NotTokenOwner') - .withArgs( - context.accounts.owner.address, - tokenIdAsBytes32(mintedTokenId), - context.accounts.anyone.address, - ); - }); - }); - - describe('when caller is owner of tokenId', () => { - describe('when operator is not the zero address', () => { - it('should succeed', async () => { - const operator = context.accounts.operator.address; - const tokenId = mintedTokenId; - - const tx = await context.lsp8CompatibleERC721.approve(operator, tokenId); - - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'OperatorAuthorizationChanged') - .withArgs(operator, context.accounts.owner.address, tokenIdAsBytes32(tokenId), '0x'); - - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'Approval') - .withArgs(context.accounts.owner.address, operator, ethers.BigNumber.from(tokenId)); - }); - - describe('when approving an LSP1 contract', () => { - it('should succeed and inform the operator', async () => { - const tokenReceiverWithLSP1: TokenReceiverWithLSP1 = - await new TokenReceiverWithLSP1__factory(context.accounts.owner).deploy(); - const operator = tokenReceiverWithLSP1.address; - const tokenOwner = context.accounts.owner.address; - const tokenId = mintedTokenId; - - const tx = await context.lsp8CompatibleERC721.approve(operator, tokenId, { - gasLimit: 2000000, - }); - - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'OperatorAuthorizationChanged') - .withArgs(operator, tokenOwner, tokenIdAsBytes32(tokenId), '0x'); - - await expect(tx).to.emit(tokenReceiverWithLSP1, 'UniversalReceiver'); - - expect( - await context.lsp8CompatibleERC721.isOperatorFor( - operator, - tokenIdAsBytes32(tokenId), - ), - ).to.be.true; - }); - - it('should succeed and inform the operator even if the operator revert', async () => { - const operatorThatReverts: UniversalReceiverDelegateRevert = - await new UniversalReceiverDelegateRevert__factory(context.accounts.owner).deploy(); - const operator = operatorThatReverts.address; - const tokenOwner = context.accounts.owner.address; - const tokenId = mintedTokenId; - - const tx = await context.lsp8CompatibleERC721.approve(operator, tokenId); - - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'OperatorAuthorizationChanged') - .withArgs(operator, tokenOwner, tokenIdAsBytes32(tokenId), '0x'); - - expect( - await context.lsp8CompatibleERC721.isOperatorFor( - operator, - tokenIdAsBytes32(tokenId), - ), - ).to.be.true; - }); - }); - }); - - describe('when operator is the zero address', () => { - it('should revert', async () => { - const operator = ethers.constants.AddressZero; - const tokenId = mintedTokenId; - - await expect( - context.lsp8CompatibleERC721.approve(operator, tokenId), - ).to.be.revertedWithCustomError( - context.lsp8CompatibleERC721, - 'LSP8CannotUseAddressZeroAsOperator', - ); - }); - }); - }); - }); - }); - - describe('setApprovalForAll', () => { - const tokenIds = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NFT 1')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NFT 2')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NFT 3')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NFT 4')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NFT 5')), - ]; - - beforeEach(async () => { - tokenIds.map(async (tokenId) => { - const txParams = { - to: context.accounts.owner.address, - tokenId: tokenId, - data: ethers.utils.toUtf8Bytes(`mint tokenId ${tokenId} for the owner`), - }; - - await context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .mint(txParams.to, txParams.tokenId, txParams.data); - }); - - await context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .setApprovalForAll(context.accounts.operator.address, true); - }); - - it('should be able to set approval for operator', async () => { - const tx = await context.lsp8CompatibleERC721 - .connect(context.accounts.operator) - .approve(context.accounts.anyone.address, tokenIds[0]); - - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'Approval') - .withArgs(context.accounts.owner.address, context.accounts.anyone.address, tokenIds[0]); - }); - - describe('when calling setApprovalForAll with true', () => { - it('should revert when trying to pass caller address as operator', async () => { - await expect( - context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .setApprovalForAll(context.accounts.owner.address, true), - ).to.be.revertedWith('LSP8CompatibleERC721: approve to caller'); - }); - - it('should have emitted an ApprovalForAll event', async () => { - const txParams = { - to: context.accounts.owner.address, - tokenId: 5, - data: ethers.utils.toUtf8Bytes(`mint tokenId 5 for the owner`), - }; - - await context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .mint(txParams.to, txParams.tokenId, txParams.data); - - const tx = await context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .setApprovalForAll(context.accounts.operator.address, true); - - expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'ApprovalForAll') - .withArgs(context.accounts.owner.address, context.accounts.operator.address, true); - }); - - describe('when calling isApprovedForAll', () => { - it('should return true for operator', async () => { - const result = await context.lsp8CompatibleERC721.isApprovedForAll( - context.accounts.owner.address, - context.accounts.operator.address, - ); - - expect(result).to.be.true; - }); - - it('should return false for non-operator', async () => { - const result = await context.lsp8CompatibleERC721.isApprovedForAll( - context.accounts.owner.address, - context.accounts.anyone.address, - ); - - expect(result).to.be.false; - }); - }); - }); - - describe('when operator transfer tokenId', () => { - [ - { tokenId: tokenIds[0] }, - { tokenId: tokenIds[1] }, - { tokenId: tokenIds[2] }, - { tokenId: tokenIds[3] }, - { tokenId: tokenIds[4] }, - ].forEach((testCase) => { - describe(`for tokenId ${testCase.tokenId}:`, () => { - it('should have transferred successfully with `transferFrom(...)` (changed token owner)', async () => { - const sender = context.accounts.owner.address; - const recipient = context.accounts.tokenReceiver.address; - - await context.lsp8CompatibleERC721 - .connect(context.accounts.operator) - .transferFrom(sender, recipient, testCase.tokenId); - - const newTokenOwner = await context.lsp8CompatibleERC721.ownerOf(testCase.tokenId); - expect(newTokenOwner).to.equal(context.accounts.tokenReceiver.address); - }); - - it('should have emitted a Transfer event', async () => { - const sender = context.accounts.owner.address; - const recipient = context.accounts.tokenReceiver.address; - - const tx = await context.lsp8CompatibleERC721 - .connect(context.accounts.operator) - .transferFrom(sender, recipient, testCase.tokenId); - - expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'Transfer(address,address,uint256)') - .withArgs(sender, recipient, testCase.tokenId); - }); - - it('should have cleared operators array', async () => { - // add 3 x individual operators per tokenId to test if the operators array is cleared - // once the tokenId has been transferred by operator that is approvedForAll - // const operatorsPerTokenIds = getRandomAddresses(1); - const operatorsPerTokenIdsBefore = [ - '0xcafecafecafecafecafecafecafecafecafecafe', - '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef', - '0xf00df00df00df00df00df00df00df00df00df00d', - ]; - - await context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .approve(operatorsPerTokenIdsBefore[0], testCase.tokenId); - - await context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .approve(operatorsPerTokenIdsBefore[1], testCase.tokenId); - - await context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .approve(operatorsPerTokenIdsBefore[2], testCase.tokenId); - - const sender = context.accounts.owner.address; - const recipient = context.accounts.tokenReceiver.address; - - await context.lsp8CompatibleERC721 - .connect(context.accounts.operator) - .transferFrom(sender, recipient, testCase.tokenId); - - const operatorsForTokenIdAfter = await context.lsp8CompatibleERC721.getOperatorsOf( - testCase.tokenId, - ); - - expect(operatorsForTokenIdAfter).to.deep.equal([]); - }); - }); - }); - }); - - describe('when calling setApprovalForAll with false (removing operator full approval)', () => { - beforeEach(async () => { - await context.lsp8CompatibleERC721 - .connect(context.accounts.owner) - .setApprovalForAll(context.accounts.operator.address, false); - }); - - [ - { tokenId: tokenIds[0] }, - { tokenId: tokenIds[1] }, - { tokenId: tokenIds[2] }, - { tokenId: tokenIds[3] }, - { tokenId: tokenIds[4] }, - ].forEach((testCase) => { - it('should return false when calling isApprovedForAll for operator', async () => { - const result = await context.lsp8CompatibleERC721.isApprovedForAll( - context.accounts.owner.address, - context.accounts.operator.address, - ); - - expect(result).to.be.false; - }); - - it(`should revert when operator try to transfer tokenId ${testCase.tokenId} with transferFrom(...)`, async () => { - const tokenIdAsBytes32 = ethers.utils.hexZeroPad( - ethers.utils.hexValue(ethers.BigNumber.from(testCase.tokenId)), - 32, - ); - - await expect( - context.lsp8CompatibleERC721 - .connect(context.accounts.operator) - .transferFrom( - context.accounts.owner.address, - context.accounts.tokenReceiver.address, - testCase.tokenId, - ), - ) - .to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8NotTokenOperator') - .withArgs(tokenIdAsBytes32, context.accounts.operator.address); - }); - }); - }); - }); - - describe('getApproved', () => { - describe('when tokenId has not been minted', () => { - it('should revert', async () => { - await expect(context.lsp8CompatibleERC721.getApproved(neverMintedTokenId)) - .to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8NonExistentTokenId') - .withArgs(tokenIdAsBytes32(neverMintedTokenId)); - }); - }); - - describe('when tokenId has been minted', () => { - beforeEach(async () => { - await context.lsp8CompatibleERC721.mint( - context.accounts.owner.address, - mintedTokenId, - ethers.utils.toUtf8Bytes('mint a token for the owner'), - ); - }); - - describe('when there have been no approvals for the tokenId', () => { - it('should return address(0)', async () => { - expect(await context.lsp8CompatibleERC721.getApproved(mintedTokenId)).to.equal( - ethers.constants.AddressZero, - ); - }); - }); - - describe('when one account has been approved for the tokenId', () => { - it('should return the operator address', async () => { - await context.lsp8CompatibleERC721.approve( - context.accounts.operator.address, - tokenIdAsBytes32(mintedTokenId), - ); - - expect(await context.lsp8CompatibleERC721.getApproved(mintedTokenId)).to.equal( - context.accounts.operator.address, - ); - }); - }); - - describe('when many context.accounts have been approved for the tokenId', () => { - it('should return the last new authorized operator', async () => { - const operatorFirstAndThirdCall = context.accounts.operator.address; - const operatorSecondCall = context.accounts.anotherOperator.address; - - await context.lsp8CompatibleERC721.approve( - operatorFirstAndThirdCall, - tokenIdAsBytes32(mintedTokenId), - ); - await context.lsp8CompatibleERC721.approve( - operatorSecondCall, - tokenIdAsBytes32(mintedTokenId), - ); - - expect(await context.lsp8CompatibleERC721.getApproved(mintedTokenId)).to.equal( - context.accounts.anotherOperator.address, - ); - }); - }); - }); - }); - - describe('mint', () => { - describe('when a token is minted', () => { - it('should have expected events', async () => { - const txParams = { - to: context.accounts.owner.address, - tokenId: mintedTokenId, - data: ethers.utils.toUtf8Bytes('mint a token for the owner'), - }; - const operator = context.accounts.owner; - - const tx = await context.lsp8CompatibleERC721 - .connect(operator) - .mint(txParams.to, txParams.tokenId, txParams.data); - - await expect(tx) - .to.emit( - context.lsp8CompatibleERC721, - 'Transfer(address,address,address,bytes32,bool,bytes)', - ) - .withArgs( - operator.address, - ethers.constants.AddressZero, - txParams.to, - tokenIdAsBytes32(txParams.tokenId), - true, - ethers.utils.hexlify(txParams.data), - ); - - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'Transfer(address,address,uint256)') - .withArgs( - ethers.constants.AddressZero, - txParams.to, - ethers.BigNumber.from(txParams.tokenId), - ); - }); - }); - }); - - describe('burn', () => { - describe('when a token is burned', () => { - beforeEach(async () => { - await context.lsp8CompatibleERC721.mint( - context.accounts.owner.address, - mintedTokenId, - ethers.utils.toUtf8Bytes('mint a token for the owner'), - ); - }); - - it('should have expected events', async () => { - const txParams = { - tokenId: mintedTokenId, - data: ethers.utils.toUtf8Bytes('burn a token from the owner'), - }; - const operator = context.accounts.owner; - - const tx = await context.lsp8CompatibleERC721 - .connect(operator) - .burn(txParams.tokenId, txParams.data); - - await expect(tx) - .to.emit( - context.lsp8CompatibleERC721, - 'Transfer(address,address,address,bytes32,bool,bytes)', - ) - .withArgs( - operator.address, - operator.address, - ethers.constants.AddressZero, - tokenIdAsBytes32(txParams.tokenId), - false, - ethers.utils.hexlify(txParams.data), - ); - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'Transfer(address,address,uint256)') - .withArgs( - operator.address, - ethers.constants.AddressZero, - ethers.BigNumber.from(txParams.tokenId), - ); - }); - }); - }); - - describe('transfers', () => { - type TestDeployedContracts = { - tokenReceiverWithLSP1: TokenReceiverWithLSP1; - tokenReceiverWithoutLSP1: TokenReceiverWithoutLSP1; - tokenReceiverWithLSP1WithoutERC721Receiver: TokenReceiverWithLSP1; - tokenReceiverWithLSP1WithERC721ReceivedRevert: TokenReceiverWithLSP1WithERC721ReceivedRevert; - tokenReceiverWithLSP1WithERC721ReceivedInvalid: TokenReceiverWithLSP1WithERC721ReceivedInvalid; - tokenReceiverWithLSP1WithERC721Received: TokenReceiverWithLSP1WithERC721Received; - tokenReceiverWithoutLSP1WithoutERC721Received: TokenReceiverWithoutLSP1; - tokenReceiverWithoutLSP1WithERC721ReceivedRevert: TokenReceiverWithoutLSP1WithERC721ReceivedRevert; - tokenReceiverWithoutLSP1WithERC721ReceivedInvalid: TokenReceiverWithoutLSP1WithERC721ReceivedInvalid; - tokenReceiverWithoutLSP1WithERC721Received: TokenReceiverWithoutLSP1WithERC721Received; - }; - let deployedContracts: TestDeployedContracts; - - beforeEach(async () => { - // for `transfer` and `transferFrom` scenarios - deployedContracts = { - tokenReceiverWithLSP1: await new TokenReceiverWithLSP1__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithoutLSP1: await new TokenReceiverWithoutLSP1__factory( - context.accounts.owner, - ).deploy(), - // for `safeTransferFrom` scenarios - tokenReceiverWithLSP1WithoutERC721Receiver: await new TokenReceiverWithLSP1__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithLSP1WithERC721ReceivedRevert: - await new TokenReceiverWithLSP1WithERC721ReceivedRevert__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithLSP1WithERC721ReceivedInvalid: - await new TokenReceiverWithLSP1WithERC721ReceivedInvalid__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithLSP1WithERC721Received: - await new TokenReceiverWithLSP1WithERC721Received__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithoutLSP1WithoutERC721Received: await new TokenReceiverWithoutLSP1__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithoutLSP1WithERC721ReceivedRevert: - await new TokenReceiverWithoutLSP1WithERC721ReceivedRevert__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithoutLSP1WithERC721ReceivedInvalid: - await new TokenReceiverWithoutLSP1WithERC721ReceivedInvalid__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithoutLSP1WithERC721Received: - await new TokenReceiverWithoutLSP1WithERC721Received__factory( - context.accounts.owner, - ).deploy(), - }; - - // setup so we have a token to transfer - await context.lsp8CompatibleERC721.mint( - context.accounts.owner.address, - mintedTokenId, - ethers.utils.toUtf8Bytes('mint a token for the owner'), - ); - - // setup so we can observe approvals being cleared during transfer tests - await context.lsp8CompatibleERC721.approve(context.accounts.operator.address, mintedTokenId); - }); - - type TransferTxParams = { - operator: string; - from: string; - to: string; - tokenId: BytesLike; - data?: BytesLike; - }; - - const transferSuccessScenario = async ( - { operator, from, to, tokenId, data }: TransferTxParams, - transferFn: string, - force: boolean, - expectedData: string, - ) => { - // pre-conditions - const preOwnerOf = await context.lsp8CompatibleERC721.ownerOf(tokenId); - expect(preOwnerOf).to.equal(from); - - // effect - const txArgs = [from, to, tokenId]; - if (data) txArgs.push(data); - - const tx = await context.lsp8CompatibleERC721[transferFn](...txArgs); - - await expect(tx) - .to.emit( - context.lsp8CompatibleERC721, - 'Transfer(address,address,address,bytes32,bool,bytes)', - ) - .withArgs(operator, from, to, tokenIdAsBytes32(tokenId), force, expectedData); - - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'Transfer(address,address,uint256)') - .withArgs(from, to, ethers.BigNumber.from(tokenId)); - - await expect(tx) - .to.emit(context.lsp8CompatibleERC721, 'OperatorRevoked') - .withArgs(context.accounts.operator.address, from, tokenIdAsBytes32(tokenId), false, '0x'); - - // post-conditions - const postOwnerOf = await context.lsp8CompatibleERC721.ownerOf(tokenId); - expect(postOwnerOf).to.equal(to); - }; - - describe('transferFrom', () => { - const transferFn = 'transferFrom'; - const force = true; - const expectedData = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('')); - - describe('when the from address is the tokenId owner', () => { - describe('when `to` is an EOA', () => { - it('should allow transfering the tokenId', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - tokenId: mintedTokenId, - }; - - await transferSuccessScenario(txParams, transferFn, force, expectedData); - }); - }); - - describe('when `to` is a contract', () => { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering the tokenId', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1.address, - tokenId: mintedTokenId, - }; - - await transferSuccessScenario(txParams, transferFn, force, expectedData); - }); - }); - - describe('when receiving contract does not support LSP1', () => { - it('should allow transfering the tokenId', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - tokenId: mintedTokenId, - }; - - await transferSuccessScenario(txParams, transferFn, force, expectedData); - }); - }); - }); - }); - - describe('when the from address is not the tokenId owner', () => { - it('should revert', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.anyone.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - tokenId: mintedTokenId, - }; - - // pre-conditions - const preOwnerOf = await context.lsp8CompatibleERC721.ownerOf(txParams.tokenId); - - await expect( - context.lsp8CompatibleERC721[transferFn](txParams.from, txParams.to, txParams.tokenId), - ) - .to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8NotTokenOwner') - .withArgs( - context.accounts.owner.address, - tokenIdAsBytes32(txParams.tokenId).toString(), - txParams.from, - ); - - // post-conditions - const postOwnerOf = await context.lsp8CompatibleERC721.ownerOf(txParams.tokenId); - expect(postOwnerOf).to.equal(preOwnerOf); - }); - }); - }); - - describe('safeTransferFrom(address,address,uint256)', () => { - const transferFn = 'safeTransferFrom(address,address,uint256)'; - - describe('when the from address is the tokenId owner', () => { - describe('when `to` is an EOA', () => { - it('should pass', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - tokenId: mintedTokenId, - }; - - await transferSuccessScenario(txParams, transferFn, true, '0x'); - }); - }); - - describe('when `to` is a contract', () => { - describe('when the receiving contract supports LSP1', () => { - describe('when the receiving contract does not implement `onERC721Received`', () => { - it('should fail and revert', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1WithoutERC721Receiver.address, - tokenId: mintedTokenId, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.reverted; - }); - }); - - describe('when the receiving contract implements `onERC721Received`', () => { - it('should fail if the `onERC721Received` function reverts + bubble up the error', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1WithERC721ReceivedRevert.address, - tokenId: mintedTokenId, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.revertedWith( - 'TokenReceiverWithLSP1WithERC721ReceivedRevert: transfer rejected', - ); - }); - - it('should fail and revert if the `onERC721Received` function does not returns the correct bytes4 magic value', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1WithERC721ReceivedInvalid.address, - tokenId: mintedTokenId, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.revertedWith( - 'LSP8CompatibleERC721: transfer to non ERC721Receiver implementer', - ); - }); - - it('should pass if the `onERC721Received` function returns the correct bytes4 magic value', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1WithERC721Received.address, - tokenId: mintedTokenId, - }; - - await transferSuccessScenario(txParams, transferFn, true, '0x'); - }); - }); - }); - - describe('when the receiving contract does not support LSP1', () => { - describe('when the receiving contract does not implement `onERC721Received`', () => { - it('should fail and revert', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1WithoutERC721Received.address, - tokenId: mintedTokenId, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.reverted; - }); - }); - - describe('when the receiving contract implements `onERC721Received`', () => { - it('should fail if the `onERC721Received` function reverts + bubble up the error', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1WithERC721ReceivedRevert.address, - tokenId: mintedTokenId, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.revertedWith( - 'TokenReceiverWithLSP1WithERC721ReceivedRevert: transfer rejected', - ); - }); - - it('should fail and revert if the `onERC721Received` function does not returns the correct bytes4 magic value', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1WithERC721ReceivedInvalid.address, - tokenId: mintedTokenId, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.revertedWith( - 'LSP8CompatibleERC721: transfer to non ERC721Receiver implementer', - ); - }); - - it('should pass if the `onERC721Received` function returns the correct bytes4 magic value', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1WithERC721Received.address, - tokenId: mintedTokenId, - }; - - await transferSuccessScenario(txParams, transferFn, true, '0x'); - }); - }); - }); - }); - }); - - describe('when the from address is not the tokenId owner', () => { - it('should revert', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.anyone.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - tokenId: mintedTokenId, - }; - - // pre-conditions - const preOwnerOf = await context.lsp8CompatibleERC721.ownerOf(txParams.tokenId); - - await expect( - context.lsp8CompatibleERC721[transferFn](txParams.from, txParams.to, txParams.tokenId), - ) - .to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8NotTokenOwner') - .withArgs( - context.accounts.owner.address, - tokenIdAsBytes32(txParams.tokenId).toString(), - txParams.from, - ); - - // post-conditions - const postOwnerOf = await context.lsp8CompatibleERC721.ownerOf(txParams.tokenId); - expect(postOwnerOf).to.equal(preOwnerOf); - }); - }); - }); - - describe('safeTransferFrom(address,address,uint256,bytes)', () => { - const transferFn = 'safeTransferFrom(address,address,uint256,bytes)'; - const expectedData = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(`custom-data-${Date.now()}`), - ); - - describe('when the from address is the tokenId owner', () => { - describe('when `to` is an EOA', () => { - it('should pass', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await transferSuccessScenario(txParams, transferFn, true, expectedData); - }); - }); - - describe('when `to` is a contract', () => { - describe('when the receiving contract supports LSP1', () => { - describe('when the receiving contract does not implement `onERC721Received`', () => { - it('should fail and revert', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1WithoutERC721Receiver.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.reverted; - }); - }); - - describe('when the receiving contract implements `onERC721Received`', () => { - it('should fail if the `onERC721Received` function reverts + bubble up the error', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1WithERC721ReceivedRevert.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.revertedWith( - 'TokenReceiverWithLSP1WithERC721ReceivedRevert: transfer rejected', - ); - }); - - it('should fail and revert if the `onERC721Received` function does not returns the correct bytes4 magic value', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1WithERC721ReceivedInvalid.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.revertedWith( - 'LSP8CompatibleERC721: transfer to non ERC721Receiver implementer', - ); - }); - - it('should pass if the `onERC721Received` function returns the correct bytes4 magic value', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithLSP1WithERC721Received.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await transferSuccessScenario(txParams, transferFn, true, expectedData); - }); - }); - }); - - describe('when the receiving contract does not support LSP1', () => { - describe('when the receiving contract does not implement `onERC721Received`', () => { - it('should fail and revert', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1WithoutERC721Received.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.reverted; - }); - }); - - describe('when the receiving contract implements `onERC721Received`', () => { - it('should fail if the `onERC721Received` function reverts + bubble up the error', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1WithERC721ReceivedRevert.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.revertedWith( - 'TokenReceiverWithLSP1WithERC721ReceivedRevert: transfer rejected', - ); - }); - - it('should fail and revert if the `onERC721Received` function does not returns the correct bytes4 magic value', async () => { - const txParams = { - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1WithERC721ReceivedInvalid.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await expect( - context.lsp8CompatibleERC721['safeTransferFrom(address,address,uint256)']( - txParams.from, - txParams.to, - txParams.tokenId, - ), - ).to.be.revertedWith( - 'LSP8CompatibleERC721: transfer to non ERC721Receiver implementer', - ); - }); - - it('should pass if the `onERC721Received` function returns the correct bytes4 magic value', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.owner.address, - to: deployedContracts.tokenReceiverWithoutLSP1WithERC721Received.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - await transferSuccessScenario(txParams, transferFn, true, expectedData); - }); - }); - }); - }); - }); - - describe('when the from address is not the tokenId owner', () => { - it('should revert', async () => { - const txParams = { - operator: context.accounts.owner.address, - from: context.accounts.anyone.address, - to: deployedContracts.tokenReceiverWithoutLSP1.address, - tokenId: mintedTokenId, - data: expectedData, - }; - - // pre-conditions - const preOwnerOf = await context.lsp8CompatibleERC721.ownerOf(txParams.tokenId); - - await expect( - context.lsp8CompatibleERC721[transferFn]( - txParams.from, - txParams.to, - txParams.tokenId, - txParams.data, - ), - ) - .to.be.revertedWithCustomError(context.lsp8CompatibleERC721, 'LSP8NotTokenOwner') - .withArgs( - context.accounts.owner.address, - tokenIdAsBytes32(txParams.tokenId).toString(), - txParams.from, - ); - - // post-conditions - const postOwnerOf = await context.lsp8CompatibleERC721.ownerOf(txParams.tokenId); - expect(postOwnerOf).to.equal(preOwnerOf); - }); - }); - }); - }); -}; - -export type LSP8InitializeTestContext = { - lsp8CompatibleERC721: LSP8CompatibleERC721Tester; - initializeTransaction: TransactionResponse; - deployParams: LSP8CompatibleERC721DeployParams; -}; - -export const shouldInitializeLikeLSP8CompatibleERC721 = ( - buildContext: () => Promise, -) => { - let context: LSP8InitializeTestContext; - - before(async () => { - context = await buildContext(); - }); - - describe('when the contract was initialized', () => { - it('should support ERC721 interface', async () => { - expect(await context.lsp8CompatibleERC721.supportsInterface(INTERFACE_IDS.ERC721)).to.be.true; - }); - - it('should support ERC721Metadata interface', async () => { - expect(await context.lsp8CompatibleERC721.supportsInterface(INTERFACE_IDS.ERC721Metadata)).to - .be.true; - }); - - it('should support LSP8 interface', async () => { - expect( - await context.lsp8CompatibleERC721.supportsInterface( - INTERFACE_IDS.LSP8IdentifiableDigitalAsset, - ), - ).to.be.true; - }); - - it('should have set expected entries with ERC725Y.setData', async () => { - await expect(context.initializeTransaction) - .to.emit(context.lsp8CompatibleERC721, 'DataChanged') - .withArgs( - SupportedStandards.LSP4DigitalAsset.key, - SupportedStandards.LSP4DigitalAsset.value, - ); - expect( - await context.lsp8CompatibleERC721.getData(SupportedStandards.LSP4DigitalAsset.key), - ).to.equal(SupportedStandards.LSP4DigitalAsset.value); - - const nameKey = ERC725YDataKeys.LSP4['LSP4TokenName']; - const expectedNameValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(context.deployParams.name), - ); - await expect(context.initializeTransaction) - .to.emit(context.lsp8CompatibleERC721, 'DataChanged') - .withArgs(nameKey, expectedNameValue); - expect(await context.lsp8CompatibleERC721.getData(nameKey)).to.equal(expectedNameValue); - - const symbolKey = ERC725YDataKeys.LSP4['LSP4TokenSymbol']; - const expectedSymbolValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(context.deployParams.symbol), - ); - await expect(context.initializeTransaction) - .to.emit(context.lsp8CompatibleERC721, 'DataChanged') - .withArgs(symbolKey, expectedSymbolValue); - expect(await context.lsp8CompatibleERC721.getData(symbolKey)).to.equal(expectedSymbolValue); - - const tokenTypeKey = ERC725YDataKeys.LSP4['LSP4TokenType']; - const expectedTokenTypeValue = abiCoder.encode( - ['uint256'], - [context.deployParams.lsp4TokenType], - ); - await expect(context.initializeTransaction) - .to.emit(context.lsp8CompatibleERC721, 'DataChanged') - .withArgs(tokenTypeKey, expectedTokenTypeValue); - expect(await context.lsp8CompatibleERC721.getData(tokenTypeKey)).to.equal( - expectedTokenTypeValue, - ); - }); - - describe('when using the functions from IERC721Metadata', () => { - it('should allow reading `name()`', async () => { - // using compatibility getter -> returns(string) - const nameAsString = await context.lsp8CompatibleERC721.name(); - expect(nameAsString).to.equal(context.deployParams.name); - - // using getData -> returns(bytes) - const nameAsBytes = await context.lsp8CompatibleERC721.getData( - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('LSP4TokenName')), - ); - - expect(ethers.utils.toUtf8String(nameAsBytes)).to.equal(context.deployParams.name); - }); - - it('should allow reading `symbol()`', async () => { - // using compatibility getter -> returns(string) - const symbolAsString = await context.lsp8CompatibleERC721.symbol(); - expect(symbolAsString).to.equal(context.deployParams.symbol); - - // using getData -> returns(bytes) - const symbolAsBytes = await context.lsp8CompatibleERC721.getData( - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('LSP4TokenSymbol')), - ); - - expect(ethers.utils.toUtf8String(symbolAsBytes)).to.equal(context.deployParams.symbol); - }); - }); - }); -}; diff --git a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CompatibleERC721Init.test.ts b/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CompatibleERC721Init.test.ts deleted file mode 100644 index 6cd11fa7d..000000000 --- a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CompatibleERC721Init.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { ethers } from 'hardhat'; -import { expect } from 'chai'; - -import { - LSP8CompatibleERC721InitTester__factory, - LSP8CompatibleERC721MintableInit__factory, -} from '../../../types'; - -import { - getNamedAccounts, - shouldBehaveLikeLSP8CompatibleERC721, - shouldInitializeLikeLSP8CompatibleERC721, - LSP8CompatibleERC721TestContext, -} from '../LSP8CompatibleERC721.behaviour'; - -import { deployProxy } from '../../utils/fixtures'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; - -describe('LSP8CompatibleERC721Init with proxy', () => { - const buildTestContext = async (): Promise => { - const accounts = await getNamedAccounts(); - - const tokenUriHex = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('ipfs://some-cid')); - const tokenUriHash = ethers.utils.keccak256(tokenUriHex); - const hashSig = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('keccak256(utf8)')); - const lsp4MetadataValue = `${hashSig.slice(0, 10)}${tokenUriHash.replace( - /^0x/, - '', - )}${tokenUriHex.replace(/^0x/, '')}`; - - const deployParams = { - name: 'LSP8 - deployed with constructor', - symbol: 'NFT', - newOwner: accounts.owner.address, - lsp4TokenType: LSP4_TOKEN_TYPES.NFT, - lsp8TokenIdFormat: LSP8_TOKEN_ID_FORMAT.NUMBER, - lsp4MetadataValue, - }; - - const lsp8CompatibleERC721TesterInit = await new LSP8CompatibleERC721InitTester__factory( - accounts.owner, - ).deploy(); - const lsp8CompatibleERC721Proxy = await deployProxy( - lsp8CompatibleERC721TesterInit.address, - accounts.owner, - ); - const lsp8CompatibleERC721 = lsp8CompatibleERC721TesterInit.attach(lsp8CompatibleERC721Proxy); - - return { accounts, lsp8CompatibleERC721, deployParams }; - }; - - const initializeProxy = async (context: LSP8CompatibleERC721TestContext) => { - return context.lsp8CompatibleERC721['initialize(string,string,address,uint256,uint256,bytes)']( - context.deployParams.name, - context.deployParams.symbol, - context.deployParams.newOwner, - context.deployParams.lsp4TokenType, - context.deployParams.lsp8TokenIdFormat, - context.deployParams.lsp4MetadataValue, - ); - }; - - describe('when deploying the base implementation contract', () => { - it('LSP8CompatibleERC721Init: prevent any address from calling the initialize(...) function on the implementation', async () => { - const accounts = await ethers.getSigners(); - - const lsp8CompatibilityForERC721TesterInit = - await new LSP8CompatibleERC721InitTester__factory(accounts[0]).deploy(); - - const randomCaller = accounts[1]; - - await expect( - lsp8CompatibilityForERC721TesterInit.initialize( - 'XXXXXXXXXXX', - 'XXX', - randomCaller.address, - 12345, - 6789, - '0x', - ), - ).to.be.revertedWith('Initializable: contract is already initialized'); - }); - - it('LSP8CompatibleERC721MintableInit: prevent any address from calling the initialize(...) function on the implementation', async () => { - const accounts = await ethers.getSigners(); - - const lsp8CompatibleERC721MintableInit = await new LSP8CompatibleERC721MintableInit__factory( - accounts[0], - ).deploy(); - - const randomCaller = accounts[1]; - - await expect( - lsp8CompatibleERC721MintableInit.initialize( - 'XXXXXXXXXXX', - 'XXX', - randomCaller.address, - 12345, - 6789, - ), - ).to.be.revertedWith('Initializable: contract is already initialized'); - }); - }); - - describe('when deploying the contract as proxy', () => { - let context: LSP8CompatibleERC721TestContext; - - before(async () => { - context = await buildTestContext(); - }); - - describe('when initializing the contract', () => { - shouldInitializeLikeLSP8CompatibleERC721(async () => { - const { lsp8CompatibleERC721, deployParams } = context; - const initializeTransaction = await initializeProxy(context); - - return { - lsp8CompatibleERC721, - deployParams, - initializeTransaction, - }; - }); - }); - - describe('when calling initialize more than once', () => { - it('should revert', async () => { - await expect(initializeProxy(context)).to.be.revertedWith( - 'Initializable: contract is already initialized', - ); - }); - }); - }); - - describe('when testing deployed contract', () => { - shouldBehaveLikeLSP8CompatibleERC721(() => - buildTestContext().then(async (context) => { - await initializeProxy(context); - - return context; - }), - ); - }); -}); diff --git a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8CompatibleERC721.test.ts b/tests/LSP8IdentifiableDigitalAsset/standard/LSP8CompatibleERC721.test.ts deleted file mode 100644 index 0565ccd67..000000000 --- a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8CompatibleERC721.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { ethers } from 'hardhat'; - -import { LSP8CompatibleERC721Tester__factory } from '../../../types'; - -import { - getNamedAccounts, - shouldBehaveLikeLSP8CompatibleERC721, - shouldInitializeLikeLSP8CompatibleERC721, - LSP8CompatibleERC721TestContext, -} from '../LSP8CompatibleERC721.behaviour'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; - -describe('LSP8CompatibleERC721 with constructor', () => { - const buildTestContext = async (): Promise => { - const accounts = await getNamedAccounts(); - - const tokenUriHex = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('ipfs://some-cid')); - const tokenUriHash = ethers.utils.keccak256(tokenUriHex); - const hashSig = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('keccak256(utf8)')); - const lsp4MetadataValue = `${hashSig.slice(0, 10)}${tokenUriHash.replace( - /^0x/, - '', - )}${tokenUriHex.replace(/^0x/, '')}`; - - const deployParams = { - name: 'Compat for ERC721', - symbol: 'NFT', - newOwner: accounts.owner.address, - lsp4TokenType: LSP4_TOKEN_TYPES.NFT, - lsp8TokenIdFormat: LSP8_TOKEN_ID_FORMAT.NUMBER, - lsp4MetadataValue, - }; - - const lsp8CompatibleERC721 = await new LSP8CompatibleERC721Tester__factory( - accounts.owner, - ).deploy( - deployParams.name, - deployParams.symbol, - deployParams.newOwner, - deployParams.lsp4TokenType, - deployParams.lsp8TokenIdFormat, - deployParams.lsp4MetadataValue, - ); - - return { accounts, lsp8CompatibleERC721, deployParams }; - }; - - describe('when deploying the contract', () => { - let context: LSP8CompatibleERC721TestContext; - - before(async () => { - context = await buildTestContext(); - }); - - describe('when initializing the contract', () => { - shouldInitializeLikeLSP8CompatibleERC721(async () => { - const { lsp8CompatibleERC721, deployParams } = context; - - return { - lsp8CompatibleERC721, - deployParams, - initializeTransaction: context.lsp8CompatibleERC721.deployTransaction, - }; - }); - }); - }); - - describe('when testing deployed contract', () => { - shouldBehaveLikeLSP8CompatibleERC721(buildTestContext); - }); -}); From 7d81c0d0d41da386649dfd0454a3dd97b20679bd Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Fri, 12 Jan 2024 18:44:44 +0200 Subject: [PATCH 15/29] Update and rename LSP16UniversalFactory.md to README.md (#848) --- .../{LSP16UniversalFactory.md => README.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contracts/LSP16UniversalFactory/{LSP16UniversalFactory.md => README.md} (83%) diff --git a/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md b/contracts/LSP16UniversalFactory/README.md similarity index 83% rename from contracts/LSP16UniversalFactory/LSP16UniversalFactory.md rename to contracts/LSP16UniversalFactory/README.md index 0a5a2a603..0df78e72f 100644 --- a/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md +++ b/contracts/LSP16UniversalFactory/README.md @@ -14,7 +14,7 @@ The factory should not be deployed directly from a floating branch in the reposi - Openzeppelin package version: `"@openzeppelin/contracts": "^4.9.2"` - The source code is generated with `0.8.17` compiler version and with `9999999` optimization runs. -- Checkout to `PLACE_HOLDER` commit in the [lsp-smart-contract](https://github.com/lukso-network/lsp-smart-contracts) repo to obtain the exact copy of the code, change the compiler settings in `hardhat.config.ts` and compile to produce the same bytecode. +- Checkout to `9e1519f94293b96efa2ebc8f459fde65cc43fecd` commit in the [lsp-smart-contract](https://github.com/lukso-network/lsp-smart-contracts) repo to obtain the exact copy of the code, change the compiler settings in `hardhat.config.ts` and compile to produce the same bytecode. [CREATE2]: https://eips.ethereum.org/EIPS/eip-1014 [Nick Factory]: https://github.com/Arachnid/deterministic-deployment-proxy From e5fa35472d5c7882fcf8b626210a4121b726a5a1 Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Mon, 15 Jan 2024 18:43:37 +0200 Subject: [PATCH 16/29] docs: add `TESTING.md` (#847) * docs: add `TESTING.md` * docs: remove duplicated code * chore: add suggested changes --------- Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- README.md | 4 +++ tests/README.md | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 tests/README.md diff --git a/README.md b/README.md index d202d1592..a297ed730 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,10 @@ $ cd ./lsp-smart-contracts $ npm install ``` +## Testing + +For detailed instructions on how to run tests, please refer to our [Testing Guide](./tests/README.md). + ## Usage ### in Javascript diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 000000000..ce381bc5f --- /dev/null +++ b/tests/README.md @@ -0,0 +1,65 @@ +# Testing Guide + +This document provides instructions on how to run tests for the project. + +## Initial Setup + +Before running the tests, ensure that you have all the necessary modules installed and the contracts are built. Follow these steps: + +1. Install the required modules: + +```bash +npm install +``` + +2. Build the contracts: + +```bash +npm run build +``` + +## Running Tests + +To run the tests, use the `npm run test:{lsp}` command. Replace `{lsp}` with the specific test script you want to execute. Here are the available test script options with their descriptions: + +- `test`: Runs all tests in order. +- `test:benchmark`: Executes benchmark tests related to gas cost. +- `test:parallel`: Runs the tests in parallel, allowing for simultaneous execution. +- `test:mocks`: Executes tests for mock contracts (typically used for testing purposes), **ERC165 interface IDs and constants from `constants.ts` checks**. +- `test:up`: Runs tests for the UniversalProfile contract. +- `test:upinit`: Executes tests for the initializable version of the UniversalProfile contract. +- `test:lsp1`: Runs tests for the LSP1UniversalReceiver contracts. +- `test:lsp2`: Executes tests for the LSP2ERC725YJSONSchema contracts. +- `test:lsp4`: Runs tests for the LSP4DigitalAssetMetadata contracts. +- `test:lsp6`: Executes tests for the LSP6KeyManager contracts. +- `test:lsp6init`: Runs tests for the initializable version of the LSP6KeyManager contracts. +- `test:lsp7`: Runs tests for the LSP7DigitalAsset contracts. +- `test:lsp7init`: Executes tests for the initializable version of the LSP7DigitalAsset contracts. +- `test:lsp8`: Runs tests for the LSP8IdentifiableDigitalAsset contracts. +- `test:lsp8init`: Executes tests for the initializable version of the LSP8IdentifiableDigitalAsset contracts. +- `test:lsp9`: Runs tests for the LSP9Vault contracts. +- `test:lsp9init`: Executes tests for the initializable version of the LSP9Vault contracts. +- `test:lsp11`: Runs tests for the LSP11BasicSocialRecovery contracts. +- `test:lsp11init`: Executes tests for the initializable version of the LSP11BasicSocialRecovery contracts. +- `test:lsp17`: Runs tests for the LSP17ContractExtension contracts. +- `test:lsp17extensions`: Executes tests for extensions contracts following the LSP17 standards. +- `test:lsp20`: Runs tests for the contracts following the LSP20 standards. +- `test:lsp20init`: Executes tests for the initializable version of the contracts following the LSP20 standards. +- `test:lsp23`: Executes tests for the LSP23LinkedContractsFactory contract. +- `test:lsp25`: Runs tests for the contracts following the LSP25 standard. +- `test:universalfactory`: Executes tests for the LSP16UniversalFactory contract. +- `test:reentrancy`: Runs reentrancy tests, particularly for UniversalProfile and LSP6KeyManager. + +For example, to run the `test:lsp1` script, you would use: + +```bash +npm run test:lsp1 +``` + +## Running Foundry Tests + +To run the Foundry tests, use the following command: + +```bash +npm run test:foundry +``` From 4a8226915ac707651399298b62bf52f9c604ac2e Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Wed, 24 Jan 2024 18:01:30 +0000 Subject: [PATCH 17/29] ci: create deployment script to deploy + verify base contracts on mainnet (#849) * refactor: convert verify balance script into Hardhat task * ci: add script to deploy and verify base contracts on mainnet * ci: create bash file + setup mainnet deployer * ci: refactor workflow to deploy and verify contracts using Hardhat task --- .github/workflows/deploy-verify.yml | 98 ++++++------------- DEPLOYMENT.md | 32 +++++- .../003_deploy_universal_receiver_delegate.ts | 2 +- deploy/008_deploy_lsp7_mintable.ts | 3 +- deploy/009_deploy_lsp8_mintable.ts | 4 +- deploy/013_deploy_base_vault.ts | 2 +- hardhat.config.ts | 26 +++++ scripts/ci/check-deployer-balance.ts | 38 ++++--- scripts/ci/deploy-verify.sh | 83 ---------------- scripts/ci/verify-all-contracts.ts | 31 ++++++ 10 files changed, 149 insertions(+), 170 deletions(-) delete mode 100644 scripts/ci/deploy-verify.sh create mode 100644 scripts/ci/verify-all-contracts.ts diff --git a/.github/workflows/deploy-verify.yml b/.github/workflows/deploy-verify.yml index 168c804c4..b8c067c4d 100644 --- a/.github/workflows/deploy-verify.yml +++ b/.github/workflows/deploy-verify.yml @@ -2,8 +2,10 @@ name: Deploy + Verify Contracts on Testnet env: + # 0x983aBC616f2442bAB7a917E6bb8660Df8b01F3bF CONTRACT_VERIFICATION_TESTNET_PK: ${{ secrets.CONTRACT_VERIFICATION_TESTNET_PK }} - DEPLOYER_ADDRESS: "0x983aBC616f2442bAB7a917E6bb8660Df8b01F3bF" + # 0xF0efeD8d49c0FA6CFC861Bf0311b6B3a4414e4b7 + CONTRACT_VERIFICATION_MAINNET_PK: ${{ secrets.CONTRACT_VERIFICATION_MAINNET_PK }} on: workflow_dispatch: @@ -12,83 +14,45 @@ on: - "main" jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Use Node.js '16.15.0' - uses: actions/setup-node@v3 - with: - node-version: "16.x" - cache: "npm" - - - name: Install dependencies - run: npm ci - - # This will also generate the Typechain types used by the Chai tests - - name: Build contract artifacts - run: npx hardhat compile - - - name: cache dependencies + build - uses: actions/cache@v2 - with: - path: | - artifacts - node_modules - types - contracts.ts - key: ${{ github.run_id }} - deploy-verify: - runs-on: ubuntu-latest - needs: [build] strategy: - # run each base contract verification one after the other to prevent submitting multiple transactions at the same time with the same nonce. - max-parallel: 1 matrix: - contracts: [ - # Standard contracts - "UniversalProfile", - "LSP6KeyManager", - "LSP1UniversalReceiverDelegateUP", - "LSP1UniversalReceiverDelegateVault", - "LSP7Mintable", - "LSP8Mintable", - "LSP9Vault", - # Base contracts (for proxies) - "UniversalProfileInit", - "LSP6KeyManagerInit", - "LSP7MintableInit", - "LSP8MintableInit", - "LSP9VaultInit", - ] + network: ["luksoTestnet", "luksoMainnet"] + + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: restore cache - uses: actions/cache@v2 - id: "build-cache" - with: - path: | - artifacts - node_modules - types - contracts.ts - key: ${{ github.run_id }} - - - name: Use Node.js v16 + - name: Use Node.js v20 uses: actions/setup-node@v3 with: - node-version: "16.x" + node-version: "20.x" cache: "npm" - name: Install dependencies - if: steps.build-cache.outputs.cache-hit != 'true' run: npm ci - - name: Verify Deployer Balance - run: npx ts-node ./scripts/ci/check-deployer-balance.ts + - name: Build contract artifacts + run: npm run build - - name: Deploy + Verify ${{ matrix.contracts }} on Testnet - run: sh ./scripts/ci/deploy-verify.sh -n luksoTestnet -c ${{ matrix.contracts }} + - name: Verify Deployer Balance + run: npx hardhat verify-balance --network ${{ matrix.network }} + + # We do not deploy the standard contracts on mainnet for the following reasons: + # 1) standard contracts are expensive to deploy on mainnet + # 2) user's universal profiles use the minimal proxy pattern, + # + # therefore we only need the base contracts to be deployed on mainnet. + - name: Select tags based on network to deploy + run: | + TAGS="base" + if [[ ${{ matrix.network }} == "luksoTestnet"]]; then + TAGS+=",standard" + fi + + - name: Deploy contracts on network + run: npx hardhat deploy --network ${{ matrix.network }} --tags $TAGS --write true + + # Loop through deployment files and recover address of deployed contracts to verify + - name: Verify deployed contracts on mainnet + run: npx hardhat verify-all --network ${{ matrix.network }} diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index 736cbba66..25a8aa236 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -59,7 +59,7 @@ Available `--tags ` are: - `base`: deploy the 4 base contract above (for proxy use) at deterministic addresses. -> **Note:** all the contracts marked as `base` or `Init` are deployed at deterministic addresses, so that they can be used as implementation behind proxies. If the contract is already deployed on the network, the address where the contract exists already will be returned. +> **Note:** all the contracts marked as `base` or for which their name finish with `Init` are deployed at deterministic addresses, so that they can be used as implementation behind proxies. If the contract is already deployed on the network, the address where the contract exists already will be returned. > Moreover, **these contracts use `bytes32(0)` as their `salt` to deploy with CREATE2.**   @@ -67,11 +67,19 @@ Available `--tags ` are: **Examples** ``` -// Deploy the 3 contracts +// Deploy the following 4 contracts: +// - `UniversalProfile` +// - `LSP6KeyManager` +// - `LSP7Mintable` +// - `LSP8Mintable` npx hardhat deploy --network luksoTestnet --tags standard --reset -// Deploy the 3 contracts as base contracts (to be used behind proxies) +// Deploy the following 4 contracts as base contracts (to be used behind proxies) +// - `UniversalProfile` +// - `LSP6KeyManager` +// - `LSP7Mintable` +// - `LSP8Mintable` npx hardhat deploy --network luksoTestnet --tags base --reset // Deploy a specific contract @@ -141,3 +149,21 @@ module.exports = [ false, // isNonDivisible_ (true or false) ]; ``` + +## Alternative: verify all deployed contracts + +A custom Hardhat task [`hardhat verify-all`](./scripts/ci/verify-all-contracts.ts) is available in this repository. It allows to verify all the contracts deployed and listed under the `deployments/` folder with a single command. + +For instance, if you have deployed all your contracts using a `--tag` (_e.g: all the `base` or `standard` contracts_) and set the flag `--write true` with `hardhat deploy`, all the infos of these contracts and their deployed addresses will be saved under the `deployments/` folder. + +You can then verify all of these deployed contracts in one go using the following command below for instance + +```bash +# Deploy all the base contracts +npx hardhat deploy --network luksoTestnet --tags base --write true + +# Verify all the base contracts at addresses mentioned under the `deployments/` folder +npx hardhat verify-all --network luksoTestnet +``` + +For more details, see the [official Github repository of the Hardhat deploy plugin](https://github.com/wighawag/hardhat-deploy). diff --git a/deploy/003_deploy_universal_receiver_delegate.ts b/deploy/003_deploy_universal_receiver_delegate.ts index a3f7d4d4a..2b751b7af 100644 --- a/deploy/003_deploy_universal_receiver_delegate.ts +++ b/deploy/003_deploy_universal_receiver_delegate.ts @@ -21,4 +21,4 @@ const deployUniversalReceiverDelegateUPDeterministic: DeployFunction = async ({ }; export default deployUniversalReceiverDelegateUPDeterministic; -deployUniversalReceiverDelegateUPDeterministic.tags = ['LSP1UniversalReceiverDelegateUP']; +deployUniversalReceiverDelegateUPDeterministic.tags = ['LSP1UniversalReceiverDelegateUP', 'base']; diff --git a/deploy/008_deploy_lsp7_mintable.ts b/deploy/008_deploy_lsp7_mintable.ts index 0f1ecc62e..6faefd686 100644 --- a/deploy/008_deploy_lsp7_mintable.ts +++ b/deploy/008_deploy_lsp7_mintable.ts @@ -1,6 +1,7 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; import { ethers } from 'hardhat'; +import { LSP4_TOKEN_TYPES } from '../constants'; const deployLSP7Mintable: DeployFunction = async ({ deployments, @@ -13,7 +14,7 @@ const deployLSP7Mintable: DeployFunction = async ({ await deploy('LSP7Mintable', { from: owner, - args: ['LSP7 Mintable', 'LSP7M', owner, false], + args: ['LSP7 Mintable', 'LSP7M', owner, LSP4_TOKEN_TYPES.TOKEN, false], gasPrice, log: true, }); diff --git a/deploy/009_deploy_lsp8_mintable.ts b/deploy/009_deploy_lsp8_mintable.ts index 1ba09cee4..7453ae7ac 100644 --- a/deploy/009_deploy_lsp8_mintable.ts +++ b/deploy/009_deploy_lsp8_mintable.ts @@ -1,6 +1,7 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; import { ethers } from 'hardhat'; +import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../constants'; const deployLSP8MintableDeterministic: DeployFunction = async ({ deployments, @@ -13,10 +14,9 @@ const deployLSP8MintableDeterministic: DeployFunction = async ({ await deploy('LSP8Mintable', { from: deployer, - args: ['LSP8 Mintable', 'LSP8M', deployer], + args: ['LSP8 Mintable', 'LSP8M', deployer, LSP4_TOKEN_TYPES.NFT, LSP8_TOKEN_ID_FORMAT.NUMBER], gasPrice, log: true, - deterministicDeployment: true, }); }; diff --git a/deploy/013_deploy_base_vault.ts b/deploy/013_deploy_base_vault.ts index b98e67c12..9cc49e1b2 100644 --- a/deploy/013_deploy_base_vault.ts +++ b/deploy/013_deploy_base_vault.ts @@ -21,4 +21,4 @@ const deployBaseVaultDeterministic: DeployFunction = async ({ }; export default deployBaseVaultDeterministic; -deployBaseVaultDeterministic.tags = ['LSP9VaultInit', 'base']; +deployBaseVaultDeterministic.tags = ['LSP9VaultInit']; diff --git a/hardhat.config.ts b/hardhat.config.ts index 63ab5b9e4..1533e65c3 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -22,6 +22,8 @@ import 'hardhat-deploy'; // custom built hardhat plugins for CI import './scripts/ci/docs-generate'; import './scripts/ci/gas_benchmark'; +import './scripts/ci/check-deployer-balance'; +import './scripts/ci/verify-all-contracts'; // Typescript types for web3.js import '@nomiclabs/hardhat-web3'; @@ -49,6 +51,21 @@ function getTestnetChainConfig(): NetworkUserConfig { return config; } +function getMainnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.lukso.gateway.fm', + chainId: 42, + saveDeployments: true, + }; + + if (process.env.CONTRACT_VERIFICATION_MAINNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_MAINNET_PK]; + } + + return config; +} + const config: HardhatUserConfig = { defaultNetwork: 'hardhat', networks: { @@ -58,6 +75,7 @@ const config: HardhatUserConfig = { allowBlocksWithSameTimestamp: true, }, luksoTestnet: getTestnetChainConfig(), + luksoMainnet: getMainnetChainConfig(), }, namedAccounts: { owner: 0, @@ -83,6 +101,14 @@ const config: HardhatUserConfig = { browserURL: 'https://explorer.execution.testnet.lukso.network/', }, }, + { + network: 'luksoMainnet', + chainId: 42, + urls: { + apiURL: 'https://api.explorer.execution.mainnet.lukso.network/api', + browserURL: 'https://explorer.execution.mainnet.lukso.network/', + }, + }, ], }, gasReporter: { diff --git a/scripts/ci/check-deployer-balance.ts b/scripts/ci/check-deployer-balance.ts index 5fc9d96a7..930a90dbe 100644 --- a/scripts/ci/check-deployer-balance.ts +++ b/scripts/ci/check-deployer-balance.ts @@ -1,30 +1,44 @@ -import { ethers, config } from 'hardhat'; +import { task } from 'hardhat/config'; import { config as dotenvConfig } from 'dotenv'; import { resolve } from 'path'; dotenvConfig({ path: resolve(__dirname, './.env') }); -const wallet = new ethers.Wallet(process.env.CONTRACT_VERIFICATION_TESTNET_PK); -const deployerAddress = wallet.address; +task( + 'verify-balance', + 'Verify the balance of the EOA deployer address on a provided network', +).setAction(async (taskArgs, hre) => { + const { ethers } = hre; -const provider = new ethers.providers.JsonRpcProvider(config.networks.luksoTestnet['url']); + let wallet; -// the CI deploys all the contracts, so we need to make sure that the deployer has enough balance -const MINIMUM_DEPLOYER_BALANCE = ethers.utils.parseUnits('1.0', 'ether'); + if (hre.network.name === 'luksoMainnet') { + wallet = new ethers.Wallet(process.env.CONTRACT_VERIFICATION_MAINNET_PK); + } else { + wallet = new ethers.Wallet(process.env.CONTRACT_VERIFICATION_TESTNET_PK); + } + + // the CI deploys all the contracts, so we need to make sure that the deployer has enough balance + // each contract to deploy costs around 0.02 - 0.03 LYXe + const MINIMUM_DEPLOYER_BALANCE = ethers.utils.parseUnits('0.1', 'ether'); + + const deployerAddress = wallet.address; -async function main() { - const deployerBalance = await provider.getBalance(deployerAddress); + // Grab network testnet vs mainnet from hardhat config at runtime + // via `npx hardhat verify-balance --network ` + const deployerBalance = await hre.ethers.provider.getBalance(deployerAddress); if (deployerBalance.lt(MINIMUM_DEPLOYER_BALANCE)) { throw new Error( - `❌ Deployer balance is too low. Please fund the deployer address ${deployerAddress} on LUKSO Testnet with at least ${MINIMUM_DEPLOYER_BALANCE} LYXe`, + `❌ Deployer balance is too low: ${ethers.utils.formatEther( + deployerBalance, + )} LYXe left. Please fund the deployer address ${deployerAddress} on LUKSO Testnet.`, ); } else { console.log( - `✅ Deployer balance sufficient to deploy + verify contracts on LUKSO Testnet. + `✅ Deployer balance sufficient to deploy + verify contracts on LUKSO Testnet. Deployer address: ${deployerAddress} Balance: ${ethers.utils.formatEther(deployerBalance)} LYXe`, ); } -} -main(); +}); diff --git a/scripts/ci/deploy-verify.sh b/scripts/ci/deploy-verify.sh deleted file mode 100644 index 26e503deb..000000000 --- a/scripts/ci/deploy-verify.sh +++ /dev/null @@ -1,83 +0,0 @@ -# This shell script provides a simple way to deploy + verify lsp-smart-contracts -# options: -# -c: name of the contract to deploy + verify -#  -n: network to deploy + verify the contract on - -cmd_description="options:\n - -c: name of the contract to deploy + verify\n - -n: network to deploy + verify the contract on" - -error_header="deploy-verify.sh cmd failed\n----------\n" - -# Check that we have passed the right arguments to the shell command -if [ $# -eq 0 ] - then - echo $error_header "error: no arguments supplied" - echo $cmd_description + "\n" - exit 1 -fi - - -while getopts c:d:n: flag -do - case "${flag}" in - c) contract=${OPTARG};; - n) network=${OPTARG};; - esac -done - -if [ -z "$contract" ] - then - echo $error_header"error: No contract name specified. Use the option below:\n" - echo " -c: name of the contract to deploy + verify\n" - exit 1 -fi - -if [ -z "$network" ] - then - echo $error_header"error: No network specified. Use the option below:\n" - echo " -n: network to deploy + verify the contract on\n" - exit 1 -fi - -# Save the output of the deployment in a text file. -npx hardhat deploy --network ${network} --tags ${contract} --reset >> deployment.txt -CONTRACT_ADDRESS=$(grep -o -E '0x(\w|\s){40}' deployment.txt | tail -n 1) - -# Verify UniversalProfile with constructor arguments -if [ "${contract}" = "UniversalProfile" ] -then - npx hardhat verify $CONTRACT_ADDRESS $DEPLOYER_ADDRESS --network luksoTestnet --contract contracts/UniversalProfile.sol:UniversalProfile - -# Verify LSP6KeyManager contracts with constructor arguments -elif [ "${contract}" = "LSP6KeyManager" ] -then - # specify the contract as UniversalProfile and LSP0ERC725Account have the same runtime code. - LINKED_UP_IN_CONSTRUCTOR=$(grep -o -E '0x(\w|\s){40}' deployment.txt | head -n 2 | tail -n 1) - npx hardhat verify $CONTRACT_ADDRESS $LINKED_UP_IN_CONSTRUCTOR --network luksoTestnet - -# Verify LSP7Mintable contract with constructor arguments -elif [ "${contract}" = "LSP7Mintable" ] -then - # LSP7 constructor takes a boolean parameter that error when passed as CLI argument. - # Create js file with constructor arguments to bypass this error. - echo "module.exports = [ 'LSP7 Mintable', 'LSP7M', '$DEPLOYER_ADDRESS', false ];" >> lsp7arguments.js - npx hardhat verify $CONTRACT_ADDRESS --network luksoTestnet --constructor-args lsp7arguments.js - -# Verify LSP8Mintable contract with constructor arguments -elif [ "${contract}" = "LSP8Mintable" ] -then - npx hardhat verify $CONTRACT_ADDRESS 'LSP8 Mintable' 'LSP8M' $DEPLOYER_ADDRESS --network luksoTestnet - -# Verify LSP9Vault contract with constructor arguments -elif [ "${contract}" = "LSP9Vault" ] -then - npx hardhat verify $CONTRACT_ADDRESS $DEPLOYER_ADDRESS --network luksoTestnet - -# Default: verify contract without any constructor arguments (LSP!UniversalReceiverDelegate of UP or Vault) -else - npx hardhat verify $CONTRACT_ADDRESS --network luksoTestnet -fi - - -rm deployment.txt diff --git a/scripts/ci/verify-all-contracts.ts b/scripts/ci/verify-all-contracts.ts new file mode 100644 index 000000000..e31535710 --- /dev/null +++ b/scripts/ci/verify-all-contracts.ts @@ -0,0 +1,31 @@ +import { task } from 'hardhat/config'; + +task( + 'verify-all', + 'Verify all the contracts deployed and listed under the `deployments/` folder', +).setAction(async (args, hre) => { + const deployedContracts = await hre.deployments.all(); + + for (const [name, deployedContract] of Object.entries(deployedContracts)) { + const contractAddress = deployedContract.address; + const constructorArgs = deployedContract.args; + + constructorArgs.forEach((element, index) => { + if (!isNaN(element)) { + constructorArgs[index] = element.toString(); + } + }); + + const artifact = await hre.deployments.getArtifact(name); + + const verifyTaskParams = { + network: hre.network.name, + address: contractAddress, + constructorArgsParams: constructorArgs, + contract: `${artifact.sourceName}:${name}`, + 'no-compile': true, + }; + + await hre.run('verify', verifyTaskParams); + } +}); From 7221a1ef89ffa6a2af7c2f746c6898d66365463b Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Thu, 25 Jan 2024 10:12:18 +0000 Subject: [PATCH 18/29] docs: add latest LSP7 + LSP8 Tokens audit report (#861) --- README.md | 1 + audits/MiloTruck_audit_2024_01_24.pdf | Bin 0 -> 229723 bytes 2 files changed, 1 insertion(+) create mode 100644 audits/MiloTruck_audit_2024_01_24.pdf diff --git a/README.md b/README.md index a297ed730..9144893d9 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ The following audits and formal verification were conducted. All high-level issu - Watchpug Audit, 2023-04-21, Final Result: [Watchpug_audit_2023_04_21.pdf](./audits/Watchpug_audit_2023_04_21.pdf) - Code4Rena Audit Contest, 2023-06-30 to 2023-07-14, Final Result: [See Code4Rena audit report on Code4rena.com website](https://code4rena.com/reports/2023-06-lukso) - MiloTruck, 2023-11-31, Final Result: [MiloTruck_audit_2023_11_31.pdf](./audits/MiloTruck_audit_2023_11_31.pdf) +- MiloTruck, 2024-01-24, Final Result: [MiloTruck_audit_2024_01_24.pdf](./audits/MiloTruck_audit_2024_01_24.pdf) ## Contributors ✨ diff --git a/audits/MiloTruck_audit_2024_01_24.pdf b/audits/MiloTruck_audit_2024_01_24.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6eca30ac5729b61c29d8c802f6e0870d17d0a913 GIT binary patch literal 229723 zcmeFZcT^PHw*O0#j06!dkTVE$?gk`-faIJ*lXK1)MMRJcN=Aa9^hYDqAB|L5prk@~?47)To`mi=p}nkStu0-xtVxBGtzB%r>{uW$ zkhnODrO>9F4N3-va4K?|XPI-XTv*e5ww zsR2nJ@`UolxOb}37Tol-;bRRrpAn71&wGe{p*w|34+v$BAuORXX~!`P47XY#Ads45 z6lcGc`KP&$?JVwOtVK0p;o;17Td($r!Ls_a9CV!b9_WXq@e0I-e;xH8B%D(qB>YN7 zPHsG0h133(E5RQ^zD0g4nKqEnnLtYW!|H>jg3SeqNaXX>YfbComht95;-zjytip|&hH;HbVjjW>mycZe;h_Y&XEvy9c(cM z{921pwUfUm>0?+|_PE_W`GzXrcHn9Avf8+5;Q5+j4yAhi;M}QpxnW@WVnawEF3$h| z^Y1BO&ee7?8EO`~*Vb}2T%4O4f8)x@Tgp&vapCO)-(Nom7rzs7A7yWcY?oHH@y=6h z?V9~MmuTB-YSR<`J(Uc9n8NLiWk4%c@#&ju?hw?#*skHg3n`lMoGLMM^#)V zmnM?1am0rp`PBQ&(j0I`b%@G&aAP>c`1BjN(dFIXO~i^$k#Sb1(a zr0BKJA(G>Le$aMi1a#zUpAqrws$6s2+h_o3f2{iAP|qy1;FDoh5w*raUEa&55-D+k zaTbnmMefKlGDJ*>FmW5}fG&@FA@0V9Z;5dA*~wAAwDjr-mm(gjMxXPETrajHsRzzg zxRM5{jgBL<&uFi#^YX?jYeGSn&A3zOmFr?Es}_s z7sp6NV#`iWW2-xKw|H^%3+{+zm@iBvjheB1ye?v@#8_bGNzr1JtbBiZpkh4k93aKv z+UHh$dwe~Zvwr2(EvpQg-J*z#oNhkZxV^@uTz@<-;Q@M3^l5*XZI7tQ+?rT^UT7r$x-Br6*a!vT40v? z=LAN$Gha0@-oqgn`i_^Ekcue0@-jJ|=xP&1blg_H{cm5W$}Iv!*QHfk4@}YyAg`({ zvZpcBxLx3?MRHIVK6{{&rs1@S28Q+xr=9v_D>}Md?3t@9(9$iT^`L=~E$~aj)(vXF zG&hUwJ5O}H_Em*CbuN;{-ZyG|u~Uh^QjuSPTsM+d2_Oea&PQA;=W!VWtRMm+emqi# zK3`M*OmTupO<=+&A4Q_?RM)Q?%FCYDv?~NBuU$22$_IK9b2e{oC4p*^&W|;`jPTi$ zeAEht4G$wj`-`f#0B2S&c0G3<9`@ZApyN0q;TdaK`>+->a%aA>h3^vX;t3P?SoAlY zc|iS#*UT>mU$MzT8HoUW1hsP*7VBp z8vD+Cc{vDB9ssb;TTl=jA6hZhk6*i%>F(Zf6w|uB4VcaTpuDXmXCqJx=mhYFh2JefXm%u2L3u z@{3k&xJM)cyzeN}22V zCj7-G!}X|@muok0{0)6!AME75a^t)hKS7}-`J-D^ICWRSlF`5z9QRgUsMX;>?Sg}v zyzMGnWxW8yS=ncUMqxUD#UHg=UUrjP_f7sC6mhmkMA%Al5L7R{JCvJ%D?eAHE|ch$ z;j(>m!GZnOopK&SWU9j5_{43}CWUC~`ii#M=U3&9$_nZ32Ne`{kv*6w%L<>MST~ZD zZ}C$523LD|24QKxu6NjY;NH=LT$|t=OPb3Oe9+%pNr2bvLaoTG0*KRhrabcI<+}`T z^POE?(-2OoFEvUWoPGPw`oF%>x1H%6FuPAhXx?y)WCLCvalZ}_6>9kc$$E(g;>(Ry|lMpc~^QI!33)Ddv@C7X(fX!;N zy_`Ke&9&$YJevi0#JfXtL<)84WH}m+-qTVIkxfw~WM;|uxfnnCy0g6P~xdrse9Y2r? zL(=PMF2+9h?@<1_?!T_LT8MvNFC=D{>^{!?tJoCz1)s4uuzf>qr*dyuFN)K?^UXH7 z<9ewuS0gjDEe{~hV^_K1^B&d>-mQ-@{>O__Vf>kjnpQ6ZJNmw?tO$i1m+l&c=<93$ z3J`AE?Y)mP*+5GI-D99*bT)~$?RP-_daM0>mp=k$QqN%ITJ-Z{$AL5j@1r6bMXAS& zk^lG?^NfB{(qPl%JkwBgKA>4uz*IwX+EX(Qf}dZc$&}LUX94F%Y0iqViTKlhZ<_gO zVH%Q6_2tPXC-13?eMr{M>+8IL4bZD#WR4MUn<}x}cdlewm$e*_r#j%~Dx4ifE1Ri7 zABC>s&AguJps_JTmYGpT#f9wu;9f)?Jg(YLn{FFo$ZTlxUUcN4Lw*Ho}Y0u>FZ+ccFH;C=4jxR+jd=D;dBJ|}t~;|QwdJZ}KsbU?Pv z{8H8oc}w-BLXO@iGXGS*+C+TnRa{hs`zrY8;^yKcIquf1PX`T+;pDt&t~hv7jO{wz zGrwn1Qpa$aFd{^5RYdxPknCVx{>q#-TiNWHCGOg8ZzK-ot(Gb%?QHxN@iWi5idS!P zM8%f!&uUo11ngFGL3@&3b%7-HRX@);D-JHqUa^_T+)Ubb^h__lvY z?b!)yJJeCVqfgtVCzm`bimN`;EGGmh)D}X#vrv@c6=|`WD}DS{mlm+Wh~=C{2pQFv z9%}}=!Zp*-z?Ks$nw^eJ+Gw*wo+T~Jzm8{lZ`tPso^SFG4{uQq7y9h=s&)l^+{VMZ z-A2km#|xmEg~=B`k1BplR#&a1u{t;k!?4%#wyN= zSlX#Y^*>#U4*MR#s2JZUcN{Dg#y(-AzZ(BMv_n}GO+@&#GtTYFJUs!*j=A@=X7n6| z7P2=>rxfil2yvwP@@z5PH&VKz59Cj&(H(3d*d|KsHseA^HVhs4Ys~SJxZF#F;`o#tkT*3`k^lE6#_Xwg7O7Yi5w@S_stnFzg zg16>4(eKF{UG$qucSRrISn4{O0&W(0pw*)kFT7v&PWL!lIt(3X^645W2{bT~Y47oF z<^vq|hNj)j*{2cdCK1-OLfyHkpZMAgh(R9R$)HZrj;Vg3f)T(yx9Ra78`t{V^1#YM zHT7k^`V1bG?;1to+&^k*eoTDO!2E=snc)eOr$$IGmHFA$)2E<jPsIT~i-5dF56|7-mZuB%ZTS@dx%>KF-rDyM1C40X0E2RxrT?md?9%_bc zQ$2Iw?(0oV0C~>khHPLu419?5;1vByDLf+GXdzXL2QVB@TQITu>j=)iEOq^+htqFU8yT@H=<=*aU+rgX?B^kE+pqVQKkp$X{YmTyW#>DX72haF~ z(04jdVw#t;rZ6X!!NvVZzgyZ2rKPbkRg4$bK32zkHz-lhOS?mPVbCxH7;O-YMe zH35{&T{(NkfiWyT9_D+xbJwDik!6E1Q3Gz6c9NKO1M|XzhM}U{FKu%6(_(hP;W&$A z$Bc=g{e4e2HCEjOD~3RL_D~+jw`$yA)|`*mBWJLD!7WDLa?|tcISL@@!T# z7oa0#7Je&s>Gwh4EEd-%q8yJ69? zz9|e?Iz`M`pI|Iy`TP5u!1sZ8KLE%G!}t@kAVwTldjH6L@6Hpz)G@zZg%H!137ZxK zScl8D=J@_@3dS_uzM2jiU1zkSa7NBAVtnP96vp0_AE31JzxHc)!&_qZ(-c!EuVXL} zU-e=EaSKLc2ktrncfy!slu^oQ_S&IF0e!cD8yAc+-LhQvb$0r>!n@^|W|WM-oAn0r zr%M1LW=M5o++g@V#tqPb8zlb+{%zn=6A!>xQGy+?1H`>EU=@6Yk699fnVWdMC=>MC z1|xeIOdM&9a}<84izWGO1T&H1ZsU}AR!m=N(YIx)l_#pi4_cZ|d%vuOQXOJWL4Q2! zP!f^;Aj_W1Y`4YL49_?7z1#y0%n|(Teuc|?fQgLe7fA(!)KJs$>VX-XTC;Ffx-+a2Q#E?evfrQ z#k5C3FQR^HuZbDdQECPVib|pX>=L3VjA>ekX*zw)1^gNvY!%RF@e1FS*X)B&58G~kGAG%yFK==IwL;P*JOvI|Nk%iKdTb{zn8B1 z|ID|He}s~0d`|rD*RQwWl3sB*}x1^!hwmr-q$5q5&5i1fvy`EPpzQey%hq?0Y_kfb z+}kshO^$*`p$|zK67DG&Glh`*cJ>cnzVo0*N|>RzJnXuGaP#u3K{FTDfo`-f=X1E- zD64hz4Y%hiS=CYD4~@EY@aT;N#h7qo_(L+=!V0&f_t*D42V2+Wh#7e5ooi&vy;2JnySP_MS$J%& z&a0V`2{75K)k;QYz@$$o774?Q@4{L zUw<(A&QnFBWLA}WlO>aKClp=3O8oja78GkHn|?0s#x=%qLYvP;a|`zcgbeOTXbS}X z;Lt}1M$LpNU6elS70cY8q+Fcb|9m#{{gCoR5y?nl$~Kn2i#N(LEI|1{`R?yeJr;-{;`a}dR7gdc1q}R4ONzzI z!yBkJ{IAM9V60-$KZ+GnE-tRvr3z(x7e}DLzybqK;OYU?l30vDfXjn`N`xj*)L=0} zLRgRxkRVhT3Wu}6Ay7dG5{`hfAfXW87#t1;8p>LGda(%E33|c&Jp4V;zP=ug;6F-D zVAvm*(7(wb3}Qio;6Q(11U3Q~`422C1PgylCx2U*qZ8P|2MYoIcOW2y0U1!jh(E~y z!pHzdU?EspI-$W<4(@Oe*bfT<@s|+*OCXSd3MeEJO9cc9Pys`Qg%DsF-~_X?@U*pu zd0-*@x60N3u`>XMKp-$Gz>zR)1|*;YfQ5yCaFsk zNMURQI7S8l3yZ-!0Obcqd0TtJtgxK{E2RGg1}H`bFzQb-z%ViZTv!Y~?p`2!FbZS| z@pS$}2MFdG`_GE-?~>vFu_-X#00wkG3ZqciIzTWw09;rM4n9`Gel{L%mJoy`76Vqq z`3pLL03DD>VJJ2O7|;R3g~i|j@`MT7LLFgfOBfadW0~~?T0pP-7aPYVAMSFP#_*p`1u^9e(kOX`Z4#VgG0{=+|I7SD63yT2_ z4RH2C!>s&4DD3OvuSZFYEg*mn2-Ke@3pf;`1HgsFVDIDYWovEa?q+X;CBxqmCE;K| z1_S~E#&!n?AOi*q3&F)1?%`0;$#;q2z*XMrWeUyqZ&Ay614AlUH%CX5jR;KE`6gRNYl5SXPiaE1QC0R8K6@;3tl zBLoNvXMq8i0}6xBLoCHJ|O+AEFEkeY^@z#;8+ZQJx=~+fI|hL@ITELu>Zuu z(&2x@@YmzyZw4p|U;w61EU$#Y0s8=4SPa&lP$#&DjfW4+&mBvLzaA%lGXP6SC>#a@ zCU0Q_@cVgCvCKSTWW zNC`wKs4xOx0Ku_WF)$FuKmZpOg9orN%LQoz1>4)&V_D;`M@ozkz@;Dvg`t22{U1wv zV5$EPFf0h0fB>XD)CUsa?F4KF`>(BLe?35`K)pR} z!3dNq3Jc=z36@YeMhO@a$^sYwGhHDdEKmfX1O^NX0%j`=4seB7dtrO!-xDgKP+_1u z$e)(?|AqBGAi(~fNC|{s00D%;p1z?_jClYoECgYHYX=WccSHahinW}B{XL-)3IcS1 zqEOiD7$^i|9smpr0^#Rn4M)1b0xTS{?lEA0PppIp14=*hO}2Dl@zZggOO zPppJsR*+CA2wRB%0{fpK{(7v$ga`=cnuLNu*fSRdfw2$(h6MrhhIm6gT-==Op;##h z*xwT@A(%BJpg#*71Qmp#gaNxiU>FMlTv!Y~PJSq~s|OSfM_^5#u)il(LNIGv2on4! zA^wBwe`fgWp%R$5Aegl+U=XY+1AFTi00Bd=C-DE` z`kx{Go>&P?hJsMAFcf&cLC-Ar08oe%Q)xwsIsN+^5bpvCeQea0`gbY`)qusmfO;A*iq|8=>^ zE*tk`Ft*~t>j)lOz^Hh4;^#94)w{#*Xm&@WuGO)o7>~%`zg}_qzDTeeyYIAdes^6c zgY4PP*R5G7Q_zO((btEf$QS)P4MZXBL>EbeVi^QpZ<)oiwFDv+=&-`N}lie zL}Fx)cxaCJJ=ZqtIBw8cIDMKJaFi(Zh9UH9olC#Qz6 zk#b#>94CY*mIg;vZb?b1W@_e9pFe(e;kST9F}Ms)vgZyWmn2g58dx%}I9ck-EtVzF zOw?@bO0xHg+VfoHuodI$t)!lzod%iTSH34tCgNKWe>=a1Y+KZCSCsey0` z$q%HwuW&zCjz-YJ5YG;DsGCsFt+y3=slj9QHy`Br-8P3tIcaEm+PzP(AGc&M;CgR5 z#QPwO{+&$kbSm+332tFM{UB_pSLM3XKG!hOuueC5g^3ymOBCX{M}?N!8?I8u_vX)U zjCiq7+FUN{hdN$qX$hkEk^(ZLBvyo%a8E&SI{rtm2G4Twvd zgS{2IR2{>|H15o)?@z`JR%$Qhhhx-g?O`%KeSJx4!+Vp-P>QddBoAV4kK zc#^i*Q&$^$bkNp%z8E7kHye619olxj+IjTrbaUq+^TkDX=TkE#rW~fhJ71WX46mK7 zCPr>L4Y)L~aTX?ZpLalbm1W+-%d)y0*0=bj+@kyL9yLPxMK{s+0N zA4vDNx&A?)U+$CM$Kj3L*ic*)rcso}vb7H_{!~!BJy63(7GKs!}2n^hfPh-qIKZQM(%jH3kE}KQLQhjaxqBXE174*JS=PK28+Pc#Ucp_)a zZ8>8{HhMn2t40=06oJK1*$N(OfrT3u_Y~?n3q4KW(&D+_>s@o&3M3|q2HhEO47c1I zZKwUdkaP!z_AG(fUrMJ}qDd-;ca6Zf`ZlsUCyza?7qx-naUxlyr+t~68{j-ue_w2+##;JaNl_RZE zl20As8-YI@q#qnVD(z{^(J$2R;K}!v4@gbCxzFN2UwC8t)c<<#Gu5IGneh?d`{T}6 z;Ta}Sf$q%5%qlzuJ+cFt{syE=_tiR^rKJaTCyC&Fu`8eBvlO4@Zm)8qGa5F%qm!os z2XBj?WM2%3O7repiakB9n|*5c;m|UBVGNPsK)B@0O6wC*KhFKARN5Tf)V~D1IG%ksOtv_p9;2on$HuI%7Hx+Er55)Xu zlW(i=(<^(2lMb+Dol8Z9dDnidFS`#2>$?!IBT4oQ2WtuxLd7?GMt z{I<=#eG#UYGEm@RM{F#r^H4;1rHo)5YMkN&-M31A>??C6FyhMFbN#x8ZzebJ39`U`6U41uBr>jm8OaAtgcA4JKYzp7R6BQxDXxN(4LC9#q z<_G+2c~`SSV#8SHYKGtWhgk|NNYQ(_Za(%2M%pYu!v}Zc=8|4 zhM|%)M%#2Zjt>KfANAoA#WFdzw!{*%+xnEfj^nLDYP0{yqJk*<`-?vye0Ni?@p$S- zCh~O~;fx-ol$h!@=_L<76~=|~_TVQj&0|ay?CKkA4w0u!)mwTpVwZd?K(%eSFP4-1 zGh(E9kfaA3%3o+cs9jkTV4#0}`6po>(-6mQjkiS2jj@Mz47h7#n-h5<*CA2cU5{Pe zPhxR=;i?ig-GVsCO1ql6s<^i%R~uuzzB|`ij#SJcL{l;u`);L4!Zz?k-tUY-DA;gh z=$6o*aD;0TPbm#qPxi``6c$nM7B+ER{0r*Vz#-W;kjqTh3w(G9!Kls& z^3S@ZreFQ@(nS=wG|Z{j`xWT28fjdkL=)I3O2-bhW4W*Ng~h+jaiNOgasQ|g_L`S# z=E%54f!s=wfAR?uafM!IEcATq<8y(=s~L*NR=v;Tl?v{zbUg>BmdcUW!9K}tecXTk z+&$TP>KJOdJ5)#~3FWpU)QY=|T)M)opA>!tuYBR*nuJ4J$JK^GqZMu&1 z%{^zMIX4d9rDgXgC@Ma%7^@BF3fqeop{s`3BP{Z2mXI_~1mmBJP6dU&kcQ#Q4eMVD zMh^HqD%W`8a1bQ@EiX{``^($44M?Xuy)C!Qm+wBIKzllacZg{lT(^D4Q9c4Rnjl;z zc0N+A*K&qec*W}zx>qK2cWx~br00+@(WX2b$y=7bwKLX@SEr2T5NT|#P0AG&Qq;*o z1ci-V`dr^X;V5@xytiJ$sh zPUn^*4Jsn8_^uM;@2Iap-NUX5h*xZE9tjzZ5h<1}bMambrN0IC(@qLYd%Y*BGL>3E zDupO~%HPmjcr6&6_BG?K=i-tQt6BCvosE{LWRrxrCmv#+>zBtsiRqRLi`>v{T_~Nh@xNMW zdUlXb5B`vF5kI>4uBBgbdiuWV&20gRaqh$j)sL(;zZ}fHf9jUZop-R#n$;mnpqj~ z@Y%d;S?<@q8MI2ZOuz&4#v%3|*TGp{f5Q(nX{_&VkQNqCom1Pgy%TbgYii_Y4{0ge zvG%=@&LGly5t8?DndKsyPO!9rndE!&a`o8#)MbrrzLQz;SKsiAS-G}*&ab5K-tIf& zLz|>Nrp(F88imPHDZPvfF1_!2xjw7>^7FbvkD=G|pHr_|xUX1%hLLymdzEolM1?iW z3U)WjYcJKgxqQv`>C8OhpmHey)pKaI+h@Jp&f<|D{rb+*cqPPkRDEW-BZb{Go#r#% z{bD{Y{2fuk>_9P%qZY64oS>gC@vj_JlWZ6sZ{9^L)adT#CH9`_<(#wKQyaOYqHs$@ z3%sjC=rP0dLA1-jp?bkuN?Tl%&*WJ8TE;b3(E>K(t7J$HEB&3h`p?z5bP(`$udkd< z0`L1$EG|7wpN|dhOu9bY=Hj=p75$)g+@sX0kwsdIop;0)Y=Sr~Pu>j~IUBNHyrYHl z#>rFDN^W`L^bx=7VQ*bs<t(ijX9G)mWJgM*`bA?hi zNxP?R(*6P5s@iloPwJjU`ey;L);D!RoL06;Mb$~D)X(aE!DrGgJFZt-XcmcdqP}GL z;PF$+SmtwPH`s&yN!r*R?%z(PFZ1wo*yB-oaF3bq>Pe(`zt6$xmTj)@+xX#cHYIdL z0SrmR3ZJT*nQC@;W`8c+ZR0O?mVYq&@zZD^aSt!s{Yyg1|^h%|(WYz#Q?$rHJpk(;$w(lS$5S)k>8Xe4l`T*6{P>mqn4R^nyr!(W5(4 zRKIdvcnsWryn}5Q|5QD9e6sxb%4j9)h)Y8-Y8JY?y&{?{QP}$+|%@2aw^}Plxy+k6e4nXDymX33$_UKY{?NrvHLww zQ}?)it`BNE3voCt_ted@&mt5;NSlr3y}m+Ll8F`$sTV(zJc+!yd7P9jki@AK%TeIC zcDPGgQ@18CpD$y`M3$Z6CFIZgW5PsAsIT%~;z6s@V|I5uYCigwc-PwiK1iuI?>)2ZM+-#-c<~hs78*Ge1byv@CO-!_oB&gh} zM3MQ3Za>`r0O9|!DKIT`^6e4Dx92Y-1HnJ2p%xdFglua9X>%;!DA?v$EUwC~1k|)j zz1zOTCcZXeOUY~Sy^}S?{CW!JuG&>x^vvTj^P~9~Sv9BKAwtT{UpEgALd9{ZX(=;x zET3syH71Qq7P8H!z%fqqN=gxHn^U?i=|yXOng4nGU@bS)n?4S;yz+rNuIkID4=h&e zUy~|1zSsL}*A(}GQWf}EUW{z9?3?i@qSQgeak^S2Lx->Toq86fjlRm7zI$svebIOX zN{pZyFxDK6Nq-!&uLIJ*IeoLimEDnT_DKTe<tvc8(!~^ zX3a*wuIBdFUQo8AJkj~@JGAz2<%4l^b+v2w)FO}_wpC?^A8XL-cEp(ef#T4NEncZ$CPtXSl}=iR1gkF z0GmMm9dJ)KYqW=jy_cY+tMmU2_isp8!i5E4!otERI12*EV}not=I?AJ64*Hg1I7RY zjv;^V;QCjE#=M{b=3(uE{_ntuzahH`LkPlw-F*na3qUX+)eUUt00SFpAV571&=-sV z4ncn>d;e8lFJF5vppN;Q*4f_46>t(u$3M9R;;-jJApjT>0_<)8b_9V05lCQH918^S zY!Da@1+vw^t^))L^t*8KuVVjMX375z`Cm_>Vy-$63~&c5awr%o2!{VI#r-?vXcsSg zz&$XRpSRHe2K--4yFx+mKkaT_G**hg*+AX8U72P{(@tCZlZS?i-0nbRF~KiT^-N}b z*J8g)&o-fLN)7*P=cD8C_~K`50gn(Vhdfca4o>EWz9=OwM0O@)zL$Z z^&aj;hG0{YaOBRr+GeeGJc%Fd-`Yv)GUA2SYW7L!sx?iryajehzznVKojvt=Ib~id zDI5&R#6{CrtTQO8fn?iDwM>UMCDo3lGJ2N6LAV>eQ_Ia@_rY5%aRM`gDG!qT8Kt$m z9>*w|T%DRJarA5XF!@xPE~XFRk2}?F@nTzf4UHF)ZBYn{9_&RUof1tATL z;<1pv$w&rz?c4l*!zZtaSG|uQB?(aL$AK)sDv=+C+y5>#x+v*>_i&P+0~s z=_5Hg`Wo>Z5%Ua|Z>>@(b~VJZ38?}?PR9!R`@(u@(@!_nWj}vX%V9hYgDsx;RpeiX z4^adL^qYUM$q1_xd_s^PXuJ!%;v}tkKXLM5?GJN^lK`JZ_Clt40=)X>CAAA02vIag zhwXxJqQ8)nceS$nH{QrrzVVg9NhswW>$Cn1c_%2 zqWy)B2yd}uL(AH7J$l0T*SeHu%(veJuJBYiioR_!#<#xDtWe8rUZF2HxVC91fV;ZC z`7`C4WITf=_xRkC9o!acg6?yUiVZTo_}q55aZwSWUbV{!^`Q?*eH_RMop{a1j34Ji zfB!|TLYivJskJ-p_95g`#(wE%H~RMhj}?C?jdxqmXX_EJ2U?m`GJNRwym=zYefX=1NW>i(EdEkdsQMRzud=8cEO!wK#N!(tu`MOi0! zOFiEldTWd#;iTeMYWFmg-c}(d479=$K61sE+7LN7)m^pKysTH5w}ES z0+pG`-H5P!{*xTP!zoCzVSbh;?fj@vJS$(R>CHxu zqD{G~77x?wHtopQ^dY0G*nyY9zWv1O@=3l%b-UgoPm?0xL^)=hPb1`o+^5j{8T zbOm(lB`m*k1<fAY9@;nbnwYVPNy*GddSQk& z`j~O2_ebS7O03LIhjY0ZsT*I>n@xc4%$u~CXc_xDo<@qfFYDq-t3F#>r_+yH7H*$K zHc7a)xav+Q6_v|bK31%7>lZ(;A6l%f{vqhk-3pnp$chXN7Komp4d*^m;>H_`l1SEWPVfe0+4MP0qIF=*O>xEaO9RYvr3$%O zzm6bew%Z=0Sq*lA^U9vLKID47xIv3-ZS?Qd-Y|sM>3*bL`m0RNhd;!FfoQ`1!+wz<+|vP-3kdAGXwCz>=))0FAJ#(vv8BS zC-OdaeF!TDQ;k%g$#PbZ4aWlKzxyEG&@G|$s(4*kcIQiWFf zu1#-Sc#LeU+K5Gy@W$G9l5GC!CtULU!nlf?AR9b~cw@#~pCxQ=1*`G7g7@IfV%mG_ z!=`aB7I$U#rO~t5@6v878mQ~HXWZH&)wLa#x#cLTD_sq`+Q7pGubJ&%RIRnzjc0SZgx7INyw?od31_ zbkHZRn6VUep$E5=dVw_&M&X@boh3UxmIuby&7)pycc*)wqY(TF`DzjHcF1vgj`!FPrnsH~PbI0C@w?qw(ElTqAoht}qsr3MVIfr2Ab8kb zWEKC{8pK-bqQIGJy+vv^tAFE(Yr{)>6%xKrwxc8!%OdaZFldG?RQgW6$-FVxGxls| zHLms5=1ZLoDHGVUTp_nfK6QIBe!8twqT8YZ{LjG2*0u}j=-OKs zMo;ew!4}iwLrklMoydF=GWca9PlFKiY7>`R#_t+=Jni?#CsqhVt!by>hAgL}dXIkfa0YYQ&pv*MCT}F?+^RKpl=OG%#|mgW-Z{Cmkqh4x zh?{3LeMin(m@2t^N3jH#%mc2CGBiHQ2P@ew#~h{6=}uJ8WTd&qO1*@ibkBA-*=&{) zZQ5+S8Yx;YXAXu;B&!_?;xOb>zGQ|kdGy=_nTa|EvHbk0pMEgRnv-YH;@Y{qbandb zQVRFn4enk`=aB>dN9)?dhT|=?_VlTpFOJl{ui0ld+S{EswtF3V#!8d)3+ZIIs1Xsl zF^>)w6lYw7LN3lLPlev&mr0TG|fmJrlBSjQRQBGaA4XQ2(`S z`{c#K*X{Lc6YDav(a6lM5?5x-;OB0a$cGY{@{2I($uNsIc_pi}bv-Ct3GE0Y#`*OivdJ` zlKMJ9>2jhi%SW4;puQcOA9K?WXZs%x3Fp`x?YPS;@jwC&Uf|zek(+yM{;uGyH)ZJN zoZu>I4olCQTZpJj92`Q$4?Wxet>R`O7`H*qIVVt2gLKF>m$A6F!^ zLpVKxOiE^&?S45i{kI`@hNnH&>o?wsgY%?_knK6$5)4PK}P5 z;zLh^kG4#F14DgzF3rwej{f<5HtrLO#>cJnxMa`ovmyCYqe8XwM5i+A@yS=IXKpX; z%23Oed7?;zRpL({Y&sDUGlU{d(wS=@VdA7aF`5uCp{o78Ov$AgGMv!9d+l8@R@>c* zOID}id$;mld=N1jC%D*}l$@rQP0FKUJ99K*X(E>8O0u=fQ(-Y$8%B$$vx0972Gc}R z*-3iVr4&@k(h)IBAz3?dPzS?Z)yWk><10W3qvp<71RCLk>$O6I2Ckq(xhf0#0u=(TyKQcB-9=XSCc((^H0ghXBS+$HUd*yMiD%&t4>L{+O(;bz)2>0+{lQlhh&>2}Swa_lxfVSkXi9M#PReY2r z0CH<`b?^wj_Au?SL%$TW@app1)a9}l7S0}z#iJ=V_ZEs?#pn8qIfO9ur`}BBYjmc( zp|zH%q|^QShR`Cb*e9#|Vh%(lTeGD3RzY3^2#%>`CCMuk>BBlz30GFG8z?-g9G!{h zzq>Oh8L@DkroWJYpfSM`rG0OYb>qj9B8gPH_x(yf^v8}`nkO7V(nOXtA$W{YiG!8* zSqpCQJ#)VFm}Jp|;#r)h@>|5aQBDf>y+=0{JLx_P(7g@$p|zl-B;RaXUMEa(8n&B6 znKUYb5Y<+Bgum-eovCJJ5!*lTvZ#L0(W!Om(^-w*SB3$4$s8^1Evem;&g1+Ds6z?& zPxs41VPu+yE=Iu*vpUm?|)MEz$b;-%-acxNnhsZoMtLc2QG@8sci1R+8xE+Yb z;|~2}r}P->g#>$x6h!Z@lqnc>tR!l@w_goF@eloa{Mc2p<#6`$VsT9l{vUpmP8ZbX~&NuTv;L)WA6 zgCWqSm_fsfVbUzJrL{{1HxKV=_k$=LV+T88RY@OwNzGTIuw!+2!_qABcD&q4?eLs7 zno%;D^rwzYbmnErgUvBs#s{orqGxc`Fib%Mb5 zBPs_rg4w1z)mK;b`X;8dFT?XV0)%>)qq$7$bcOry2MFssJj_ic<$S7Mg5K7JT^C45 zi-y_rTh2Ea;QXK@z;8YA!!ImKO!yhwu+hMuYT!J))JHMEz+KL%PDU!f!Vr}5P9U?= zYTD`$t9JLavO`@bT?HdPjoYMikL{uyccbKlv;l6?0@?jG=0MQR za6|K!MPj2VTo>|!KIfrH$zDgD*#?r^XNlkg3x zw@+UckA67m;cJkZa`-eFBvmJ|LP)p1X_gy%xIS_<&>`X3oh|N70zzk{Zl4>iS&+BF z&)OfjDP~XTbFHZCt4hm=hYDNct>_loHM|`& zCY*!m=u(<-kt=ou4qOj-?Cl4`(v<%elqmhQpgjP zw${ZDOGzd6%{SHFXx*R;{W=!OxLcDaJE^ttD|B;G?AVIZz!={3%7q>G(ZD6EOlKl7 z(agcP7rv*dW=tsyGAJFCY9Dm$XF!#u;-B-!U&brhkGtij#F+_NO zBg?kPYK3dXc`_hS>}JKUV&8GKZAyoUsdJ@eH_}ILUn66yr;2o(zjmlm!`^<8B{~*L zdq?oDNydbT0@|gbIxg^P9I9P%jiZ1qdgR;TDeudouMEjQp1Il1m^poB3lTI-`yL*3 zpNY=QoB2I{cwU4)kM?`~6tSTC*C}RHzCBu1abix6ek}2Gqh&yf6-WO+AO_%Zeo4j>3S%N`TL~3@LcOuo@X;r52wLJj)1_1cwg=##!=b@Xec`-Hh4gmd?QvG&9& zd;ODY8t^)Uf93rMz#~WhwUYfepMi#eQGyU)H$L!a9UOuLc0j}6z>aKTIPgLTIPhp4 z93uStdGLR=;$Um+0bsJ6WJ$AUNdD)t0|r)%wqY z1CP=H4k0@B?gwaB&TlCZ8KoF!sN)SO(x;vDTPJ!>ibN1crbKm#geUE zOpt%yG|qWh_!X}D+2~lN1#6wdg6%fi?FT9!8sI7-w0Lt|8Ruv9>)LX(6=&$amYUn% z?tN3V*LF9R%^x@8CT`o3+unM;zmJ(oNaZn5in+eV=AX;&){nS3U(1w)IOQa{%S+tT zbiE7lI4wb2;xa*yK{l_aV0xGP^Gfe&no_z9WSmv2PF zuqiDh-doW%_}W9Z6owFw`tYQp=+F)qSPJ9-`o5({y_cGD)N2)U3IQn-Xiq>_mV{=u zoo-_qnngkHv{D|5x&j^hw8o}^a*6y;|;u$t8K4QO8 z3!EM#RiCq)4!qji?;Z<^-hLu}A<8q)<|cAspV!C0wot$Z-*TKAUwrrbfEwx*MP8=k z-*}DU7#-hj<)u`Bt`MD%Ia8t=xSf3{SVE#H%v^!0H1`sb*gTYuiNjC3`}lTYVW*)= z#`xp@f`>lPkfYkPeU~(OaiH2y-wE%0^B2xy!p9! z(_*eX=$>J$CZeGg=pf*_s;ScH&<`7>k%TY8NQIZr{#Cr8cJ8q@mzMswl{=<+G1Sf1 zO7)gIB*BO^oS#&m!oz50A%<7HiWCPgTbsT;InK|sHs--*4r)`@Ll0UPnM4z@ex30} zGzZ3ZPt^7m!hTz{Bh)nC99cfq_kKAvC2DmU8wE;fHXS99yB%*!9(2V=Ec&Jx+rH9b zRrsN;9AwZqG9?>PDgAOUhil2vqd0i51!q_lyn-I|$t)AE3Yrt5XUVsU#Rxx|=9$%HLo@_GJnHZ-3)7}eM!51DunCDx@%2;Dek(oGJIP#(ARnqXH+=pZLuBkPjSVa_>z$M z$-0yuAJT0TF?78@rr>V{n@82Y8#drPT&a;{9H@U5_%LVlxj!O-&!4^ zsAV~Upr@!#Busum;l?PRQI|e+MAsrnRGRYPoiJB{M$$D+Oarkc7n-U|;f|lG8x-bN zmAJ(g$2IE7hqOEriUQt%Bx!X~x$Fd;8%1~)@+Y~%14c>bd-126S?-FsF_D(Wv7;n& zl)(x$N$FxR{vCNZPr2ll(+8ldsk4!S)vRp{bTAhbK3bS!?tvdo^7Q%|HF6p|Jj>jo zj@>a!pEN4fIjH>DX8B%6*oJV^T_u5bR=!%^dtyXy_)Psy=iZ)yP@*pzI1J*`Mk1q>Y=}CTtjtdggSuF$@ylT@1Tey(QaB z;mpbUqW6xf=DwkuJG^QYlVjqGMzf0+>FGtF>LLJ4t1ZPo5f9Bl!w=2qFK|~_dNq7V z!z3!pw#Novgbiifd{?7h6XES6b}#maj=PEJLsV!zNnvchL6$xfFg4ii>NU9rW|wmh z;GqWmjJM&mY&wMy*|@8}3jFcWla9wR=S$P0vr}m|7aYV*clf$0 z`@1R0o@v%t7lDkdPt&DSs3^+?pl4~870$Ao*o9PcRFFgeTE>u8S|A-NTLX z#BCYgTH<6?pxAD6ztTx8$SbY)7RvU(c6{b-VtNL=)M0z&XBZOEw+2Dzlf)P*cMpNSj4$8@}x+ih+N9b9zvnuRL!f>OjSAjoq);m z=(^W_@JKuoWil%Fscw;DF=t^V$f0a}apDWI!RBlWcRzu1EUma7;SXL!sz=5N0xE;q zPgRev>Dli>sqNtB7Aef555*7T$Tz(tg0M*Y&gu>FFK)xQ{3SozLg$j}9lkVq`N<#j zB`yj>d1vajVL$a_{#568eZ%=|p+o01F!a(IJ@fku@iz-bqh#Pckx8-vzQ(X0 zwG{KaI4u`)Zg&h8UC|BsfV9BBz80poelO9qgB0uRZ3oH z;=k>N)MCECP($T;=TMX#DZOfp*V30%3qGO7eF>3=4o$*OE7O_mZwFW9M)(HeiIkV% zgh4xiY2QHEq*l!%(D+=QmAWQ0`%Qn_#x8rC&YHtU`2M>?#ibd$pFEvdl)Yejbdr}} zK_%r9O@FTI-c+HDj#PQumQz>DqtrO=7@PLnZF0lAlNrl*OFqZ_?d`WK3k`RdMc0EK z{x^2#ms<-rYh4Cw-`cXsFK>dG@LV=sKPD~sus@IcP7izf0pW{tZUxVZwhEyiE?R%P zo&rsUqSOxy^pUs@GiUF!BgR%}7L}`VLoDK{W4&B8av52?Bv%$oM=6#u0v1)zX4l@> zFh0EKons&9&xp*VFx5uRU?=Qp1zPcrM|-#PdoPxtG9z)vAo`wRH{VEB?Ij)F4^duX zsVtVqHH&RA6~%kdpKo%`ez7U!I?X2L9wS1lg8P=6bPMfeJH3hXZd;#qWrz#G2c655 z4rf1H|LqS8DVwqwsvW`;w~My$w{5BX5lpE0<^!^7Efd>SbdohIXN!obj8V6a43enQ z){xOsmGw7tU+ls_S}ghzka|V+1itkmF}1V}t`pSFR&H))69nJ%5B0vANuKJXoL zeC9l`+3a=rF%Vw%#C6~{Ju-DbO8&E@<=q+D*WOzz<35=)6Lp?){RMTGf`6@=16xGq|Ct-rjOCK2l|- zlBXdP(XKw>BTi=0_D~+4*tbnlc-c=%`tu~RI|C2*vTPAtk(N(Hlx$vHx7QkSa(=ASA89PZmmMG z{^gY(D~~#jxWD8CLU$J39>xNv;cmb2x?!g8Tz^S2vnMP4(LhAQgr%%qyi%c_`qN_5 z6A=5iDyx2<=tX#}&L7)k$i-7sp9Od&@323AgQA2xQm4e32lr*xipbzB#CddG#;$y+ zE%R*3++QPO0>exYLAaP3zJX30rrsJ9G&CO`e>+loE2wt>dCf{IW)l94s;SDsp0-=A zuW!SwOC=dNWmYz`R%GsvG_8mjxEbp3EQmF|$KqtUIUW&swJ*EV-0(t=KfHFkwYJh* zl1BkYvo&?n%^?V#kz#V8d{f>ZAM=`Zkh(vo?cH&>@!DXd^WOT?Mz%vq1A8Bm{d~0G zz1*exK6tPmKV+2oM;^F@2~J08|G816q1e4F1=!C7uUiz5k{&C=}afs_7tl+P) zO8|-G56uw(a|Fy)fL}tv3Bd8#*x4aK(lvn2g8*2nhp?Z&k>mH>RR1|LTs+*s-@Iqr zfB;|}4?t|VPdWW18`nds$=}HF`(C4ejtsDBxOpHzCiH`m0andDAnl<>{u)LFe&ELW zZ_bf_Xapd50KfzwX_yn>M*u7M9?``O0-ga{da!2xMvmXlTKSuzqCJ=(ebADXTAa};tf z2gk2(fR{idfCG5+Z;9~-4C_B<3Bc!J2Pz$S{zWAKp@*G^?O!;ce}ysw_&$G1As|i` zfKCJ9qTskU9^4QB%mplGV6L(~1mymu5P!_7ass3#pdbW*1MvW`C=kHh12*7aa&bPy z()^_mf54>vk1^o@RxS?+U?e{r6ClI@JOn7Q53I;vgVg}M?jITzz+$j)gE#@Z@oSy} z)E;gC0tkQ@LEI1b|GyFAkJ(fJ|H%SSIPZ-rFfrM<*&)Ef`6U{_A^hK~<4+n@py&>m zr)&T%_JIZA0PYqbfRg%fpZROt95AE))X)GY05*W>3~&d5NE#;>J3zMr;BUY)Ku-^J z@;7q)zES;8;|?4Tfolx}IQ+5$NK7#IugUTc+5Y!({Jur~r*XfB@UgLR14pulV*^zG zu>l2h53R^wQuu&5^@oOr9Rfsm*?4}TN`YeVu(S2S}dad${WZo%}VN z5Co92|J2|B0e2ptToKrC0UAG;oeQA*0$UyMj0^nG$p4)nf6TT57&;aR*ZpPpS0y6w zPbOT4En{;8n>I!6F)x`B-!uxLOn zF<|b2z7g#IrWn6(S^udL;M@*4hIrWjWdjC5fDIa;Q9s;(|C-(i0!~wZNGBkmniJs6 z-k;n7mLqVl0BTd&@2hNqd&a}<=I;dgef#>KcK#j{$O+slfTJ_e*@6=cKuiBaHZc3c z3;5s3@%zRVxG>zGQ}3NKoWD{>IDw*ez?$&@*g)X;3~b6kJ_#4+L#6yR&=CasV-^!DryJ5he$$o^w|022@Xb)^6j=>biEf&1@& zheGUGl6nsyAA&!RUk^fS=2^sVgUzWKI z%qNkqEwV@5u_jA%)kzG<320UjMHk_Nbx5}KkvT<+y zL@pk`6}(w-P`vZ8=5MIzy89|ce|eqhps)}|e)scah1lilxIJgxn|v=qDswE(-|K4s z`&46at@C>5MsbYA{VEV(;1pYHaV zSoF7!$EsPCR#ZDLGVW65a=BKKx6N$59fTHjiPks$8a0uKa97Ucm5SRZ%FsQqsYbX$ zwTGP<`77QW)Mlb6dY4i>4nfNS>F5X}W_s}!I-u25J`Mrv;H+8+QO2HOzwWCPcNKIB0S2Uhyp zDBL+|lsyXC?G#*r1S)3H$VCYhug~B8xC*swH1&XA>LTIwV?8qFgN~40zt7EhLeL_g zCe~b4Mqa)7Ih^#5Y@GFEor?PxD2c#N;yL`dMC|(ak%1TVy%KfUbM@vd^~~V#byBhl z0mV1QliXO?69)OGX9GlYuOO8a-E#|P)7MpW-C;K&7i{$FQ%^58-H4hAr$pn=YVr{t+1p1OtH?DajdM!Ow(dwN~sASv@f6Nch={lyO=e8?_sS#=~N^c%jo zd8NR)L!D-*`wtu^QG)-ha`) z^K8rPUFURVbaLC!lT!rtXK$Ul+$Bw-N6?zgBqnJ+Kn8Hh)3B2<#DsgbLWBNMP&r(c zq5bTIM!f=b`zei@G*oaiY8`#@1s zU%y-oC*79bi7_Jn_VfgM|7jSrR=;%G_mtEA6qUAqrJ(cK4MN3iJo>bf<=X6N(eXGk zoY!mJFNomhIhtl(Q!lE42ui-sj6Nsu%VZ4>MW!02Hl@N+r4EOmq-&1lDzA6h{Pyaw zBPpha1kpfA>>1+6u~204PjHD=(Fopjphse_C0;JO(EAXv!_w7cO6Sf)XY`$t1~K6O z{J>DOZke3r(tp00EGj3;sY9Z?myEzrx<@Dq3+WB8t)3P+zwXe{D0ntv9|v_IK;fW9sbdNcT#e9dwo*# z(Wz6`Hyxic41e2qz%Q+<^)8d~F1dnfj)(vO3YBr)!wPfPn{byeu#R!J zMcf8+m(RrTsnMWLWmg+s{jBu6>(6a|eXq!_iO`)u9n1n}Tze=nY3U8std$xHR|`Y5 z)`*hD8A?h!BXHB8XCosb9cv_xxP)!tk9iUBf~~7~-+E|Q8ZF!9ebsU@V<@8iW_6WU zklo~G$cIrs5Bs^+anNmQtY$aHEG!_GOt=1Ai4RhWzT1S*#R4@q`W0^%cT<=i@`O+A z1)Y^<5c}ImwScUo>jbaqXA-r9@-Zl18$HB@@dgt_{o+c)B08ujqzMTFhpL3I@4%dE z7ca^35;Q|3K##ITgryxi=e`!%?IG#DCDC>1=7_IB$INr1%;Ta8=FO`MK)}r7f?-Z$ z*$8rS6Mo7@M|l#VcaC1mJ*HcWNKTR>$~*$&42uC*KkEn1MR zB3nTi(?S^Uo#Y__Ua?am&FTJ&0o}mRoPFHb?+nNhWl*s{#a9R>6B~*_T+iXsUrs2wJTBQd7&%HI9O#1Pdh58?cu$lHuTAQp@}gON_DKsb=j>|g*X7BT)R&)H8T=mk z2A6KZcqo6_FUCJTPJ|`hM1tdpK=)Sv_I^R!^Sj%RG}B|(ki#GwzT)w$*ba6mjqfwg zT#DL6jcs@JCj?qX@KzOiA_xTjyXV#mKLbUuXdS3!~8s~r9}6tJjGT}chA;o-L=j1FR}=@1e-5p@FV=V<$LBsz&V zGST^8NOU4&rbc%b2UjdU)~Y+37lQ0*Uiw7Sd(9Djl#vo;T5yD|MEv&s)i`bX6WzJH z#!kXs_VQXhoT(S6glVQ*7d29U=s@#R$3MDvPu<3pKyO*^GM*rPg|sMn$Vqay%k%5{sa|+Ehl3A zb>a}l{Wxa8-nh!C6u#CjIj@Jq^e_c)+3KerRBR{~;SPw=KY^VhA}@ZT4LNk$KnbTS zI_ehpY_TVoUg0a=_y_l!6Da!+8RTRsN67jD%}qJ=Hxdvy&h$G*xZ2t~kJtd3xTWyz z3Q=J+Gpxd?R_eS#ISU)oZsK)jtoTVn{{VCA#~ZNF0$3vxSR?x6K|c(Hp<;Bg&Kn&H z@e9_iLt!OIM?2TAMk75H4d`@=Xol>M3Zz}Ul84@)g;*D>tGF{YdExjCP{PORR}I-U zu46kT?tUvs)GLo7NtYMlMnr}6_3k^0a*N;dq&LH9v_OrYMB>;>zxb|c}x89 z{FO&O4^Aj){WuN#S?v_lTm2}G6Hd{vvhG*3?u`y7a2DKT{Xu0v)odFhl)V=CysjEw z=1|zHSjcC7!8w0hwB2~pLg_`s$)#n?mHm7h{W`~4d;@=S%h`lMCt}Y=Gu|@Z6_y4w zm6RW(Fk5Fnj`CiAl$)a|v>(PH&ymSnfq_MQmaia3qy7auN$jP82YY!BR=ILnvi(4e*nN;crs zmLH+BR4-%~=;CK$rI&u;L5fGRqi@|OU8sC9TA)iG7Q#FuvqTYPl90E_jOvjwB)OPF zcmvM+tbj~ddc8ZShbhW$aFO_{XyC7GG2dxzyF}?c^|jzMpXo(k=z>)9%EmBL%kNFN#gwp!1mZ zEcU7oY_sZqG9^&j-Q!CFiQd{rg<{S}p_cpUDlQ!uywCx!E&CU5fE8EOzcGHgwG~Oq zG7GlIP2Kx>Ss!9anW?%(43C1Mq;)0DDqu(EQu2C9$nf+N_?@{$pVwQBA2N$zFFw9Z zOl&?!DqOXRpK@3WU!BFFyJ9H)4Nj{`ZJ+K-u+Gxv&)JK6hGZ`*5lv5^vZ1QG8qX(bf^cQfr<}=1V?jxn$nJ73WlQ^50K1EmKzikE zG(i^|*MN+nv#QJ9k<5F&oR;CRleFU)52ajqr;6bvCpZ={j3%08uev-|Gvpuz_;;3l zouP?nd@J%y!VEu%%y_RbBxZ~fK8PJJD^OfhILDZJGuW_ae$m>Wm+9%2?fNt_U|yn} zm{3V0SFxn0_lD|S$|~NM(YvQ|@)sLf>lsyQC+!xFr)NqUJR;8|JZCG>&6)AM9XqcR zohzO(4;==TofhuOR;TZs3bFc z95lH4ZYeI9r$3q(AJo}1g$Hp`Nz|`wakJH4|0xlp9@{ib!0nsznrs`&t-o)EPRpl# zd^l{3FgSTGM$b9?oWoh=xsyuYOx^j?uIvVL3je2{h3!LhFJASbRDCsQ8cCiJpA<~+ z-J!XF7Z+PxB?Z0S(Ny5lYVQdPI>z^2(lT(tYY@z>y!~J^Lk4AC%FOIs_`;5*{(Dd( z=DZTpQMOFf2|XQx(oD9p-IHN8Zv7PYJaaZ;cHv)6xd{$iz zQWS(u*mBQ?Yz5Zn8^4=V&vPC|==uFY1!C%f7uYEW1F&(+&048fTha=67cah!w|fLy zW$-J|ejdgtR-X7wmx&opaj7T<>qS9Hq@`b4b%+uX zBO5hwDg9Vti&>_>Gar;iZocju@(_8H`O-GuPgs^SpM7sYwy7YH858$V_z@fGa?s|NX1GOE4yU0=BJJqQltv9b%_z0^bW zY*)>a{`^fMrT5zatWYVmhQ{DiUKTMD7D83mBlqiXH9q-8by7}g+KX=rQG&h{R4WO~ zQ7Y&W7|zf*bQNn?${K!q$~hT`%#lt!h$>-vDo03ElLDED(hayBkycFK--$ukHp7sC z_NR1Q2-BDi7oTTii+D66ESP1M705=YgDB{Gce01`to?%Q&cL8UW^wbSQ2$Qx=EjCX z1sMZ+zieBcp8*38Zrg9^=rxYu;`1hps57lTl2gF<5 zZl;0XGt2B%JXy0NaXb8uTz6`!W)EDQ98r3@dqvPtdH+E6^{2}hCBXkEu(ou5BC5KR z9&LZLM1T3ice?Qo5JV8mA=<jR~kqX0b<_2`Z%%u2g#KkNPPlt>nULV(VbS3Nhvc@`ugXffyIx2|`uqvq{8h2_uc`Cz7F)Cavq&45KRgdLbU&f~<$;)kvpI{4 zgDtfj5cgu116r&7m-+MuLMQk03CLaqCODAz17vkTfPgtb9_9c6k2rtzUH$F#^@nu^ z{<|4=ufMc00kpqc+j!~il=fGimh59q!(9sp(j&rFQ}k16E2J%FUP zFg7)3HnlQ02AJhm=H{;dWxhO!i~V==%z^$7Scvt{=2OJz`z*7*L zITzRh@?SpggDi*tRTvP6j{|LhA2#9xh|o<5ZRhXa6xbOtJd5w72<(KqiT63`B!gZo zUpXbhE{HGkDe|bPL1*r;Lxc?mWwGbXG&dyEe&zIN-|n21IHG2dzH%A>3`H zSgOMwT0>c;VUdlT zGR;QuJj>GT*hC9uS=oLG`#r%|50*D^ZNR5ae6>I(LLD}Z3VHBto2cCm=w-2##8J`g zfCQ_G^H%{o?uMb+U91Bmm!BhWY;%~$k%odoz8APWyF9u6FJ8}RG!b+h@B2lB2d!#vcxPcUtEE;Lg3fIytNXm094kt06W>PVru`5#hRjWlCo2 zsaMSji(N$t*UU}l-S(l0Iqv+hzW38dDz8<{h#`40o{fG4^Q+Ug z*lb2P9--7iuOH&L6l4>dR(?!&$nqWZ0AGS>8mw7P?Xsa$7%o7LEDI8lo1cF~&-qMd zCbdcIZEW0_XtpGIAOCCQjd*LGJ_G zcM`dj_td|e=LH6seAbuXT5!U1h3B^7(GvUMA;FYof?QQmU_m$c`?ZvJuY>)N^emEx zvK;Yn3(`#jc%~6vN$Oak2y1E`TunbxfeC2R|LlIC7yf(`_OPdLP24^&-StwO2ojdJ zi0wq|zOU;yq#&CxYS8w4sQVUMtb>L|8znW zE3PcDsifD&32*T7S1k%;O-J1GK$RCnPeey%85Xchc@beY*a}wM#Kjnq@2Y$Wqq7JV~aLc4XwN zM84EzFI=QC-o_egFq}@`lf`eltUmc<9XrifmnmmXfe#kg48=`jXPAS(VWwLJAkcf@R-T{>H; z<;QxqZzbkciXf)();^m;gq?UTQU@EmLHLfOiR!tUTwbO^FS;P~DKYsh4V;wJ14jh1 zp$@TzwgP*u1vk|n%x>i@3L<9#sqn_<0VNW87MK?i7-9|1aL?5Gxt!98!ld7hyt6Q} z;KjqjL;0M4iSsr2c{VmpANx-sw*Vb33Xfj>Rnd?X)~M-unovl;6BA|#{_2|JU_@^m zNP)WEjKbh`x#TBOC-VN@i{cm%dWT5bVh~hNjm1!r-H_ZX?rQUZnX(9a#AF9~%EDQq zo&0XiDsunt88t9=%N--nGD>@1o2xLX6PDyh7E``lYYUwYvCyeH_WOuT{M_2P|1ss# z=W(h^nu-Wq53_AI`k_-JQ~$&aeF5s?t9T>-3h7PhNhX|(;j8D~i$WwqQw1BOWYN^- zs2rzRJdPN%&!YQs>2B!f;xHlxNEN3+FY78JZ-lo^2#4VMC5mDQGP5tAWpzsARYAQE zuCT|VB%d%YZS#W#XI)Z7lgm<&>SF~MO&)w( zndHTA#1#`0Z`>f)1B%v|+3%hW=32v=jzrnryK{7ILzhkF#kQrWuGM5%K{0t0VQ`II zJ+STQ7B;GiZHmnUEFAcwPLC(<7A#!so=6ou%>-SHLKAv`K9f>=ka~o~P2%LfjkR*) z&qXx2lzDm{4im^l9EHeFT0iKif#(;JFA*ua!E<0%xiTpFc}EBC8BQQx!fR<78w~>u z#VMU8`5#r(Dnnc(DTq$2ZMLv_k}-DdkG8IaF_?K@De_G#uWSZ2k92jN2Hu2Xq(PTS zQXJ(&bLhg^xy|E>Ew5wwpu2NgWZH-2W&Ozvn!1pkx6%|fIBuFWmks4+R>nngx!MgHqdRW2lwji6S!sJD2hJ-uD> zaD8gk#qAcWXJ?GuUbdgBiTjw>Y8%-cw=1*h@u@dr363`M2iRz9B1?!wz=e|$;IEfP z!W;(#dUU7bkI=M9X|3V{a?mgp3KUwHUK)Pp|TMk%Cfu26ujx97P1wR^KYr8@)mLh+>Z|Y}3Q$yXo3wE9U|J>8KtY zH-wkT5$+~68Owq5G_pCTU@zc9A4zs{{|s{2eC!83*(N9(+z1uE4!4FHx?M|~STEgm zGDM#9F`utpp>VJ2D=D^#s|;cbr(G6R-O&n9?MGI|6~*1AEJp`)d&+B~3(MSN_XrwG zcP5ENIUe=OF?o_1i=S$Xw~!8TtGLwf5tge%oLbD`k26fFWK*<=^DECAsii-A zc3Y3T=U_<%4HRVzyE~{er|-y%_+u_z=+PNbKu<1TV~AX095xLu7QC!{tnDP9qG*6~ zT@VhH+@{d7=B8os=|J<%btY(ohCx}^rNYP1a6G) zdWlNmyUqip)FQW$H2L4D?CyqUkK!fe> zBYCmQUPdm0I$zV^OGsBb6<^Q02jRfCAvd+6YQK|`ORt?TIrXe?|E#-oRRpGD6Ai;l zBCb|z{gSS-o-+`Aqw0iN6!$|`@pF12HCS`%f-JOu!X0bnXvE-gkRXiHK%KQ*TYJq% zWSL}I-zJi0Lti&``OaR|_i8u4xItKF5L=~FZzdzeuBkcejkm)3ooB?(kK>7S?S}KsZg}{L=p0KhPd7go zU6SvN=`w{3JSP)SCng`gj2{Yft^bK>^O#wCj#cGq=)Hw^YO$=9mpq<@0TX+hPKV)l zN*hdVzBQD028&nv$$dleo{Qzz*NgSX1@=~zLEY|@^jd&&4-cJiN?ChzMHtW5K*Y> zO4oNniuSl@*17a9zP@4=BIEoLoX24v8*#W^Gdn9J8p+LUvI_d%_Cq;4TouGL2X}In z6T!iH7)FsE;4qA3hbD)agdRvOcra(~x%Usvx%%uR{pwS;txB z*u%&jgCzGSA0tX75h^)_pch4-5b>gAmtJZZmRBDOOs0Hk$)k!ZRT-3a+cfY5n8G5Y zmn<3!JrlHkI*y<|)bI^wLvQR$@1{RB z;(pRXrSf+}`DWQ>4IaC1^Z|`P6UjW$Pf!TmhNox5EJ? z0#X6@PNyAtM<*{zC|LyWT*rfD@eXxt$K4Wd7L!U^G_WvhO3@B@Ye^Km2K_pH z0)yN>*Ny!M$0}w9wU0m3o2jOY-5U#hS0V$+C%m;C<(}QIcPNrlpI_5FZLV`4f0>QD zxhqgDbeEaH2OPY>?Y>=kex^lix;Oj9% zHBDM*>_K;U@}CVIZ|q_bLz!R^q#KtX`vJ$Epbvqfl1$(CC)QR9TI61OF?ty0+B$x* zk%l386~F(zPOnN)U-!b+mljo3aJXfMLMwvOBdh*Xe=C2xZZvBXldTn@-J6dADq0_Y zejhW_!}-P{ISJ-t%x_z=*iTy|9yEGg^#Xs;hrH>LmbYER-DZa${glXyx9Eo>UQiVRj+k|dZ@Kz#m3`sp#(y5vTL6nsA&+*SAw1IH5kHAG+tz5lAazAwpR13FyZSJwhe zn*S`j{xi$!KYgy|>=qmr<|b@Fg(kouvH#!dl*W|ar)3~Lu1;g8|%DSyzz4-1fju#X??n3En%T+!}d%rP#&U|;v+R~oO z&wm_ys7o87qr(b#VuzHE;0>eVDn1`aDS9jBxW6oE%RS4{{sAe>?ZKffVn1>BgYo$pie(fVIVUannK(Ole5!bHe@J=K}{mNmJEk;}+72;`7O@wOESFQOnwkCyRo(bcakDthI4bYi<2;<7j>rqU{$Pd6 zG2o-eY2D1k;M^UJk&>!M%F?C~(eAa?hWX^d<)1+Um<(@guY0bAm-gF!?!|U1S6&!) z%U|QoHqfMsY;thD5>w6G3i;`i6!mA*pnIy2SGhr@%M;2!z$ zlD+@@_4C@BF28Z{G^;Y&jkRyxoXr_}xDi-^``=c(z`WsTm7!vq*gc_oF35c&Smd7( zQgC6&XQ*d5ts~)4%N+YcjhEs`EMX{{h(fcAMZlQFKk|4w_=___X`Q^#P597Kke;#& zkXpu8nw7zJ6|Zd2Aosg0;R~%E6YhF-oJS6OTwn?M`3p$;V7%owWE)P5r~#kZQYOlw zm69dmDn3sj5y=+bAk)^8&l1JobFS{yOutBgNs$Hbq4ZOU=vYi0zgP(Nb`tz{!yBn! zjiwjZzp?r}=Um@*3=xrWn(^j)f60xCMXCtv5o&PPYX!CgU+B$JXwHl%pP!uE$=gpq z&6cG3a1U}kbHpgGFmqCPKvQsv0BlroW|RI_y9>fHDb%N1^REUxn_YqMX`V4G_r2=FrZ3`Sazs*jxrWtW-4buz zqvQFSk$qC2C@VILzzx1PY-OW>A~xeSls*0zpAW`rxJF!@NL4+huc2B|DZDu6JI!|s zR^mlDWUo9w1dBz-hp6HN3$myD)N8QzAX%rA>h+}KW*3Ywec3(a8mXDn%^u4wLO&)q zbo2%yYXOEGbpVIIRSdZu(zu&3iueqQ_-vlxCXytm_)_IW^7UuSmwMBWwulzZeYAVH zl>Jh*3c8QX-m9i;f^w~I(PTvq9EN^U@t4vljQ`Lv#N9p_Z{tF_dQP;fipDWf^o3}_ zMu+V=y0*>8$tD+HyT5`w%>_RH%W)P7Wc0^0;3)MluW~^&>DNZ8 zu+tLtHQPWxv8o=qA#f!?h=6G6|9@@J*gla6VW2gwIMv-Hk|=;R%# z*n^H({I^A3xV-spYn~ft+-)|ZlgxH7ZaELqy7>9V#_>YGct7vP%$)EU_aHUwlrDt{ z5rVw9Ic^Y(ST&1x=)*SB+K)*Pp1SCd%{7{w3cjq z#1MLCzp|ScsYn69kkF%rQA)i@x+aBu8OYQatcw2!Lr3Jvv-E8i}gXKot_la zX0(`k9GSd>9;T23Ns@E4qFy(1YoTb)8l+}f(3LkKJPwwBv4+9@#5^to(i zH(SVr>&|nS7TSr5_QA_o=I`(9n4wgzBZ@+X$(ngDPL65xPbPUfJr6ZKXe-}zGHBaM!MLGZEqf)tf zE+^So_xbeeZp{^MXt_XfVu}mRu8SB{!cDRvyGIQCu;KPl&C4!JBRy#zCyfyW%pa7? z30@NuiA`w9D`L*6x00E>(+S3_I9D7qQIn%wPXk3xan#Q{^BW(ae|=BJ1gWm)d@ z#Yt~ecKDb3rHD9=d?FTz>oCqmwsGXg80x{%bSBp!$inUrM;UI)?ty*O{5&GYA!RwW z8L`n%@zSfe80U1G88v@3+;sZ2B`17EoIGt>XiIdI9yS80%Dw{w0nCD|FbndV$KCN3 zK9Kkp3LLSQ<%|Liq0vz`^a9M>ZfZP!;IfZ+2?nTey>#0Fj)4WVJw77)LA?FErkni1 zc6G9e&z#K-jXzmf3P(fO=gst&Nj{Ka+qCQk+T(2eFisU*e!ZepOi5Gi6)Yp)uLP?% zrTg6kO&0!R#mvWyiB6tumhC+Ck8dU4aAPLPy26baOTlkbjJHhQ)rZ@8Rm{y;(26f5IS7=`Ojh@AcjRN}liLO>G`(tOGvg(q zij=(&2xeevK<{3(9fNZh`@hJ0tLR9#EJ;($%uFFE#LUdh%n+gwGcz+YvlLrsRFs0g&OCQBkEP? z$&S-D&@zvMo;QCz#FT69EW22FJ{bh1uVzpuy5^N!Jw~@!{cV)?E#eiE(!|Hdppo+s z-pJT4zt<8T5`?wO5Ty>kIG7gEUEg*8Zl~^75L*?HD|#4i_v_o;H%(rR`xwuveBnN} zOC>D=A#4)a`9<&gyXC=;4o8Qim9nCZj@#P~jqguIEM6W8I2{Y((-#V&UwP&WUf#5q z@WH5wouRHc@xE{BN_O%YNlO`q|7=cabgzh{(bE^&3hJAgJMiG=UvZGB`~~kL5rSY5 z?CW;)a+i^Rh=vbVbFhRe=X|aj?N>f$5y|A#IHxM9S7GD^-zlm|SVNw828>(0Fm|6S zrKpAzF@*Q7c>3J2(d5;|#m)Is7)w;h7MQGX#-cb}NNPhn&mBh+ijhK z{q%SF>Oh0b`N8}f8C}+LnhFCA?RqLNa`g1FLMg3&3-jVr-V@m$798KNa3S28(l^lI zyx_B?8G)gIY#*F@Yfv}zl{b0Hm|m)FH_E%>f5y(lcdfLtIVz?;NLx@?gsw6<_vTjT z+d$Tyy@-+RpX7~rK&+N3Yu$Jp^_|s7y3-9r2-~Q7D7Tn%rm9Pt*Y8`NZ13H#J(1WqCQr^VAU&b$cjF$zmUoX3$vKT2F|`jy~g{bn6WgmG4oc%*da5 zaH9uuFpQ)u#U;J#F&&v6N9UCW0^!a~HIow9PNYVk6~Spnu6t>2!UPVJ=g{h1Xw#UE zgqjd^^Ap^fY6qOziMamC6wQo%7514`oZK6Jcolx`zUOT0+W;oSE(g)I^LRCFEl|>- z!m{!8ubwJ6E4pwRRx1z0(?}9O9O=8^bEEjZuhf|zcNN03AXmMB?m#lHYpI%{R-t0e zy$aO~fh5TQ;q6exAK37M7fLspdQhsfo#h~H6cAzgm2UIH9(Z!@qzS8WD3a9hN6XC( z36)g*&+1}$V7=n~wX+m0i*+vYK21F|@|9_WALp#%?i0wJi~NBYz=r+?wCSncLv4GC71`gE)7u&MJAfI&$*jxT%y{;ai1CTnYcD22IOiD&la^5! zD)J=n2e0TVaq$@1^q`CHVSPKF%2Z);xg!X187;1!n+EIp??M>hxc2Ia=t~Fd?s1kZ zXipf?v$u!PY}~irF*@0rA7ElR(5K8O75hM<%$-Rsv?vtZXTPn|e$}mCbIK1gs`r)P zJ8ZxVuHp#8OulcW)Z{Zc-PPz}b0q^lvAn}j34_9GPz%pm@tZzb)ga+ny4AqF zN58){_iRFcb8DV}2-gDf9BlrwrlQxzc7JafZx*Xa4vi~?^|>HobE-!#;5U4=tfKqj zGC$P3SmI-LCh0sl*P^ahI_GvJTS;-(8C+Ab;O4oSRJXBku6IUE2k9~BrgFEupD+M4 zufH-8o!@z=1GgOBeW0~lr>Yj&d)3tR_-$96f{iY)L%hE8<8daN(Kjusrg%~aOSy=| z%#LAvgZ7<+ZD5acWO+f}p5a&8hY(8;uW<8JlbaQBQ*`;?S|7^$~5I*Zuu| z2E4kf{XAxH&6IXTY8QQCIm@d-9M$|Zb_K-AZd|NqIm%xP6eN3sv`Xv*d zLQ1xuXP~Ki`L}BXCy3#QRBy>j6EJJVH>;&S{uw&hI+}qVIVC-Whx5Ca0S@T%2^i)` z2ILWclgp~7rP0&#hc^m)uO@RY;R~gUiV`na`m5{FG2@Dg7B{m3+=33 z!PlrXGP>973FNyb=`FJZ21PpBrXCzdT->*ukS}K$l+$XS!HZ|V5?RaEOoYHwny=N* zVzsdEunTUz?DfrABgi_>xg0RtHaY|6sZN&k9i{=5~&BCQjc? z988?8>1-X$=tU(Jl<5Iq)3P%${)4jgF9aX<=FpWIGEnV z&B?^Z(cISNFR6YGVOwiELnm`Uf?ZTe7;t)j4PgUNHMBB}Ow9jqmVcLw{LcnK0fBx1 z)DJ+w`a7ML34lRn2S~Jk&9DD2>a_n$!|><1QGaO4oNNq$)I9*w2$*325D&nPy9{y$f{{fTXZ|C0G<`SaEeGk{{n1X#HNfHwca9tR-%0ORuqAD$KPNC0@- z0FW>{^MBci+BsWU(Q~l;!*T_HGxl%GI{%US&dR{X{_oXy%~(862cJuQ#n>kQd4dq^1XXn7H9;}3_1>LJ zM1)O;t5E)rkE=~Ya{EW8xA4#lBHz#FL*dUc{m-|nZ8NU7XI}zio@6__$=U51UyrBz z?c7N|;^#nDvJ1-OsM$Vs3r!5rbqN@XekE=h?p>!8KWT~K-mwUK*5MR;P>@!+zf zErOI=NQz>&4T=ta-2nk_266%FM=zOxW$zW!cF?Q0iE&ex;wH)#uFXg526CerazA}@ z*}91s=^X~2ZeUIyu@P^7%+XP#;DZ`0QiaHu=v|T^F2)QF@M23}q$+$S)%72$Q>dAM z0zt)%3BNI2%KB!C;0|nspa4N;t;g;oyBGPkg1{pND(12pZ$lh2*eU}%2i(ge0Kann zy;O*;t^gjQD=X@EPb!^|XTvT1t;tAlt+r+VL1NU?kEAn@pU5yiPb2n_8?|)gsTdS8 zP2dl8U>lRT%g`D90m%&-I(gpQ3&L=9q}|5b1GN=NZ2cd-VBc9>#$o+Jt*jz!Ah!@O za3YZU))9Dxm>lXdu_vFbBBiAX6LgIuI2Fbc1k!6Ai zSr50;LZdWDOcpqjD}}Gt5!92lK*C}Wcry&-u(ub)HE1y174_M8uK~@k7Pe#X6rpVw zi|H>6Azd+JtI!^khNR`lF%EFYEilB_G7>QQcWm$w-XfQjsvw0L?dX2 zOu`FKYQ3e*esw$s`h?sI9E3v}6p73|p3UEX(q_`@>?g>li7cJhw_~un%)xEbwga5sz2{*^?j*S)0W%n?v~<#p!QqfG(qvlJx!;AseE z%q)|m8l)j8f#eaeA`moq`GKsDtuGInz_&|%H-b6+1eF?)q= zPKFW~7@CQEzMz-}St2zpIXH_PoDT;Ywj)8ag4`UtE)W7lMghy-DO@PFbzKOP#v#Yl z!)qso2Ex5ZXV|Yfv{JH2czu0yvdyn_O~yj=X&)zaMN7u7ZGs0;xtq3omnG(voU~mp z16plvqtHbjKjP_ZL*wwU!P_g)0V5=0e2$D>T$8&W)sUkRt9D`A!dE!Xn9Z4V{yL=o7L6xeEEo)sHSz z=3V7-8GNyy2zZKVlEXyugg(zT{BQfig#0`o*S4Rpp_^TA$DbcAPwo1j@0W=D?@n$n zPhONZ7iHp8rM_N1b_;fX2hd%>Yu_kUf7Vca`2dG-j@j~xi>?b77QVDEVn#^b;#v_B z?;D+j$`T$fJ%gyqfjx30UdE0pf)#$XAzB(rm#MNFO+ur!Ln_tiNdkfwRj)~E3)Vhl8P{$%dgKSLbvm^nQ)a-*g(Cv_ zquA}<=y(4D5ITY0XC)yjV)-p7dt&2#5p~l3aD0+`$uD#=T2?cem0L}-PF1$yJFSEN7x@*`a6#h`XVm4ax;kd-6Y zhG9pN5)POB1)}ORTUvoYYArAeMeSFy#M@T5s3K}SQ1(r-IgOc7|M%A;*!i4j1Rfq~ zNc0(lAh9e)`@Pm&J_J7<64S#;23(kFEt7-UD3By%R=p>IJRWXe^ZjZpnSDnpa?M_^ z@DlEWsvX_g^d_5jw!CE_yzxHoxCDkhAylp zA%&~Jt`AOReq3il+5PyDjx+HA=UM(Q7{mFlbg)Vc3-XaxynxB z7&acYmIfUn`)G>C(+Gg>9HVCoC=9^K*Z^w0FFlO zi1l_Wt)SK)sQmS@%-JC;IuWn75l4{9tPB(<5u!T{nPnkg4Z)wDGIX$Yh^TFZw@K*c z8-Cg^3mJCHBBW^9of!3nBB?!}AS^)j;44jP`oyMeALT1u&+YPd9Ur?0=4h(%r6R5g zVsn7hhgx!cA<(E_sRa9?Sal>*m0Ogh;BU3mKC%lYLkpaE_u_@+f~sv!q9OVUO+|D= z-KKfTim}RC&wi%mQEcJ)w__CbbfJv72#!AX}^pERrDhEq#A3N}n1^1>x+P=)tTghn&q+9E{p5-Fk;eD3QTKdt{ zWXmGGhvn%r9Ioz8Wz-pihOV-#=Z7d&28|KXIw%+{p_x}vw4>qIQWhsr?@L_ZVB*BB z29}fV(~Y5%ieuLPzc|nnH)|(_LIP?4M+DlC#Xl#>F1{Phcmtn3qZWH4n>BL=N1-(v z?0TN4SNG~MbDd1GRWnp;y}{w z%?;Lk2P4I%Szc%Ptxadp0{AZC=%>%f;>__*d$4W|1uMebpjhzlw(*5PO>a-11}A}r zzK3BY=hb=dujss*yZ8Hz=4@ya?N{X+w!Bg18^OMb4Td7P3T@7XcQDnf0k=AmqLOtd z^485#q^+{f_X#W*U6A@u4g%RWw-1%{8!Xn#=D<;O>aX~h$1lQ(nWjT|J>=w5w)KJ2 zGcx587qn6ClaRANEsxv2Wbv;}40NwnX@2qcg$qoAoCOaID7`gP-v3-ceQbZguff7n z#m2A79o4izcT6SKE20u+aJ#OJ={xZ2z&j6urt}kohRDA>bbHAIE}2VgKRYein-so% z|1q6GV}!c3H0j4)47P)io6bEaDR;Zf}#0hy?IW7 zZF?EcVJ_33ZEBq>%HE+`5kD|~ltG1Ap9Wb6H}7@dyqFMXg~!!|d}BtR9m5TZ5<*24NWd(lmUOgfx~wv5BYAlkW4Wxr1 zr0j=_(bM;+0FCdLgmj()vo3ZImjEq!N-l1R-PqwBrPtBf!S<=41TQ`?NtJ)D;AdHX zzdpLes<*7dF*OsVf^*4wHAY8EJb$x58mn9Gdfh^SwO-u$_GmqJxtg-sOxta%y?LubwXC2vsHh8oUoj$_O`%jBmHS81_N z+3&IprTmmUjR|yh$T`j9)9DP}GSJvu*Tdq48^03a`IlhN%i)s^672W+=!#!Y`paFj z=!%*;u=iB2XgE>jXxTb=%j06NRtJ0`<_?P&JWaqp&Ltsor?^}`vCS8?&JK<2@v^+j z3hka3Yum{J*sV;K9^$+H`XYG)azexSld)_BNq!SF$rpY#J_*E~%`Bgnm4~;|kA+}2Lu9|;F^jBP z(?W*Eo_hSiq@7zQZzIj`Ud`q_4MOmcZ42CTDOsbA9(TS!cEBekom%BR9ZAhTk5fu% zJA2Z3v3DMki!e|+ww7&5E8`#tk}7lN-l0c!K80lTlKL(3fTf!m^OWyZH3=mca64@J zx9@o+Nec+~qXRd)c5F+4o==88>G9ff2Fnm1LL@da5@$g9TO?R!ZFYWH#K$GE*szlv zyoq}1bWTv?~waS|7o9gUHTz? zhje%2p*w)$#(dZ&>>H06hKY+<5jWH!fC-(u|2F3C@4(BQrkm-6#S6krpdK-t!p|q&!;+e;rRC31pXzxiD~ukKy*1h_2Gd?lxU?hb|;{9`5I`cp0`7DjTQOu^~y1oj1*w z9^IzEsl4VCmJ-VwWew#Saqmr<0ddFJ(RSO9{)Xb#&2@+k+5BHJ^w2 zb3!oQe{(FO*I?{e8qXh=JWT6#WK=S(zV6)3A9`(8f9)()yV_}YN3g|h>C(ACZpFIv zwvzCKJ)Pa~K$Aj%#n3Fl!#EjDl9l4)%9t^HJ2WH`ISntZWXI9oX%*_7nlb#*+%j{} z&s~6hD}!E+duz-f8=}3OVB(Nkrb_^quG|Ct%vi#vgdwIm#`BdfGR%BWJ?fycDJDR4=eBHfT0h(B+ zVMCx?`dq&X>ADtq(Ik08_;_{Bo{6}L^TyI_^o{fHXl6@Llj3Q}V=BJx>@hOL6ngB3Q-EmWG^HQ3A}3;uSMdopN|F0?<<|K5pzjImmZ^J zpI0@%)N=qD4e7l|xb$kyk_PHWAjg*6=J!GwMoNH&#KV>6YwvWHR-(IruXAxyW1Oz9u zk6k8jDeelyeHUj0OAX=Ayu1`xW&D^fxNmRgH^g%$^*oE*ft>mMJfJv_lhH<$+0*OZ znRI#?!niHJ*5TMiN}1kiMS2LoZ=P1VUsp&_I7^dMU5wC6J_>y@FRwi}Sm3~V?n*S2 zAfzRz-3i;3ggcF}++bQm9d@`S1*KVS%H^&guNajcoAGSyT7kwav>i;}xUf&8oL5OU z=mQ}dK{v2Bc0Xgtz>ThDh=S~*Lz?P!KhPDeG6C1TrUD0$rSyHU<{e`)(8 zA+qv(^zFyp1pb8oN--RU%Icd6;Z01!tsN>{wfD>E0rO=#-=^2gD}MMF+9%2#;dX+R zd(u(^CKk7gFkx|fGNk~o!x$@P9t8Z@+zTWEk`h`16gaRcbxzl%kY)H;l7Ow5ji@bd zsT3t4?+2DIvRCa)GcbhL&apK?^szM{FHh`@J_7AxUZX5IMqN236wsvNlE@U9Sb511I8s2q&wflZ(8EX|22G6&1S=LO1JE6j2D?ou2V4(uUxkY;viTT)5R zkz4+aDua`DNKDrV6v}a+XpSIrH2a(b>`D6VA%27*2-T)qg#wK8m+D50qha2rRWzqe z!t4*dcOJHl>qMw)CfNS2(j3LHvNkJKy%xb)em)Hw22K1KGCUJ?UreM1&fkjY4b)c% zI;O`XdmXAGS4kyG;`pn*Ut(ZSvCfa*b3dN<5p%sCK0YdPKW_J3bGtq+4}rgkrzUH7s@T5_QrbYV4>)F8+Ar}TGRnlELF8c0o z6y!XGKT1Tr@iI^}&WG${d5~PTZzNJ_Lnf+sR5@A^nfxpwj&(>(z+9A0W~3ucXW8>j zlnczHZlHouPLsU9JfT2BJ@dY~`uEJ2pH591ejnFp7uWYEaAx9kIqnWd>;C793E1llY-tjh4n|_m{vCJ6k7}Gj^%$j*QX23!_bn_@bk%BnWzo2 z-jbIaU)rbx1KkC=&$E92!f*MWk*Zi?m4-weF)A%E{W|9v>(ets+j-YTqcVWCv0<8kc8rTkEY$&>dp>xsM&eiaYyF2A?_I zcaz$5z(^fT@$oHj_kxsTo4IKq_pZS5wN4b=vH8(Nb9?THMktUUKfIR~l!<2F}vR z8wE%lVI7-?7J#Rxqc$Gu7geZd%}OE4S1Np72J^}@NLLKI5iz{hwMf>r;!G{gZJK8# ze-A>1&A`B7_EhQhPo6j+aO!ou&)j&jgUSEK2|Ru(a>cFo#I+cg*91jbc&)pbXwZV) zvBZ%vnudp4Ztzw`pS*~E@2i^@d1f56?k*uz3chg!O@^Xy@Hw!W)X1OD#E z;2D=Phw{+L3f9e+r$OHRQ|6-=<)J?@_oQs*!?$0;_}l%wwpWQdBPI+jzp>Abia`D%E zO9i1Xa0_#iRnQ3qtTi=rGf%%t`YH#w@0n0ix%opTe|+FW%~m*aY@Z$w|f)>p{HRJ+b@KU7}mPHDm<=F(j4C9|EK z4v7{V()wps=OfA2Nyv+4rZ0N!)iYE6A@>cB12fQ&tHgmKsl!$qbu*4Ofqn(C8lxrEEIBv0OC zTt8F+^BDri3Wr^%PDDrtqWF8wQ*RjptFP7b71*%N$%U#d=c!dw}jUm$OgZkHN+M*teVhx;A){NqlxQR|W|pmHtpgW02ED+k&_ZQ`}{63j5>zIts&5CHm^x2#%>n*&br`6zhtU^bF)fT!{0 zEnX1z_bJ1rtf^kW3AE=7nW^JBYcCxe!eQ`8)Tkdx^^-7WPv zg&Ka~1>>h5;t!V1)2rONYOs0N)t~YXTs>)bHF}+_*#=79Y8GmEIIAKs-lPzGuqIH* zmDqp&zVbW#5f!av$-~T1mAP(mG@5-ZW#s+XJSM0tUG#GWvD!9C&Y0Y0UHWVB z##x}ccgK1>XmGNoN+oqhs6vWivRKpa4{Ej|0+J4|R0yCL5=%9qD1VcYJe3xp`SZs5{ua1ZOsUr zk90eo-waDNtK|tgwrSNCzK)Z6E8C9aps&uT={p+w^f|$quCdI&1=VrVAOos4W#*9v-1@hq-IjH@8GqaiRlY%rmJli?EzUJxeLAnXB5*9h$11?;-=RK0;$U@eQy#>QN-WM>~^6`(B<-ATvp2g|v zi)J=NsvQ6Ntq4JGB`r1?mE?+BDwZyh))?ub%Le|{_YUUx?cDy-t!bU`-HKG%?{6RU zZO>P+g8rY7J?=@t|3oom{qyP2{}z&GVPs_hFyQ|i^8Am8JPRX$g8r|NnEnjD;y*^7 z8#+6Ew{l(n2|C`3m4v^#+|I*z0Uzh6sC$b!^ z3!umrP<8+BvGIR0$j!{g1|Xob|AVT{`sdA!zu{&8NO=xGIWa)D1RNZoJeu*ZOnD9_ z4#t1UJpP}1VE??2@;9Lu@Pq<31sMLF(96ic_(!_~pr-d<@nZWYBSrtum0rNO|J$4B zKT>-CyP{v-u^3WzhsTcyE)RIPP&hF#NdctkSo3VJTGpPIHjNq#wxXY%dY~U(;(LWm z6;y?zmE$MJIo6WQCvs{gao0ZaaFFz$J}@`xVjOSR&3}+)!rMxBKlcqej=BMOmHbaY zy1nc5O_>J}c)xJsLFWkqy1rWEUw?OaoHDbOunS}4q*+ev`UMVWXXo#o(%m5LeZJqX zjC2NWWq=CeV8>}B#U9ubHmO`vPYC8M5v=p* zwAO2d1q+uV)&cGi5hrt8gUcd87uj=JI$9pwGKZ`*61c+JWx5iiBJZr1qKZp|z1DJe zVw#AHfV+jM>rv4WJLpK~3n08S(gbev`=V%`xp+=d8aGeE+D|TzfI?(D>~2hPwhQB5 z6sI$a)x5hF2#K^&gx*u=N|WKpz3^N7E*+kgV`RV>T74AE$o{v!rNESk`UdKiQ^pfY zM4BL@v>~@0qGVn&E7(pD-ElMfsszb)BWp@PLz*+1&qkNs?|D4XN)6W=Jvf;Vd>Lb? z`Uvz>IpC}xNZs!11%AR2l(-o`9(R>)vWe8P0pvgtXVPJGzU;6c6iYfY;qvUf*_&(O zDwsQ-!kP70mfp8-$W#6@u~IIV+nOIEh<5b8IeW1$T%@0= zb$Ppp?^9eQo5y_oUTmXgv+--GLiZ$8g-=O%9QL5(xm;L3+SrBCTjC7Bx`<9hlj5Zm zFG<-+oT?!)u1;jVJO&ZVvtU2EMlLzFC?7d^cI5aA-Q;-nc*id5KE09-QD&it zus7nX2N*@_TEOs{wpwJF{00tXfpPcJW2BT)c_YkVBxk>)spbMbvB)BLNd9PX&xVPV*-Maa zJW++j2n!K8*F%;P2MQH@VxbNgqgR&?qXg$O%P>|HD4)3V;v1!K0X5hbZ1xwi0Coi< zR?qoe2BIYDx}sZk?6h!AQ|j@g(==pT;gq%Z^imknetr7`3fO+cmiQyG=gH>_Q)C!9 zkisA58;*9Zn5l_hzf{x%%X#4v`}V3Z$Zr*ZB?)b!(o>ev)3{g`3~Z4@zZiR%f6MKa zLGP^dZ+s3_OLGXjp$bw)%tSRW(A-N^1c?Xcw&#w@>-(D{f_&?m-+&q%X z!m)+62d_Q14HbTV-u>uFX!*h1L=dEi28n?jn7*=y%+3Va2kYMLXHh6wbO4N7s>4*@O zGxa<<4Yxx!5Jkm9m|>{MtO2tnJjuWJ=Hh@*NH`JB5@~;7OlmI`@RWsFSKdL{0D+}C z-9*LsS6uk8iJw^%GqpL)cMhi2)?V*gh;iF-S*MI*A348NY(sgyL1yuLu%|x1e4TXN zk#IhhQ>pp3oM+in@$bio%J?0XPM9ilF)#LbMDY?irH@NUq^RoZBe0sFw#v$+mTiv} zkThl=Fk9p+vF@#8vhfi?*(jH`;X15JCbXHW`IZF2>Ul&sdkMt!I}`TVXyN7rZLy$2 zw8{03+#+-Z6je-Phfz0)%m7YQp+_8LuZciA5-#p#naJi?Sn52LwWF|s)v=7eYI;cp zhwQm1l#rbSwnLevnX-Fyn;L8xCrxpSUY3xtcSP`}f`VSABT6GQUvO9rhNlzD|#c?=Fpr-wcQMeSu)@LNCzcG7t;9{rw($U{c5GO(~Tz7 zyyWX|LP+~zd6{P)5FuGdjGP4>lgcr=sBpU*;4z)DOdSJwxM1FeJNs#Zxbms3RSFEWsJH^^WV)u=Nb5Xaufe!67_-wz7V@~05PwWd7L5oJm zd)6oog0yL|VRC~kcUMNuij@h}Sz4G|;G&yzPBQ^yTw$N{n3+3Di8p()6OECFpmwjB zx#(=9f74ID$4TKHl|x|a&Y2Nwq=Yfu+spZsrJO$HLP+v7^g*4}*82{lA)qG9rWMX1 zv5XWtQ8XNy6v{62*e;yXkTV!N^RzyTjw<@uv^Qg%v!);cW9Z>JmaEwiub#G)R9Io` z1_+uxqrgs{huZ7uRkasA_B!SDDevx8a_$Jc?C(@RR`EVLUItd?@w7(FVUk#D+cX-w z_V$KDsAJ;IpszPk}X7XWoN_dtrDF69s z%$(Wb5qmziQ6CAr6?N6M9P<759la(r3cs+Lie9hO+4rW$3Ytp!uds=goNybh}IK6s>=PN z=xVRz+&!W3pamUO&eni9lPT3_*|+e8Qp~-X`@pyH(Ux!T8Acv#HXJte-tzs3CnI>f z=<^^_2iq_ZVP~3tO9I8N5X5VH?QnqcXJ6uyn*ob`CAx2q<;r~;WAJ%cF45I1Su7Sr zC$m7(ZSZR9!fVexFDErCmor1wrXk!=IB6;PWlAy*hlT^oev~Z|J{PCHmL?)PLrP^Y z{L9B%KHyltGPV%sx+GJVc;BNc2I4&5?Sjp6p3|x7#OJprN~soz_TYjII?bk1k4M$S zkEZ+xIsx{<({;)v$zDi|8`#MVmbbyK+1D-tj*?EgzV6|M_fnRq{;SW!QKlovHr^kF zCT=4<^%6RuP0>|_P2uNP&If9hmWb6u|(tK)uw@$?#Ftu0y~ z19nm$jIQ6eoS?G2Ix%4HS60H=>qM_EXlP3rtcJiVtSO<^Po2*2Ja z;e~CNL7UWZBVZudu8#rP5v~RZls;b)tK$WM65@D@2j0i$+ri z@pE!CySs2R`-LmcUR~Sl-Ibg)nyL;SkGl8N(8`e0$?ErtEPuSfu*N;MHibd=BLp_p zk{s7XXbm4RxII)Nq~4L{+1R7=n%hfq%34{uCdx!wC-xUvtxed9jNOxKQQOs-I>;eZ zf2d^)55(;!E+oAX@Ev=!!DosscKiaf5z{A!JH;)zbOM(e*Gz|HLI0o)2u%TW#iRRPweIXnY7s|5`BeF;haIH33!9ZR8kM z%+vRx_3UA0>6&zQVsgq`%DE5_$;AC(Y`LXg5DBG9?Q5GMo0x&|9ysr^O$))!`*ju} zefB;j4`S>$bLs1McpZOg>hUX#z|0n=bu82&50A8f6WR5j9{aQAgYA;)A`UbU1q z1cj8Emf6EayLtiDkHLfsb4J2%Jbp5{1sWPkTtVf&s@ukjdGz=(=?oznn;oek)c=$9 zGyGlz78k40M9~KU4SFkj z8wc+9z2R5GA-5;Z1YA|A62n`<{Rh|TKQpv>rLKnqFbg^&XWI+DUt(#+SbN8ox~7-3 zTKMyxzT3C#3zW`xEK{&c1Q7XQoL}RJn^}LSU-K|%!R${WZkEvcDvQ{kTgtbGQ~W&< zOpy)&mPN;RW*Vi-*xS*m{B`^Cyoc`ko(YIW$L)T{-;7kz^0)G)ttaY%U9N?qO)Mq7 z#Ot$c+Cy;a!C<1W0kwVR0h_V~RvrCL5OTy+ylJMiU564b#g{?w;&{mdcD>0;L{q@xG?zm+q~z2O@DkcXyh|4bedLlT zUFp|X8Hk~xNo5<(4{IYfhVpe(0eH`%jT?Kz`zTcCLxwe{(ls^nubKp*CGfH}^`rg@ zJY#e6@2?wsL}$lAH!2I(4hCrA`R$nJ5EK00I+Wt>1*#;soLza(9DN3Hmwzc(hRaHI zM{SxdHyZ{DotpZWF1?7M0Ju^mhc=Dx2C|TkxZl^i@qVx_NQ3Q))F`(E&n$PLAHQ1E z>Ti}$?6ehQU1usCzMlA)S*HkxY>X$kbliub?u)!vw?~Gy-!Jj;v6nZU541kKmEB_{ zbBK~>Zf7zbyUujH)nyw5+qiX}gY9rce#LofzMrVEE|T`(caJL0*N8Mtk!i?8uII4( z8G|%c|HgFshE?M#C#mz3L$vpb2aZU(LlTphbU7G>%u2gO2!|(#<8&c2ptj1sK_*c; zzY_!X85j}jO zwr_REa($D2;P466=TM{-3AnYE)RJHAgsWU)ST0e8;JU`UvAtTOy6S2#^28c-K;qZ= zar1=*+dT-)o5EipQ&{xvOBff66AJ>ZN_UL4d?6vnIVr;(X`GwZ0@Qn4iH4-*11V_M z5ZpPs`rXj8^%U^ON1EGYiqnlZqS*VDwJzh2+5Cj4L1_0W#-Kw*~lu zNrPGs+MKu|FSqg_YD@BJ=yx%iin)DU-RrLFHw|Q7cOx;40U6Or=pE zEMhtDHiAYj*}1Ohm85TCDo(-ao{)|oOMcKhQ6WW><5GDFN{=nObiZ*uzHQmMTI82( z!l!+WIl@UR5A#eTVv^ASLMzeOJAOnqjVSMnpolI|?3&hUE_3#k*Q)yLObxvlzR)gM z(7|>DEh&6^)}P%z=I6F~_l+G$EB9|^OVKZYtn%-4_dkk$|BK=7|3oDH zFVWo@SsDLHnw<6TBDQ~Kso?Kgf&VY+-ZHAPG|kop0(S}A3EbUX0(Ws{|2JMTVED||fB*hZ>zu#d)${vp^*a(6um}5nclbAd`rnYifWDr8g~t9@ zb`gv;zc&`Ks7oly$|wS8qt?Fi^|C=C7|s|9xe}#PA!AP)F`<$E6jR-JBaOgL-=^z8|c6vxQPAmn0eRQiwPUJ0H9SLk9U0SA*_=r zWquXMhF%k zA=nT5JY1JRWH77`sWEu2?-l60;bIUVqo`e9KXhDnA#8f~p}RlpKU_~ET=HSLM(h&^ znhCwcV5+Eub^rre(h5R7EW3{F&B$v9_x{Q#`=a7R>gC(_5b!~_G%OV4Nvtbm4j+a; zyvEp_Iy5c&m`%ort_I)fxB?Mi;#8YmkF9(m3{p0z@P)t>N5`T25hu4c5%Ozx5VG2S zFLHh!53qMc=s+6R?%<$U*(0ZG*uu3>M)B=YAPi6vS8)b-GLQAZdWbmEHb_6$+$Vp5 zzHIP#ncGou?XkfN1kV(vLMYl#tpfObiRD9+tpMV&cvq0nAws6j4WJ?Sr`fkAGk5vxOnz*8Yf zisrX&LGB>6!Ez(R_qCJmyt;uh_tnoMS7w^IC|b}He!MW84;MlFQpmiTvg#0W(onA1 zriowW;9xzW9XLN+d!AoxKc3$nF7bRHEF__Ud_Okd&Pw>+ydDM+I!aOx9q(u6 zj{wGU^-w~j5S+Fu9yY3hm8kyiEV00_k%k&L^AkT^!^r&Xiyj{tC>7a#}w{fRl{^-L&4}?cZhHCS4pdOI+Zo9Dc-x$W0EtR4h ze6jo-TO+AFFP(lc0(&!#i133fVa3O#rfZ3@sB*^e))z?i#sxp`hr46wWV5gh%EQj0 zkHL5sd{T_G*j;Ccz{+z)(~>R8pOS+cbVS$705W?iy#*~1ARcho^%^xZ7sE3M&X{d; z0fpko!Su4jF$j{#%J|6@8v}=G;WWYzdhvy@GoAS}{p8XwK8$B;o&7n!D3Fhu9q2U~h zde#MLeXPU;{pyGdvI9n9nfuTfpdp3uXw@Y81sTUuyUMn@C>Z$_^;=eMS#aOrM;mvh zPe^GVkafPt#8KUp2dnz>Ih*ZgmrV{(;1+%MieKsNPg)^rh)_1Tm9Y;9j4&dioo}Id zgpNz(B{o~DwMMfwHh>({h86Q`Hp0qKC!V5bVp|s@TzCf11erG)n5!> zS^!>fi)ucRAQV&wSSrfM6!BldxP6;|7TUc9-4~=aTrY{I!HkOCBnc>8jcTd=&XyNa zfzE0H4hg9W^@E-)UGxhFBW{X6->F3AkO(CZm>xDuoA|qq zR7EeyVs7DNLr3L-hT|bl@i2aLTkQ8>wOnGE$WjAqFNfCnUg7zb-PH7z^J^FL#l65N z&_n(tuCGp=S{B!!*CCM#9F6V3LDqsc#s$VWvQuwn1a!2IRT=YYw z>AZyy?Xd23)-qXdQx=HStoI$w?7bOLVJV-t>lx6w-u7q(!)P*zX)@e}=Id?_Y8cCy z0#L)@Z%S)0E0(`pFlo$j!X*%4Q=246hH(G|vJSr9?rnOe;0#60f}j%|<=vdN?g)Rb zJ;%*|8As}%nn2ZYoF;_pd5FDCHBaTW6)f!ls$nqVy~OBy5e#kN{CT*eJb?eGMZo@x zecu~y*nIC5aXCW;Q55-C!%_+Q_(@-eDz^qM9NI}Iq4(n>V^H+M(woD8x}oQ$9Fjza zO4FbP6a{w;swI02`dJ zcw!NN@d#bd+^d;paT4V|b|C{dSkoa8z*L45m3p?qaynAh5em7tKm0ak6Y8enu7eWuw>r(xkAL- zaAI?<^MeFaS0m%q8I+lX3P$2g^XJPR8a@4S6c=j$p=+u#tKh7XJM zYzg!I!5&-|-+tDvzO`6gI|{RrX8LC7Pe=cB&5I)Jg=8W`aUWs~p;tCi+8K1}DW^wE zCH631Dq0aCG{KEk-qKUGOlQU-;XWi;yDqbQCuvp6d&NHC+AMbJkj*T7uMsXk*C6S5 z9$qJ93zzm%QxVgxO0z;=u2mU2xQB<(gy58Pmr$U&K7Zy){8VL;kJ{nR8M%%DuHn>T zr^qvT(;*^%|J|A#r{K1zAm|s%DmyKn+Ds?3J2#halyZ4-?+JUwb78 zSBPvZ@jJT&y5&c0ET%H#E>>-70;O&#&D0GHMr;-oe-0_ za&PQ$1a@Hss9oZ5EsmM4Ru2_v(=I-=pbF`L#D|X4-a;UWd0pfw(@^`fP&@c9sPS*G z2KuqqC>~81rD@&2Z!W&ep1vQhXkkf@ zzdzAt(M%jGHKkSvwYS>f1oMsT?Qmh&o%(@HTVBHv^=jYUzKt|ouI@?On&lP1~oZU_d)B~_Y?lco_ z=}fz7JiGz)=Q4Y2YucyWa;hV(`x?7b;erAlMAO`Tu3qvY6n+n!war++FFvundk@DC zJ51AirZ!b{1^U5An5GblJ(>9`RZk-C=obnL9$CmvL{QE@rhOuxFEQ_Id8m>dXDyQO zD%Et~?oq8IAqA+60k<4_9o5cjLWO#c-0b8_-d>&9`nwwFqlRQx?g7U@2aV3>@A%(i z(zv}2RsxfNu?P-ehCdoip~nj!zArImr~WiZD^q#0m=-XNfd?nRUE^X+3T3O%{;}dx zIhIa4=i~oo>3m{LDohE|R zu%@6altq9%c^F?F|M@oFSJPu{LnA-=82>a_F1+_1ysy7vg{0k$XUQ|GCL!KSK|;wi zTed>bzAn@iLOQ(D1|(?ABfL8=gt67xZN(ynm%Lb$hp9%21-u)c*N^S%5yo`fwvy}p z8Mr228?6xx3gpWPsI|m+NVo-jM1JyjwzY~g<5$j4r|%D4;_!U%s=(^bnzXunnI9Xr zHx~!Cfqk!hQ~U*emyQ1Kc76Z{mV*``*D%b|zW?{S#15PtOXt!oke) zuaGa-IQ-02P$NY^1b|lRy<~_8 z+Q?SG0@wvuKk!F}voDUbMZ8Y3U?Vy>!)H{Z_3H+(MxjvL!w zqeWJmbbX&Y*FN@Ab1pZ1Q#PhQIxJsQ=3~N)AIAAEeA-|3MzNz@mB?$$e%zPyhr6MZ z4+mV56yLAj4jCeH%*l*^^^%0Df%5&r0xGKnTFp>_n?J34PTe|x_l8%!0j-S~wR!0R z=GM#vLOv&C4CVGd?_LLXLG+q6xzly^1;>L+{PIo`4aY30x2rHJGzmh5H!kp0WaZ1Y z6I9a(qaGxwuxd`>b{?=lQH43K49S#|pI5Kpjwe}-az~f60Y2_ZSd^4Vq5Jg~*)E)7 zu(0OmOa~%U(L__&^cS^=A@HUeH4~2gh=(qv9>Iw6CMB-98fWK)8pV-Bl(2c^-m{Oo zx!0ZJi?=Tm8~svG^Rlju&v9{*lq}|(JWZ*c1;xm-y+1eRw_JN-<#+L2WIsA91R`o# zM_!!s&3Pa`CFWV3e$Buy4R;84-Wb{ZUShsCKYu$y3a9i%5s%*^7H0>l;!&5gR{~*P z23jML|2Y({$-E#4t4^`3XQwB^RFH<0Ne4|Yv6%;X&@XUvq|URj`$3TqJvMtqMGI;&riMp>!Hj3@9GL`qnYrM9*|QyC)#%69 z-p=XBFbzkK$z3(#PxnM~{kgh^v2N4``*QkmjOsYB9{W>$j7 zn3gpTwo%P(7csYE4CmBBuwfRn9;}%Bo2qvv8^J#1f{dksHmHy^<-nP(@`P*4+eZ!YOh{An*QCs6b#n&~zx(#ZvR@v% zQHEY~^u5PLr|=%~RK#c(`~*9g2s7?Sx9gx4W_fVUL?uazxeAFx%$_S1t8yCpN@HJe zozgcJeuS4wunuGj^y$Jraerdg7It>YhFyhyrn1cE!NU#$jH){_>c2qq>Zb z7;z&_gXa@Dnc{la{9!gG-yl+YDIwcvK8}Xb*=pex)HQRFPAldY*r!3l%B=kOB=+A$dE!hLfNlCs$dHyoY@ zBURSi~;S9y4Fn3%Q! zGWXUD*-aE|ED3Y@QYjZL!;MrL(@1YhYKSo!%QHE7e1zOY!YA-^xg+y(yUrO1b-9ST z9|m+LnN(h?+FB}}84rCMZmn&wdPnE}L_Eqj$Bs?Bx|2xLVtb;~9z2y2-RV=z5Kv1o z0s9@Z>0cLX$Is)2tFDbwBxQle7Dn1-TPf%DcW7907C<7}*PX$#;|3KaR4Xq~9;0R;T_A&L;-3AXQ`7uO)3HZVB>${p)u)K})4Pbz`piUZ z&x_tGpXG;;G1gk5U(z|MIv^pIWBYvyI~F&dWv)(g88D6%zk)1=_yc}*>v~JLkYW0Y zxhbAIY|pJ+O)k?dbe!AaIwy%$`!vSwBo7K{KKsZp7j^Lcr?IC%laZ1e{>IrSH`J3` z!I`Xh;2P(34;N26y%d0o8dc*g(GaicgZP zMgN|kV#&+p@R%$MZuhm>#zOZ&&u?Do>dv$Fhu>m71A^LpO$unS3oS~v&HiBjBt*z( z4z+0Jxz)!QvXD2ueCgmZ)FD6oW*twg0U|G1uBm5hN1yKw;?lt#5VA5QRcvjierIN! zL#wMq;N=fIyYoZeq&3Ii;!U`jDDuGFEtX!t9=70u?|)XP7w)>aJwL2J#9qh}^g3*q z%uXPoMzJjKSqL|d1uoSkvF8fB#-04)xkpY*xZt9-ADYH^Un)RaGTZ*cYi&i}mJveQL&eZjEQWY>B4!d?6C=*N1_nhM{j@i?OiB)hl@tfB*Qv!Lc*fgJ=&lnG2JUv1y^clXu zlzsc=;Yp_+fN7f0^fC~8`*kc{WcuPY8OSu%Z9X97pr1~ZbVZAtvkmo9R~R(}r~+ztG;we3w6r<#BSckEED%hm7Y$U3B~4yXfJ7jSrNW9NIQO5i2~s$0D6@5?D% z8(w|u^L!F^Z@9D%7NfIQdl?8cW#^^p;fW}4^uxywPD-BdJVz33bnNQxrV&;TXNi== znG-$md!6%l1E7j}>&*-c!2)4af=>G6>f4o)8-s1ZOXmSp*=@Njas2DB8FPDaf-Q=@ z5}bBUp+6ed_I|Axc3D6P+Ur?-z!jvUH^tgM$Fl!;$N@$>S%ODvanx)2I&wLVoBT#b zx8madfyps_2)zVUbbvy0<3y#339X2I6*Adg>&Ie#uVVgAkb6w_^Rfc!;-d$B^Vjq- z#j;+h`THXQTbBEW>Kf0hsloXN@Uu#_=07_b{fi79fI7{;g~OSc*ng)_G5!uv`@?P<8QfNMph1htAv?@mY$h~9gvg$ zE%poe0mFaqIrPtzE4F{|hWtn8P$o7e)<1eEG;OgvkbE9$W*q(LaU4bn{qy~B$qw7B z{qDQYIrwMi^GiPPkA}Oyqx1B@bSG~Z^P}n#B|ydWsg_D zGPGsonW1!(jUO}(M@u5kf>bUMy5UPBx?E5~W-9@m4F(xqUzsS9M-xKKci~t0K5blV zk(r=zg{?$xP4=LNiALiJ=i?PR0?1Y_J-k4z*N;LCi@rRsn0w@3)Z@YeX>uJ|GZQ2W z;iRKr+^EyHX^YNEY@{9sxKO%C^bFAzR(Fa9Fk}-8AkIhGoAo-V1olM7IE+(OflO^3 zuAErx48P<;9GZb$A&!@v8Bg#+OyP7HsR!PrMWc^m>+z`3F%{>>o1(2R`$lDqUGJou9 zSsS6xt;pBAl0Hc`9UCMehJZFU&c|a?rsB@{HjUL&4Ap`=i9OO4w)&6tANmOdbCUT- zvT%^T`ZSFhjL9vsRs&^s0%z^sxddp}Qs7BtPWMmEKAsIMpoETrT(yR*1Wbll?ZfHq zIf^4Yh0?~^4e{@TG@q!1^@i+2esj%p)n5()s-S?mG_c6(j1(HlvZ&Wa`7P4x==1!3 z^@RN@&M+|1^YO}`mAUr|sbTw3`|>^wp;op}Xz5mH zOLnqafJCqo81e#-hc_a{u)^&ews_ri`uP0Tr}pbyZP~_1>k-etJ>)zvfL#5uXKRc!Mq=}n#WJ<`nb?IB9j?yXGd4s|0n#Nzwn{s2!ulx4jGv;vuVz{vcSVs; z)O7Gg_|eNbfjc7UZq{*sVCBbGIB;h8Y{gH;0r*cek|2#jU)T9P@^oS2?No|d66a9n zVDg&#AED7D=mQ&&hnI;)xFmyx3Q9zrUR9HvDO&`IE4y@oE= z_r{9wTygPwb}GDzx8*%>R@DY8J~~A^h7Wn3t=w53a_FX$5nQLeaW`+*dlEyo3UHtC z4mIvTH6X|LL11*;B9Zns#m0fL@<%yV&*sD6*+p3+X2KBI#>B%0Ea6~_3 zxfbnFwDDFR*Ou#GI<8jjRDR&suZT0|%|L2E(@f7aesns?jWG?2r2N<`Ea`>t_IFulTd z+*Y7*8t9(4674MB zuvTtcBKE#($KG=pzk&soOOPZ$%!Zy>SCf<}p!h}_1UAD{L!G?P9pX$T2RX%>rcxit z9`W99MewYav!qj+Q9pa*vAi$LRFK9-<}qD}SI zk%fLxjL@YP+99mKaIZ>ZAdsMpbDtV~GxFd$PWhHnIu0WyVIYSS;y6*6r+T4T_do%T zwPhz!h*d#KQ(H!fsgjdD!`2QFMtL|T5*@!!C3W6|DjD{gIgOdUhqgj>SePXUwC-!+ z*|BQV{!&}=I^_#VsyH@nAKRx`p=asFf$s(M=9}@#UO0)F;{DUDn&LDQ-tEc@u~bbtDnn_ua_l+cwW$0;?D<6sNze_C@afyhmu#_0 z1F_GX<9NoYK&@70KTQsI?DS?o(-x&HsmY(ulodgTQ9|glm7pahx2W~mNlz&IE3_$P zWrrYY3oEUc7tHAus_nFkeBFR?%&KNo<|#Q=KsA=dGU+z!?U^~X-|*-kUN|ewn^AG{ zn-Yo~95KnXHjKq5i{3ngQsVDtK|>}~B}pxYQTl#g?vT`!zulr5Q`M}^R#U!Se!Ix7 zBbryvk}6rsgvMpqrYBTdRuZ`p$#Sd8rPN-*+0Q!Fv$l1$C{jL}QUm!;MAbIi<3%_u z(n3S|{%WG4N}>a4$zcj9-NPViBv~cA4R$K2*E-s#!?f)Ab%#T@`l58fE@SMce+?%4 zf)<$atZL&t^yP>6`EvGfrew$t1RL!xE8*?9yUj3eELId|>=3dSW5S+XV6&B3uepod zGfA3a9pec>kF|`c?fCZ;xa!FYZhw3p`)%Q>iSKn~Dg~vEa&w%NH?KF>Un*jbSoTEW zrVd^Fi@vh4*h&-C1D~yUKgOh1lpB6liWP^$t7Ls>S8evb@*{RK?>Gnk4!8b^5_@!K zfN%K)VoDgl0@D5AT_A9;HeU1Uz4Jc97I`E|ta80!abs?wvP~g!Y%3L>>V~;h5dvS1 z)^_sA*}-GAc~-L8k2u0%QpZ_SCtyzjabP3+&YDs4M`iTt3<&l&Z!E zAEMQ=iqhZK$+DYG)>#YLGx43vbnF+CtqN49i^=unukcDY(q!asezfm1@eyb6JV06K zHPcoFoWw@~`DUp`F7ek2sDmMvG+QxE0)RL!wXo z-*CFG=brdoaV+gIsTa2`d{lpqf3i580~!v;3Ymn~B{gDGx}0LHPFX_R0+7$kJ~~pKiCYzwIi1BCN5K86HI!C6edF zaong4%v34Vxve_YYa(ruH`11u9IVMtvj{|~oFInqonL-W#uKFccJNcN!q34f{>j7f2P-&Lxs%-@|ad zH8s@aNWT1Zz%o^7Q)EEARlwxOp0`R4c&_b-vdO%U*DRcD7P&lQ?N-GZkS@ipA9zr$ z<%;FjGkv-=d??gPdXgq1dQ3A18%LM#o>%F8#&CG=R4gUG_@%&tUBQ(7vA${Jo{i;UIx843Q0?h#<9)u7?aMb z5B7MyUsEokRi98Edlem0O-VcN7=013j>Z-gMJT2iYA~*7tIk#tUh%vTwTyUMR+H8!wd$q;DfKwhxKdozDNbF5KNC#K@0qmC9M_@R zM@xK=jxJ!giP|!mKUam_YM0>D@b8A&^w4d*J4k$lI=XuOGTvKNS<<`=O13C=bB8*v z0OOcKXM|`bg<1&_H0friF!UV=j!rYm-k_gPq`*W%ADy;AePVU8Yn%!#=&(r0J6oA_ znSXV=&TWW!tyFuSvlNPLsidC(f+#pPdVR3_@TUXY*DDT50&>>Xkan2iL7jg{zIgED}$=mv2B!M zWs^FkVraal+RNf`$;?$t`{p$Xf=n;WZg)Q*&}!QI{zm^LO#|7hu-Lv_m%aD z)LTHYuA_a5YGE_vufrT5w6jokq;H719DSTUyh)8uQ|RB=9@wf?X_2&G76KXT!U+A^ z-&0((n<(kgr`9RsjCgmvhf_Gks@7^wXdYt%N zWQ!aOp;Akx+P>v{P<9-CIQ@9#%kfn)_$L|@+h6bN`dth8H;oApmjOU708Eho(Haw* zusI-oqHiVeTUzE%czd=#;Ozm-4ggX8ixdL~0GAHvY5SAz@vkv2u>QN0!~{sxu(PoO zYWDsI_Y?kS#`nLgM~n==wG%S_shyDRU*Kf;V>=-mGoX`@8SuKS|2NtR|7$joKTZ zu`vLmUL1hv5)(V?|3pyDA0|cjpB~*`kCg)WM6^t7%mAH|i5-v_1Uwu7=|DhAjty|r z0fxxI2Drw=%=}+dECDLEjia@>qocX4jUxjC9pE8kt?y*~H_MT=zPSyZqk|!xldYw( zjUyc(B>De5r#R>V8CnMVKRu@Y`X+%15Q+rYm;i5)ksT2K`>m)F5dUMRWe2=NKRa!Ud_)c585 zz*i^pYKHS8_ABSnmhbZ&{X3w3vFG*G^0!7t-9}vtPQ+lh$5Y?V*W&|xK*a4}EatA5 zw)XyYd<*ye^z0`xJYm?af_ON)#Ao=Jdb&p)FNJ{A=#s&PVL$TeM%l7JKXHzq{wC4L z2&b14xB2$D;>^f!eFr;$B1ZH$S0rDvh36c)5AJ9qp1wgHiqtb{>ysG5;~{?|TZ?Gcsph`5KpG7aXDqpIs46`{js~|@6IGEeA=3Jl$b>i7ibQT9i!N0 zDs5)@?6K=`Al5=zE}7kyLP-|U-bfqaA>+<3$j9tI@i@SE(1K6L=L_*O{2S@}o-AD> zP}w+1at1rT&k=xMe&%(J+}Di%;q&NuS@01$5ZlwKgf0nNnKbN@pN9(xj3*S762q)5 zhjOrcIwxNlV=FWac)6*9%k5=D;7<$OSLdB@j@YCkLB```x4>9(cfeIX>9IyrY6I~p z2#*h}-d%gAsEWi}x9qfS?#a=g>p!`CmNUO$S_p>$cKcMz<>0Ry3O}NcoNsu0 zeam2qsKbj_>~bwmTzR4RQ(X(cL6|^Htj%!basW4RF9Yb;xI)9P`0{-}hH@twg;&<~ z_<%$Vn7lVJD%qQ#;lL@9o|#W_MT6^oxxZMQlTN6LP!BsB!Yn0kl8$XlvOJKzac%lUt%TVe-C z@Y|1BVMA-Du%V=<~@ilrl%u&Om~ zE>|^L0@^ikm36`IN3XbAD}~yOVxZ+-8=f`O&8mqFd1-CrtGZSY0u>gMsxgyl_D`n#BRpyi#65`Gbg44Ytfm-WcPPQ zS(^5<2FOXrZ{Ou`(H}8Vk5v6?c8h-81`CAJ$>U}+X^B-kKz84>(T7(MBAPU6U620& z1};OY9w{nX*_EQkpn23-&Ggswr-;p7p~&wyDt#FMBVxQJB@hN4n>vlL)4#?`Y8vo{ zuZ{w7nPXhLwu+Oy!Vs#Gt5ZUAU{H+?msuzDhmcagsYjMKxz~5AFZGm~7bLE+xpx5W znzW*^yP2CqGQk%}Z1*F3{81L6wHm!oBpMF` z8ACgmM4%)o$|@%H(`he4ea?&2%VI}4jY|#VR;@bhiF}e{2xql3-|Dx_8B+01{jjiE z`cu&O3My1QvTJ21izD54ZmBw==8%`}j=*AhfBpm7T~d@uKqeD3gfY4B^SfUVAHmM4 zkYE~F7<<`|)|s@*3UX1zOvP^`Xb7LC3xYqIBEYTDGR%zR(lYxB$Hypw?mbGf9emSItfR316AgPI@>u zL`w>!qK)}o9ZqsbIVQ-|tT(RTII11#0_(vX^v7D%u$8m5q-dq(PLXZD@i_KM7GG#@ z(7Z5BCMZRop1&RHKzP!`xS5*542Mkl{V%V`_}~_Hb}_!R_>4^A5AqOH7cc`6+}AO6 zf4$ww2UOoqc(c{`tG(*My34!PvzI4e7Q4@DCd;f=CCA>8GC^043e)u>$6<$Odm2lJ zuO>msT1rdJ`V9yAKteVxYt7vgd;Y!$6s}HbhS1)f39w>IZzrTRCfm@2^_ASI;ecY9 z7J#4Jl&nTeP}&0cwn+qvki%mevs0+&pCe0=9$Ia(*6T%3iNEZwC5(+leouPg?u;N>hR?efI6&O zph5_ax|c_I?)*ditPQ}WFQob=m#TO6M|E7J&N|M*wkoN*HE~Bz+`4464m6b_)SWCl zEcAnKjytVa;#(dE`k>B`2=+O1bhcb?k0*B%hhiSbZNN1KOX5t1OD8l*EPt}WE@>?m zPyyGdz7;Y8Dc?CqUD08!!N4HQ7(-`T7#g3t&iihb?w{c4#WZra=rLWD6Gfg5BJ7&bWYxnpwv4lb*hzQ0o*pC~DwaG|ez z@L99D&m@n-HZqvh%Z0v>0%@NpIZpGIS%1`|_dS@6i&`hcgy=~JTraP$nvy2jEgG&; z4c+t(Njw;&iw@HX*tWR}laIkpRw8dLlMr&lTO|P`v20oBhTJ|M3iFv;KL_uEsyj^d! z6)(+J0W1ZjlbPx1dRbmE7)HQLm0r1)+gq~S6*MhN%67+R>Oy{3Q`)+rE=PhFGT%e1-Y8GE;P6^uRUy7A|J8%!;~OCJbbH|j_)3~B7SqY zIaCS59#+U-N%N+9k3N4bLs49|3avv&a&-`PxyJ2vC{qh2AtJ^;%((QOHx~J_Gj)Vuc;T4(!Zli?7y^8|ul z%Lpx#y(-Q0mq;=$%yVP=@#HD(sKXQOsyy!A?+ z3Ka}IfqCh^#ACunQRk$@%{0Q<`vJec84;6=Ffg&wn1rIk6tJz2xUUo#9a9F1J5 zA=J{$EnM9+ND_L>a9-UIa!Q6?gw52*>UtaVSmm7`MO$d)#TUvxW{HMkqfLMQ2H{CP z3nk?UHIACKj3%A~Ir<}>>Vw&CAew;(`mUju=4rdv^@P4p7i>+TvYIU1=RpU?Qd?~K zR;)ibAx)8m@K=|u6_|ig+;Uy=Rq(w(yI%jEK7;HgME@hb*hzc>mo#hxuac&rr;P5( zpw-Lt=s@I*sb|hHA0Kao4-oZf0Wi>hHu3yCEA`00B{hDW3w&C_Pi@Z5!Y#*2p)lfH zloi(rM>Y_b;;gc-qHz^5e&d50^UF>q-8*Qg_*`DQC1xfA`qI^6V-MJ2lJ`={tm-*l zRqm$~$J8@IkC3wz4WaMk&O>lc&=BXk(Stpu$?l@36K4+VWDiE zu_&$RiUwe41~d3MSZ1a!1YWx=@op7wX^TbT6u|RD*YHIf_@>(UeRj3tDey`x51135 zqVG%29{3)(BCU&s0Tlqa(=n_#Hm!(-O?k4*a;#kUC9wD3H0P0yf2~rrso^Wuwj8jZ zs;B3NpPQ0qyN;)Olg`_$GpkxX=rgt?=M^S}knv_~h+EkBx_B^&yV6i?-2Qr{YnTTK zDsMW>YE;Xa8+kbpbd*oto5)z*LrN2`Vg-yVLgbUN!-L;tSpI?6JAiE5UZ(b)3YY={4FIBo*C+IN9KmW$ZKE=P{rDRe2b#$V#~W5aM*@@G$*w zSsMCtEDey|2II)f^_V*YIU|N)c9fzb6J3%O4Y@U}_^e@d);NclatzzO2*z_AwszN`}x> z%3-&X^B|cotv7Nu-l$t7)cR?1-A?ljygBCuN4y=`I~(w-QhV!S^)0v40$U-g^2Cc{ z=hoZXU0iPgKqVnR>g?NnxhAEYE;oNJ>s~r|0;}vHabHDVdMf2JF^mq`gPJu8eD_Ec z)Z&42Jj5nI?CXDsZpvb3kUcNis~B#M?b|vkWjo=idNRrW zVqO;8uN8{<>>eW7AaHv|5bTpr2y4#&-48|(Gs{4&bZQcOA<_F*Td8Zw_!H^TF};Md zM~{;R8`Z)jyjSF$*m;34vU&)!u7!G09sg&3wVe z>?pp@a?LH*zWE2Rrr|A7Z+st|YD$k2{@t$vchet~p${K;jn^MQUavOM|3n=J1fc#E z*|gt)=6`o!{u_SgU&`nCXNt*xiv#oj3_rub{9BP5%bx^Z_J8Oj`Y(!=zem*=IamQY zF9Qb)0ISWx#`L$W8Y2Jz4M_g6(J}(0%>QN;is?`0NA`c%q5Ov`6f+0IA5|#zSe!OE zpB&xUSaG0K5&0j$)M#eY%P&cxMsUP6k;K@<%agbSe0=z)Y1O>T3eF2|CRQ(L1wWMY z$#1?;$WyO!ym|{gCIoK1?HqRaZaRxUSIoO={Z_Pe?%J^v>ihO|aqimra@%v+$dg?A z<)-sxDd)nc^JQ`rC1J~bcdBGi0DnQApy!mlJ*s8}%=_$VXpc6(0GG@5o*=tD4yESA z&y5wdi(I7r{krwJL-+jMWs`2Wd$|9|<6YU4yJPu5jM?ef8~uf^Bj<9)eHdU7tl-=5 zM&L|J_yP`YzuNRr7dgnQSy(i+ra9U)LNIA>FRbQws)|C(Qb0$ zW%mw<);dSymnCU=sn57?SMw7a-L+~9U+(hI9BJkIj6E%6g(7k!HwK;7Ib|BC^IWlI zv3nz~u5nFwI}RNzeDa--cTEVSKJE;n$G#a9(Z~MEJi;(gW;tbl-su}qbRdWv(N;mFcJiLu|oaVR4|Ff_XMt(@G+0-&`b)@ z7U5N7iXO91MkMIaa^C(K_CIM+fo?olBv)Q)#U>?`lqgS!Xud+*gtH8kaLF>%n6^z{ zDWG9C04;&D4c<|^k_72tH_R@%ITd|XEl7G-B~#Ug^A}2R`}BAq=MW}oq=4}mT3&;X zYnH<;{i=MG3qAJGLxUy>5l#X_ScCBfvLLmvGDXshpdG`X5{7e_ZIq%WRT63lCKK=% zLx=DL`@9b1mo*;gRe99v2>PhI)iU6e7}~i89ezaFra#i8MohwZ zcDDn4*S!lUpUy7;m7CkECinR~2utD5r$Bi0>V|p4A@rL-m&7Kj@Nh#GZd+`fA8sY& z;Q}zPu4YEzJXZfzK;_L5D`S09(ex zr<`9M9r%xf`e43@k^Q1{dCawB(OPym923imd)TGzGD0`nF(44dG6QeR%GC0>w~kok z^$%WVao$@%uu$}0LZ?$n=h6fZ^~4N6nY$w=j1)a$nj?4%9TkFtm*ZmH7i4<~%5k7q zlmW|K2vL?O2`L%uKN0M?1=4;M_OrSJm&_+=xh8=bWZ|g370G0IEouyQH58()mSg{- z(N4YlGto*svanb_B#sktCJ1+t7~g3-z~8U!p1`dZr3#U;1rI%La0Td8R1eHgPa~!; z$h4WLDNF~PrRCY)VXFgVbIq3gI z-dn{+)~;EaW@ct)X6Cfh%*@Qp%#^m%%*@QpOlf9jW~bR{p7^UueLyueJ=LeBY0XW9 z_P&dVPYUhzKJT*@4}#Qm_upyO76_lH)lEZtILQjtQy! z>(s{AKe;;@5QE%YOj&T}P8s@w?~8#lMFd<%>xrNQp5&AupZQBX(xBx~--PsdG++@9 zM8Q(?QNnRg&K2%Y z#wpd~Z0mxm1JfPl4Qd;@El!H=)KY1bdnEWUx2VMw`4OPAk zIzb1zH$BFZ^-62>nv2cN1wto#akh5pufv`xPm>G2Uvo!ch+D|r5aI>hOeC#G}*mTI`j_Lvw1!+-epF)4`iQ7q86WDp(p``msm7-Z@O zuxI${Cg_(7(sTHVSeCo=mFv^ya5M9u`xghM zi=Q40vRrLu?aM|e%)jFHH64BTMVB0>BqW)v)k3TFqA0>naH21iH-K>C(zo zBsXLS>51465YXGX6M{NcJX*fqSgtAgQ+(l791ah=W_$a%0i8T)6M^cHH9;e$RI1O8|@qQR~sm0w+&wqaL{Q? z;6|11)@iqx`WY#@oCPt+8Xa@N^QM$y&R~R1#AG2)4ah!(&i~Samo-c&k>HrcGBxAV zF}naKotVM>o|4OX<9!i>sP?T6=V^skT|pjZE5W6`=Txro4)FMD2s^zW>!EuukF*Vw z+a(r1MrplxfHDORvCZh4U0?dxZ$T8L{#3ZXAJOp36{B_)?Q{^r zYq~=s*PF4hjfJi=SGNk5%A^h!d)Gl%U?Q9wYl$WP8%W=`8)W#$m&;MijQ(L(Bi}Z7 zCE}RsGjvoS8HCJ6i- zF&j6#jO%lxSM?l;vSVD!n_29X7xh?%vN#VlgaZl>fb@}fX+eC%0wQZ{&*IYcl7_Xl zS+~{EK2A?%Sy@{nD4*<{Z^Z)AU(x0=5ZS`qV2!X*Q-aRiwHgOv8yggdh%rP~6%(nY z{G7L}hLdo=8%{?QyF5K)yk_E1M)|1qoc5TBJ<;_wVjBcii~%+Fqm4%*Z>h+#p7m6z zG%w-}?@O%f6*9dseOtI9<^1iMso2IAZs%HCbslqew-n_x%5h|I$Ph;N9+X9kSpTed z3VUC@`Zn$C#J=~5)`Ol-n}GhVA4C;Z81vycFodp#u_I|vlRnR{{@zn)JcIk@I~BN% z$+GikIVHK4{SCf~z{6RFMr`ILVv%B^B@902P)mCWFS}b#d#RM9Vc}!Ub>zG&KkeX6 zC#6BAoo%pT_;4MUhoXJiZ*=>dPcRId{s@O-`^8$!#u>8i*xaU^Uidj%w`Q&*zj6~V zEHlA$AeP!G#iYBD=z9D7J%=MV$gI#XnwJxDsVHKX9+oHnF{0Y=_1irvC_`eZg0n-f z(RHJNU1Qx@yt=$j^FZ}Bk4Se--SV^MNi|{W#M-L1eaHgiux778116*N^~bS>i^F^C zn5pGRRd+kz(|ChUPn>9??8oTGKoyW7GQ4%{B(W830xLO#u)l!4Vybo+-TSLcwnra*1zqRQWlS0HDiH(1 zRhml1Q3)zf%4LL+3Hh4|fx8`^94!q=IsvIqbL{$fxKMl>Q)pNPhS^7jc&)=xyFGn0 zNuZH5a~dW0GyLh&!C*}&?!*OF6aGrcDSNkU#!QYnVH%%NTim($=he5~D8#T#@+le` z6@DoMZ7rCUlM`?}gPIsI9r4+&u!yyqv=KGeOdlFulHVWB$qfdlG@vaLYN1J7Wp!li zo-?YvL@*ss`FfOlja5u&P&5#K?5MJtEXaHi#S6eSE}Ap}|2PA{9gBj9@JpsCI95?J zPbyl)VmNDAESG@?UeR!!ljg;0v8rheTBDK|A&!#PQZ}l1Wi-%UVL-=DvVmF24HUu; zSl?{Q=9%j^yi-KsE4aRMDk8=td6b{l7-C$Ix0OYK02Eu)7HV?nyh*}UNV=3_IczF* zhNg`yKeW(TOr_}AV{?XbN&@0&N9KWG(d~4oYRpo!n{Ni-vL<1AY*h!K6z%sfeZGa} zB{%!9yRkj-Nn$vBpj{F^JcZB2d2QH70#tw@Tp%3 zMiH1Umy#26BI`V3vSQ2XNrk$4EMClHYZG`AQ8}C)c=e<+#r>`CA<0Cf$LQaGmGT%{ z#VLSGu{%JWZz+rF(N;>Kq{c{D!ARv$(G*E2xa|&})Su=vdPrSf`0Z=GRkp)|_xpEK zcE0)-Q(aEUKvlTAI{L#ekvr=<#s7biekyo}#;<4r1O^`yD=CDZ%`p2>QtdV9)O>#7XCqS6Al8E_{AOPT(#iA^^>zYv zN^Q~|Q=0r|Pb^Xzi*;F`U@&Gi84AzoS;l2cAH05?ztxLhD^%pmRBG>cBddAEYg7Cf zY8yXntgK(RDyfoI&XWWr^Sh!K-drpysbM+;WTQlTGv`)Ewro{Ag)9Kr0UnFX@Cfl9VzTL<+*y)wy5^EKh-Jk>2 zupDmY>Tc4tzw|s>NL4c0XEIn_mN!35oBKn2h+*nl*2Pq_Pd6Mn2(Y=M!#0r~&#(e{ znkLkPC^btIx2e!aYKJZsh%f4lGvX+T?L2O?T3J6kO80iSvQ?uGWRVM)1Ttwlx!SY) zFi7v`n&6tW*M2|~1*c#xvpTNaH3$w1#GVyx>eQ3*T<4)McU#z4yJFIYUlcIVm+)nY z)Rt^+d9~SjeRV|{Xr_0k`60Q;3WsA3hT}VY8QMV2d8P~saLP;St8o2U6W~MyDQIRw zlA1w@IOBrhMBNh(5&Cnn@#H5M6J|_zXzs~wCbyUesZ}QGW4YR7KdHZTKiwA+_KgOf zdqUlt=0_gPs_u-)3DZ>8M2IH8%&`XTL6+;=`0m#hxK}yF>)1MJDWgW;pcx5>&4Q^Sijebp7?1tU=86vQ4{)#Am0YSQ=IBei@f{ zTX+allz5IhIyD6II|Mh<>LR9m5Bj+iIFnX?Ig;vq73S~jSb3{Yn)3Q;$tZBc0DyuK zr*BTks$ZCqZysLR90!nT*p-(egqi4MT&SJ#EV3si33EK~$w2EE@u>#k+B82M4tPgg zZ51S>bn_(Xy7}b>>opj)=7Mzwg)`+Xrs*2tuSuKsm?TGz4n6P<}Pnkqd zPI#9^(!*f^NrS#CYKlv#!q$Dq?_t2oqU31`1WyU9a%+U@0*p!LkD74ErQW>@;g_(T zaLWt-%ilpyuH>h>D}3p#z4D#mz0Wcqf`J`rSpQk__b;Lm0m&bLsN(_%2LmUdBN_m*0=gQw05m2G0JsBSn{2FH z%tU{6HE{iP^Z&f_^uJCeG6PsdCT3O+ZX$M0W(H19047TW*!O4PWanb#AOgGq?s2mI zzd;4Dt-ZYko2aI=m9V~*1HF=rEaN|(0`9*975`VV?|;{{0WxmDT0DSA|C^_c1#mK$ z*jTy$cYE5{7|kqgOr8Jf)BWA{|9=&Lvomr36NV`ri#v+k^SgGJ89Gi){Sg-lOoDc- z6b}Vfq9)837r}-S(1(ji}^XD%&7m&7eozqj-4^LoZZq#H+y z$uO}^@8g1yqZf}4i&Lj6mSdQ_HT_GJbrdt4BBI5XC6nuYAKTMl{ZqBAPHaF4?JdM+&@Q$x;a7H-bBB|`D1h8Te!y-*} zn%{1Vut=62HZXceTZikQdUy7D?Y>5GQ+90iSDt72{rvHEf_oE3-P2w@`8Lc;)2mqz ztDLXSo;2@^QU!DgL15m8->k%A@~1%~1Y=tI*AJM8-pk%XqEULGvF>~7HreSZ_(azczL zGS3P8ly$66GLwCAKZw?`A?_vYevfz_gtr&DjhV=iJsRGOVZ~+J)6KtjOtEOFE-2_u zn@8D<^^GFm-x6=yJ`XZ)It*Hnapmj{C2?htDzXe^kCTv1s=iy7upyR$w0s$cJ}WJX z*Q(c|TvQ7*8WvKwVuV{_HV*URmefIg36ntDFht2b)S=)t7N~c1948|#EPDSb$7B|= zEECzP|4^=uWYohH@3qx7Z#Byb*)` zJxoo8V`?p}6qlnj?tX6wZa>==Iy@>xraw}H(|hs512mzWE3eZS+uO=ahojFR1S5kL z^frnZ5p5sgfxiw7$u!_+&T&|@tdJ`0nwxhm7MUmMN2`w_DW9E=Y1bDc+`dqL7dHUB1tu7`wa*rHpu4tlXiV03&lei%?2O zEN|TWi&KfzZ^Ykd;t;QJc@vuBXSd^3xX$TrS4#~X)6HaUN>iYC(h6GNB%jSA`09uu zdLs0HytBniH@%0NB$G{`Mn+PrNZ%+tP?o_26>}@!I(jL^;Kka69+a5YAca%5&`;%M zhxK!KaVF}LR4XD$gg3a5KEX_bM`NCiOb79kQyK+m(KFWuL8D`c%Eh6R$feyl1RRI{ zQJ{K`C=7;Wp4|I%0i94Kek1k-Kj0%%OYiTGKy*eJwIHM={1H1h2u(!7R|@PJk{%u? zE@WB5f1A+PBAcyT$M4us+&JoB4iJT?bBvQ=KrcwKfVh;t} z{F=pNnKZ-FP(-5q`eo+9k*V#4_4>(~c^ub`SMHdt!{;+0b?~ZNGn!Ws)uc~c}J2aqz z@I}ihUz_}zy)m&%;RwpoI($c5-JH^&dLAy>UaflsjwzO3MA~r$$qLz(XCbmx*T#EAlge4kY_;)I}1Qm}KwE?*!a%#i zakp(v2r~iFPKksidknXcCGSYNmCLf=Y@6gtvyE&Bo0^MkhPrSz`W< ztw5=!AI1%r zLZqQ!Rve%5H1F@}J372B*FW3l2U#oIa~T71(^rpp#YLR)s1oMK>KB|PVj9kt<^x=x z_W}v59SJmrCdbQ{S?Ce0-%_{38TMIg*-MjJu8FtG9#OvP^C zcKvr2KliMmFoapSQs*i&rspw`l5ex|(|4}GfxZE?Ij|e2V89_OQ1NA>qkv={8mm!#k8c(o5J;sN+QyYB)}pSyk>Z05CR*Z>D_F$vvqqL; zAhN&vY;5IQLh!Qw0eqHm?(#Ul_=gg*06{w%WP#7p1+oL5>3K6K;YxxzQK+1?nmq@v z*|p^7u$x~#Shi_m5FgH^+fU&lqKqF-uiUyxaUauCx+bxP-Q1Yj15vY6X&=%gvT0fI z1q%r=QEO%@dRxJJb8m1F^##QcN$1QEqFnQc{$dhk!O#TRKY;Zox`$y;DPUYk<%;Rf z#jbmGetB14?M2nj>lk|f(rqIYN1gjpLi20(tGFB)C_3ogtp+AgBT{5us@!=>c-hzC zU=4?ZpJ5gN@z4!YoDtW|fQ^qfwGas{?bff2fXc&!%o!8)ZOTGajjOh!v?Lu}R%uZ# zcZ!&lzAZ<@KoyLd zhNk@Tp$>s~b=JZt;=`hR%7(w_L#?*7Kjp#DXUEuVJbaq+L>dtS%2buun6}UyUaH*O zIWl$)Hgwp5zx0rBV11BGM=b8I;JqQqp!o57^ksH6vUGr*LxqTssP~O1`H*OJd}-Um z==SJ$Gn|eLK8)0aS7f%Ts-SM9Y6vx->00TQ#(oqy^=ff-0L2@C!3?d}QsY{V*w$Xg zZT0fmQ8E7H2xUma>Q)w=G(q3NU%lFKYiIiE%(e|rC#}4R)Q7EljU+dkt-Hr8t@AUV zZVnO)%qPUsG6;R4RZ!x*R{f(p6HA_O%Pbn&z6mY9E~$qpfy)mI);{u3(d{iuwA!n! zg?3;xZAMztWudGUOaoU>3lr!Il*czI!0=kXZnxt~8znc7o zf9sY>Gb(GtCo~)@2u4}M6|=&-zNG|wRFTC&a!*){4O!wm4d8>fQBuqUhnAxM_4xa7 z(ZU!9&7iuGs>3=o;GZD6?nv)`J@QXl1s0o(_*qsoZ#Oj$v zO@C~&gu=GzO9b%!cK=l;&#wuncTgNz;VV!1Dc=F-C)Uo!UH%;8U?nbT{jD14hFDFc zZAqdMlGqfJ7v_i_+%z73Lj^6ORNC6Ng%v7WxHD2WX=V+`@iMxGZT`g6zfA{K$fv7k z?Yg@1krI7C#w{@${J2<%zRH=%7kM2Md0jq7bp$yvLs{Opq8J2ko)y)S1%yz(t_j{{ zm8S=zxf4Hr=hC^Z!zqVBZ{=Lmd{uyWxp-Mg8R;#E8Q(|m8BIFVQkFne`ZAu z!cg!$h^@|9l+9j3tg+W3^kA%UvQJG7!ehucMmfchiYrWMmnB_>`()6Jz1{{e60*V@ttRaZRB%8WlyJ7}unc6F9$xWi1Y z#X<7~tG84!XA!KtwHVa)u>9mrq6mLdD`M8KUM{k60Rv3{Kkp17G_96r4zfTwap{cD zQ<=G0OtWA?x(2kd6D^YR@Fr1)E=pzOX@k3Aa3ZmT#f|iuPdE_$xw2iJu<6Um2yRTV zTj>-PPXC@Te4CLCnc1I-#6|5kuOm@Vn?#{{EEqf+Qn_KHk}SpO)=`KtD_Z5z5(&dN z!-HZI9$g!0^u##1YSW2erPsWK#;S*F7#M9Wv#??z zXDe_es>4Vc5DqFja|}dFNge@Xw-dz5L?*&5quE;-Au@FxQ;}|+!3~Z@J^ED8(rwKL zPi-hBod0f!{FbOjxQ#xRR3K@k=YZ16LXfEZ7)4EYfqPWl2vwxwG>ucb6KMpCVxi!* z95u$=!R`m{$%Cnad94=+`}&625wsy;CIMZCBj1K4g!Cb`AOq3Yyte3$K{1!3wigwF zHlGpq2OLp-t8lG3N9|NVzUDk)!=;JmLN<^?*R_|8i~gknA`eyyx_c{!jwzQBXqgz>Vc<)KrQNgqc&(4QCf!=>fN_4~Qa!whaHdYW=+(cY(^fTC+qn zBYUp3Y{by@kznZ z85d@S0L4<0!!zT7EET4MUMAXGVU6 z0g0aXx(E$7?_(oLQFU7OgX7NqX0Ef_O8Fy&Us5Ulj9=|nLzVg9Y;$>Ed zdo3w;#@z76@mNc$*;m}guL!%zs1f$1jDp!N)Jc%C|BEoi1AbFP%O=>w6NS`xCen@t3Y zaN4!GIFI$%OFY*sYlRp@CQEvfNR0Isb!ml_CpYyD%Y(k}N3Fe|=f~^PhQ0sWZ%#qq z*K7Y?TfgUz*xsEk&qjbl=QGXYbc<_UaBJmAy4WEma@p>9mAoY2>=_5uWLRx1`A=@( z7b^U)r@bJoYnj7Q!9Lns^I1wBl>~QX9eB=dx{UyYPLB|X>_&sgNg;*Ivi_^urWTn~ z?In4~Zn?uamCBFdRhuXh@8-StE(uZhQhmAn1erfTp;y4aq{>-GX+{S|twN?p73+Lf zd5IwM0fLK;&s{dZ-s*R*ZN>xhOR0QTyzlM&FYW2Eh43qlk_r~qPVFlcq$65F(uqQA z6LFE32{~C%(FyQ*Ev39YiH2^56zuIvj52N6Okj2pK1&4<9S^7wBY`7X$iAbVA zRi_D#zSoVWlw;^_Ynlo)b1~5a09H^*?gk1ja@!^9Pyt5~Lo0cOL3t+(7ogJ!M z1Sqm$bT;NY2fqi79)-Mxmw(JJhR4C9dDs*# zi7%RgQs>OBr}-Y#J()^7!UVpa)3U+d4VIOCUljTi$SJs^*mD2ZIK;Q1yAL9xX0@%V z8?HLFze#YXA7k@7=W%MWnlzgz;1Md?h@(}Sj}4_NdQc;~`5soJ60ahvWj)C}-4n1q z^pJEetT!8jMVRWluwa^B47plq?V}LzjkF#j$|{0|@cd9I`|2aKeC@E}ohA;8yv^!B zt-R%<9n*57w{?=K3r`^V;*&&Q&=rB8=T&>X>+3|Q;tO(Javc6Y8L)8w3uxfKbPxXn zt^V6E;s48M_5bWJf$gt7et=rwpMuuEBaQ#NG4fwu+W*jv{OwEoKSww6e{Xu=U;<2F zIGFy4I|uj~{#VCVe+BN`Y#e|}8CJk~V_{=w2KXIVxfuY12fze|jfoX-@4wx`F7IG! zr)BEkU}^)9I@kj)y#C{Y-q_ym-(<$l|89M7GPN-^bT*}TV`Jd{yE2)7b3pvN0^;vQ z5G*Vle_2+z|LFw%3+9@C>x*IK0O&yg9_hc$Ay@&b6%IClEaG1=jrz|9dH*4TVEs?$ z5PvtI{IBK^tlTWD{|Mqs$C9mo8DOQ2#>jJ%5fHWG#H>i{x}uB% z-`#&(Dy;121d#ZyvF7kI*OzjsC6Q=ieq`iQ;Jmf|+ku~?%$GeMF3-PtQ_DJeK5H=z z)j!`~Ds{gG<#%?vzhK;VzD{bIO7Yx*fZYXs-2v3K{A-9)G7C2iqHCbkg#KsU+wJKd z^`(f!bkws_8P^XaHv|nq9wb88;f1L1#Wh;-KGNH7cT)Xi(VKIVX%3uUt+RaXt8-wd z5n;P+Z|lAt%6ABlux9H1ZEs$?hk4=gKE(8wN+gp8^(m1I-c5hZM(fUeLAM%!$8m^yDeOtNN zJDT>i-Qd3C2>@nscjE0S@x9;y&l?oUJ z+~W_?YEI?~sp0)yj)$-?h-MK9XT?kyqiy8xI6MK)z^ezF%kp=oea<#a_?bzjJjV_h z@?HdQwej#_nqSJ=_8OMJj#j5riOdkeWyy;{C*$YZOR*0KRp_rLcDDVX9;h$A!nYcD zsXXi-YnUc0GsJLTf{0YPK9Ilh=l!wb^fr9>9sr86Cnx&sGYX&z+-Gn?Z9LaY(0G?c zdN=OI87kxF+4_?tgG+s^#{kg-q&?$C3{0{YHr8@Oho*km6e5cqqCp2Ur85(r<^Dq_ zs$FL9#e>;AsRYHr(|`8l-&vVI@rFPxQ7KiS9u&Y?L{(&anAF%{7~r$ulTz|3lau6!=;zSV?@jd zpvb<^!=<=kagxI{I8Y4tUrv35&V$ryPenjBCLq(&lBL zEj*NdXg=ECy@I0T3Q*7X(bN9uld+!PRVM=vk$4R22JwO@#;lwSV;0>jdWvB+bM#1n z*npv@oR-Ta!^1i+B8JF@R${)BAffE@S9jZgMEGo zwirvO@X(T^ya@d1Fb=0M$gW_VES?TfQg@kh~jb=>vg@Krge$ zdlm82HpKdv;F~2Hhd^hh$J+W-tKUUqT3aPH7v1)SWaNQ`SoYinuyZjYM$o2W3^{Fl z!mc|3$M`6M@MYbt3(XdII{mzoxODE5*OIrBpewj)CsNHnYfG>zuo8+?bT)BT*l*xb zz&$~0)RP>5i>Ji-5#e!2%=I$b*@3=XCQDS;te3-wih|FSGz+fAT@VF+pTqG|O`pDTu{(!6=G6EHjgU4qal(xDNX z7QEd?$tuSP{;g%PdvBycJZDIA))ZI;q1`RJuQtQqZK$hdQFq-2d4bT_uL9vbIZR>) zpR_6+0gGCe(U};z zQbrmNF`?*dpgAUhXuJ5QZwR4HM%r(h!LZ*z%NHDsI#P|K0j9}#cphP#x7NlISXVSM z|G3TeS3Q^*g;(|WSIG!nnsPYuqZL=Z#)r>8fS*V^c}trEJ_QlH$%p~gqC3L077`Iw zM{{WGd>5Qx&Ps^2q~4D|lblxH}*(@%j3wSMT=p%KjR=6ad#Im1$WQv)NAtc@f{ftTm z;);4;R_FMUR%CK+EeBNf?dag(lDD=RFUx5(JJuF~w8c3Ft0Dc7f2Lh~cV>hXvOl_z zO(XML?`uqnhLIsO+&4`SgLd2gnHR4TkWvw7?#PE~pry4CDYKvfKdc66vBgu2ha;6ahrsgmJ0cb#<$ z{kfSIAX6QLwm!_2+A+mQ6Hs1y`^Wj`fkMb$AePn@2)uJbf60kU;b<@^x^ypPf?PF9 z0gZy-`GPjZ@#_~M6MPpZOR~q_TT6~I<9q`XC$(OBY3OX+o@lufDoTj9l<@`yE4SEn zv)E&>qJxA{i7);Jb%qQE`2aP8Ndo5Kh?C<8D%zA{@J*8xhM0YbA{k#&RY|zGgiYyN zaY4B&1!8i>CXKVAO6+*gCXX{l%-Z)ws=T6fK}V~yyJ{evI9|(Nv zy^L0DBMoWgUT=1i=`GAxhN4(eTGG|m&ulJqKoe?-K_YyGM4c~FkkV;=`u*z+$_PjSU6G zIQDS5j7#r7xn9jDYFrOGMn`#6Ou|9yW+}JuN(qg4Y@SusCMX+85omLgGLm*^cf`dP zatBk9#(9sL%C=(J12Kl^A$x<8RwnS(Qf#5)pd)>OLn+~%HgCWIrIcHA&{;`2V0YjHRcMAwq?=43 zAgndaEilY6V{QvKGC^TevbU(0e+D$9MIGGo29lvL}aFwRyz+;yUx_*7MD zSmxu~Xch$=enGMwiOpQucVOa=^q^FUml#x?BJSK0@iOwwJtj@_(pq?x0B#vE4_L$HlY`U<3V%Eo*p7ndUF7!U`j^L_^9&3j->>8Z z)yD-r;qoeVT(zYa7j*>F(;Ysp&duJd+B=e;%_{YouyGy|F8)h-o^jW;#MoVox*{sO zYQ^dW6}649q1$uC^6sWKF@B{OtkrwaBkH=Y_@zj~^!p3=5Bt~xv7)FLi_~*A&qm^= zm3S*?i2A4-{@1E)Z}pwh@xP9^x)A2!&bPnVuW~-us8_#$eWSvJ|FgXBUjTdlL*B>w z{|l7@0GR}MU;jxv%)<09z)4v+0cK?>`V;o+yGpinG--7b2D+U z{`Yd6e_5slsBr!()cUK*`QJ3mEF6EOTAa-PkZQ3o{T+b%-_1q;mTEDxvM~UVeP;H* z%e9!t6+o5k3W=7 zu{YKkt}#%|>hd!^o3L2ty}O*Gh2pB=RmL}2@)VwVcG&I|I8)c1to9aBP~8(8CHlII z#lu*V2(HBX9aiy6ZogxwHTxHda(IRYux|)JD^ih^2VmIxLr|c&L*-$S)HRebNg?e4 zhI#fueIe26&)LR%SqHzm(hpme?1k|~@CL9*vrq7}YD_qBpt^CwlG&>%J<)U_N2@@NY4;}>E9pHVcp z=~~bG#_=fC{#WT#>X(N_L6bsLZC8UY0uw)G5{328fu>G~41Eg#-_v66(S#!)3!mGg zLqG@J*_;+4`5L^9fN&T+e`w!y5hWl;kJg4<(n83QTAm+Eb~WBN?1%>k2Y(f=CP5CE`ukCkNMvp84bhcQGY{EG zzA7>Em)^j&%_XDn6MVnKM}2oLxp>fza9Z00x|0|9d`30iGZ)w( zo8BMNF$1iU-vuN$56nr>OEp1%^Z~SdKShO$=NHdd<`OiC`ZrT|`=JPp(Yz%?;@*82 z1y6cm*>*npXRd7ho)m|-pMIY$yyvv|>x}r)v@%}9CR*qbIoU*su{_bZlYNgh8~OpS zfd=vnxq_TMzl1HjB8mx1Ymc7eK8U!qo9-Kn`OK^OB6t}XsVE#w=#a)6Eh*Etk}feT`QZedYmo4^af})3 zL=n1z{Z!xJ@80Qo(!9RrsOKp{IeeOJ^tfB`M86hslE1s|;2*1*_~-T&k_dr1jlE^} zHPGe4)n0-#&37TARmR-_EaQY-j=G)f3a(hqh%pAma~UlzVTZ13HBKi~d>axL%o4hrGu zBi_-*wYGy1S?6Cy#jmQGQV@P5c@T&dsEy~_O;4cw!uq3NHtY!<^IC77ao#mK-hh67 z`*YgoJb14CC9K_I`F+xoEJr+3%xVC*GFkI>i6jNZvA2KQ%ec-GSfRZR&ZP?cO~7@K@%;R9TZ=BlqYEmo>!5fz2eHfzLKULD+X+Kw6MvCN=&B`^j8 zJqa#CRWxOGYjCvhyr+OdK%d&6*xtBgb|g8H5;rau~aD{s^?Q} zm!Wv}jrmC<(ea>A;*|dgW>O9`MTa24IJw-^G<&pA)Z@skb-EMpu;k>OjyT4joHxoX zq!0-5Ix;uGi-PKhW+(--)FuXz&wlH?LfiJwa+F8E&q745S`wPG0;=5WUSisWOxhE; zyWv}RI5{Q}h*d&-QXhElLO;^rjg#Lm&c%VrSt zY5Q=2m1me=PBdBGUMzim6_JN$hZ708Jj(f1gewiz9v-(yNQYA>etGb%Eg$daVAgSN z?=1FcQ1?`e=Xz4xp#3UXGiY@V6E_HOW}rswk~W~G>cE^+`DALnak)!Ifo-vR#%`{N z5|5mXEwnV%hAV=~n*6wOZ3M?9Hs{s2l6oklI%RrQ3cq-BW$dEZi#qy{nT(m9mzK5D z<2%PmqC1?Pt`#VUGinzYNjF%Yb@t!gJkSpvVx;{3m$OK2X&+<58Mw}!sk5W5XghLB3)O2I(o=IJ zh;H;5b%2sjE)1>dJAo`~c9U}2aT9;XqdcC}zC11+ z?~@<2t={XmmQY)oF=X@ea5wzoV0xNJ@Ml3?$m;Ejae_V{9lQjFv=A%LpWod3^FB!+ z=%B?JZ}ZgM`bDVcs+3=@(F{M43IIzM?h#7tV&^{cxFR)i)C5Dz3FH!Cj*APcea3pi z@q9Y%{2SFx&79MA?&`l%#*SOKkln0}+LwdgBT4OuBhVG<;~~9!VAe{^^9D)~j4z)G zstJwhE2(K#1B>Z1&m*JA3o&oJa6V)(^=d^C^86;yZ{|yB>J)w;RF_U z6#&~dH@iRn+EOVJu`^@~=s6~N@@V@30>tjw$T367c?|$xc`cB;wX8Kbe!}mmqB~DXA06jjIJJ7&Aeb+ zlcAlhGRuokgV>R+a_TFS(h1`LHac3T(_V_E_*BM?(8O4{Oaj<^aK(G>#rQBjV!s;~ zAih?q2*=i&9wU2|9Fd*+7F#EXbf%$Rn%CuTno65+aUtej6mr&5vS5`A*FA1S#qI+;u?O-i8>l~bo zkkf+X>>{~fWrM}DP*jL(vc!@3*o6lfVpx?Rcjf{rPCIJ8LPk0cvge0vxYtci1!!ke z@UXz-&r#{`rb)>HlBd4ZUbW8K8X!;{?pYR_qz!e>+i4(d1Y9&C}28Xr%(0K zV#W>DjtWcb0hbg5%!z}$Zz+jw(3=R{>Q16->;0$)r89+;4aaPZ1xWKD+vLMeGnF6| z4osZ>NzS$t1EO$d)B3ro!H?5+Drt{OrL62>B0mXCSO^fA@PbWo|IixiiosikMT%Gt zSY@9=f(HuQx(<8hbuTX`#FSq4_&(XI|HxyRJ;$rx%0YpYNya}BJs9Z2WXjR7xf&m4 z4w?SG2~-Z8b+&(c$oBkaIAGj2^j1qogNUpipRcvOpu z?he7-9fAf(aCdiicLD@=cXxuj1UvKV-QBC#>OO1t>Gkc}tLjv}#gC_oKZE(avl#cd zuMu4F`z@J(M(M{SAx!pf$VzjKp6x^&>>~P7lKx?SHT8l(;$}=6ItL?aG&t?)amP-h zwL&-M$h4vz7*&Fz*B0iPpZHsNcvd|UGi8YnQBC4|iVb9auQB5Qy!JQNlA6XXia|!= z)yMYJ_|{Z+rxwX+j}U#q0{nTMX#yR;o8GWD4wcGMh^%LAdV7K)9sihXe!HMfGVDN- z-mlZn&E3E%iQfEmJF2;{!mPOu2chp#*5RnSw@`=YP*>a-LKvbJGYwv8V4Zv@<}r(% z6yV1`ur|nY7Ag&`Q@i3n2IO*(L(Yu6D=DOL2*+56JX(NdnhNdQU*Ida64H|SZFV|7 zyYdz{!g0eMAQE{Q+8!s+ZluKZG5|uGb+Ch^E5?WlwmMcS3THl3S`XL*xITSl4H(Fp z%}?%&!JZ6hfk(7M&YnzzaBjiG_{beun1%K<2z_wM<7CF){PdM6)L$na5Rl(rWp6&O zR#*sTx+5K7KE_2lOuKyoC)r}%!&8RS&~jSVV9;ita*V0(Vrz4;l7f^L;8(6ro*GAO zz;9B<3u|kVdzmJ+l-rIeKUyJX_#I03S)V{~&y9yx8<}j2?PnOv(n30|X!Y%YzTd7w zPx*)448j}lo-qZD47fCj!r5&MT2-;dpM3hI{XgvGKBl8Cu^c!a7+G{=R{Y^ zY?Kza2Qqs^VbxP9h4s^V>%VA2vOo((5l!Et-yLfr7Ny}&DOby@lhQ!N8GfeIq>dAi z%m$R+bZd)SrJJ#vRNCaXdtP6f;Yt#(f9D{<)NibtS94az2sta6xhyL?@K6!&5}VHm z5|${UezsS0jygX$S+6P~d)qHN;F76ZueXq&tq=q2RC|;tJFt*f>^?X75t+x0B_h3+ zIreIGV4$k;)uCHwJmYz^ZBu`oAj3|ih{%=Sc$#1#fFOm;m)K)WDfm#rW2}PmvaEbF z1H5e0OAgA<7SCR-N6!|I>Vr`^r|&%9cLJgK^ZPKfjyN*T%wdaO2_4vx;x)y#>0d8__Q@?<` zz`~M&sqkO4L-HOqN735Nh&QA4lES%jGjU)WJ;N7eu09$fF-DB=zz*CQ zpMF=p?&AKf@Y}=rwmtZH9igl0#yCvR%)@Z61z~8w22DJn-h^Y?3-icV!wcv~*~Es^cHZ~^wux!Z1Ip6vpr-LDhHlg^O)w%5t) z_%ho97LvaVl6a32jUf11T#>T9p_l?u`A&z*e$b0Xb8~9(z(zAZn3g(NAxAl&>x*wo z=_VeoCBu}$@qtfuV6ImdneG}vFVDTcof5Q^U$rRuZ1pYYBJGGU(S}uiIYQN(16K=6 z%P?A0Waf+r6st6r#u~*VJR9F+D6+z6-Byh6UEUwOflCuQg%I-!Qk|OMyK+>K&iHxL zaG5hAy~|{^GQ=|)HQ$0X^U*EiP2;ED+bL#Y)JtcJe*4dy;0WrSLmHo<2{T^bA1cf= zW1o>VUA1!3#E5%w8+F7r7u^i%7_H^BLk?>)j-#whV0VPGkT34;sY(!9?vNM^!tJy1 za296D$v&ZKf00`mbCMc9hOIK1mlvRo7V>$hccI^-u1A*%)AG=iJUoFk67arU?PdOq zy(H;wIuXQH>1j%*eRzBlsC^mV%S0%!I03>#`$)3xR)$|3eJ3iy#jT`E3S}+g=t(mY zp4qn3u>DfwLSK}8yVy|0ybGj9nCvZGhAW8XP*EQD*{c(q>kewhq~ zdLzbCJ5~740}fWepOnr0_dxUiKL#8?HV#l`m+h}(s;q#2JhRL49|j!UTuj`cWa?kW z8>}n<&UAg%f|lK^=+(xKQ*+=0wSfbv9SXFm7L86f}FE}Kq+jX zK=Yr%B>Fq4UEu#p?UI{Vnwc>Ijm$W?xr_|WSXj+C**T3(O@OQ%Kp+c%gVV^&6a@L^ z<}zhxH)Q8FW(BgC8FK-Q%s{+vP`IDVjGcoO__rGUH?zMSpyAP9jY#;HqX@X2E?%+j zESLe9fe~Bah%gqeGBq|Z}z`C@2O9JK}E zDG{2eaucm+U7G7A8xrP1vSpz4Q-7Y;V@oKQeLLYc zyd5IopmlL{JI8yf0qB7*V<-=gMV-b|XA^v2?tmzyG-KAwZ>a1WTefdrLr>>sOJ1wA z_P=#G3e{xVgZ$O%*Or_$$c7TJj1ujUc82oI*!9QXh1{BLITHW<_5|ZpjUpL7DJ%h) zy+d#l*DD?39HGyF_Al>C;F)o?7g?(SqX>C(Em07p(C zM*;&hZKE_K)iaFMe9=#Q;w8`IKUr-rciaNZw>47vahfoS`oD~EtM-;fS{rnhQ}x0F z)>T5sZ zS6z75MN2Z`nmfZEW)a-M+S^s*EDoDjio!x78Q(49g9JAxQ5zN(ghIl)dgW3~IRI;C zf$DVs-dqnMeEG#B4P28jGkzHASfsDpjtE$2Ic!cLau+{AS2r}Ie7FPRPT$deGM)XZ z^*qFFxL38?wfx4n-_$@DoE*FBizC<^cC*k|W?;12=)?7jsE*$qEkQJpvh`FS)Zb|p zL8dDs0W(r{8F$@}LAY1oDZOD{6eNosgSymxxQRAxrljCd?z>N3AXBxlM}LyGt4z+8 zpTKsy_teL=WM$lx9feZaqF6_>G#JBRR3onR8fAf+i8Dmj7aanqPo#9=^_m~$>ZaEI z6hZ{o>>LyNT?4<9*>FFOmCSP!BA?>i2!oGtjEYh2E(dBCiNo^>B|@|J#dhRV zEh~LC=w<~;pN6$q%fCsUfxjLl_6JE(Dx`|5W-tPy?9us4iZE!$?CES|vLw%DOGzVE zsV3P14Y7Z(;X%DNL~daWG*F`_3T!8hz@Mg-^w;pmQIgaEAcD(G9FgxfhK^AFr&n{2CqZhZH?6lc76y za3X7%d8Fv=%Ep(8L&r>;A)U__AooQ<)P*jFxkrg^8q7m(nH1Hqp%DpxkB%nmEjgpxXz)5T`;9TPneGvF zSPb7d=w?OXz$~WB2LEXj>763OLi=bw38(`su4RvOGWDFF`&b2AU&W3%G;&1DUCuoQ zsp;J`ROmm;hzz;t!wRm=T4@va`w6{z(3X7t$V^#0EO5$08SX0_Ay%wDp z`y3fm@upN3gfZoftm?ixR$G+%n-7hrmR0Zpo)e(G?rY7KDAw%(iO?2X0d;UE@QjMI z<&8kN+nWKb!uXybzNd6>=v0jhW9ad6+SjS4g{HxvpdnIH5pSED5Ihvcrn2qT2=u>jL{h$Huy#jX4xVD+#^hpO*+*p0G2rS?#(va3alePM^oUUq!4 zpzn3N=r(XC&%V`RdLPO&jr1(wZslTLf^C9JWjVj zsn4*9lvR?GVDVje!8K&tOzEJ7N%3Hu7}eHhRybZVkDLzBC(eS;z_?g$#Ech1w&M5` zJUT)rZ8Ns|Cu7^D&|)5FVd@N(D(6L6(Vb~4$%&vip>fWU8)BMV~Nob zHlbE_LP1d%>Bl?&vT&X(>gHeo)XPGGVds8RRd*^O8nUQXh8tm;+r#7XbS!2Pk8JTo zO3nB#q-yuDzVg0O`HF=nzBdSkj=L!2fE7KjVo8w9G=W^#IHnhI@}a?A9M0BQLL_(y zMjC-l&z&lHK6IINJT8!88n78%=6)R;s5}20JZuPa%cviD{_4eGySj(MlRWx)8X8g2 z{tNBL;?+E9Qs^4p+KP^^Q9Xs)&g^2+HnGth-Kr$H&3(o48VsSIW?D6W#iyICmN_Si zO=+*Vt7}Aa+Uc7OM=Cc$`O+*}wj&6^;2D0frt53` z`{P5`GflXz^ELIbtob?iyq7M%0Yn@ENvK3P^G)?f7Ys>Nw%Gk>wDcgoYv&f}o&rIC zvx11Bk4oQJQK)OTg&3FsCy{4cqkw&pZ#2s~_lOA#=ri5*6xjCsu2c#%OpEtuC06?> zB@U6NMZGau#%mFK=pWg?wST6awzEZFznjT+Au6$cZpx|BUd~|P-bk3$Rp*A(X`oa` zwDnex$7;hUzx6-oy68vqE2eNx1&bM{t>{rC6Qle}umTlh`!RvE%*j8~yAct2fKJ`u zk&9Sd2DvmutO5pM_jo!{uJlk?NF6Cuq6}|Q@dr7>wQ$<7%>*OQtp&oxU}VgIp?}Nfjz0_<+VD>1t8lH=}~pleZKKQuG(6$vN%N zF}Glod?-<-<;?Qy!vdPXbbo0#({E~#$8&cJJ zO;~X=`5I*v=vq!5X`OhGX6+bL?k~!K1!dmhfYe~SsltLWlDLvKlfL;VS!N%jO;R3v zCK4C-3S(O+J(3iOKpERpykXCdpLyu7i)b;lp^mV18)*I_mhUtDp#*tZDnZ$}h-ax=d#Y~h^Z5trRsH!OgeIo>k z14K*POOSP=U$mTd#7CwpTd#*QckwmlXyarH%BF>-two3D`40xI1ol|ZhTXR7Uw7W< z>BHZll9EhI5PY3KYcMq$v#aWR49T1|t(=--!9=;YTQD~Dch?L125ST2`V?_6Z#m}z zR+FnpzArchqv}ZV+Mu*INJK0B62juss9zsrVcrW`aiI?jDy`Ko3#gwu$=!$rx(~zR z^5yjeFWYC_T4TTF+BegYi^MfiH?rFi_r(R$yOtz)`$$x5ch1zj4-9kFI%HMMr$8_Ku`fOXpq*N!yzM<5}FVx!KAa++-S%$qo*S*u~&1QdM zgu!EGLK%U$e{WZ;pl;-X0JHg)eiF}hTV9v);9j6$6sP>UjQY|=Qebd)XAj+k!Faq} zNdWANUM53;@mnC@AkUI@)G`L6itMX9b!3O>Pkp{m^c8jdMga|fq4_`}NMh-MGoLR# zK#b>&pid&p;Ay^tZ@r&8=MCS_I?I1R&0eORr9J7u_(1cUCevvs&qBYjHBGOrndhRu zAE>L-)(jK;@#EY@D+}IQk4$k6a@R%UKDYE{t<~_aXP7Uk*(G1uK>anM&1e`@UTxIz4f}~1yY(xpQdQC$1PadL&ma;&+&EV( zu~xHjD-g5fM6I!Jo48(>@gkbNGtbJ1kq9MGT(9<<%H|cnmiZ~3QJh&oOWCAx`?h+< z@8|2~KHZ76Rzl9TnP;og*UAC4;S3s8YnrU?Jj^1>V;Y*bVB+U~w*Z+6z-iR7WdB82o_gMOU@0=)(K9 zOr0n;Cj8k^!rnJm7+RN+)5s@zq%P<7jr7Wa;SAhQWcf|$oEHpNlT=l-KaqLHH6-N& zomB92?Fs5-9Yj~uAQK1C&LSwhFv@sbew|iVsx|gd*0-srwgYR4nm|YHLpM6wQ+s`XC<&}+k1kz8BfxMnPVNN-Yn4yAD)6-)CY}emm%$p-vT;4e3G-dB;E{- z>GPHLJm0b+L(H}xm}i_r5+Rxb(_UlFF{Z0FokKz>PH74+epV{9tk*=NK_`oj|0v|} zxiFrS$Ux1Ec8b1LYhaN+;yYM5b@LbnN>K7L)HViOe2)0>jPP46VTevTWVyNE2H%Y( zPc@@h-JEm4wI5bg+8qQdk&lcAIhqf)%t`lyJW!isfeF zVKgJ=uqKgvupP`iX}^4>f~x9XlK|ipAGnD_iN31!0zA+rDX;u6^wdNklO)%O!3*oPcN88%L0OLLNdj_ zv?@O&fwRG+kQC8$geJFtU%53%OOj*Gs+LATy!w7^FL^$4=`%^!^u9s1e7So`dw^B7 zb0n-bU*-ND%USJ*tGM+J?zcT>`(KS0{-pg0P|Tf^g_Vn&0;q(^e=?$zb4ZESMKls#VSfRRxXgC&i2uyL|+{FN2{S<9ZH8O?XGI%SZe z+excp2bux#Xswu!;$ut)UX(4xC1^tt?CI%gDY)&hgw(68FtKx{ie1?`O?=@>4Xb@9 zH?zOX{Ts2=+WD%2#`_P}X?Kl54c&szPY;LD?QhB1el4EwvF?H|hh+_e47_B6?b%)J zzu%4(VEM(Goo$f%aavtWC5O%sq0=wfv}o6f^w+4-7=}E{mAA&I%#wHAFh|6*JAeHi zobP%ue3*s%nVX-28=wBpfEmr?h8gM^H<3E!b0+ZFzs1md`t&$jL*JOdl){Su(;mU{ za+OP_Aes^H&@r2HhiU(%-A?f_Zk>0RoMkY-cbOSj)aln+-iU8H8BP;MT%!u$WkXg3g94bH6Gyd&j@NaJo< zT%!T0q7qaqtXqw9!Wv8F+Cr*#~d(sk2lR|4LtcHG%TBhuyOi##EI5AWt zD5fz4N0$D|S+A#VoqmO^zWq@#Y6C#2S808*CD1<@lZ2`;3>LfwGhzl!QbOxVT-axU zFzs1_ZVVvxDv}}pNWSo#0Y-EaV%o+d&JdiyOKsCGLo)l$I{tWYb^IE5nz0VTg^Q~Q zS><#@g-r`2wQu@^Z}f)Eo?qFwqb#)XT6fl~S6z)fB0o~SoL!||dUEQz_i{YXpI;Gc zJVe8bJAso#rGDr6b&~r$zXjLk{0(4KGiw zsg2n{H!yD$wP>Wk^F*xTJ%~_&AFcfAW!V}x>HAsRYK)FOxrAC9`}{Q5haEji8@yu*oSIglIjI;{$yhDvb3WzI9aWz<)VWoIZ-L0o8U5%f zjS|RoC>$N0rSh)rk`6E3|Hcnk{IQNyjS~3wX|*#~wEa0(ut6);rsuAEu{qh=yfZq4 zbTmsO{vlRiD+Jc&gXDF<_$3`AFOHI4NNkpkXCELN)xH1#7ugmSq|h~CdQLsU-qx$J2`f<_^NIi1Vcc7NIL;l^2N$1;!{(z&rqA8{`N8=|QD+8- ze!PqP^mM%sejSW`WJ2~u`H;t?amk38SrVj%Cg1~GheMz)ae}F7^W&NBgPmd2M}mnX zF%3?5$2;Ui%axZoOD@3(AXurTnWdwHHe4%LXf@|io(2pr37q671BywQQBeg&#_k7M z9K%yuXzUXCv^9WjpX{_sFN4bp9_$$xl6jy*N`x4PA|BH16bNB}l=dB&RFHuk0$)-d zW0I}s91Vr7xSVs(c_|G?ue19VzE~wg)&cFY%rlcE>dN%jC07v7Hr>E4kNcjyKHhW#-vlNbseLx?$fX^w=Z0QZ?^5FtM2* zEJ5CyVaWSt|NKQWG%sET74=-iDbQd}A^%D#rYt)3=_H~*fk1rM^8u`983skcjhw1I z1u3Vr!bkPXiw$@B0Lp}EYDsE`2WNtn(@;^)bfwJpM<1xGPJn z%zn_d$8JZ)b?+LTwZai4+0b{0ZdjK_qG#;1$T1cIP`8(#uR~djCPwl~PMC}a**xC` zC$>gI5TlVssa9f{NEZ{nRBoQDS0OHQrRz#bXP70O`A7Q2$dwv?Np|aXr=H+`#A(G@ zb%4-fZYO%WS(YsZm9B!YyYpA&Ko?fDZS>Z%7Ip?jQB1YnV9hVW6h9TVT9in(8^6j# z0~#zRX2vUJX}FDL8b7W1ek_w^x1Q@SC-bzyRCngeB@3AN+K()4ub5aDFqxiaNr#*M zSeD3yBKZ+PuQ+$0WOWdT+(y3aY!@YVg4}idYn1g0UZI*7*hp$O$we&3fFhjkBUjn0 zNc1vTMp4zeqjd;f5NWyJM7nZkw2PbcDH-hY`qul4RXJ6xC9kUYaKo%;jw$sGmGLIU zut%%rP0O}+e(Y`VDYbMgr(T~GNB-hgV3ST7yb)AXUV^Fa2O|B`w0Wnm$`_Yb8dhUU zhQmc*(AX)qlHM!=uLtS|z_7v}I9nU5gI6=7@T^GZb3~l9l+wmpPm~@JT4#J1q~lLm(rq7Qpj(WjFobuCIyhcLJ2adS1w8nw`RHTLav^b+^2NOQ}C zEXlP1GoH-K_x-A-(}`Jpi2JmnPeYn|%2V;Z@K9LEkqOG|UR#WG_bq+oImOO;bh3^mqe9)q=|d;8O94Rp(aFSVfOKKMX`@RO zPYk)IH2QA6I&9Q)b_eC~jr2(W4{z&LQw&>)2=4V-Ef&HIF!0~?4Fijj(5}WEpY@iJ zpd;M^Jyx}7M=!59)eSVlhBa5L@D!jVikH?xzb-7WIW7N6v?1Kb&t#KXw)mN=S5lmw z9Ohk?Us|9yFHEh2u5GE6O$2I){GD0bs6h{U0si*xhvhH@!9(pmgsKQ;t)XISEgKEvkpZV=%=)T6 zm-o5kW}_|?`+nc>@Yj2Vi!b!|UjOo_&?jt!y@DPy-(NDc_s`0}_!g%+tq*F8(|VjK zF#(hl^JN{<>sxOu?)F}xS)X3I!h|kNM}w_skfB1eM61-G*Bz~+(MRF|waM6ZzN9l+ z2K0+os#j?$Nf!%^w9BwHqJbR8nDx^{=(Hfmfe^miBBHN4)unm#C%yr`W7e;w`MLjT2bQAK8w71ECo?zW=A*f;qOV($)Lzclle0((R|X? zi)cAGss2!4R2>fXS_`{uX@dsTXnoty==TY8O zQML(=D>C5vr3RL!@`$C&2){G#=Jrfb3(de4$O!}yywvJu-6bdyZ_QuXc`oqm?8AbW zuaqrJmwt~Ljjpp>72gXa9ZY$=m&{#!<98g>$+CXX6ldI^zHJPBsIESZbHZKD zya)q^m|_%caz76PwvlY*yjsI@xF5z|{(R`f-8K3f)WJGQ)L0WK(RMeYfz$Yb6bwmV zvH4fVLlbSXXnX56jYTV;d!52czzbkf9&ZxTbMV9E&hpbaifACz396}rdxVEVD(Rh; z2H&HzIpNi5i)EX=GG7mg$ixpj#&b{hFjUsoB$qw6Z&OQW=C(+OR>tx+TV*?Gnc7vM zib434*FVmq=TO4709yMaC@mym`wS1L$0WH#HPzW+)kHOZ&bfsUfz!ByLEBa9O+uup zh@ajFaD!k@J#z{_;WfU(A_zd5d_gSQs6|PT5fElZph&Xml7w+SeREeZ4|y!k^j;(#(&-B{o6lXd^>&t zWb7qzvj;;uH0(L|+L_+nFq=fj4R}H|2f?*nr*)(@?X*6WiZOcpej_gtc?Oim!C^q9 z+?>y1Ij86!36@@Y$JBfyh|IphYLn%sM9>Pbc{&PR{vK_buye9=Z~$3N zO<9Z$*-Tlu0W93iAhN0RA3qrXQ#IdT;|^H<@pL4pLJr8r1wtCIfzp3KE+#G(P9Pfz z5QKmDgM0w|pHUzF4+`*?ZbB17TYFbK7c+aOzY*mh4@rVV;rOFhj}r)D#{2>Y`O3MZ0U=hUpHLJKN!ZTW%=B+>%|C7{gS24#qrQ{-a$Vg2X(ZXvg{ zb1`)?Gc-13G`27`bYXP1Fg11g8(IFlmNFOMZ^+7W(FDzCofp+9#zx(k;r%2 z0R(N%gGwGlXFe0Y4T`TEZFYIrFZ({89kz3BULG92ul;&Wc?}x6I%p=o@NIi$+sM(N z43Cv_@w{ti26mly;&5^umCGFrrT=orboQvFkF(Gza;9?e0}`JHQ1(8G#+P@k`GkAg zSfl52$m5k^fV@%!y@nd~0iDX^oREr4CC(^yWh;4I78a-d&H!Z z*7t%g>`dbMznk26kSEyjxp5M0W>-}RS zVe4?co1hEtZ^TLr@P~j9EfdGuf12V1?tR@n@S&Y6+xh^8W;1a|S3|g$wiJ3Qy;G?> zoJKOCBN*o23?ptr6O)!@NR&Wnuq zJ)w`p2i6ueFk`FgWYlZjd-0^55@=<09OrgzQ<_XTzN-yFi%#GLELMg=F9hDZd5%xs zt=LDj$w_r*>j5T~EVMS;=hIGu>2S)O&Nk{;1_>`d(6{=q2m!B|D%c2D;Lro zUp6diSmt#=Uf-4^!QJ2qHj#31QHp_Sw%`L^4mSn7)o44bycHLl4W&f)75u7(4hoaV zbof9v%&xo0)GJIl;hd6Yfb6es2XYVfDdOx8{MvQFt^3|3=(NMRU0@ww(+EX=qPfs^ z6bI--55wAj@W932Dl|E7vOBXxt!~+(`n>}yWRl{VM>a`=bp~|`wlF?V_xP-rF@;L= zWi1(>2faI{c%sb2V;{d?qm!^Df)Z>Z_6MIwB0f|;0hxTp`6^XU!I@e~k5kXy=S{JR zZK2$#Ia{z4#NS)^4h3s3c@#3H7t@zp*OFi4;YPxJW(QbN+AKy`r}0_LIZ0LatqOqcZYDxMj58%M<*ZLBYo-iz5Pujs z2hT8(_p~>eNqoEHE@-2g`?@f0~4X)>1wQS%y@Dp-mZnxDIL`xQCsN;C5!r}Nu4U|+_B zAry4g5*xOHJPz@)Xa=2}cl)m)p~vk^ofFV%pH5Fcd~Qk{$kSxT=!Zek{-|4s?rd}~ zBaU2<8z?q^ILZQTJa099vf>DsV|2Rsj6Wk=KwEP-026q(M}o{pf$D+Cs;->po-p$j zOCb#V5&p66al`@en7w}Q>~8yM5xKHUq`X3S@N0qUcQp!#>KP*hA$W4qPeA=;&dKKQ zMg^WcO}sl?;h8MFtLiR|i;`lP=`1?m@)Lq9cIjX&pGJRMFgLvWsqFz z47ds=V<3tY!ZRdPx*&h6UwQDptRBpMN zWYT^5Vq?o*j?BAEVfQOY0oHYi2l9%l%?X%CQ?kr{o)p<)0}PP*ip%hHXF{GdQNRsN z8(st=q(I%m-|=0o90^cono}W(4svh;6ZS~5XF?#1s6I52#@EOoYQd@lLhZf4MX=$n zbK%rctSVbiXfO&0euuDf<402lF%%9BqKkg$7qy`EPJT2vlD~%ytsswX`P^vK@JrHc zs1P$t%S9(TfCZc|e(Ku)4%)!;yTA3SB<5B`e9(Tld2_;eCzo1doLk8xi4-Aal|lyH z!}3e)#ZHVPi-YxU;aCkMeruKgA%QN9=a7+6%TLO(@rbqwaF}bSSzo6Oo)n!Q4wK8_ zM# zSsxU6f6KWkQ8}KzcIRKZ?G}xGo%FmIb|cnZ2|#k;s*?4~iw##!hoUc@Im*wM)A>;%5#ol50AWAC|jvByJ|#FtwfJ<7Yan zJ0f|te|}>fkuOvrqAM`v99a=SKhL9q;}pH#IF& zPl`rvifZo$DP&kkGx>spigZ*8uTD8)x?M77s*#NW(SrbLmfT%P6(2E!S5++*sD>B? zzcL2AuyYF>28@Lp7*^3}tX zv}tXJgSUhrqsxdAXuH^lFCNeDx(Arha(q21j?WEL!%_a+2K}*qQMG+tq={gEXuyxH z$+JX(l6%1&Y>mOet~uqPKGYIDtMdh_hpA}TNXP8MkKZW++*TwL*pZe-TQF7+xC88D zxrV)s(VRuoXZFxs4&jz|EaQwtt^Mqv-^OE+Bb$9HQSd+-kq%fSq>42TTuy++KD_v? zIajdk#moHJQ1NhS1h&7aAO)W@hOd@=z+7|>59rVVEf?K5+qbrd|}A=uTUF z8+u-uiA&ZRz%rTWqqMklisv^aNZ6OX`v_iIoDZ9dMw>NcMRjAX+HqNS-+xyv>9wsb zEo(*0vV4KjNAXOOOTM;Kxudn@%e%64oU;MjUl(Nbc+^$#@bHJ)vrMt)uFBT6oEuI( zVmP4)PIbJ@`)CFLKNP9*`dZ%@!+;NPTzEoqUGwDPXm(eMPeclPpyeE^PU$i$V(oRm zN^()6rD`lFU~YW!n`o2!g3!~h3einEfV>6>y`n@1L+8+6ixK|}F!X%8e{*i%GRdfx zrw(r5x7_y(Otu5mZFOW>swWR#f6fSu?2$V_#vTM4`IY`#fT)G4>fPi4i4YfY@ID-p?-wA!)oa)h zY$tC4_QJ!W(feIXl2c8V;J7FJ!W~U8?9HOja(aP7)EXT;pmv`tWiryvh5K+RCe#nf zMHHnT5`>rh%CoLHid-?vmytIjeZiVc`B(tg5_A(HUTUpE+a~8{x&TqAX%yD%?cJZXS6^B zWQ*HI^(~rLI=_7ppIXZqj#@Q7iA&~_vXtw1W#1H`DT66xy8wC zX%F*zq>*;FIUV+;`cy?{L<~Q7u@i9=s#E#CH5c4se2VbFLd1CPu9mtN#CW*BS|Xit=hps9Op%hzAY3&4f{&~X@XLS$7w4v zE_bYEVz}Hxwcogyjn{f;9A`%?b&8)IE>gi$GjMl2m{;1(b33`+e$oZ=wu!5}FUjy@ z+Pt_WlY7_x%&lkc6tubSIsE)b%1?0(ib#L~gzqySGYnZ6k$M7(=o%UTor-j}Zv*@o z{wtDNKBvLF#7%~xX?jcv+52ryg4l{X1D>Pb5MxJ-zJ;_84P z>43;usxHjD=FLyu8*d$rr{~5GnCx~5Ua=!xPu6Q4&*tXt@35~0EY$ynEe*2A{$yL4 z1IPpdx^j^GLBIVcaHY8zrA$oiTtJ}*Ln9kgF-uSe(9lNM+1b>E$=2j={DObnq6gV1 ze{rZmaXJ9VmSzL~^H|h>SB<~e)u2KzCqtLNHLF?w6bGLJw6+i61hRmFhafYS8^Fm0 zYAEC22KkblTrB@Xa`T_(;s1SsoJ`&9txf-5)cJF)d=_>l01#x;{);Ke$;QbAa=EDT+JNloyhx)U;^a$(?qN-YP9H#4ab|W`6VTH`|H!}K^H!jk8|TQG4^=U``hmG*?Ib=-*U%e zR#VrDeeZ*@n~pJqt)E}lQ_U0aMz@B~{fK@3ez~Ae`>Xe*(OOP-wR$RIf+39Lx zZftU|ZnA&xypr}ZW~Ah+Z#R^6CNHswqvCDZPQ%wSH5Zv_?Lw2`++gS2=-}7WDOS54 zrs&FB*l2PMS?RZU=4q*NN`q+K`b}NpMK<`&>rUfoy*zG&hj*li*;s?Vn6GLz<5=Nw zu8I5$O6Y_Ai0v}wUnT%~6Rf00CS0~BnQ9-y6G0PzpI}fys^N4aH?FHoF_6CL$c2jK z0UTf1igKIc;FrkvM*^ONQ+>K%gB3!EH@M`A_{K`Dx$Grf>z;6*z*s8+HFG zL3f0je?^GyHvRy2K>NK{n%Y!l&T-1#w$M?O`kIz-1bY5{;rJBAi>J({a+=*^{^UOB zhEydgxH|1)M6EWi=6acC4!?yxTh*`a7B`)Kvsvmb1$vxvm$|-+^~ki-HaePdC)`wE=cbLxmLXS1Q*?_Z9s968?Mdr;G8w`60i&54t(XR zGl;V9~i=0@zJHT`7BV$O>*TPgj?^m7n0qAI6LoiO1G*k-4lxPzj6Yay_a z5F=A!v7q;(T*q;fqQ_Ne-jwtiJ+Sw8Qxhq#y@Y_YBCR&-#G-vd`wvAe<5iw7k)vjc z-+rBHNm2p8h$7k{7*N3tjJ_f1fTtkF^ho50qOqt1r!3%u1%Vy#5Z>$C_f66yP#7Fv$apm%%ALL0$GoUO_)K z=x9M+`kW>B;>m)yUI`@?0vcm8A9>IC>43=RKu za=u2QP_uYOn!(IDUC@H_KMurIX%ipKbYLR4~4$D^7<{7RZX?=QLI(8}cHz zTCRs*r?mA;WzacA2+wyv47{V7kzzlyku4~paW6j>G1I~1o8}qXx+0gZ zulsr4_y0c6`+5F%AAOGVv(7qufA`vJueJADYm+}sds1k=uFxs`Wc6LVP(h6Pe4R0v zB46BJ@$ToW>e)4y3w}*Nb>JJmPUV!R}{D z?dh$MkLDj~sm3M`_p9#DzLT0GaPr1d+krbXqwzUHbd++g0y$#fkQ=7Vp>*8 zh8`tH55>4QY53bIj6}1~2s)mFG(1Yox6bp=KHm~2yZ&xS_MFG3x5+ z++4}!>|)QA90e*L-ZCVF{0>&++(r4>` zDlD)FWoP47W`)dHRf=HZIAzS)oC7zLhtk*)Qq272hM61pUiil^pL}?@?0Q(~vEzcY zjVnsGfs1qJnD=>@y|xfeiNFZZ>GI2_B(tT_obbPkKdUiuO)#%rlS5FQbNkl5R1wqg z8$I0MK{~RTIRU$u1vk{qgdm55;erNr^IKCc`rlyIo4Oa@-zuiFQq)z6I&4k<%I<(< zH*byUNKbK#n}Xqrd9L${c@NX%<)ryqtJV)&(s@>P>+`0QcMAl(&I*1x_V5Bfm@$cK zO8n(T+7ubu_`aMFQ`nlrHm{t_l|%Fl43=-hC9G|yHToner9=eW>TK|%x{uTOB(;so zRAyAMo4Qvg{poV$C?uO+wDtItw`YF6?aG(St#i_IH6bFl7;~_5>bv@VJm(p3$?A_Y zl}D~he0tw~o}#iDMf=-E zb3b;(M5>H)e2=esCJTCeOTP3*YBJ-L_XE7~6b#g3OhbLmueSJGxRH&APz!~s<(o5K z*;>Q`hes$M(tHU1$W*hsN z&N$PgTz2h;jBgYJE#(RxWZjfX6uIx_1ya!Sj5Lv7+R^zMC#@C^ zAFx%UtH>_&y6khe$Uw(n`sphS1y9zM~zci1`59L9=<(sG4{62%L!Q4B_C)Q@6^4{aE=rPDu)TTn$cVn#fHIX1a(e(iU#IvPFLvp(2t7r6=Z4$u zV4h*I_zd^%4+lJ6AK;iT1T|^;O&tAhQE~EH@H1426WdX;7XJqMP4+7QSx2cv5 zyWGX>EJgG+?cd8Ojp-huHdTLj(}+*WKx&FEDavO>p1#m=ex(Cs;@$G10%BsFQasvKCIeajJ#M{NqB zuZ0v=_;N=gW2rB5OlI~V9y4Ak=LfqFYu0?8Txc2#oZ{~^xhoxhrC~M!510;{%gQ-aGgdiW%3L3_&;AZ1 z&aq|$JTzBhcU9Y6QNy#B#Cy1L zWrTYuI;O=GRQ-kR=f$dnn_PpB`mHwo%KN6W@^b_g+Sc(37bE7nPKl}Mp{N~WC@c*` z8x{;Fv8aybw;E5j#YeE8!#sez7aYax;>%f&32An$K}GD3e6O2xqV;6H7rl==QtDVp zET)`NW?Z?{S%>(joD7~Wi~M2B$3Obb@t%#!Xv$c4)xwxTugwIzwxztdl=0=!=J#q9 z&nTVW-){A)?rRi7mG#katY})glxs9CvG#%>vci{J6<((CZrTJ$op z@RK*0d_F!};K|fIkxmhH>Ze1NR7bN{fSEL0M@fnj#d2Y$HJF)QJZ{+Q18u~K=U~Gj zm%^v&qo3kB%jlvmS#VHqO3915)XsfV2Pv49bI(v-<=gG-+ z;lRa0*PokEwRb@q&tG)!yLW~E;`zt$vp_+J^9r|*M4?WUvUU%)Tu!y4jufq%yKj~b zO^}Fnv^pH`XL%+fw+4Gs2DO-^E99n!SXS*)dT~_B^1KG!LGeCt{1V4yw`KCX)2a&b zi4w~Q?#?%=O4kF&9|$mqMI_)K8|@agLq<*A9y{copg3dGH` zq}>w}Oqkj1?R8VR&U}o)buKG(p0N)uILDH~8W$RUEHQC0OMxQoglzij$kpJt{7!Z` zha{>Tn_~KH#Du>gZ8rIMKDdM&5^3YVEb?-`_Gz0VeRW;%@|fF_!n44Q(a9;rpMl?& z7dD^$9Qe8LyyT;cMeX45aP8s!hdtgGpWFTf_pxYycTYgV^{ZaOmqU3`K6c{oLL6I3C9^ zC5{@$OwB+2w5F2XhZ%=uw@7|}V;tCCy16c=fj4^pv-Wkl-eT}yI_J!Fh&FxkmXnJ!| z<|T*hPoBp<+m2)-+uE?}QvcuxYxe<`4#wV=K~~S!!_5nCZR;T*FE6WuceB>F^%O9X z)loeuAbZZ%*Hb`N(-k08*?B#&^QsAKda3z(s_T1VJZ%XdRfh@?j>z;B6c}VLXj?hi zT6+>6UqA{FwzP?lPr6}=&rSm2!-QuHvM1pJgtHRDZ@}RXiH^YFjIE6$M#arnz=W`S z2ZZelpkRb;wi5sc;E>8gfUw~Sd`jOF?`7?&gTWIYf*52;zY0Kr#0S!s+G1_otehD3 z)`a-K(|ZP4b)Y~4u|~sx5{aGu14w{@q>Y{C{~Z>}Sgad>gbA1ky8tn7Mh}SLCv+Ux zr6j!&u?H$wklqnd0}^70?;wOtKRp2m@v8vDNbiUP1C-Jxy(4iU9!da|BrXsV7vjFE z9uWCVq$J@j03~sOlDI%gT!3>u!WRLjSHu?*7vN@6!aEqLEie)n7^y8V5*HYW3vk3k zq$F{Hk+{G}Two+Fa1s|di3^;_<#%a;6B+In7w|t97dYXo333BSFe$U*|Gu~Yq66GX z3j6@Q{m)IJKSc))%qJpT3c$aAK8=2f4x9ugoCGGE1SWz6CV~VeVh@)RuuSB2(>i-j8NL+x#9pXC@7ZiyLio^v);sO+pB9Nd-T+k#g zXc8A7=Y{w;5*Hwij`)tm1x@0DCUHTNxPXawSp&-v@eXIgD~S;pxSxRVSupWl4Zwioj!8?Wnc*k-8@0bqY9oqp&rz8#5 zj`aYB5C`)wgFrGRb`JvLZw7&Ab^I64@BgOfZ>NoI-DiByoez_<_ z>-XQ_{{jAv8vx$%1He0u02sD27$jHVub}TJx4-&@=)VJVKlXWA5yDV&END3@AfM(mOlO7j*AH1@ezSgV8Zji zpigob_n`l~&%GOcqI3Cg^#4GA$IAw8+S`jRabWhK`@7${2VH_Q{67=j|DdP2voitS z*_r_F>`j1oHYb3BN_%i7?Nsc+`FGcnI1;}Z+{9gt|Cu=dZ~6B-+dE+NjxO2R-~j{2 zFS~UHX}4z&+Q0jjd(i&(x(EUE?jJg1XNwH7vqc6WZIS)1nIWXzvOOsO?nLfFnQ-yv z|5V-aza!J6i+h2ytDOx-(rv4MS^t3ga0Kz*gYxfQ;~td%Ez7^lG6Y20lp>Yh|0}wr zo!Z^#LVouSccV+()cqf%mm$FJG~quWW&g4D4=5%`AO=1}+7^fG9OpuaJJN*b#C;Cn zbq9CS&g@@w2WgXb5AMJFg}ZSl?&tph8uwqP;5$3nkYDHEq@8TwteoVhLw+5F@0^80 zNSm>L!Jo7*y9fW@J;&Yn6Sr{p;O{{QdjM)83IJ;Vl%oxB;{WRmg(xGW4H*HVPp>CH za$yBXJ{GXOzq7AEYA?{fKjI^Zg7v2@1R?Gf{|CMsymPh>-Z`rW?;ODc*I^Kw1Kw!} zPdFBlmE zY2O0Cb=LwQpji$wj^22TJ;nuZn+gJh${>*lg5yS{b%)r1!L~4zlP3&_k0EvO z7f0ZbO9l<3!V>nUiNyY{Xc*2KVddft1tLXAyGef#!-0Fj!AK~)-D*ZjgvbZ1O{5WizggO zEWJq(S|YIn6oiL3yP%(@VEEF>?MZ4Wl%sq=&v^0+CzOEp>Tw!4SsK%p=e^!KVV`JTj7necJy%c zL^xrgE_)b55kTTL8c8rPh{RYM7h43#-yZ9a1BPQ47*H4?4IWA`wu!`eyr;XXovQ~S z%x4cV1ONjLLJ;-|iNwAj90=j$WCe#f?Ii~0rVJW}L=wJ`NbPU!?*enM^00S=;RQ@~ zX6)X9Mq#bMw$|1#Z#Qe3y=1!v+RGp13rBg`dcbS|so2F6sHG%>0B)uKH5}gVo*+js z3S`*}HqdTmW!)H2@H7888w~SP6*OI{8`o zU_3qjeXSw(dx&8`Rbn7(o#0>*i6QP*wlEJb4=;bb+a6-Tc9lWGkOaj_B*sAfT|F@{ z8$S>V0BuLb@5RB<+so75*2W#@Xt$SY7YtZeINsS7=L7O{09gK7F81<7J0r0+SSweY zi!Y#`_RsGSAh8&UCahq@2IHL2 zu2$~$&VE?rKi~-g)Fm82aMMY>gCpJX*1pcZ7!N>tcDDcl%sCJes7ks+?P`m$^8(pH zvEELAa@|c06tR{;fd1r-^s}*cvUjq#b;iO0>YY`8Z}0vE-Cuj>jlrW)u25GWggs$7 z+Rb!V_mIAhI3ITm*cD?(5V~E|#O?vo@k=m}J}5BC!5QiXb_cY?Zfe5BLqQ0|G)U0d zdO%&^cssl|%-0>D-Z5tOcJE)%{k40p2x})i9D?(L0=ut!neOVIjW5Olg-0VmepX(4 zsdsk|;p1m(1G94SLs;4Fr3RJ)VDt#lJw(C4f^6WvPlXkew=!xZQp9E~O%RFP!U28OW1+xlW~V5hy*2%rQ52!tkVP7|pi?%w|1 z4lpdBkpcU5H*W}`7&8K)5-Z}$Kz0_h0#hWLBAfc^m; zNox_d7KvQ{1vOD?5dtQO#P)cw3kZ;AZ?HE(RqSd4Nof(zuZhGM6y6%)?dRd(0|J)D zJ;YG344hcWghcINZ-?}D!Jx3NR)k5ii#1?d$v_DA`R(v_^l^fEdDsKywi{qy{<6OJ zVu7=>wuYi?+%SH?9N0?-18l25wUCDc9OLF=i$g$N{t+=yCjteA|Is}J%m!-@a`kuf zB^WBZn}7fTWo$r%lF_8@xdHW(F)k1fkS~NFM!O6J7#c7ifx_dzW;M(n4fc0~*m@G= zc*mvK+qu7``l}Qp?O-4Ww6B*l5=u}LyIJm%Vh?KvUyvUl$-Z7hAOO?>xBOQFfa*;E z5Ck8QILv<5o=A7#sz4tb4}!SuVhuw8!~C1bBc0JewIyeFD{l-z9q*!sppY`q-}DvQ z&(;a=;g0af0BX<#FxvmpkUwqne?j+GEHH3qYZq4>439z(R>$2;cVXcPcJ>4&Gu#vB zPMD*+sQ1ihKbVglusYfKyAsx>UDO1_7zRcY95^C$2wzWII1&r>lb5e+K60>JIa;L3ucP{v)ot`Ui2e_d()tE^v?wU=r?b0|F?54tNlM=pZL7 z#Kr~h3-j`~Cd|@ZEe5WO1oSbK5IjNb9}eM!a75U8*m*es9>s2IFdF(7G~BIG7?2kT z0>co5ZpYi*3&!7*?ZyIT?dRhL23t9R0dHv!QveGT97$LPiS4y_b9Z!bb@FoZv&ZhG z-eXzd9kF)aa4Q>6Kw0hK4F$|t1Qhy*{|biT?LBZ{XMcADK^yKk@q4@XFX(pl&l%wk z#(JSVyrFIcdE3o(*H{ByrU%*qRqY)TDV0{X@rkW5HH#4pvxqH=~Q{0cCNNqm>pq6c5~g;KYO?> z7-5TZbb?wDthZg%yJgwUAL)ws$J+YYyZh{=2KEPJAjC~_qG))#_@Xdwcqj&r04%3p zdoFv2?_bdE?j9Zo_}h*+lp_pi!XB=>x`+33aI>>@!~tRqOzhp%ySwL%hIv~fY^^+O zApd|jVL?R$cgX&7UTk1C&Yt#m7#~|eB?G+w+3;aqaSqE-~10rt&q)(Bt&0)@p8~ zXAfH|XL}nw5xKwi4hn|LKtY6CFGy+t!lkuDe*$jZwb33Uf{ANEiK*Rg<*#GO{6ym?|Et`NMnmkZVlFq3yv zLy&-?{bL38hFBqOKyVuzf(YDBeDdD*I-&in{h)Y%9}Hm7ne6Nj{;{kBKKEbR>t+M; zb?~wFcXdY)Fx$;_S9_uMo>&`O54g1}9$2Y&Qv+wKzf6YTw+sQZ^4FFjDc$G<2B^O1 zW>46#wFgr30N<0a;4{do+Ij#vUl39}>hBx~1G%&5c-j_g@96+!p#d5lIR5^-OM+2o zH0&=0odW4SIhy)#=e@p3-_(R88?mv`L2pV+)4yY)&z{-7_XpyV?Ind)`r>YES`Pw!<>vwnpf^Qi^DY zcuVfRx;gl07(GZ6_{#W_aFMF{duuI+XBIl*Ompa!I}f>PpCzb=;NVSbb>0u`6yn}C zj%HZwUp+b)V-xCfRjk&hS68E6MJE+w4rE2z6+C9kA8mHv z&!jAUFW^2bIsIWD+Ro>&ZrvqS8V7m`Uyp93bD_}`k$1={8DRV2rq4@n)w@Vgf2TR| z5f>T+ON*Y&IyN}9wG zwvL?rWJ0%bnma}{NSk#{m96h;#x(Wq!3X!@RF3|2N-KCaS4_o=jrZ#vm&GPf4w@HG zUcLrg#(GU&@t|1;&EpdH)nNfD$;o`|tXiiAi&Wht9Y#OjKAi5L>9g>n@@b%ipk|5w z^V!O+i36;DdRlZDvN1HTPV(StE0XNK?DGxtjNlo(*FDdfCVDH|TBO6tq4KI-S5Nzy z@?yI#cE)MqPi{AzZ;@EIf#VEY$J3MbBa*Q98s(22C-1#u@-)SZ1clqRAYNfZ+r=Z4 zr)5?pN53#&rB%G3yt9QmALgGzM!E|f*WT8De4gk(5*c`K7U}EBI!=9uc2K8;RoE?Z z>t5KH0RM43)wtT7izj5KMUXfit7BR^y&6jK7kRs2H*RSjh<@s1=hb2A`KIWpBUDHE zeAB!mP{@QwTD!;`^q3jd_oYJpu;gmZx5cU(XCr!P8pa%`Us=m0GIh~)m)7?vukSOa zxUHX{_=5ja!m{|fG*&n6RVb_a=lkmiws;j{6F&7XyKm71vyZ=khR=p};-dTvCr5bp z9m{4k;eYPo_8s%4K4mW5FyY*~?UMwG2TkO*>XI)#4dOPCL+T@xF70&D{UBCRX0Atf zV$-?ZB;F-_aDGuEbM`3G7N2y9-L-NnR-RS+44Y=orGSBCRhb?G0lYi)oy&(rD^Hq? zb>EDyq%hg2xGBWnyx6VVcOl7zz30X#!>h}&3szXoYtJqi=p`kKta$QfoOyGBg8iJo zc)ksL{g+}9T@5}gd)2yb6O!w))R&wWLp4bf)gP|Q9_BqSeYo{Bm?OYN#0kD2 zhqo~~h3ZN9%k7|h7uw_5bTzH-Efx+ zsm4qn%~L(*xK!u3f$_87N+H^eC~qSKPao;Q4t>z8oLo zsP}W@$AY$wWB$b#8zHToq4#cWBT^#V9(R8jFR*H)D!#9Vj6B2ZK8^p{iI$T@VB0>&F264t);u|bCFQ`5Ah$#KP|+@SjL`X(3le6 zq!uS$8)G-b4fR`@k5wg zXTF-M1|?w58kxa!3LC~0KerKvfx9EpALr{>-uV8mk+rRh+90 znR50)R)=_RH@1p@NCnD|ENstOUTIsf->lBu4A5SzdjVWx&O5WUG2Iq2-26RcWA5r= z<}vJY+|RjpL8}h^-ydy4Up>Qzv^m*Rd>5$nSqi6fPL*p4>aOiHn;&NEpz%rGRL{y# z{`v4Z59Qb9pyls=l;4l9ZbnXIZhpPcvz;vK^O35T{s$w~woB9r>1Qh1h#}{psSh*5 zUt!lXtvsGFURaFSN(~jaC-XU}axFddY4#$^C(-i!%P;$Db@?w@d=U&j8hK;xWU0=b z9_~wJ&C051`cW5(`#geCWfEr8P!T1QVTpWRhuAlH3N;whHci?do?WZ>Z6^DyFBF4an;I zU--}~*l><4ight#EFM7{ckzWX|H=|YeBKF`_}uD;?%C7ot8gckfF6Aob@@<4mKTft z>r1{I>l4o{`R=Ow^hW4HC~e7^@L543aS}8xS_L0FE%_;Hl!E-A6?xe)Wcw2s!cwE_ z;T*-Ea6Q+*bmI>jcb;hT^M6U+rCc+ra7pax$1pv&Z<^OA<)bkfEU(0$eze-a)GKzT zGtS-8t*fTCdrAg13%w~*f11nk2P3GhKc6bsj-uU^flK-MkYauLN96+U@t~YdKA--~ z+u}d=2b+o%idhTH=7`ksp9yp3GNr~%G^Q{aQkz0Q%`PqQtJ7ppgdj3O=?koE-?QCS zjy+AWpzrteykC+Tr}nKZ7+R5__P8)6Py5NCmpm>jO~x^9WC%{OopwQs}FvByznLSqvErW;O(uSA?wRW zU$uusJk6i-m$BuqVtD%Hh%uv~ps6IzwlQVDA-O3aQVrX0;L1y!Ij1M>@1Af3t-~zc zs<7c2UHJ0@S7UO& z!KeawFDdWa5D|TgMGm5cU!H7#=Pp+1@xk=RtET#D+ex^xxR^H4ONKrSPW||@ z>9niT-e<&;`>(e2J}-RP|H^wsREay9?1=bFE1fQ@&71j|r}Xq59)EMTvifYIXW)X# zG5@Gdt}Wh0=EG?xMpqliqG=BuwalX4cl);1vak0^1OK$QRt9LRQNwGT9M{kC>Y*G@ z{CwiR;b+|(ZUJcuy4uBgh0IK-hb89n?CGA-eL2}i;QI+0eCJRXRC;-DMo|{SO{O$QjEHHOM+HFMj+?sVd_l>E|GyIzWojqO2VekLNu}@KDV4L zW)g|PRirFjOXNxId^h2-A_I9SrHJW_f?g}6t}i(e#+=@*+QQ82NL-w798I12uGu2TizrJVk`Q&M*Tb-Xy=_C(v_aoLCPGn0*^WJu%rcfRh zXX>OYe zx$Efh>dAve#t>`Ah^@De`CGV3gJvS%F$M=FN)=~ZkPjN|ei~HXSqJ%2kgMvxEcG!c z$kKCTh@M}N^PpfbgN6@_@7(iamPUt<$P0&E|CU&<$#MI>6HTwGS$VGR%nj3WT@LEY z&*}8iLl*|H=R9POFGmJ;uDO72hFhB@j3|q-Z9V`*X;a>(^ic+j+`I<${40S_s+#jH zPUV|ERFqT$v}ftgspM0UE2nG~ycFa(=2cc+o^xIY>b?(*dJt=n{0J%>Y%fLm)~3v4 zo=*q8FaLCtyg~!^(f3NF2g5oq?ml6D(OK+P_auMf=X(WbH{Tq3rXR#TJ(Hf_^8GB&Se-PLGDkO zp*A{4K$`J^HzdzdsYxCSwUuU0(fSZg1+lY>Y_jvnLP?u@$4pK7DBvY?hBq>`Q-do% zId9w#`E=F(nNLG(Zo1{;VpKYf zJu>kl%!H=#a6$bs(~=VdXLUIu>pPUqC&DD5HiH{s#q2BZMV_a;`l9mct<+Y}()6ci z+R4Vc`&55QiF%aS#6Ec^a1!xGe)tp|T4eS0=#2iLp7w*AR~G5n2ESa-5XheLHxIuB z)g!0ndY6n1)acSU#^G6dMp?JKfrnp7H}lmyD=4(AY-|jAQ?&kYl?`knaH2w5A*ZYY ze{-w)w($1TqMVA+Z{M_k2v!%K53 z-x16;1_M{_I1@4BWMPUIu=Wv{WMQa(Dw%1RwZ=X5^yny)eHuFUcFlN8EF?$*KRdX& zKhxspjM*&(v*?M<@q3M?L!W(>jmB$Q#-=(%so@tk-@QELjA$|Z+Ie;9YF_k6n`P&I zW=)HViRETaS^vZgH5uBrfXK|qQQaE{G4OG$%pqU;Ygnx#Bl}oOK=e;eF%9OkJSyPl zPiz0w9UyfiKVPELIHPpow71aRVcQ42TM?%k*qRr7%x+5Zi}eg>&97h#8H@eN#ar|0 zOSsjZLJq;0eLwR8H`coa9V*JH?hKsUXXOAL?<`dk9+u2H;*GtRtLA-6o%hWfohQdL zcswrm-`K`nOQ^aUXs+P9A94I+EL3P*|LLRnZy!z}u(e;V2yDHj-eADipExz#RMpjL z7;GNWHq&)qHrTU`_eCemdP11-v5~8Fhw`;DAKoq0D+=aF$e1_lyQBbHHOyxv{Y>~RDv=zJJ6_u zo!;M^o4J)C$0WxMF* zanV%jW$_JqSrH?$7|!?&#>J}@k>5aZt2a1P5$7FK9UG$eN8tl*oLdNUpj1|9f>&`; zl3AMuOn;xV{1Kq6cGxZhpZe@`;_*cp1?kMj7|;OaV-{Mq<4<)}8U%yexX9{gj-)Y* zhAm5|?E`0|o>S;E)DMk+SHCrIHv0H!t{SGU=10ZOFQgS!qvb`l52zZxRS4{S+wDKd zNdJ*tfK}()v#hM7(~<@5abmu*M#IMri<{TYH)}qkh!xDwrL^W!;^x0xkv(&NIy=X{ zlXlby_Nj_mFd;cxltYo-+md}qlg0efoco&(qX>P%2~&(P}|_hY?GL;bXhq+3gNz znv810fhhC+uPkaywSTT)wpgw-o=43JR{2d)ep`AW_jq_4B_@0Ox&`OA(S{{vbUb5b zz}ets%B{Eix#}e3zs-HK5Gbk11gq23sYkJf@wU%kwnGtb4#(GmV`uJ>7^ax$Mw5w|PuB{f+F zEB`H)CHNx)+*0i%{Ps8hZ_6XY&uMUsoNXoATR|QC`;TvZG2ZBneL5?8aOuUg+{PCv z?G`TNn25`*a_$mtxrfqgUu8M#E|>@4*V@xwA7sq?%Dp@Rr9CVA!}7<(^88Wq(T|p# z@G8m=^B?KDACsq*yvtjtHwrj$SR^y);^%}fw8c!5`?sjd`zYV0VGJl|WgEV(7jO!U zl7DX%R|&gLd$8lx;RrTM(IY})!XKrd$yN_#nYfQ0Vv;duF`+e2diGq9s|soCHt>X( z*1Z`MG%IcclC5|g*_(DnIEt*R*S<Zs1`pi91!U+$O5wkeSCtIC5)XtGJjW?4yuk$JM zRNoI@8PP+*7#QA-u{)@$9O_>6)-CDb#m3xunf6k`PHJPQ=z;I-L!Y74{y1)^XIx!1O?K@ewotvO3Z-r9KI|!TS?wmw9|ZA zE&+7QFAV4^>*w0TrfftD?%1*M#d2j_@HYR+Lz^D*g-ggn462^mk+BxM+&#4UX&-D#iFg=&`t_pcg=KEC?ocz0N(?g%Vyc>XKb z5qhByaiyyjIL_<(7ZtBCm{qdkxL2E;6FOglR~{u6+A{}7ETq^zwzq%ackx9PZdB#< z!jZIRoZ>&e){i|}e`g#TKv#c=iK8+!vs|a_q|e$*G2W6&dtBQ4wv)Nh^lCPE{r*?u z8hTQ$aWC$^zNTS1*Xv9%q#vPoAu&VYuH$1Km3^&L&^F(fjg4#bxRluF>aXqVzK{jl zjUNX-4!s%mj^Afw@yK~4I_#)+{4Ms_B{66R>T6!79H@@H2K%kCHH9hROj-wU6E8!i zvGR}WG6Gvik1!4lKr}mCiYW3lM8`H+U`kEhhfTBsid>&-v5$DZfhL#Q_4J;ubyK%H z#(4Dk+fsH;#^b1suCEJAHA8OlT(=&MtvX`+3N*X;ks*aaxUGV|2j`FzZDZ@)Ss@&% zdiU=RL}IV0JfzVrS*2>%s#-lSl*PtcuPk^i;@mt{XI6qkvvN|(+9lR7V+P#i+KiGi z<;&$?k|SNbM-p4YwHmr?3b&RLPC-{MJesXm=M2gyFLRpPN`d;+`18Ey>a2U9-C4Mz zCbGEyc9~7zqa{R*$#L5!1Em#+JkGpIr^oYYVF?|+G~Ri9^F|UHapX+N;WgKr6Nl{D z+qEV_(l3Wy8bNz{(@;-m6?q=?5;$IX@q3w1`^U?93@cT-cOS1_?NXlh&DG6V;63~G z+V#_JUiYUDw^Q4>Gkgp!;Sa|q_GZ&~Ygn`BLZ2SyQ#53mEhbkwo3avjvx&0KWAcV? z%^55?MjjlzUOJjoeQKSL4_un>Fp?$o9Z3yW3Zp;r9j;v0_$cg3g*%lg@Hr zvgrw7ijhGXhlekq={@9+3$t^W1#VRxqA0Qok8Lq@l)HPr9I6ra!4gW*IUt;`&wh5I z-CCh`)79y{PmPM)_A5E$+gkC(>n72sYv4?6Q_(5X9oM^-(M)rhzN0TR`{{(v@K(3K zjX{ZXb>Q9Qe_T#rXiW}HWj&zz9i-pvOP$r2xT@UMo+SQKH(>aX#2qi$_C6eS$S95L zkNee`Le~^iSM$1$e%yNLZm8gx2D>*TN~UA}9>Sf)a57z|?whJP%-`j5rt9FFKF59g z+y;&I&-!M4#zD&j?^u52zgkFhbklpTdB93w#Rs3Wb+oeI@VvAsDz7X<#Kq0^TF6iT z0sfT$6f1j2-=X*E-xN2f*5Km>fgz!?93!{HZ_0nZIXJ?IgHa5mNme9&y^@~w>Ba$@ z$IsS|wfD|t#qke!&W&t_xcl1k(1j`FkIwX)jC*+4Jvh~6`V9d#OZj*|Ip(wO1j9z$ zP~p=M`>NZD&29bT$4}0v#O$YETT&Euy2!o$C|PD?;Kb|MnyFj`wHE^^H6M_U_QyhP zdgDH(y^feGC~#jJ^Dy{u@U-C)({N{XsXyP5l$=p^iiMP_+Q>wSNvUa=uK69_!cyI= z+tM9+hT0Y!zBz;S^`e4(9#n&zk1jl~b$cn`gi)UyZ;JKzYr6YfJcM$RPY$^D0s6cy zDWN354a__yb?RkY({bpg`q0+XBUUH*8>eA~fzHvzo)i$z3YDudMvM;Ry zb2>jD;$a0JEni<{inWeTrcvoNZtP3`ILSA#Nzw52fk{~d_tu4=xw(ri&c$1K_N*I& zx(uu?iatyNvml@{`=hTvpGH!-aoDV=DsQ6w#`~K50&myUlas98jW*=9r{JZXK7(9joR>%B_Voo08mcJI!!#$V+%H8PH9oLH zsoE9y?%mBrzuS_}qG(&)_!LC=FK*J`RttU}VW#+`b417wIdigc+TzQr=YH+JBHAhp zhv~_r1@Y$=V zrN!k%kJeT2**3{fo0NR-#s$l?*O3hB?4nF^muE&kh?Q&5bZ;2s_;LZ)jZIbQjK_z< zV$UA3`g9fDdrEMr`a&TCpTd&bgUaNf;s9L#aDo2o?-_yK3&-DIJoh0YFYzKT`0P;z zS>8m`?dd`_>b0?{H^)y4-r~-E=x~|i5ZBVhYxGI`^*DVF=11+@Zx;qVdnGXqEE5!b zkaJnE{jEagW%W-5I*ABn4}FHtrrayDWGNJZuAr|qF$WG+ET8TbXE8$!1Pn;1KM`NW zpJbn)$<6bN!14z>mDIJJ{+9NP>W1ZNjzYol?-{=SYm@fu@h{!Obh0tNUHMjR%AyN@;U_1lEtbz7F_t%J0O;DZdHq z#_)Y~+-&<3Pb=R!GINLU80%`qK{7<&J~jxC6%Vky!IQ*Z-(PL|Jo)Uh>bRK&1EkshCl)GowGoRpHCf{>KaVR@uv~J;ji(BS{<3rZ|Z$pv8A(=&YuLwsf zIJ%`T1Qc9ewuoWb)ai;=bJ&uuZ;chZQ~B89s#eSj`CNb;H=WCXm+Zk_h5@gRZlP#c zKzk{dlHx#kPv=DZLGSTZ$0}+8g^<}``IA^y7v<_`icm7Qo;J6^;@Ny!8eCx=Eow}6 zzvl(W+UZq))Q6hh$7J%?$(nyGJwN5mF>~MZqSiO&Z=y6uz;#*_=h%KKh&-aYZTIGQ zIsEchJ8-2@+?>SOM;6cGVGW9EtFiWt_lAEuCCqrt+-p6$@?53V$2ti703T6hi1V@r~EvV&P2*dIbS2gn`RPB;p^+(sLPo{1y( zq|c(S`#dZruZ-nE-d?`CRT|ERuD^HK*k+Po^oRF+WgRn+r*FvN^KtA}+hN8~cR z_s+o4LlWM{_2*qJ`nL>uYfl8#agM-nn5?&D9JB4TS=)E1WJl)S-qZ-q_^NdNB?r$d zz3fdcA@ZLM65+wN6KF~OK-;FGpc_fD)0H&JR2mdHWX_@f_J#5dbG>3@gBgbKcdCPR z6T_}HQJ}`L-gg%mh0+UuaH(>t-#bp8H@12jE-5RcAgEZ-Y%4y|k#KP&+$`aE zC8tG_zP8c3fZGc~%{3aBe}9LycQM>DIoE-9V= zuH^>!M$}}fs92MS?(9hA{!6{Cne<}0CPCu{30;lPT5=|$x8Cz+R(YIfN4KP=d|Sx8 zemE|5jP|g_L9h2oclQ@dO68wf;y*xDAx$Q4J~5g|53{VY`Fgu3?fu!WH!f{{UQQ<~ zmyPDY6|A-g=#wiHx*n--o^PH40`l%QxaW~gmcGcpHliOkk}nOa6F~cvFmz;=<2o|D z_AgEbD{Oy$HSj%G*>p&MOl;rKfX?=-D*>BGi$q4fu~cS_^ss^L=rARNqYHJcE946a zu~c*e97@2g_6q|IbpzMNgX}-Y3=M5@vJ>AE1N?~s&86viGCiX~4cjnfs$S&$vti6~ zhJ@M?RKF$8o2gekIJ@=Ly(JeH1LkY7OD2NGTH3JF7|nra-NCl{Qd8f?NSysI-S)UlUPm7Cr;Ddtn~*YJ}4&FhSu_^-SKZ3 z^|N<%^qD<;4|Y*{6j_?eBT_X3Uf~nG+cgJVg01mHkD*StAc%=!d_ToX@4k~XBU3>K z)DrGUWL#;lC@PAqa7kzYjg?2JAFVxQTsuP__|?REV!SBl;QWD@Ab0%B*|(Q{7W_+> zZtnL{-5)3t{31Mj9*spF5t)k-nQwLqq(V)Sk8B{$pFL#BTl%IX8qz{Jo>)rz^3eG! zUqZ+Z%pXeK{{{W-iM7jZ!OwRswT{F|hJs5NXf504TC28XWjcndUSrP0ba8YzXv}8PTMi(CmtfXfd;qJ^14u-gevMwZ<{#>}|@1*_FzFP*s~)0&XYr zh7`L)D02uB%b2_$`jfJipNGfg0P$kAFEYwuz!03=!y8lXa~rhOC%+>i+;1WX-;AOUJ1`+!&k z68IIU3pnyP0oIH2k{@pf8IKjLG3KMw#0 zO{|?8p~kqLt-Yg%C*Ds$LK!IbZ7azjtBtp@1)|aH1tflb40x#T1w{AS0wI*10wAC( zvWA4};wCU4y%LE2gQCoU(nJC#P$2LcfrdlDW`sJ~KvowV38Y^FF|0@dAj#JRf&zj) zAqY6aj8Mc*HhpwU?7JRcnBbeK!ap}%p9PE5|F1P0|EmLBRquyIZ-G=$RYx` z1r-S+3?c%Il0gs#4!A=XB?E*+0{P|$LJ}kh2)r``7y&7SP+)AKgfvG&v(SW$N8rX( zundrI2aGS!2pJghYvI71p>QAw5GDWxSU~|n13Cgo3kn3>JPXv9M#}*2fY??527n(i zR$l-PbcArtDEhajDB$lvARmw~2SI65Gs5NHn&e+Q)M0fl1;nRtYegPI8dg9;1|@E2n1 z%>ZFmH6#xDPOU`WZ0fs)foY78t)}D3Cm(xzuBYf%1s7?PYK-U&W~4p@9yUpMe+&E( z6z&ZZJ+CIZZ+PY|wB!RFET+s=_(vVStlRtdQT<6uAvo!m8ea=TQV_Cwg zYdJY@x}sU1+2Mw;-%GaB^>Z4N=%ne!E{(-RRllohNhL<$ab{tURcW2N6I~P&)CP;? zYqTKzwC;_GAhJ=r2TMVGzApX_k6+`SvD-nE4`lFX%;eDQ)tx{}$gh~iKQ$*|p6+M^ z!b3oP{k`r`!&}uO|HwMu|oes#W}*lmKZ@$lt|eA&~wYM>8>uavvpS`#$KtvRC__k5Yse zT~&>cTFhGK(bc^)dPRt$Sc2EkDh_O?4U=_(iOqKFjumTOlAYYxx7<`zS0kNvBTs?L ziWB4i)8s9*o9RaKx9x58_C{CB>P+F&w{OpX8-D7QI!h7Bsv@T0Yty#aA3~N|FDe|V z7(LiNKXkk1ihHq6B!$8W4ePef%}j+K$tupQY_nM%2hn~pEfcpA(v>c?hkuPq){52I zsMF&L?V_l`>)BR42zX*gS5Fh#tSy;tTy{_LyH{kz-OoQC7N~vEy1Jhs94{~5ubut~ z*ZL)5-aoQ2Pw-lW?cjJ4H8eK1jP-ScN1&^*d(Zg22UBfXTS67unKTFLkQKMc%*k-8 z6-g`9lnP8;>aVt>4q5lz)>M;vjZ_MF#uE8NUsR1zYePwfW$+{If@}F@t=Kd6Pmf00 zSLxVGr9(@G%)-S^`0WcaH#RWk)vENOnbZmV!g7-8vnUqH5D97AR!O*H3FD*Z2)7{9 ziPd0xP1gR9cRWLR(|L;4&B0z%={|PygG0e%Y)xLmb(+j_-citlTduO{-0Ss+dK)et zFQ|5$Klz2xcl=RxPch@uWrZ(fy$vHBLBh3prxQ7wvSf6)64(UJs1_vNyK`D&^Nw!f zm6Pl&FV&anzXo%8avl$>tPf&J5oA5z@FhmcT5z%lOZDYSyPhBEZJr#o?8 zGx$2itIn2|lScXa!hHht*^+}(^ksrIDGFmy%;|%sxAPd&ZV5I?PqDTiVo;{ZUsg`n zMP>z(@kZi#%DNwD_OQU%GB~m!-(Lh3EZjxE_AfrCc$D{)`jnSW zM(91iR_-VYt_cXaX3NSowA%3!2}TJ{fvTb~Hj1Ljtc#yyF3OQJooEs;dZSBygj_2Y zQ#?ryqwSzMD?*v_L6@Ob=^IpnK5L)vGww4{U&|$23x{0_hrg?wku;`ry?0{MvAglT zx{rkI^EYT6MaJP$a(??enxHf$6p~Tq;ObnE^WlhC!MuUmr;>y zf10Rqhs538-QC^Y-QC@_a44*BcQ2rDr*L;D+@)|R945~>-Tm*r({u0K`7&$ehs=n~ zki8>zt`+gb`x`7|jG}b2zU5Z015Q@yvDxu%VL|_#hpYD3S-yn*u(4 zM7thNw~im-k1aU8j$r1F=vnkcqG)jWO*f9~fN0=SV>%F}h1YQ}9D*vLb?rsz>Ubyu zRuT1T$ly1uBI6ck-`GzCY@Xp{r|QNfge-kCJmYLl_O-E*27E&Fl>@5v9BQXYcVK%o z@-^KKX2t$|e$Iqd%<~*0V`3Uc3`7i-! z`sMJRTkbl-t@HrjbPO!-!!gCZe&EsHur$oaVSt(==nC*L%h54WOf^y?6GQ53>L{bE zfug=1C||rLiPP0Gr=bf5e+TTI>HjHNHvtr5{3R~2j~?Zm&-S7Y;!gq8>!1?b-d6sf z5amW)Y@nXjeysi;KnX3R#|uhEP}oTbU0gmG9!if?*` zCzzaPb6|#`W4?fYS%K@C&C}R5j|zPy7`!{a0^Z2$kMdQ~zf*cv*3j@yv=iVxYo9LO zo^|r(HVmCf7BuH*pN>Bw+=Vq7U{W`b3fDGCR)%JsMXURnRlfUDj%hbyo4>qudkVY4 z#v5PPS*QM(!MOq?m)m(gdj5ECl25tIz*G6b>Yd|*>^=W(o5&dc8=*5bGgzHV2oZKD zB4p$Uf)Q?U{Lf*Apr;N8T21}z&#sTIk9@;kC`7=^oc?b67T5NV4W~7$b_{+}Z=-98 z^TFi~Kf`>TdYw{aHEH+JcM=}Ld}`Q-+b8kDNh&xCL6wRTs@oUFNwaS{`kZ(wOT@1L z{yPPjAP8TQ4dwN8E@!-?G#_{dA;7`M2>!jo-|Wukol~YLtbK(AJvcp-=@rE%4N$X%VoE+gY%WwO1o3Xb}G4flH)l3 zLs`(`T z0T{JXu-pu3qzUyCU{20B4YFah;_z6?D)eUHq;d|tEZuW^1!P!V@Srvyb0j4yHq456 zEDyJ18yTij=>AuH3;S-uY8*Io;&kET9N!5x>KtP;WNn1CKd$)aen|B`4u|iK3I3!c z7AICEHGy{qtcn~`Gd8$BHuRzx-=i$S>*B9^#%-?W!P^(xF7O{*bZhv zDUNNu@C8OiH&}~SFj=!Fdl!Hu=an4y_yb1vv3;gcUK%YJ8 z3C4|<+5Ygjn$fw!9vECT=98ptu{lAV%^$qnaH^eHHrNe+iQ;_Rmkamk+D5l?33z00 zgO?`Pb*X0w=Ql^aw{DsRS3qH%vkc_e_-W1N_XFTS88FMK`6ui}#kvVo>{qvQedHe$ zS3bi~E2855w+w2LQDF^HQ98e+=|n#jB)Wo`#y8jIa3!!etpNdu!(=68uwJD2gX5xz zA%F(TZ^1q);mfFHyTHgFceA2_;LQ<_*h*)G(+QDDD@g#O$Rjr|rjKP>3P}=2m}c0{Wz9S=#GL)5?gJ~bHn7RpUUC{#)m5; z3pY3;rAOmj0P`>?hxlpD2iX1UD_dzH!nh$H6)I>aL2$_ zAXrTpGC>T*S{8G=iZWq7(nS_=6=s=SZ=)4Ihe|F*Dk;?>HN?1U`^}ezQB}JSj?PL( z{ygujs(1K%wyU&%L2q!e?|!EjM<4 zC9KgexvCV*Wi_Q@#qt=CQmEGV5Fi|30cf!Qbh?{fc>?L14WVtvG+{F4(ZgXZA? z=-yD9gWt%>`FXpdYjvPM?1C>^Mvb0*T^oMZxQPEOD>HNJ?GJl>Amqg^Hpvu-L|`O> zB3yBQZqqF3<}B;#3q|DdaMXggv82aU=ZXltGm+tH5lbt}qe`EfzBP=~ z=7%;tlsV6HDt5Q6M957+!2kNO`$)anDQvnq0Gc!@kHZ1lfU*upfJzPPZ_2O|`c;}+ z7k=-M8P0}{^SSr|WTM#03~9KUolhnPbS1O4PYs zim;<^^j+wNA@{JoTVg5)Bi9w-Na=H#0~jWi@k+C1Q~yZAM5cO)OO%&3RF)#* zdp{h_OUcR-8Ll$}l|NHpbyjnMtnJfn*S*@{?bmj?<+{L}iD8STvZ-voy8GEhrtJW4 zC4Z~qq7FJEA{zaM0{bo0KN2uEX2Q_VqH!$Rlq%5br(NW?AlGr?1WYN~a_A5tz5`I@ zM%^dHH)dxMEk)$o_>xg`gi&e@n-zyY2)Ji=eAVT~@eJ@>(xR=m(-L+Av)gB~2uUM2 zcOG4LxZWKJLS%<#6OyOihM5KbknRJ5g$z*oq)NMN8ijr;WNYJ9RbVt1HZN~0+i5Q1 zPBm-B!EmsNhlT#e-lIAKsg_Zk}={R!$n728G3Rb9U_@NvAvW{zGN= zv%mF|f+O%P!W~{~2X@6(OQP=G-lpYx8Rs(g5lfCs=v}rW;nkP~z%*E7H@iv_X2kOh z_s1tKH%{1}cQO&Gw7D3tO0R+n@i0W3NZPk5!a-Njf8*_aHU72)$TeD2DvD= zm>oV>m6llZ{P}d<@70oyDmi~Ikv%oJMDT)wPQc~AVe;_PtowE7S&U)KVYDYzplxnj zax5f&Dd`BI44>RO3tb`&|3Zle>{X_a$tD(Wkoss04}KGUnHmW=-2fd1j<$n>JJ3F|6Z*!*ozG4p+}|?ME6h zXL8iKw%`9EINfd=d|T2gx$D)e)9u=`>i6kzyq&oDu}%@xE1j3*tFHK|$jy4Us}r$k zs1%~%j&VQ@_JG0@@v#Vg_QFXRv89Yx@`qY<2~1RjBw9|6Ln16ro1jr1PnTct=aTX1 z{`Mc)Ui$-1ll|;gXM5?C(=kLo+cCRedA{p$y-zB(8zCvvH3Cs=UUFVeUH2!oL>We} z9uKkZSBbZu{MXw6^1uS=&|1Pvy}-n))OcUWo<8$WPJIp?ddmSmZnGHr(Y}dpr~SHL zUeZK8k7o(JhQ!Bb5XX3`n`{%!cQx#IKF%jd+$YNU+d5bm zOpq~QWlIG}Gf74rNF8k%`Vr>LnU}tiNEu{_l;O-VQ7vMP z93W5oM`kCh?ZXO?t{BaF`gbPvz;U2g_j+)R;oS2*Of@2R2pSezzn=Xu=;|76><9Y|p;uUO%ClqWWRFIt@3eFD?AcZaH zZzts09iloL+u zEPG<=`zs%fr&j0Iqfy_PR}zYL)p_xf%I$J+(Y857%6;oxJ+;)1Sj61{WcY!0*7eQ-@p*me@+HF z6nIG$=DDt}Yod)&0`&SM{g5f@<+eLvYzN9l()a97)6WSewVd=@R6E2vIt9^lwgbPP zcC)V-y~!-x&d1n_QaCYdx8WuQbF)jZd!B93`_KYtz=B~YjZhZRP{G|%2#=L;M9?tO zP0{Vnh&I%O z@}KD!-tWgV%rhx<{19q&#mF<_c96WPVw;vLC1PaI6EriuoZLI)lLG|mx;SorZD9-P zfcS<&br*;FYi@Lk7I89G_GZOT2VuHJZQMT9_a-se2L6~Sx0JscERP_{5V4|s)X&p; z{dy84xbR_K1y9@FTtou*M4EWblKpn1R4J&PE?}z-fn zP?78zy%4$IH1buv%Tzng8Yv`GeXTYsIluC=z9>t3*RUgw{8icqZC zy*S;pluFV*RYiWUAf1iBXH9Rs7;{f4-LOXis`PL3({0)rLaWU&Xs!7Iu~K$>cK;GFF9(FJ%=g{eg6(tPM}^U4W*%mBPlC6o#wUuZO&Q6 z$n|EY^C-GU>!Jr)fsiP1~tR5r)oZ)8{FX(Of>{gJ^$N&v~ik`T0CUt+~*fvIp-#R z7P#WnjslMMMR=CQYIC9$wPw8tYGm^!2FPkm$^p|tJo96(-`+t%%fbrf&D~f`uGNo9 z>qb_*yLXnmA7#MKAS<2gB5d0Rl>mP%HZ`RYDmwARv!&y-*NCL+HcWvwK9f%;!E|`8 zj4Q;pE@>%}2(;F?z)&8Gv8B_&F^1{`8y>c3=>FcUDav{4ySa-KXe8U~&-U5*dYtBH z)E4;CgVyR;U**r*`I!Q*nf#41r=hFlCJJ6iX?(N!EZHKA*10vmmB1hd2wg-jpx$4L zjX3V{rHtlQ%vunl86s!pEGC9CMd?)bFRNAgPiZ*M4#r<1c{7`ih=$A}B8yx zP?i<#9lp5Gg4Cb`U~7^G{xU(OR17VAK%>@y zX=n4$X)VGY&&S2&_pj`9o+sT0LS-0_`5O1biDi9EiFnRYllw2^jPvQaAN;MiDO``q zk&O$tWqQtG&ZcTJP{0t6DlH>{_aD{JJRB{|K?QWFT|usa3krfwKDi(UQ0%hzYTjP7 z9qJ_zAjrnbs*??X9dn!N2Q>zKyXv$sDr>B+SSefF+t_@3m^KXo5{>rx(VNN?O%9ph zulDD@V3Hx!=nq&ACcAk~nIz+FMJfP( z@!qfZCX|fQ>$n!*x-J_d?p9LTYA-$JABFySw^u@WWw`St=JR&FFS?vPNJsd8h3-^k zksfBOpuknDWjP|PPOa9;=j5yW#QOkXc-h%~Mk#f;%jT?Iw_Ht%mG`!H`}eDLzw#S= zz_4)0V$te5?#8asmCTfOW@#zXr`yXV`jTh;hL(L(`B7o^Qc2)9nO=Zp?8uqxBeWEl zR&jUtd)BXo3{CykQgwWKGLkNfg{e%^Wj~UYRVhgn4sHOUL`u7+eF&_tQB@bq9fKQId{uy*RUM=eLMw8I7u$**?GD zZLKNG8K)TiaL=zKCaaGuuj}=GFGqHHyj(qgP_K=2w@ycmfM*Vq{*r+)?jK&gi;8BR zbwZwJ?Vylhew!=j{ZW_#&8Nb;?e)p5gJuxkHs(J|Zo=Yrlv6;M-AGiJ$@#YAz0@mJA7ZBWZ zIe|xh)8L5pD}QX;_{~n+y~bQtg54aj1Dhl25-(6qnsJ*R1_U=E;jFBE*OZ4HABR-_~3G1<*<&(yI&2d48d}-r*Le zpr(#c^4agWe}2_s>}Cq^4A|Ck+QoNmxnY0qUkaIVmq@xgSm^lD3D)-P!%zfA^TTW1 z@%L(tV=_}L0f*}_3F6cNqDBl7M+E)|C+Q6jJ~2UGacREbt9l3Gvq%k9{?1rkbsdvS zW^>38GQ4p~Mx=8-2=M5Z6aW1t&DV&Wjfj>VEX;FVSVULRQ#CQDCXi+s!Tlxc(1_7g z5trxGS68$32GRt{hGKc==Ae3*`ZV$sdxfh!SP2|Ka=w=m8o}LKn9p==E3jgeY_Bmb zRFwc$cNnTeCreTYN7tES%ywPeR6nCV$7^d%RPNoRw*Ar>B#GKF5h0~$lNzkEaWC@mb_E$n ziJ0YLf$T)|A)bc7q49e|neN2j+BZ)>IFyzIdyXE+-if>$j?ZrVWs=Dlrde#p22StP zc%8mAy02}lHpemkyszi3HsSozkdcRp(kM#QEWj>Wd9YT-#PN^=ClsY3rxcqsXmy=K ze8R$Jv*3T07!?e#jaZ$G8BmU>fPb_<<>905P5yyb907)mTX*o?i^CJ7AdJcvzDg_d zo4d}5dMD4;NiA04M|OH+(od(wDgGWa=)9Zh^$jXFQ`_+)`5xyG`G^A3hmZaVq=ZB` zffRN1MZf@$;6l>~7Qh{%*mQ1)-ybIkZO8O>Z$_Uz4Q)??2Rqmp?%QI14j6)BA)#vN zBNR%9{ep!!0YcE33~a%=pFEDf*NrJS@rTVO=|;VXH}lRcw=il0qwo1g2CQGS7%SP3@;9bdmepuVxNYJs-?;AEcmn5r@sZx;iL&SS$!#dY!_at`nN+HtuI%&jW?Z?%%c-hf4-x z8(yQ11sg=xMAWXg8JH6KGjEVr$m3{1P(?8m^t1{zb`FVL_!)3@oe{i_=8x&|**_e8 zO!p_G=*HWg-MlyK&M!Ch@&atG@)%xLeh~Uz_}C_c6t933TQ?WgO29dk(n%aNN>j6# z2Qku$n_u?ZHluXMwQ+KeW%#hV<1y*lq!g*>nUP0Ic%>r#{>)SuIKHw-fsqCOlfOgn zp!g$#R?DzD#Q`p_HOKzW3@Pi@Jo{(zu;P!>5}UE1XtYGxnRDkcm(w{iQ0}`-hhLa` z+a=$A_1kB>Ag#f3hZmvF<^Rl%ae!wcotlGC!4X%H>ndLtMQ;&>c}SwZ3PW!JKB}QO zG@C?hc2~(+dwf8=Ss@4ehgtX4nYM?r+vGCsee}iQJmZQaD&l)gPrysruEo=7IagGz zVe?LVT8gCR=1M)(vN<-`S@Pv9 zjJF799(9U^bn198Gs=zIXAVk8^5JKviF^%vdHh%S3g z=H8AyduHF?Fis1t?e5XQ=O<8J69vEA7zUV5#oD{MLl8383uE3?q1l<&H>-=Hg%UW?qhKtg;fBvTV7xV^=6X!#LLI2IuVjM7C_gz3df*UlAxJ%Aj-f?X*(Mp^=cm)LWnYx6S`xoAm7TgC zn&#%o&AVZRhAx$C9JD{kY^VGDZu0&o&CN)=XAkmJRaf&0M@MI7u@v2ts(XUXS93FzZJ3fGUZKA}k&qxGRs7)>$Rm?E-o6BR7J1g;g8GrB5sYZspZE(n zY=3NkwCR@x;|dPiFT}Q4{<^Wz@<_jAiiy$)Y{pJq#&B%52teP&@*Cw=ej7fY&>ifp zh$J%Quy4#!ag;uSb9YNAEQMaw3%Y%l=kHTV^(3zc8DH%Ru)fUodJ>8fl66Li1ISc4dj{`ff#pMS}75Hbl)7$?w#v! zbjpfT)P^to1FQ4llz7-g}%Lq*B2b$2o&>zs30`o)v%4ufh`nym8 zH_-b28}8)<64Af#??1Tr-$CoY;a=d!e;h0)8&JRg{WT!5W#k6d4fqGw{`KZBP5U3F z6$pRXfRWa~u+6_UHajrR8mOoL-3$Y#{*2&xE;Xg_kZ$BIf0p~!15?SsmuwC^9HI# zPM}f-7O>T02hISNUH!X=;=fk=FMtbV!;F7na^Rk@GqV3BXn~#=7$^@c=fwkTOW-u% zK?ao2oSZ&;GD-0IBkSnBu?J{-5S@1N|_tpu%5E`FCLs zTpqBsfUW-zlm5pe1N#cNvA|6OZVa%N4a;9%8AySF-TAkD{%gg+>Kwq11=i32ZXh?X z8Uq&)a0A=?ZvYHr&3|j@ziP#B|J@NB%>Op+-%v0Iurq+2#>(;Eq2RwlHvhL!@PE;s z24DY1!4i)ja7+sl;TOW|Koy)MX*w4r`wBWls9Iu5FNXORaFNMhq8mE5(QXwtLaxzW z?;vz{Fqqg8lIhjWL0ES4o8y`+$9JM+uWaRxVz8A^cjPMw*97~Z@-IhopJ|_4oT`Q2 zSUu~RH!uKtpGPQvCnf&}0}c|W>FM_Y5YMAf3`nlo2*vtZKRf6hSkv?Ma9<&&^S%uN zqge1d=8Ss|Uv}np%`m46SZ&4uTJJ!ZYGdQ6-VV~U)zkcCDX$J#N0RS5(-HI&qv@ig zel7w=nXi}_qNa%=0uq|i(V6PxmooA){{0Oo)Kzixdl=)=V@}|duOE{@Xk6(=Nh^!F$sn!yzGf|NoH{2V>)t&YH0*HHm`JR z0eaddMo2IPKPU+;6a*nPDYYQF@}iZ<*X~z7w$AL0&ghq|tJja0!0l?3Fx;prUTcLvca zmf5nZ?ckwc`}W!PZ7q7|nq;q#bE*lZq-bN4ohWF<18oR5@o z1UzM)^AY95y#(v!O2KgXW>r4QdGLqdVAZUq8NBDguA%h7vEj?n;|QP6c4P2ho;gLn zROj%zI+75L+7t-v1j{c-DiTy5>)l+}K`%mLU`~EJ&55CQY`+gMnOhye8W!M(AM!yx z^CgXg>66P*M2GPS?-f3zhCmbtW9VlBVU{3=idH_-Ms!sydgr(eV^UWm7wW4$9)zjH zGXBzyt8c+ERMfl3*86bXhtylZ%;D#D3vFQc(iQ&t`NllpB9l^*2P%PxV7S6{>vjyQ zTByAUc801*!B2!3N>ho}`Nn>9|A zwQJ{*BTd@r-$E;_&je0Ms;U!j_NxvfFmaoeu!R{K|6Xe70XA(PK zGM=!(s7~hb(}r77&x^+6>VVYCFCrcmP$?5;eaT~uSaN1ggpnxrE|AAO3wasLPPS(4 z>Q^kkOZRHyk>EcPkc!ENvxY3b>oXFbquTUAU`yVgM%zh}+VD}-oSC=|@FZ>i2I7%dzb;(I*ToPFy!_D(`w)&IDfUUZ2x(i^*A%p=#ingT&rieOL_!dz ztM{&}t0HGUqC1cJ%L99!tYfld6^22zRb0wB@lWlPNRoi4t6#Iju&e&3l$x2Cbpp|H ztJnl{7TP>o(IA+OVou&R15fCYy4^88#A9k!owb$pZL|ibk>~# z?-7d@UvKrFuX6;}(?Zhc}!0 zws`Po8UW>Eq*>&V`M%B8%rN87?(L@t!% zP!cTwzcQ^*=mM&MsxVszf@%y#CwtqwmYb+;}SZSD$rPs zk!Wo}0js$&urWSP@vTFrebw>Zjlri3RZV7wg`&){43=y}`&s)>IF^~*EvkYhJFypO z3Ao$Ta!uElj^C?YU6Y!cf5TYW+k!BeOC-uhq#Zvgy6U9aU*?B#B~G&LKMBvWGZ5Og&{HSFict2`f=iC3~POeB0LDC)lcv^UUK zMO6XA_8w0gzg3CrqWgY;Asq6%*xLokuW8jZp#TH3=_dm6k%xoD68Sx0QZ^!S7N~eW zgk95bP0eixJ2&qqiq$=r#!7QxM+wZDnK`MY3U6aaNZa86wQpD^EyBlTd&RoyT2hVo zN)476L>z@A?LUqx?8G5$rvnx^>M>Gq1uGB&qMzzEUl7D4ijOfAL?rfOhZQ9y)Fh{K zA_r8MO3qlxe}(h%uLlvAY`%E06fOt6K7`yiGKP^{Y}YfDfWJOQwiamRfMA&VN+zX! zDH;-sw$dFPD2v|?6AB@nj~EJgRxz<@OV>6 zYe;?_b!F8aAEi6&M-c`w_*dcKcHNLNi06Z_`hs#{#>pYAoAM_%f5f1K`U%|<(b$wH zfj2IHxcuR(eYPk1x&b2QDG@zopDl=@9wbz-8DjLY0y1y#EfA&;D5ISYLl)EJShvkW4gBynUEU!vVII3N4kXU5H zir04cEZy*Y5OJzd>RGVRuhdmIn%QkO4>T|-%5*YOXzF*XuYgs{B}sYpa*1jtf65^i$`%?!~8;j4f8yi_*Vvp z!w!VL5KG3Q4Y5^8FIg`UE^#bzcyzs>JkWcjz4$3WPw7wbo{9QF5?W3?Ts&K=Z zhI+>cX)sK%8qojoiTH_#D4H#VXz*FQ+k%Y#owsBeBQ7A$Ej|cd0Vx;5mxP{#p6R!% z_c~Ez-tO}*~*STQN0Q*%;L4s{Az-}o{S)@!|QStJQCP6 zSjk0k3@Ac^052r}1)=8~v03#%P}=>J*_1a`_MEFPw_~pr;EVA)R0XVWWV%!9kOfOg z+jV=&G<|Br^&(Ju)h3Okk#@9I#B-fMgayV~JAEN>H zFhhz#*O!%__uilH?~jk$+n+r|fk^zRpEE>{q_&^=;fF%c`{jkyJ?I|DOdUmUxq6<0 zkStN-%3n^AqeSr$SkO#`z6gA7ve*Ps6Cgq|F`+$(32X*BqDtFjUB*nP`GsMpg_ zb!FT_a}0q*v5+Ww$SonU@-Rz+p^JTj$YUJcDw3v zz@InhBED~*x=KQ{vQD2izl;uyKpz6%Qht1@rv}>ou04N+>Slf&Y;Q~!ykf7pv%LWv zD;&2nYi)m@PZP4%7@PM34Wmmk^yt~)-|ITwhw*Y1`ZN zdQ_UQ%~)x9FQ@XDj>K^sdP&(bWmy0C`K_0|!Y88?>l8Nr&c-V3K3DDdat@ATfkg1q z(I-aq+&{4n`?$U1s+Rs?58_xs3vMHD>>08e?%Ec#jYsJNG}VZ2#&^koKhV&ey$yuz zow5Y6A;e1sS;(%-NT<3#hE&o;TD(WtLm(!?pWikzs~BPtu0=B1zMLPYv_O3kvjv=H zm9Xa8ei6|F+GZ76AmODL)S7s7gycjfH8FDcka(B0PzdE{3`>;wQ0znpngk}#ms6I$ zD=|vgIBuC5`$Z|lA1WLKyPQFK#1omF*^qKl!4HPlvuGdQ%!&*HkDz!9nK>*3oEj>a zod708ER5Lr9s)ur6@X(@@(vi!W)&HVwsEa}(BlLskWe(!+p25EXjk4g3~k|0KAq zhT3d!-y%a03!%q10F;w8jP;m*ut>NsS{F;m5qlx%^v@GmDsRnMBGBh1go7p4A2TO_ zQxNS>_bV3U9;HZ5-U4f{igVCLs-Z1pXpxd*aoyp<58>U*20~xq->{8bLn6~o#`+8c z-aIu@AuX`ZfpNYez`giRft3eg3ts4+aTrScNU_=J(GwlXyA6%KK9G?~oWjdn4O*xF zV~}t08C6b+Sq2v@DXKtQo3FMMS~!Y0^`Z-@VFOb85{%vpG`%x;&LH@h@%{~v3cZg6 z`gBWz8hqq;a*lL=0=R+^hWrC74IPJ|=sS=BEARt4?-b@O1g9I~?3ddV1YH+K2vlHj zzk6rCX8A&E(~C`QMOGQ990&bFy`*Mpt{p`*3g>*Y8X+AqHE}>WKc5n^zYUf?Anm-+ z5|Ev^J>w~)6))tc9leaX^XR6E*Q8^0dR1z+dWE@54vQ8g z)*$FFqs)Vu#KXbMy228NKu0+UGGS_{L{GZ;W3f;7yKA)P-eBV;T5XjrU3p7Yb;`Q& zw5c?Tb!b>N<_;^qu$oC-Ge(e+Jlcs3lKU;}EGd{oVGASsI|!Q)AWN6pS^!cKq`MOt zDZ*JcSXu~7Y^GI`GIAZ+>cJ+{t_StTEibM9ha{`0=$W3wgFKz-%1){G;+4a|K*wKtgqqhNE92Dpy9U79IyBGZ2l@(HTB z>@E9@YHe~_KB!rXURs+6@6y1HYONb6mc4Pbfru}ipVpY?HtjF2NF|)fP7a$>JufQR zDKl5a124@b^M>7`u1Q-q9@m&C#WXMG##v5<(g8=U<#$N0TCu{G7^rNHL@uUf%%jhL z9Q@kmF~Z^fP@v;7al8q9Jb0+{rq59cL$-2WE3719zV@B0?9rD1VD1a{GI@Q528~h_ zqqKrIuL>JI12cCnGh9QI@zY5_(bX$1#>g`WY3xH3m#KTh?Zy6$Op)E756xvE=TxBd zeIDDFP(;!-%-9fIShwMH&!oefGkM9RudA@{mx-o=DK!E{HiAx~@2$48QEc$d2Sy=DfnQlco66n8)B2!7R$1hqLUVgoT0cgy{V z7uZOTaB7#m1-5zB(6Av4w5S`Wg!H;cZQYmg^+t_r5Bg}*j|1i!F##~&U(9u{S&9K! znNM!(dmk?l zKVH1N>fJCV#`6OrYiJExa>&$5_vdAh5omgM8QW^_qutj(FSnVDGU_%ueQq#~zY~FU z(c*)`rk{q&gBXWL4#2{uWAqK8^h?&-3A^DcDk+(v!~7^2E}5+y zSe-0i^c)1hL8nbp`_zHCX$iGKhhEd%uDO0~wq7YH^57ev7Hl(r?Y#G*0qo!%b&b3u zUH>dBH@JQVm;NAp8Yn=PbdmZnK_^bN{>0w(e`O3W|Al7b$UPvT8C0u~+J8C|E-=5o zXYS5A#F9x+*1}mCxrkZ%Z3(?k{9KegmxQzm_@AS|Vnbu^3OeHrZ>ZAYp5o@{6S3dz z=9QPn?p280ZTwPH7qp4@46xwigqC<9k#q^BCNq0x_0DW0>k?8?T>;RUUrDJ z1zm1vNF1|ti!`d-x=gVHq!JJN?@@SE8c?R+tg9j!hS zmb9_aMW5)`1^j6MUtxNQL4%y~{>-fp;36A0ZLeN!a1(zF!8%3m*`IXKI2e-VlXX=f_Eb9w<_+eLdQ}!}3G9 zeSC!X&s+S#($;<*i~u1ahG=WBI6cHVM1zKtB!hq(J^}%hpRbj@6c2+Tn*10FfR2vv zn9edCKCxUM6MKeIyI7lT*|?TLSA_ZTD~d_rg6aa>o;93Yv|M~FCe9QyeSJaFfjjYL zH%@U(I$t#tcRG4JeV13!ZRgZ4LPx{i`%J|7+)BC(BO}9sa>dR3#iLptr|q`q<=z`|hp)>@pT(6xKz5P!1zN9uze;bzV*g zBaSUPal#>jtfmH>FSBJAdAKx6F}F(IETmnsu?%=63cTw!19+Hdn_}inqPDlcet*1GU*3R(AD9 z@_%^`oQl&4vnd{ShVn0d#x%e+Z#Zor*iJ1rx^rtd1wWHlc6;lrBCsB!utVyk7~m=+ zDlDejwb}X^f6pSt{br4|7{Xq@yuOaIhOViX(((gF2l1ONLscyUsspBuMZt2q1bRs@ zB+AT5a&ld{oBe@!)#v>v{uEkT#j(wpwB8VMm?5AlWW_A`bQA%+G)?=^>u_q{=Crgs z&%g>M=kaoA1nam2cUg%E4N*11T!=20=is~*Y9ycN)-q~Ukx0Rx+QDaV=888j=+le; z=pic~jBw^c897X^bt>xt|Kow`G`l+t%KvVTaMHngZO!HRPrTU9xr2`p?Z-n%^M`n- zg{1$j!W&#dAC&*W2cpfF=A$)+{YblOr{rxlnRy5j64d2FxPx2a&cu46(zHa(I7275 ziC>PGg~Y0ts(0Zi+;frU@S{;n9r8xVQw@eZmt-T;8s#zrhVy5s#Y{b)ATt^1A$Cb( z17m{P?XSX==xlmS5H(L5k|l1r0>Ub+LgYQdW*5d+ar_$HVy5-$55?gl zNvVb1YSt*yre1;k>T(93%`fdf{$B91%{2SIR6V*F%aM^T!x45lC2ilcnO%!s&?oG- z+nfFix~78xx5cG;l8u}2t$xVEDn!>qWOd{8IG7Phk}m>hw<~NUO-w-*P3H|J+I(rL zs-UQ(96mELEE3W@Tgtg?xci--%-89tf93sq^I_^X^>5@A4H_P{YV-RhPm7qnES4YwjS*VDOj;a86yw-mQOBxsr=`E03liZxuO zqVhA7gCXE1Q3Xx@@kBI9k1hj6C|W7Nd`u$Z^;CDI!_PEl*E!P`j)HfNr>wvk-pA|L zHpyC12+zS>Y=t0GO0n*(?|+UGT=p*{S-3dFwZ*cnh^Xk7aQ)5|!TW-W*C_T)wHz6| zEi^Q(VznDU{V`jWI{A7r& zx@05dsJ*o)Vidgr6FY>0s8S(nGlqVmnRKp`lazvuO2ItsL=vMX8g%Ub(AplHOUl!C zZ|%hc@CsTyM@$uj z34GKNod4$T3Ag8uU#Ve?A(IXQb1#R|EmMf|G_jfO@U0$xC%%<|+vTni;+ffq;9`Nb zxhghs{P#vF0aNX=re zlKf@7qQN3~HTngzub4v^8Z$SH?c?WR`O>;JnE+Ln-(m^BJLz**I{~eHTsL5W2YrI4n{p6t+}a(l=Lfi_lt}Kxt>LxiTM3{K zO|KA;oex#{diAWN-r1d=Mo3(w2iy@=AWxP4GDrOqO>JqKT{ucLNfdxI&E!P;uKek#JTLsM-9=` zZaddQy)HWZ$1GvY46b<%hqv1!w!7 zsbd@+Ppr-b85|>es_thE?>K8ovujX^A*47f^kz7FRkBD6ZhH}B_)t-7zzngZB1a;L z{?RI>IYA@oqaaSJ!5#zse0=-i{uW5jQ(wA~;h5}Y81(UT1;WnZp69eM-T0QmtC-XA zxPQgVHNUZQ=!+LKQGG2z<)Q~OwLD_PYy}!3jGH{=5bFXZ3M`?h)DTt1K|&(a8crv*+hRH1U(ZiQaiY{N)2dsXGP(oERD7 z)*-}5Ny(x^Vkw)D43;^9C1LST@y(x>y7?4NzdvC1od8ogg1$c+amp=;dPhfOdX(&2 zYtjsJZO(f4rse}ipyP8`%3k-g-4c7rA?+uZ>ImoeUtX2sin!H~xT5cWvm?Yeoez>x zd;2nQ2f-Zm7=A|h-K5X^pe*96MF-}buMYj9=JKUMy8ZxO%#r3g^{|IlFDpW1?yeTOIC~9?!KX1;t*zdljF;v0aE?#;*N|?R@052 z_~!Wk31lE0Wc*K*gyZ z;q2;w8w4>1`R2HsJkzh8j~5)E$iJ9Ci#A^>^hY62cR{qNHu!hE2SX;K=YmX)>7>1~ z+11+-Kc3b=A-%YHKV-7)X{X#mwZ@MmA&#bMwDQs) z&RE;lD|r-ieZNR`dyp8j9Hi+b-7%Fjk`4nEEHD<}=n zxXUkYVFgd~3H9EPqh61}@^Z-_4={X2kuSzI!+;oSM^ z+V`6ui<^L26p~m#GZPE-E8{`Pk9!UA8`RxB9~`z$D4))A z;Q3~7JDo1|=^Slm-1hI|5z5Z2h!+KBYWP5qpYEw4xm54vhSKkl5Sb=-HH)a`cqhDH zki37Cb|FFqA`L1j+KMnsKw+8f^{NFB;*>g7bq?mZBwv57N<7k0b8ZNG|5Rr~8(Q`H zwds=zT={$v#$BEiQv8Miq)1fWkr@(>qMRMEf%s~J0{xRD)_jRV5k5A%?1VqO8&Avz zM%p)qZ&LPha2Hl{q+X0nx7|M&Vj7c_13bHg96GI!ax+l8PBQAg9u#aFFi?;S?+)6C z3taD)J|(%$(8JHeWcdw>Vq<*+I(G(giwqMPnP5w!sD=*?$(PCh8HpenIoG%d6WC+Qh-`BhvOqX1rlQ}GMJ3<8i6Ft8pbCLL zfK5r~UdG3Y8HZ3=Qk}MA>2c}2H%j>`#bH$2$I`!UW;#}JJpKCavj{z#la0nXHaDUh zE9%uu&Ua@WmP6()iSMBz-`!Vb$GQUR4@mdeA9h|D=!p*)!Wu_Y(7FgrNll*= zeaYd3vMpP6;zS?Ezxb`GTq|=z&i7C_&;NwWCP4qroR3*IRG_|g=qiBfDfiB{Fy7jH zk?Q!dL}65_v!T*pP7|{EEkX2<=p%#4h_zYS;b?Ypv(e|Btez(y-c#X=7Atujre^B2 z?BzCDIIOW5g(>QuQQ{IP4~@j$q+|XlLe5tkLv~^7P{y~LzT#u#UyQSp9gj-=4?FE3 zU|6ahen;MM)ReZb#GdSpk}rzxL%7XN({i=jh=sca@M~Ty#0u?>uUQfn11Egi4B2xJ zA3sVavsdAu72h%x5SBY{ep@^mDU0jr2;~xN9a!`lKsr>H5APAKX%9LZva=_zu=w1P8asL_Nh&51{SuA{zLQdQcfs|U+n@o(c7!y0+nTkVcmT(tiqscg} zK0Y74qL1W|g@L-urgw8ArFF~gy`T^U7%&eULv0ORe{#ezJUo}!H( zk0Pb%pXUyHL~Cn2ag%pxdBi}~_$yC~13L4uZ^cjM0zHPu39esaw@u^=l$x$Zcpcb~ zCGy>_xWaf{vyE!MDAJ%xIFjq$t;p*RMxLD^Estfa+LDSxK5BOwT1%gzRl?q(w z>d#ZSe71`f_!IA{*63;^P&=jg(!_@<>?J=Y1?glzFovM0xH_kf6Mg|hc3~*-jBPn% z*TxOp*-$c|{(O{RLu5^`VBUYVu-OS^Ky6i0C81&W2vuaS@mU{6H*<61WFb5 z(grls3w&2 zA-tUuP#O)!6u9izsr4M#y{2z9A?|@+Xa!i%Px@*L!NmtWX4(D;JCqZ+kB44lGm=dA z=k4Ck-Qt;v(LFqBC(qL-ESq>@L?}97Mtpgj3CO9>KbQiS%A16J^%s)#)qjv;eNy~P zdf|iDqN&9TC*kRt8k2eW32$>TGw~&|-FR3UhncRWxvmNl%$~|3H$RK@L&`I&diH4{ zcpXh}4HGEri&NbC^Ywv9zc)q{8b?VTGaq&O=L8GuvF-y#_s=-t48v_JT!zuRa7it0 z4s@swYx3+ngoc=GcvvF%rd3*2U(0(l@ynJHp}&6@FcitWgOub2$L0V+DLoScYW0Rk zLfGP7l<2)@(VdaP^8yY@!LmK;g;1zvzq{zzMK0T5cgsdjinCI%eQG*m#{N}Du~KEa z;y?Vh0PLSJgi(Wx7cOAr94Bc`j%S#p%YPK_586cCjYZ8HCd;;SbDja8>CFl!lq0CF zpQHz*uf)~ooaIaV=%$OMql4LJ-Md7n#T95~McfZzlfj4A35!U{Qz9x6(WpD#rOn0e zVzKBk72B{SW3%T= z7Wp)PAT0-8)@oH#J5$ENLDO&tkkW7u!`*6n_Ml{tQ!#^XZrXuHE%e48)@w*UBE>zy ztzkZBPsjl;;J(Ypb{Hf>f+eT)aeW}3*P$CA=^(TdUy)Aia^+LjGdDytBn*e zSX~JX)lEhLwCqPchQ2Vq8E-4ok+92Dc)s$IUr2ZPD9-rrfk-{6Wx79u#(|jvBylJn zkW|@IJqo5U0S7p1l(JQ>kk_)oMWAsD#)*0;8qhd}k8OgC?1TqjZUtb;jatdw^Ccg6awjXs*WATaq}b@+&S_;k&VgHde~Zi2{1-Ntkv)B z!Wg8btMzF21c_h5iLFmbB*2oc^sa8zj=(?8l*_Qp9cTX*c){i@)vQP=GRd@jU#lbW zVgH@F1th)LZW-sK-q*5Qd>ID`t1I4ucM3Pe_3?hdN2-B^c=`B)q;(S1&tD=bgc(-X zDM+i$7c-O@D28p_zIwnPv((O zSx|oR1N``G3>ULYo3zo$EU@3xd%92?L%mk=C8a=)jpQOU8~ooWkiAR43kd zo0*j8mD5X=wcKcf1z!MXY5ikKN9~ng`x7Yvk_$5zE$M}&IYw(OIx%5JHl)JZGUHH} zl37ZXz6-OGwSCKl<$~5SrR2b30jfaDow{a+M}M12pB1-6%bjbP%H)G9nRcV4&t8e! z?IJZ6M~lm%w3kLrC;l_&g1Ler5EWTx@$vU|?@lbmw6EgRQBtkRrcklnheb^_0{{^o zJ?n9zgYcWs_#EquB*~lQnH;0XeuYs%rRImJp197s?*umP=>(IOIQMC*^Tb#=jg541 z$2ZYg1j%U-u=})4u%FNb@n?FcECn(58i!mEyjJLaqF3oE)vYOpQFl9|tUBg0#BsZk zmNoC_RRk}en4G)K>8j#NK!0w4gD0FSkI2vw{1Qk^?(5a*TZ^(Auzd~!G04?Nz&CIi z*g6g}4MAECx347)v_kxaZlKwk(IAR`?x?O2Z@*m|pl`pvRMuK$X16)FcVcZBJHuAc zT7c{PIFefH*4;B+igP;G?2;AWHA2tsLVcDlgp-jm?R}i@c1z4fPfuX*@U&c8Fg7ZkR^3{cTamS9;r`@XVtYTolS=G&eEwd)n?1Hz3O+TQynri z>GK7K+imL}%#QH`pSOkboSiRe@l3Yzv~co#O49|Dw!FzPs{Y*bt(&MvK4kX}3j>OHdRXUS!R;#PRmx~C3&ZP8ZJV;+@Ue6jZ~ zC=dtMdSBQnE=LWdYdc=}bXw6~mCB@&!*5M>2F!I~E#g}TGYzShhtz%WaGNi9*}@xs z`8XMVNBOT=xAcId@qebc{wweHUqHZLc?f}j;~@a@Z6`~;-Px0XhCG0HHEH z01)^Goxue7#2+a>;7ecubow_jI6VtM`28Dm06+zRVE}jpIzWp6^x^La11t4!`8gv1 zuwbC3W&AzJe|?r2;CTo1|4*<309X8Tk^rO!HT~bt05E*!KU#C z`*eVwSpNC}z?1-n^qX4&OeFIk-hvijIR`BKKh(s(j&W-&&URNH|=l4 zgb^^Obd0}YkbfQne9f!?%{(0&U{JrO^3^zE#GV}J0K|2qof zcgcYN4TV8Z_t)h5f2i4Sk+}u{Rrev)l-_E1F2RUOOQYkV^>q#h6Y55Ce9uo>Xlnqeg0osx ze|Eh*D1YQc%BuZ@f{)^e$wrT?~enI!Gq=qxu#QhC5R z4jI*le^0tYAaGeS^3EBB#KCyYWi6+Or-tw>xrZax4Ih$F79EbjFS3RpZ5TjWsA|tk zUnoe2ogtq~^bKO&lO&ik&L81ioU%wTixhRgc~8GQ^h7namUE~5_Qtr}hP{K)+2h!u za{C>9%oJsj-sjV^Z1(zp{hRO?=;5z7#(&=5ejofdJNtigL;PQ(7=LO^{D+|ZPx*+y zpcqWQZ(#p{VgPt7K>3XS$VPIpYr7c1hD zGAYa$%jZgw=CHCPI`GD?s)}RFU}JFCeD}EAe7x{-@j>VT&oR8iBarhjk|=#F&d2`D z--K-pg{gi6IiS+^aS0CZiPqRic}w~0+>a-*=NE48(k2@kT8^_rhyUX)ZO0lS8s>Ks z@-Ey@J04#eoU@j3I-y%E;76wJzJO>gxig|K@IYUtXeX=MLv(`gBA}JJgAF!bv#t{NyIxiRzef>F_miVxx7E>0L z-=$r|f#DiE2iAAf#e{WRq$%NX>nwPTk`Hu>R7dEXp6Gmyo!z&OE3ey|2nReI7T@l3 zT&Qen#%5B%xfj0G>PvhqPfp*{&>g1EmE_rNTvoGo`nEs!mhym07wso_s8?MiT=Z+g z52fIy$|9Ha^$HtKT3^I%E?m-T6GB>=M3nHjYi`%JksJPYC@&cPbQ3ld-k5Q&;YT@_ zct!rQuNR)=m>A?Sn8#BMY|VWxaBTMeGK@ed`&*LL>LF!#xr)#5+OqzoA>f06G6tei zl0V^=V?fyCKuh=|ej=CiTgYOnN4-peub{-l!&Hq8p>*E>DMOoUcR^-*GeWA?vrT&M!T<_QCR+hZ1;W>`O%OoQw7XnYmk4>@9~+(uX3xCa3t7jszbnhh`=6i z1?R^DXnicZ)Eh<6_MM$~KeFv;HfU2?Gs|vp(?HYg)JB9$U({e$XeY);*i*`92Y#a- z2M8LHS0k~>SP_DA+1!VZY&OJFl$D#0LTvF@qHC9s+Q){1QNWVIix4feCTu{OXdhuzgdSaix9EAne9?8myTE8aRpD-N`6~N50Ws0Fg#&56;4Te+ ztb$G4fZkK*w7KA5KkHneezpZk2VuQhEDsrCg6EoWr|BQ~F?z%@%^hg^qFpD$YwX6g zLeedP8}>k!&xbwD4aPZ*d+yNvq2%CYJ5oSOxFX~KK4Z%BJdp|4od|sH&KNE{jpzCb z)aQFWR152riyRH{A`5#G&}`gw41@;u69f&Iw#O1~!v^>j=&TA$7!W^LsJh%ALI|O@ z4AY|0QKjj$c*B0xR}8_(R^q>`%<+6YD*c)8DV+BXU5hmiiy#espOE4%v0IY1XIjN! z1^hH{`b*bwc-b9Ly`3rp7F#tI0a@!Vt1KD_*FN9rCw9sK;-$&YrGb1sXJ@o^I9rUt zErhL6y`gPG7q^aJd5ZVhAH-FOUT}}QcmS703+U`pthIy;iJyT=FQ`aQ;IS0wVrNui zAnv~8x_O_541xxKSweb{(|Hv&6uK-tzX4=mHC=dvY~H+S-NI1UfZ&%<#{gMU1jyZ| zH9*x9>F!-M0)y_gC(d`VRYNs3!iAYo>$G}d;sQErN(zon_BC5*i?CLvRIK!(*?ab$ z4>Wyu#}&?6TPNTw4fp>>&qee~a)Vo&kF!HX%tPqCAGb4_iD2sJdWw0~>QIMhCX}F*VFVI}smj8v0X%&E z4o|g6RjP`sj{Fts>pDsc1 z=T%D=KF-M>yBDtZO2I}3Z`&+tJ_Cn8d&+?rEHAqPrA4r&GkVnE@*-F79l3?HRRCWj`oUQanMnY-H$L_G`ecmy1~W&0XOHf6cDE5D z3LZ%#iq|?Py^3Ia0un0fRqY7L&dYd^qHn_B3D#Hg%+L;BL~f>eUE{MaMe^zgfi-le zXrzBuuT^?+T;rpRq--yVn&$#_7MN!+2aaX8?t~pDMgs}L^}LKg*3MMX_5xRByD%rN zx`cZ0dCp{EFzyd6pNR@Ds0HO7^`E6bszmkrVI|`>IS0hRCYB#%5f$pMxKrw}5{+z8 z5i)hFG(Mi~N3vM9^5aK4Q-sQj;PwTjf&~f#iTNvS3;8YG!XJ8GW||$qTp2_3q8ud? zI`{*v+g>2WRM`|7b&AAonB*^3H%%z2pmmEsRVgy19dkmhys0}FV%zeqLJ7BTMcfKg zA<2JACz~*@S_&Dyb^H=?a$=J@&YZ^fkv2b1aw4;co0Ub&1CIFNR%knC3~OFT9H%^M)fk~Z zp~}2s#aBLHIA`j|{7aaX%mQA6kG@#+3rR+;>8U2Ao|Ruwa0HqwRHBold%Kg9_NAeS zDocdX1z*O3>D=*`HGfXWij&#L+!BKyU3-#|KbckLKps4MC3}9gXgYbPQ-blAr^0Dc z76pZc*|od$oZ8@+F$oTt8vgKve5sOGhf`2k8}jq>0SO1NjD}@G3K@H`W58&&JbA*& z{0WZAVsS1((!9Q#`+AF3;*Sx@Og>^AsG?HPW^Sb6Z)G}As(kXW>)x21-YId;uTSNh z4l}AWOQ7^uz{xU?XoxQ6h2pwQnfebJm!w>A4-m! za%xDrF}Dua^$U2@=N-Q{G?q0~jQx^lk+l=1BF~(sjhOA8HPx4T+V32+i9Hm1J&*~8 z4bGbU8pQq0aL>CcB(DouU|yi&%lc=^ElXu>z3@ggeMWq^K63mM5B?l>`_N`2{pv9` zg63l|Gf$hC-KUi;h_rSz9R*)ftNv4D$oVK{@4?;Tx`Q+qs>TY2qtS1M@=wr(Y!nm{ z#7t*aJXz+8ri%p_jr32G7B~#(5zcvLb*je*Aw)BjVqV@B))m(=N*z*x>A-sK?%xHE zR|tm3u8zNMd@a~HywUG6u<}BfP#O@@JvJ&+hD05NV`f~rh{SvChxd0;IU|iT4Dn(+ z7)O3^&RC;P z8CBFBd|pC>JgoN3+-ks79N0T^!ws2E(T(vwkms`d2$iZ6CsrtCrfLK;RgWTRkKBnn zf7EeG>=|^sf8QU>m>}m2i7>x^!QOXXtq>RJ-*wh#7S2(P*=(CsKhjjwx)tu!+j4gr zAKCfwn&EAbL8LJ;l3H&GF{Iviu%E~=ClpQKdaD_7aW$HjbX_6e`X(r{$RPRJY{2SgMLU=J|6W6|@}{rp}`Z^Sttl%>|?7 ztGAF4*K;1fpI#YWj50aPBPU~J)X29jV@L%@^eg0F6wRd|qg3*7 z8(u(r?ht}@9eIRoCZ-AuB@F5)cc9KjY{}2zzy%#zGE1ZEyAPJy(8(MR+5m!Zq(Fz2 z$aJ7bNts(J`SBCrLw2NvJR>LIm$B#=o2J*U&+Ezk z=?LcLmCB!`79semKf-g@DX0__r|D?VYO?Qh5jO4WQX6dIcJP7?-FGTL`uOQOgNr{Z z6KumPo{Ws$Y@F*eWHH@0CZkYE2`MHDL$_kGVg>R7%X)17X4$xOQVG9|7UBh!lg&}Y?2h2nw+kD)uacBhI@`sXAUw0{>swwjw0Z*Hn9~LgYR_%pnE4ma1F1(>18h0= zfj4U4(e%OsNM11xc!6DGJO;&2dl)x~CXQ*&xw~ndIeI1UP#)3p1A6>x`v&X8ndD8Z zqb2O!jzMqEO4488>qB805wH23!~@aLyi7E!?uC_<9E^oaw??uEghKAL}s-l8Y`Rzc`g9Ok)ao!cqkj4 zcfO(66=aJMs1Q+mxsm+>^(1nrMIPp=*Dv$dH}4l(QHuvNu;@R3bzGKp(r#5YDJazX z)_)kZBEyE2Nf5}kp|qMpH6ATqtAdPL9y6*mE8XgqTY4V6uC1oTG(J=Y+1afjK0o?A7aIwqoZxn&|=OGUs3ghUzfth3JqWcdOG!fly+ibhFg ztmxj8X;auP%;pMa%UV6j;?Jn4C`6*md<3?1R&QhB+A!aIAVwMxDfE5bSka3dx3J(T z7c{&}4hO1!QYEK&^)w;`h*Qz1Mr+o7*~pa6seWL)27l$qN+KK>t4;TA>&6Om|8@@E zOTHzJ%=NSgE%l#FMjlsp7Tb@ruG_d?s3@H(%EGCiQ0eLKfwu~)n~s^`kqQ~n2NOHa zcqlz@0w{-lbI zm&ES;A?eps!SeE#SXNOgqvmwo%NJg-TnD(?B;c>t=$FI~V`qM=kIXkqeDWQ)S7SD~ z97FFLRk(F~2W=2BL%yNQ;V2dZ)ylbny6vQ5MT0Hi2e+W{t6DqhSm>FQb}j4DhjUj$ z{jmrxq;fXde%dlcu?vF=Y{W)ErTJRL%-`U?>h+bka+g$8l$KV!o2oqZYvC%*&&?^T zcrk+358}2)?OEJoM7S^E4!jNCDs{!1H$m#e*41>%w}Xv2Y&UdAtevp|Gezwc`g0Gg zvMKOzwSG85P=qK)3&O0uef2d^>eFV+JJfLO57u@9Rg@Nuz^!*OpKG4T&9%7?uR3fN zE(aJZ4!0=_WE;iD}7N#iNx_-w&ia7_rC5OwS%TrNI;ZeOi(eq1s$Q+tkWA|XK` z7<+b~&|j{mrr+3WS3>wyzN0_Mv_vU;rb(khx*fTw!*{?#s6xu_wa-@|pCeDYfLza` zpgM%KoV>dZx=yT6Pg+YnShWJ@iK2L^Zz)rcRIWs7nj(pFwUk|?S1SZP)C6`{MRbD= z4J!}q0a5SUWW{-Nl$K++Gj$h{BJuPC$w&Czme`2a6P^W^2xe8l4KEE|^*n1}zJ_|$jQ zV3p1zMk6&r$)=$)aWuhO<#;*rfuUlCT)jfoAV?!Qh3%(GachRP@(nyTtH+#qJ3>k5 zys~kE<|m;H&u_hD%0u&t+bhE-F{%p>wbD5%^|B%b!F$&L`x$_)73Qe#+KyQ!1$p`ch5PSG~-7-=5lucJAgPq22l2GuY?iS(i0eB;3?d|_X2l3ZaQy9IQt z*^pck$}6t$0A+xE%knmttMF6l$IgfvK`6Q0=&_Q0!QXXaJkE0e>qa#_({JC_e~ID! zD|+|W;HBVSgO^e^);3iC5x@kLPyTx)W;#I8-@n!E{YO2~-=&!UQ8pRiB>Gc|`Ttny z#t4Xq{Vn$OuSW4$03jFVKXIUc^$yq)|7~acdnx8WJK%qfU^4xsX6auy>i^T|_Ggy< zErR(!%*8)<`TxJyy3qlOF8>av(E^GfGXuu{AC-Fn5vPBC+5gj?KcIf_U$^|VVkZHW zd%q4`atcMR=MadI)gkbkOHkM?;YOT)!lT2U0hh}L+wkr#EN3LD@}7A7#w_hhe$!J& z2*smWDUPN#i*c@dWF!5lbbBS0SF})riP~RhUWpmJy*WJ)zNLrJE4nZ|Aj{hcZM{z! zY<=+x!T(a)&tg2GyhEno@W%L@#!**zz>m@Z1EX`+!f3MuMm4y>Dd)|dL)zlf4dB6q zk|cmC5x&RxqCsYx(99og|6xek{zL-Rb>wr(VLu=7QjApst3B>kH))I@sF9mYILr{k zyMh(0FRvXP8xSc7As1Pv;mNj8o8H#BculF18y?4kaI{ZC#HS%x*S;ic&j#3ni>L2_ zi_?k~#32)NPEp{}_zJPia^24MH9a=$MiM{g;K<+q%)Zf4$ZL$pvjZ*4tR&6BJKEL5 z_Q&m+I!F|hu?I)%!6WRAL)G?wy$b36n`QXVmGocYMgPO{``^Zl{;d7~(0Bb=ApdrO z{C0f(N6ZKiJ7xZV2pR#Da%_KHLFZ|1o=8d!gFcVSHp`+UyeJ4W$f=C60lZ770w$ml zLnyT4RYcLEyosW!TG=V^--CB(gF_>m!q~;X;SmS-1hYfd{0!#!JOyteIOS&jv-q*} z1ZdcF!(;<-Q&GVbwF;H-;={ddS+)(vV zux>+86*jx&S<~4T>Y2q-g-Pq-Q1vnTWarhkE$>F3^Yzmjyinf4_$$VhCyZcO7ISNU zu7+LX`B@Qcpri(?ju+m0Mkff&gdRm(i~h^mV$u^cFt&3Imx;TW5vV>~-!-();hma9 zMWl8iJ<2oPDouRSgtq6EVZoQLR}PWe`$pdi?yBLr;eX*2QZ?#Z z?|X8gW2)*{-l>dHl!~&`>!ZRYLHf4=8JzzZ?}Y<}5f$V;Vn01YblIZ#+KsDMv>xIZ zemLf{HjNy1nbNd0iz!cs(|cazP2{1v_q#|~EE zb9dZ&Y=r&h&+gSpt7o$oL>R)BY+?p+2WVFY5S7W99}=o7s*pqZUSeR)^x*Nhiau92 z0S?GU2~8QLJ5|VLv?%8ISfz7m$V132)CUF-|Te_X#NGUrv<#_+VX8Ra5 z2z3I}FU}~7!e7|gCZWHRDJ}}H(F^n*IbsoiX5m(xM|;ipUUj&P;d|n|C-)#N=DvP=@OB1#mvvA-(w(LD)fuPW73VTc_Ehan z?~PJFW+c2h{M3&3Oc}#leS>!HRWy{(<*VVOW}9#4RgMPzUsy@+(o;}GJA z`{-^W%lWsqli{(a#vL(F3W9zhI`voK_**Z-f~WQ-jWbjL9+&bBYM<#QT)slHl+$MT zfNnwF>^bA!_>`(a0a^%}hN*4(sys7iGkkgtb`<>$yD3UVImpj7YLG4+P8ptHT5n%qRl(QK6_P%{jr zXrfo>le8;W9ZP5vvqXwYuI8a~wollAH$ihq4rejA!2dO3$rd|ks773w&^YR3pTsgd7$20GBNTBhvhGrr)O4PT0`Z4Rs zp1KeybNkJnlj%cSx7;KO>%l`t+FjL~mDhqz3~_Xfd~D0MxjW=JyW3<*>HAzDHyid7 z)`Z>?;-0W8VlHMCaM&NAM`Qv_wBUT zd8d^~7hsyiB;}b`CWaoL3hk#5!t+M5(BAl->*#yz7uW$y526X4WmnycEm1X$(kAp+ zw$GJF?IdO0T9%$NgffY)RMJp-b)v`v?3Oo?{zoF(MLIbQ%<(?htt$zTA>6fhQ z(&T;^-L!Jq1^t%#4Bdt8U#A^`bjjH~p#afza$cnX#%;Iw+n2~D^ekN}<}hUF#oG+h z?=ll|b^%N}ICTf7W;Nm+B!eT+B1LqXSE2>_FpK&`=mMb8*}?IdpycQSlrqd z^CTmu4=IeG8Jb`$njy6-7Jv`3<{Nz8&1ZS&|uTM zPIY~H`}J^~Fm0sT$tYk#V^g0};%6czLO+(D+cyY`z*=7w+4 zEwDy4CU(v^43Ms*6}aBBUx15EWv_zbeK(C`UNMXGIZ16g$v7wb$E zKo&E>RD6D0ti09SQEuB>Q=g!YdI_<8VRMnWt%=1pSs|4Dm>Hu+q%lj8oC%tWpT^wD z+`5v5c}B8&I)eHMHC2jgKG`>JgUDc{iL_E7okzQ|eqykwF*5b#Iu_~Tk+75;jPa6^ zgc9eEquj#wkS|``k=+hP^4@kz+(p{GLX>Ew_RP&aD)}ME>GDh!eN81@_X*9nUnQ<3 zm7wfRT1QKbQEnF;OJ-<|#q_0$q&L{xaWZb^N_q%fa+w(?&MAf?DldFX=p-5j+~=1L zxXg;@CxW|rlpCRJ%KQVF%Hy?;7%U1~JLvX39;$exCko!$!#v9@D$@#8}*YO^4$p{)5tyD5<){kF zQ?Gepz*fi#yXIR`GS_A`OGnFI9YwpWd4oP3hdsyr))#wL2bg*y>^}uf+)OSn^bq{Pp;^~%U!>s*h`-SPQ-OHv( z0p^KB?@MD+TIv=qwkoM8IR_RKJKLXLejp-#^v9Xs*AA!|+g;ZU(AM*jjj#Hp)u#oZ zsu$4edcTpArpqcJua!kkXZz%&q$d}FL|??Zs4&^JWK79b?$ z67?+lGULmRM4n`M-`50luGo^7NuF@QM3$lDB+gRcFs_@_sBC8wah439nNavMonbv+ ze4@ZQ=R!VwQ$$h@!PF&o^r!a;$_e!eehD;QgmwaZQcH-s%^hh*!V|{){@6)j-_4q; zwm=g?1cPEmNtaNef{1*P?4mr2oK<0#UW$a4@VXF}#e-|YQL0lrx`*R9m2tJxLD|<@ zH3U=XbVKGw?R}_tLSe9xwNYSeKVa+jm(OEdH6TWfbG+y&@!KpTTUFufYI5R8H1wh0 zRigPj{B7}{=AXO^2pLNhEhA7W5t{2uNepJG`+;*rg|d;Ty&4J3dkE-jeiTqo;vrB! z2XJB^#S}F*gbgjlJ2i8Dr<&7J6w2JP)5IC1SFh|h)QOi$(V^2}o>)1mGG?FUxlE~JkkVye=~+PB9Z&}M z;CINX#;#UayGj1hR&S9nF&P@&+T=`4pTQo_9?Krkl4u^+YM7KNuR;Xo2IGO9Z34~B zFe-AL4YH9!T}cvzDa*8l?nq|QN9+_Q;?9M6VLa=5*x*!#ezjH?$OMvknpkVx#bAMN z@rAR1L5*Q6g*E_iG$x=7zW%1eq}AEs9@i~Gwzg-Vpkn6l57j+_-L6Lz!UhlX*tlkW z%yzQ%IIVZ=o=%0QLGTa19v$LWi2$GGD_HpV;hrpl*Xy1vyjSgQAL*}K@=pOS8np+! zHsM#7$nQn|o$^myJy}GrS^+x9Z|(K;)dw{j#xW)+8nxj;k^2QHW8B;HF%+poTv^W%w0(&kCN4wgUUoR?EM8K*AjNDZtPY@35fF1D?f{0tPKY^HFm^SH1KVZp#j zf&lB;MPX9bsU%`U3++igZrhOEiPQ z6QWUWV=co*$_`dVSp@1fgudaAOuS!&hKM3t5ugB&;qi`(QQ%{LM9u* ztC*wpOq(vw^P#QgoRiHp?4cYny4w|qAlvX_lwjF2mXAVhy`;bJw7G}r^N77UWuPjr z^IM#Qod?ubwKfNR&R!@xlxy6{-`N&9%*%!5nl=jehtDf|uS>Nm3l`Z;mye5)DV={7 zT4=ojEh>0OE$*K!sqU(qBduz&48S^QA=)^{gR&E=)a*mML|jYSLLa&|Un^*Bh(|WB zGckJCScrC&R@zNCtH=aKBm5+0Sh~1A$iMjP&}H{#A=Jz=-_fmYh--FfGFer$f_P5t zVd9bA?ngMY?O5mF&;A1&CTLvGP819a+x*_$CiME(2MqHqEQBSBA4=^-{FexwD@-vN zRwC-41#PluP=i{b?+qRpkcA~HEC%cK1j#lO$}SC41W>ZF$>q?ZWIyXq4eH*>KvTWu zY(h%{n#M&+iB+x@TB?339|f8TrC+ya!|)51H8D+)(x};$P6j3a3=l8~6gC$AIyU(R zio`;{pWDY+>axI$6izjhd2}{QA0E1~tdjlK{j?)X(t%)dYk%68B)m;gqCnrT;%4x* zH8$n+7I`l8x)4|K`rBKRK?ma-)~hb_Yc@Lqus0@%w-{%Zw^qatZ$3Uz`nT90KO}j= zXkSYxS`YS>UCzy41WSK1dXeYN7jk>V9mT~Pz6d^7FWxOOAT=#N|(?zVp=Cn%A>xCuF;y$4HCHy6zTNvH%p6&o+;RChh7v_3zc=HRU z!#&FZ#sRkR1gJw)6nTj=-s+%>XYCrfz>j8~uw4YNWx0t^Nrzh)>2NiSMn4;hH29uM z&Yag5EMcaWnVOlJaB6M^VHJ+uG$#Xn|^FSpm&bPYCK(y7=%6jOm`W(}*xS#?XzSmvWPDk7q&%ZE<}uoz(I z!a~hkrb~fn4cXbkgISv&pbqwWJTwDA6lFO zui+vXhB1|KCi3A$Vvn9a5*>&>gbOoW;J{D3XLTglm2wuwO7V4l^XPcNP@GPY+zUH@ zJOWN|jN8niKo}-+#OK;;Jo>`o2GJ6`zKtIzRhXUj4lQp7kz!l}7CY>iAI%jb{6Nqt z{KY-GJx2P0Pv)(2YSEDAj^I}w3mcHvosVwzFyD~`3^Uv3w;_q?tg${Id(tl_I^AJ> zhA3a+meKeRqIC#RlVaV5h;Hc=dBXIrVtZqRv;!?~?BhU(@GE(#*?^y4&^68Mi2`Ht zXw$JGM(=272liAorBQNuc_Qr4_##={kSmD7Xyre!xWfrZqKmFE!;QTN24dr6MWvb9 zKzHvt^U!vO5j2IQzkLLnUBwh6^CoVy?9C_t^a(sB9;FLO|33UeHYP}Sx|p0EfMCyD zIKvG#JJd`}AzR`TY9S{)(d$?eCNAhKH(8+#LM+Im`~a`E%{?DQ!^O#vXLC z#6~crJz2#(&j5X#w_@xlUDhiV%F)23FlsDIispBr7l^g+{ylL@e3fl>d!~xTs60rP z=*BH!^@Zp`JBq~EMm_Xql+oeUVfR;@&Tos`E_=APao%4~r8d4J?|msFy6hu=*bu_$ zU00Q|7EJI)dfY;}(JsUPFumbk6SnSAzwus^=H~VG2fOyT!7n4k9l#wDsnY&{i`s#C z1K|vW-ZNekwmSQFw7X&vU-#y-i~I%_A|8>mRqJCJ3lb6d)b=RLAG|8nx6U4qJ)SG>XC30sfuI*|Prs-k8@u?|$hELbyKv4R_Zu)Q5+BBAMCp^t zoKLuM?A-XP_Ai}0MF7px( zjiFUPTn=-9otuq56z!a?;_QWrm)bE z=JTQ}`NegfIz2!9G?-$U&B&?t$-#OA_|^aZqy&#uKtSWjBF?9?F23{!JUq%mNlcxX zg4uINoy}r}5}{dK;mnMQC^$QNMmdI98e>ADy%L%}0pZ_T+ooFCWp_0FTQBjY=|`6D zZ`x_Eo1zlU*bh%2y(b&CG~rq z7=sy^N`G$9>iXYa0X!k>-8K8uGEtrB|3%zeM%DG@>AJW(8@CV~0>Rzg-QC?GxNKY# z++8;APOuFGf;$Aa;KALwRMoBSe|Md(d+wKWzOJ!Zuvl|42ES)M?|b&E%lGd$qpFv9 z%6~u0@Xwn$?wFf5*-|>ps59A28!{UU|Kn5D5>Ja`WB>1`+UcROuP*=Nks)arY5(yf zqu5NpZlKz6dHyT;dG7%FPr&k@1oD5)UnTy*UqxJPOzaiZ-^u2Gw?>&cm{{LczjrwE zw;NbE{*Ae^ynB8u?+riyWUlNS?*9dTxiM@@Ph@+Lg#fQI@ zw7k<(QBfza4|IxP?Dj$-#lCJ zr^WilRZkl})~o&d)sLbE?#-nvz1vvLA~OM^)7fnR_DOx&{MNU}8%5NjhlL-fN8J{l z{=Wn(sz@C@n;Y@8auZv-B-t4-OBrbB>RmtVU-&fRo0eQY!R{`(YX9p#_+M{>f7e~~ z-xtLHHun6x#r*!#)SWaOZOoj^E#9lP{w^s0_5J6O_aE-C*Ll?K?&h>>G#}35Txs}ZclD941^X;2%PZ_jL?UQlv19e#Mm3>0LEvaYOUz8I2?m9-p#1GIr6yrQ+e|Kv-9Jp%@>n~&wS-_5P( zS;tcnrX&L5^i5=hkDcC1$j=7H4;X!2%t!W)jPyBt&x1q=m^@Qw4i3mo2KVP2jAK1; zFXv#d4Z!CV_ugl~^%?%r%Fp@LD^KYPiH{y zJ7$z(vY(~-Mu`6X=l9328@Y-71pJF}fr6YoQ+F>`uZQFZNz89QFS=jU4!CQ8w@5&b zLMOkvO(jMe%x!1^@x8g7?xlGbb_8Dn#{gSPXIpLOQH7~jj1Rjuoj$Wz-hdKJLj#GW z$c`s|A1ImWG)$rOmFM&PNjXt;u!Ot&=u_q70X2P*Vop4J^w>^(npN1**U`WrBuP+yv6c4viGJtE zsPp7);u5r|BjRlXJ^MjAIU9epzvQ~mp(7k-&5^5eFZQhkboV(i&5cZ zLNub55jcb_2{z%4gY7Afu|M=4#r%N*X zvoQBlH8AN>Mpth+w@Hd?#O?6w8$3v;T>kazrTAl@%kp;*lQIIJ7{oXPJmfb>Vk0Yr zCL{T|)y(%aX~sW)@&!?*Q1fBhPHkhuF8re!_aREKoJqj!U=?61)*nY`FW7u?7C{*2 zr)A;=VPBT|GZE-79&uNmteeX3F^k`+c zM|vv_N~Fr&8P@yuxrl~T*v?!9GVIW+r($NtrHvOpFsS*8=Mxmx2&nz#c;|HMld$F zG{<_q!|Lp?xQD+giV{Ha!cXVkA2!w%(FVMSWM05%A`cOmet00fUjsx6(SBGk5m<;4 zFlDK2C)sao(a?;$;```H@^j$$&ogM0vF%
e45{x|ueH`lTHM+SN+>%5w|6PFGH z#iS*3){a&EpV(&yU$kjbMv7HsKT2aFT>B&pCCn-Dh)3S_U?9zx&sE&=7AZM4{tlPk zi9oJGnbqDrQKrY?t*)4Ld$>8z*QHjYpL>~iY<(h=EfHWJ~!mW-Mq(&1PZh-YU|(YFqbe$iO7O$q;T zc|B-+p7Ej==M&Pe8$Mk&mt)c0(K5+Tgyu9Lgm$W4Nl;JutJ>2KbR{*P6t?czu3YxM z+Q^z&eA)XI!Q_K8=p{r20&mGmL- zvp1Q4UWeR|`frrqoUrV!L?gvQzkUaa+>UCu&raLWR;27j545Z14Y#fFXxeirL=ff@ zt_od-Furz4`VRZDMjz5MWZr%bzr|^9ok1ex_C`6thvQ`hCNbqmr$Hp*`6he$fZ{zl zamj0Z;gt;AR$WQ+b{ZfeVRpEWrRA2%KXTNsM9wliq*HrzMmPn{|3K45#ta+N=Icrc z{xY}x@Yyu_1&C*{(T@^%_>6RO+R=$V;b!Ib{T{Lkz7`A2ixNop@zkp?EW!m_Zae0< z|Ja|a;S4(W+hP$vkqZTbZz4D14KOp2+UMcZ;1ef<)J3Vzu;xGK0Wyjh(ZM{F$yEtov)rtewKJ=Zf&8@`c zW$QVm<7Sgq<_IyD$sC$`;^p*1(n<<)lk_8M_v87V-k_xnf*Fk=7l8$Lng>%8{d$xvOr?vAfQbfzam_HRT03dfF7)l{MH9 zXE{aDRwz8zcsR#H=>{u-pYqd$^N0+CaXETkT$oxKYt?TL zuVPUXGSkrNT&wO|qfZFC3}x)#ph7us|9mRcBVc6YS!BNj{!~M=Za&*0V{5ADC~S+G zCK4H0s|@_$1WC65ttpde?w+VH>@bv?l*YD1!p%k1P4002o6&mScJmLa0~a|!+MSoYM(Q_e{x)&pD2pmn}NRDGv7wMRAbw295N%; za_%Un_b{UJIp5^l@2;dc%`67GdIcGH#=Usanz{1171>9!vTL|egBolBMy|A!lQ|VC z`Y-9TCRENhQEfE)$1%}*zpzJ(?g`|Rgu0wfmLy&Qng;Nht1y-7+3-75e`u6`%I!h7 zhrI|4qKI+vMIQlVsRoaoTz;Gdnwp;a&c9*=+6?INSx)`=!rLz{aJGwcwtW>O%uS4v zZMf5L=MO9mvJYN_Up<{|2WAzTqa7uB$*Bz6D`>~7+fK+~1&2h>jxhAHQ&pE&_!I{| zCm_|L%Sp5++UnVah%yPazdgNXW;V>sP*i_oDk@MN#H-2d!a^Jgu$Qfdt zjWXJJXf7-?RZ^L5#?+{nmZvk{e5^qJbW5>fhl_+1Jy1xTCA#aUpG`rpLh!;`z73yD zMI+U>_6L8pQVJ;SCZ=@(19pqpmlZO8ZX(0*AA!C;Ky8pU+tUA9G%JlKyBL$!C{A5& zF+{ecbzmK@qIzp8Yx`Y?qM98y6p&2KrjQA;|HPp=bp06Hr2aAONC=0ntn>;6K*c^9 z`8;Z!HqIw=c zG$!Y&W(O!aSd~$gOO4l|*&U3mS1t`sRcr*mBw6tNUGvw#EANG$VErau=)xR^?G> z^|AA09joCz^rae1vE0Mck<$GIaRL7bB#+TyzQwN+E>LLZ{PV8%~Kqtq?u*}R7 zOYq|FAxmQMmk)wYSBIJ3(tSPz=UA=jV#Mmae2S|p0BYR1U|yGuNX&f>qRa4Z$q zpnaA6xg^k8GDHO9F@)JW(N_0;7$uG_gZ>=x-tkkvktrTdQ$-K;l-6n3iVTa{>eiB5 zpm#g^C_c{Y*1V6otX<1gal9|;I$F3&O^g~nCSkEgE>knpXFk3T>8nTq2-6Giu2O30 zrTD%?1r?d#iLs#u)+)V(&tq7F17D|AHf`Y#NbnGUmy0LPt4=8-a=qgEV#>LVxqe^P zM#0VRn{kc!y>J`71vS|F#99BFb=yM4J43V}xMYRiH0j4LT+*P%OLi>0a~#8FbAdPh z9f^@0d-z&5e04k2NxjA4?!hdRz~R@9*uu_mYb&d{O%N@Cj*FlNjB5dtyo~_Hlpb`D zX1VtER?}}z?w4c;|M!Y$V|YianDdSZ0zTS+%5C(;G(WvXT8$@` zSelnunD5wWGF{DOh<+4HPE5>9O+bVm<#&DR^=lMKWMCg9SHatNtQJ8;Y=!C~WQuzw z+E!rs6K9&i99JmzfOz2}E9Neo&ZTH1Kxy|==g~_U(TuHS; z5ORhD>g+pF9WD2pPuP50qW>UHstDD}EJo$QsQ(h0zM-Gz`+yJbvEiIBoLOKw9k&-LR`QD*O6Duc*rE7v@F#fGB3M)`k9(*fu z9?%Z-FcmWu*fK&9ZGc8JBa`jn)$b&71DYA$5x$fDj%o1WXGHWT>}5GK?j9*#tf!7& zQ&`(ssj7{AS>$#RK@Ba|FO^qw975H#b|pV}U`M7G$;zjoFtQlOT4wI4 z2ISjQ{Dm1|A7RZi#!Y6o;a^>B%!M2WuY$61Fkh&y9`PjFBjz?d)_hzhD$46 z5+Wz>oCDjCKZ4}xo!r%17+l@z*|m2AZGDc_Ei9UQs*cwUP+x3QQ1k!`*~Bd3c0G(< zi(6Gp^-E}T918nca&9vzg~T!Xh7k4o)fjkmL^Yr3-P@6o@x&6Q{p8x;D+eRxFFu_? z4_%60JnPcTsG+Geba2w}7~Be_QE5_FS@8pa(627DAgi+rDCL^nSY# zI|i{;nV%U@fh26o%aNw9p4}5a#}8SI8$J&boWjE56AdAq-h~P>u^UC1VhhxIhrRfx zij-6}r-ahUju~Djr>@T|xXp-Z{+O}0YoXPeplyYZA~OADbmgVf-e|>;Z3y4cgQ%#q zYf8Luq545@0FRk0&wS%S%;T19$a39Vj=+9UF2HMP0+?b$j{ zz2$tmr>X^Ez)dI}+seTrYV(KqF*~tK{}6_Y|MBJ&hD*BdXE4uQKhG*r+Rq2Y`t&F2 zny#VTfuiH_#el=wMYtQo+fNto<*>IAi#)57>r&~6EK(6k4j(4L0r@m_gAZS3xUfV8 z#O3rCJQPGkyqQei&pbAi37HuEtktxNc6B59PMk(NxoJT(@+s92`GKsS=qGjLz-}CF zv1|KkpD&vLN!=K9N)iy3|N6roRv?NX;ak{Zm#TErkJJ5^8?7H|=v_p1d^ZfIcsE5K zN+I4X&ZRVWc1`sfKGN7B!bSL7v?+38q1bQ`AUsy2QV){dX~2qUbb~IUsPaBztW@Xk zHcKqTqvY}-g>}{pVWz0DLTyNEyG%~E9{nkt{{GndtpT0bzp_Sp>B3o)wsSE-UFW0R(a@QMcO5rEGHJQ z%}v1t=9iM_b`Llcl|AL(AD!1~d`Cwr2%&<`ZoPds6@E^Q3}P85bc1>lakBRgA|Xh& zICOu1W~rj+XGp)dIR3dfRH~S3wD+nJJV>5b1!Wtf%(x88AoNECCNBU$wW{)L+DYj` zIeK_CD5LO0>%CDKESAz;CtF_D+Oa%uYaqsaAJ;FY1P6_JYRYTf6bjINp&_K2)z+RX zQ@5Fy-A&!zW{g#>Rvj`IVUX5fN*gZjg|d@oDw25u|N3pa{rm{**f6b0rL%Ro?Me~5 zbM9T=?X)U898?|5l}q_!Pf-t=u?$zCv)SdevWY<=?TD=iTQsdKwMmIC`E%0ZbIutX z3}^Q9zIPto`=KqXu}fswk}#Bv`1F*JV7c3DlB*R3orB}+DQv(-y)88=?dw}1!g&^Z zm3$7L=Qlo3*3CH@qHY4geaB&m01=b_Z}^N*rJaWMQ>Y>r@b8SPwsFRA{#tga;h_WR z?h@TU;Ubgok?_Jz(oQet=GXPc)}`B_J{`5k;%RT=A=h{tr>E_utGKBf<@chr*Na03 zMm&V{LE(oms96`376PXBuaapW-Dt|T6jtO*dM__ucA1)$H0mT|=m5zdjThz*44AbA ztyz~Mkq)&4-y1~vu}(FJ(_lYo#GRgaIphkS`}~~XV<6Exz>Z#*zQ35BjtgRWL#5ZI zlKa;gChL0?-+#yw|6j9w$$xRFM4jx-|2fnD|0_~)zo+88&-A(8zfR1=S=!=#TtO$X`bGR-8}Ps53>L0`XHjwfMVb3|<6yRb7qYiPNuGkC znu`@7sJ@K;;Wkm1evow{sHb)b6s0a#mw7Sv$uftu!puU!_^{(l12w35&=y@R@CxZY zV{edJl+{5!9kW~GR~zNmJs)By_Y{YxVp@DTq3u(Q=OJ9aHKR>BnT<|3r{fgHZnQ5y zZpPcm4#04ONe$+N%jwrMZNEyOQwtq*4%?ji+G2Afw%y#pl%^s^MLwt@c7XdqLvlJV zeJX|tmlQ+7*z=EPJZu@qHc9Lb-<31j4Gtuii;=@pOMG=Y(r}TQ+zXCV8qUfPa4|6?#9?+m ze*9R>XsiR6f^sYy^5}}z#++vO;FS_HCBNahXO1!T=6}}H>1i~x@f_f0x%X*fsoRYj z$SgVp%_#b*V&rqnvg_pIYdD4>e1Qf>QUwu5ND;&4GiP>Qc?Qe)wZg4$2&QTo=Jxf? zS2LQeFQjB*Fw_Wa->MyL#e;^R?hIkAe=24ha;oQjv@q+@KQP0Fz=&@+jidC600*%_2*FL6kcW zNcp5nntAUP(+#o62ZWkChwK^luWzW;aBCs@PT9J@78^OCPPuMHhFTF!XhB%rhSCdb zU->cVo_N&1a;rlc$K&d#kcip}@S5^oinIu&k$#Xa zBb1r){qc&y6y(ILO-^tV!R@LHNiRk*C9NJdSiob=lo_|qY}4z3kfHJ!5cAk)a7c@e z69g+&IBh(Nh`t&&I^g6QIhMFh@clf4nPpUAS>mk$_N9mP!R!BXPBwxqvi}(sVoQ zI4){S=g1he9Oq$&mh9D|j_^6eg9V2p2&V)*OHJ$TRHyQ(427LUlt$E+8UVi`o=mqo z3-dF|IF6bfrsfxTRxPy7haI)b^0D85atw}Tun?xsl7tZXB9TFD+U~CA8uI4nqP4!7 zN|AF_I7a5^x-%8Yb~=JSjER{Fw7wnI#1T*?$`V|UdrFztetPE1jWr3bzQ_6vxxsD; zb%nS0adrUBD$k-PA$_w$_|j8x+`@$|^o;a$BygXBG2Su7Fby=qImEl$v7?1Ucb-$= zr9-D-Nv}o!xe`nLYsKi1^Ot6yui?||cHNiCZ*hLuuLGXJQW2#KYy*u$SLJ~hYXKW~ zY?Dk5@tg)7s!t%M=K?1rzdzTIfsg*GZ>ed^e_U$K;Eeizho7uxtUEm)-qoI-Igk}8 zeTaAS#dy!UdQCG{4M#>Lxk$9bI*iK8-Po z+($Rtd@DjP?t-aXGLTGcJv`Kbw8zR@~qu&{M{F3T0eN&ahg)r0`3ER2>cWd5BcYn0_P(z`+Wc&Oi@KL3;b2@l zW4DS`y!WTW=>qv-vV(&1>@sCdT6cqF+CRhv*t+>mgca|Q{FqZ~l5wlWtu$XBlM;4m z@J+NO9Ed8}FRv0e2uiuUAO#Yi>}y)wCPN<8#+J>H*c(1bjc&^XL;7QupAfHFDFQgEikW3JFY(QEaiy%^UvctVp(ptcKJPch{5WGrzL<#+A9Q~N z|2wu`JpMRAsg3+U2Wa0TYlH>#fxPXp-C`R>WF`u(B%+S_SqHdtDtL1mc-Q)>N-WB1 z0aFoT1ucnhRz8<+Nt4S$a4cr$QezHypF6msMc$11OIVdFPKl-->8EG?a9}Dy^{P0Y z5l@KaZ7{_%dJDZBz%IZD@9>n*C zz@ZI|jt@_aj7fVI-zX^@{^Dv^QZ)^3_LO(8t((G-bB?bSDZP2eOi1nWBfa#nMF;kB ziYdbcn!CxNI+vHGL+v0!sERY>GS|!xwEMlj*(LN_oU>I3rN)KEkkLT;9ziEIMY z@g)r%45Jv?44dI9wL$SBTo6(*QgUM&s2=w2C=RywdgOh_*|DR_EDVQRYW?CxMjCBw zgc{pJB1f@6a^V4GC}v=!*$@x2={nj*3C=vLci?_4k5>JqYg@@Mnq$wwKR0H{#r65i zQDHV_>L;ro*-riiLtiGWA$Bzc(@km#*{y3!DO`RcRU(PH}i=TR=nU~ z%0zoj$~zm(AzZ@ogkENhQ+^&@A+biu=ElQGopr+|#GZ;KUMNGNQIn`4#;o;9OJs=o z!Ei@f+mJ4!VWHLjX32ifi}#gfKs@9otVj7ixazF19lIeB5QLu5y0x zvAa6(f&SC(7o6hMPr6n=e#K|&NUL}ujoePHZI2i4G$^;1XCoRjNIQrC>EO{)V*zdX zVMkbsGG8r=(??t&u$)5FS3NOqg!!HO!Y%g_*79gm37%cb`_S5Qon;HM4T11MjPiqYHN?QDY_HVFnv2`u(ddY@vtJ+0bv0GjM~tZ(>5B@fU}{p%xO#`)3mhqvVG^;idB|CCdZYB) zgp7Nj3ncn9qA)&W|7tR$3>_X|j@jhl)B z$1prSBhBQ9DEyqda25_ls2&_Q4n{~H3G`|L1;5zxM}BqaFVHx&{5=SY*)jClI4YFW zmo7M>dJDWNxuDPLd|#80DG+rSGH-CRrdSHdXvNa7RE5`-U3gFtfojrK!Gtm;;n}~m zH&qo<5UUtPI0mLB4uvaF^2xt2lgjoT!O%jl;$hO^5>?F5=0vY!kUwKqA1ORi;L%r> zM&Qu%OkT4Z#Jl5 z^X3yu20V5miGK3`5wU9yRBr!$kYB*6>dLX0gUV=g7BJ7c;V*Qt59f-mdZ$@Gc z0ZbKQ+<}!sFF8PjxQj9XUcBB2a8l@{26z&$*8=#8Pg6&0sx(FR(M7KndWiw}Brd+w zdPHt>sMzBTR2D8$M{9}KYXJ1bFB)h$V@#814Y3B`R61#+ZwkFc0Dr_UI%yZ8w|P|f z8KOA~y(9sZ67{kG28oL%TFuBp9e`4_X$Ea-^fsc(C(ME0gRmi0J1oX5#UOk zMGMdlVA}8%!*G_Mwb_+e~cb3Os9;FDop9ix_D)iA z#5Y=2@dPHM2-+F(1p4TJLTOwHG8M|Gk17Df!brR@0|2MWkEoBD08N!^M~aUEQQlDV zta8e9qRv0Y%$#qzv;C2zVym39p%zh%x4ub{ABQ_P^|^2XgWls1ohYR&G5NbNa+!d? zKSG2wIlDs;LVjZFY3A%|%F&t1TqkMD%NQNAt46()kF(q>U1S%j z#sPjS^cktho7jlR2iTYiw(R{@@NQ#4CmZfpyR4%?-~VBrW;tMe@!a=ku!{Ue>OxO+kB~)e+D-#89I&3=EP*e#%ggPw^wA7L%FXy zs0$b`+?IuN@ zqw-z$P)ati^cos;MrTlPO#&KC?gqI>&2Uw}`U83C{1pyAf@*0E@~^2tpJ`vd&g>_@ z${zBA+>$3$dBqOhD~*KmCuwsEujxQawEpskl%P0Tf9XSL*)uhtxEVy*pL8Teb0UWZ zvS-S?vWEzu{^a$NYg~|6GMXx{u#FJtR&&EWpNsCKs3~oRRMsI`m#$gaRdrdx1`otV zds2MO3nEE2ENaS`sZ4HB@d=yJlnpFs3Y!^C=2Tl2x1j)~(K_T`e+1nm8|F8Co4HC} zQ1$sX)0n)V>=Qm?D_cohU3|?B!b#38Y|2)3t7O4DkdYmwWdvQrfT)s5ORw=kQgnUt1YMFU9LQZ3P1Yv)QB4+P}9iyRo?;g-#ZyOHhRZdCA^to0&hSHL3G3GL;AtDq1@v-Bc7w? zW1n+ue%xdL!-CU*pCJOF{m||iHu*P+H>;#nrU<|`U@M>+Pzf>*LJ%$+#t-Hm;~et+ zpG#jLHt;vl42TBq0D3}5L4NxpwdsX_&bi45CI^dvA;AH{e47ejL9ij1RG26qXR43@ zdk5wi?ii{QauLzXKnl(0JR|WAOj)oAv;kPQ5Inq5xfxVAkRPM=jiNN z&!mSeRF=YYL1@E!k=Eg!6L0E(3Bhc@d7uU`1z4&vF2Vqz1ljc3HXWECG<(oG6j%RP z^04>RAR<}GGCt(UddkU)W+tqxSY(p0rPluoZusNpPMw&Qj<_b9A~QE239f^(vtkjA z;Bl0ekNxH1N$=?`_i-=r?fsA6h46pQ5AqWFyTiircF1G33KGjiP8v=NMHIbz5oiqe zP#CGDq_&((-7~OL(8yHQgD+-r7}JM8xf~7ER5^E>4@VQkBVP^Erj( zvp5B838%W`K4h-u+3eV7I?FmbM%#**_Xu`nnV7irLNG%V=&qt}LNb93z$9QN;0iDh z$`LXE_8ICPe$xu907eBX0sjE)fR#Wp$UyjKhu0(0oFp` zK^Q@GLp-CN^K8}vuYhjAMj#t-7B~q}3XumT2&_Miz{0Tt< z^n^Tv_y+Y20u6c{t`n9Uh8uw!ViDaMz7uf~ei3;Q+8VkEN*6*A>=@h_)EErd61{8e$N75RwqW4DtrZE6kV=#|)>8S_Tyh7Yh{&qYfnrK@YJDGy$>-)8)e`!_dM2 zATA-rAjKe{A)z67fGEPeU`T1`VyH*RL`Z)K8KAf@)CW>y_{H~;iZ&2uifI1T*XQ(Y zu5^1NC+KbcCmuN^dCy_8mosFf1S=qPTX{FYJSasywlw_s&AQn&aA`&P3(95iNNT^h zm8UgTtYwbo%IFzv;Ng}1_fo{wK7lSuI~QtMH~-y7e6(NJ!wYtcJ_T3$rMG)71`W+u ziy0Gb+Er|SVDS0zW5%!?Td98BS$;}|>8Pd&aS&XmZN*vz_Up{C@?yf{j-W^7Z6@lI&WT6hMpDaz93O98 z)^F2s+=VgSy0sV!s+6->XMclsves8s?=2{_ozE_i2A|pB4VHHBHi@>JiCjy>1XN%~ z>@Se{5X@2lhZhT7gypJq5_Ps72f@V&ggp~e%H?NNIzEe3bUXXHnZ`HfRRW$R*zz?> za4TfcMc74|Uo4X*KBU~3>-28(c2o=frWz5yy#<0IO0W3NQ94^4ZTk*7htB-fjv`uG zOBQy*r6h3KcTf1P`*b_q=Z==Wn1F#+&)=0TjyK_sk5cT;hU0FOKDob`GDsf{-{m2p zsaV{h-eTc}`Q!&UkP7%b#*d>iVGt&}D0Rc%PGPnhW(1*`er_8;_ibX z@TZDoqAn)78C0#ExnxQrD@hNey(EM^vBF*XM6j^bOC!nE!=8D&s=4=hIy&OGfk!Y9!8~XrqlIRD#j~NMi=3Gbw2o zXBr4LMh85B0)NSk`tY!hNJosJdeDr=ppM03?w2J7N~~aFVC8`chb&s$MAvi5 zJ()5*_|UHCOhnlmE3~iFNcwC;JbT0TE#Z?+N6V<)8gHbh(cR=RW#q4{Ikv%CUVu-? z^3Olfp5Kvh%Y5f@H{{k7zAgT~=P|K&MHk#c6cn5q!gAk(@kp!=@E7yi%17CFokY)O z54j7i;jP|z7(_|Y0=6(x2Mqh|?cc<&!&&P{N-IUVE+?~w!&00il>wLy=~p_On&@#F zZcl3qMDY=S4&xlgQ<=a_FU=l%9Fz_FyAS)<%{w+Hjqq4f4E6_~)RD-=8eI)8X!>0= zRmSKX>mn@pW)Pg{iXGoUFP^zcr%^a1P!(q*$Yr=kb#RC*DS99|AlL@Itb*1?uR~m1 z1^Ef!c@!}MI#v!4=E`ypIJjx`qxLYeLz}qUIVY+(CeIl>8{KjK9F#M$7dhwa;{HcRUG>z4M1&)bv$Dca+ z5pKsIB=OFer&K+G94pmiid6uV>8?3UzuVw$Lrsl3o0@8=q?qfJ11~3Rf70Z!>^?jk z9Hc|S!g4z!^3-`D@V2<)kaiLJvqj{)>MzOwfch7_z*HU>Mf_Nj;k92>noMxs1o4@JDj7@X%XAHRdToi%;s)cPFr>}a> z&W^Iv(PH2$)jPfL2@*|KUu*55cpeKXx6A(Y<_X7Z+pWl)H$N9VIF*OTYOO3ZE_5dS z0O!@FekCX}U}uzDI6Q0Ny1Bk@>$sX@d_rzT!V@8r9LTj+QR4e^0n4U*sjq8YJd5y< zaXL3i@uvgr77z}XW-Alp;@e2$Q;UONj)CF%OeeV?01rc>+3_)$Mt_4tY?&{g1Xg%C zfEEVTl@?zp_Sp}BFnIrsGteSl6#pc-K(GNVDQ{S5=_--lAR}r`3~pGVA!R~`Qj9CE zpQlMOrMAgOz?np_ZyK+mTA!#Iz(PVtzDZQq8Gb|b-v>!Fb4cOo7Yw`%5@G>HH z&{@!R^6vWRJwK4LU6v2EyJ$fT!ZN&Oo}Z-`Zka_I^(Ws4aJ;E+T*RC4gu~&w2Vs4>xsylB#r0y z@a*2H|MG(~3C!vF0gb}u1VOihYX+fu?N@q@?5{vEJ>N`b1&`NvgSSkez`Ot6#_Fti z!pnaon*@7X7n*GlHNeM)L6F7eZdLy0b@i9yM$X)cZ;%MG6EaNQT2nY{&n zBo^-Kt4ZOHBe=zUbh@Ox>7&i*B9pn;cXDM$ZcJAp4W(jqcV$jawa~ETiJ-ztrC5;l zoU|Wi*Z8C0tY~~YM}@2gM^Hp=VTP4DceUkve}1K{s`1St-jxbvj;Yk` zkkKSu(bZZTXRlbATIC~lVq%VxH?L>ilbs2L%!VlaVP-Wtq>V0(0|_T%Iivg@KkG}q zP}@=Zi9utALJf6`NJGPDn*-w0DDJ^mx%`E14gBJE5+S!4|VzHV)6r&_nt{74G_ zBzG{G=y6hQ7DzS+=0HvXba6J=D+XBar{yW;7(U9jw>#hCuS8lMVR;%!lcivlo$Vgv zT$(P;^mQJPqn1zh7#gyWk6k7%mucP5XKHN|#%|ojjmM(MN1l_!qf;%fz92XCQ%$k; zgMC$DNkVZ1A6nZT(5gj9YxbV?b77;mH)mbZkc@k%QRsry)e@94=zL&3tIqZ%Nzn^|V_{9+>&Wy$v9=1@hI(JBVy;jE8r^zf#tbPjH_b5;e z2e{AV+sJ|e|F~fi6Tf-9e&scZfcAM2pNjwZ;t|1eEu-1>{7bj*CN?}_1k<0qZuZY^ zd*}D5X|8G4=r?!$V<#DB?C6&lE4akwwYH=!PPN10&jvGuU=KKR$qPnX92=xdh_YMG z2sGGHj_flMhlC1c9pY;Stq<;2Cc?OOf=mmeIe5%@18Y!;)&cH)#+-Ck7wdHO6lNYy z@o0-GYPXAZ2MdU1tP221j>Ww7P(HjIFIKJU-j&lae_ucUb+Z$&AKh4kGKAn>O8t=eOTbc-vK>NLW~Rk^_VGs&qZ%^mcBSq_J_R zS)391!r-D!9LzWoI5Kw_TQqpjN3hm7Cf1GdwU#Fsr*|bnJ| zt3RD*$g8Hnsq5>GM*O|m`5Y^;+F0l2<8f^{lXhDheHmVI{lOh+RB2F7JX#%z>33RA z{gwU?)D5P@16r~u#yDy%tc$l8h+(Z=iI+e|QB`ojk# z>MVbYJY$ZC(%p+mrMK(;8Q9<11^CmV4@X(TSOf4%i5|I0^+C4H`3r;0})mOT`lL#?nes519-c zeJ0!3-E55%x3CFt2H*y8uMr!HQNB_V&p6R$%yNp|WCLIKW2zW)=~-RN$-P?pu`6Gi z=uc}rgQV&!FmR%4rp|ujR^@E>A23U3Lb9^XJ$g0Lc%U*g6ok_C$YArB*+ZQJvT2?GkG&mSg(d%0+$4>=z>xC-hUrz-Tk5 zJg7z4=}cKKKWk}3!=SdxaGdfi)^AgPH?x;r#tC!zsUq3Z=#_;?i(bH3wsK;G&@z(%4tb&OCcI&?@`kN$N29Y-Gn|A;L9%%}|0j^q*Z zMDs_hbU14c`R^JXPp8y|)z2rA%NRo{rDilE{9k#+oZIG`WcCg#XS4du#?uKb_k_vcB7o%_yBv7NM85-AysF451g= z^KFW_IDNsHOx+&$5BDpfQFpz+8a+Q4!2zNln{1M)dCIjd@Uixko!Y78PtIm=%dT)h zsk7`cHtzAEAZnf2gQPPzQEAxM47|jlb%N{rT$lQy-yU6MgfQ5L(1y~-UQf~EvCmO= zq?5`O53;9GCuVP(A;i>;0y{Tl#{I_WC%dw&E0wSm?9wBQ+JUk6)-eH=0>QQD) zXiom0V-aZ%NSrgN={5%^VQJw=tRp9?-rq zT6)$oY;mDz$donhmvYFRcbcCn3u zG6(kNvW;Ns=%rRocUzycYF9x*PGe$rzYg>478l!W26dxX>QKm9PumU+{Vqx#-jP&l zua$pNYF15(J0(PI)oI1H5Tc89vl@~t+6+TDwZdPzW&M*Fnj_Ns=OLg6_RxuBv({J$ zU-MzEWN@+kMS!29ww3wFs*XHd=ow{FK6|sAiUL9V3C0)aAwL}#E&=lg#OUA}8agOJ zWc}gDZ<5b=vhN8lUXgcGr%yne{EN0Ak|J>xsgiyCAOIII*xBati%HFv8ilNHv%WS* zXIIx5cJP~e_;Hs-yn%tV+P6fK+-v|vlKx-=(k?M>Mkf(qsLVfp+~LWJbUi(pL?)oxT|UJ@{N{^{$o$@_`)TwaiP$@CE5 z(yzQKzBkN=T+7^mp;NLg@NVqvZjG%j+HesM({tMWnjx0SoaU>2>Ga3=5X#>fvz5@} zqe?aFDur=AmalRwxnfI|25_Ct0Uw3nkThEy5$DYJ5^=^HXIx$L-7%GUad_8E6I%bD z;=VhO%l8YkLPAkwB~lsLpFPNyS;$_I6+%WvcA;!SR`#Zhj6$+yuS$}g6q1bWk^A_5 z@9%!=eZTj2?_c-oA05y0KIfe0JZHV{bB?Re!i-f3f{RM_lvak;g?1M3F~a4?y`@o7 zp$fYvMBa+Ov~@cjoA*NU(iaaVe$CR9gVfL2AK90mG`8(mi=dw0$zBep><<`uZJaM9 z^@G;m*JDG_G2(RljHs__{Tns^U&o^<+b!LFRiCicD%n#bc0RVJa!gYCMDJzO34PKw zXm;#MnU0&hzhmObvezh7AF*s^6|}XaDHXDOiHtg|p_4ITg>unscc*5!x^9e$t*}=0 zO}K7AuG+gWQ%)VdujYu2m&0+Q0>r8a57)eiYBn#C@4w2^jrq%OJNR9oct=S!<;rn! zx%umvDM&WGZY%@r?);-6A&(5X0p|E_t1WJ8g^(nPB?x3ZdEOn};11h+V0y@Bipwk!M4j{UIv@SZZ^waiebn?^@592})zJ?L(YI*Y-ZpMV zrdoOE9i3|R6b-p98*C#<)=%P#J^%5T`vp0g?JuFb=_B!M!WNqWLNED!+L&6D*o|`S z#oOX~&o(3Zm;GOc-nvR_L{6nX(L^CfmfNzi-I{e+U+qZlg!iu+b%BNzj=`v*;WH+8 zYu716f~|blvaRpma~F?|9{(l%h&#WtJKS;pddDKSegjVAERBc%3riV>NmfJB{CZct z8YTr1YU`gDq+XkO?IO+O?Wv71JAR@AbsCNo{lq)e@_jOP=Y^)8 zLI-`fcByHly1ZX#;VGi@uaamr97V%c!YeQK1#HQp8oE8u>2OWtW>`h*m7Dq+t-W)E zM(xQD%(vFMQ+-m1u|{3%zfy$U5}SGM5w^$9Os9zQ>M}oGkw`KNxOnkuYTD~Nv|`Mn zwYIvW)p8q~BRsYJt8>i@dkz*2gPC{cTsM?1Ml|al95bP=V2#xm)ikB79dQZ=;?Em4EgvYVHMBX^IA zpQO^gB>DU%d#ueb_GXQ}N0?=vXDbYWrpRW=wRK;Q7oW|k{lvOdx@WI^Q|F~$-s`e6 ziI3;r@*N&>*ttwTI!@<#cnMG1=WyT9dYx;V=P)zB+))>i>N^u}q{S4@mu6-h)@WgI z57QC7b-ivuC3Uyxj8R<$Yh3Fwg_)8O{4M*P=TX_2^D5527L^`Wgp4~RgzCnfwQIE; zTiXb55cLa6c5Zqa6iRWlrMR602NLz7Bry--{o&e*-Hw{1C4I|*#YH3cQ`Le-T&CjD^|e&< z>H&`H?1kZE0mWUPiVycnWoXUSJW65X4R7F;{YGJ=b!=B!=S^dl8C^2Dj^ogL^F!P) zGb*D^s)pat;EtswZR^lS)$^@v-IK*k+FOgsR)amMT`dP|`F8CksP|4J;(s2fBZ*^; z|FyFGXY{Z+X4X=FPrp&_QyD4ZE8q12 z!D+3`i-`Tf$xW=pf34LfzfGdrD zCDLqWC%E8#H1Avf1p?myBcmC9ME z=ZS2pZOKJV4T zEpk%HF-`8H(sx*H%4%Vry~fAys8bkUdzI0h7K&wSKG2=g`HevauSMf;8$6;un%9I^}Owb_J(Lf0#~hI?Zxh> zrI|NhBzH-csMezTCqi4prC1CpYkSRmj*clfCZ6PLc;_*k9u>JR_15}yfN{(08?G~% z2aMY4$UeLs=YCkLBBEi@djGSpkNJS4_POFwAy=Qm%cN)wu{^7 zpMUi_T$1b2WtV#D`PFxuvzI03H=?A&y7junIULRMj4#g<(#YO8wb8B+bTP?J#o|F{ zKBQ)cDN{E2WXzPbncY~E{a|E&)j`_G&&NbpajA6b$vrv7WBMN-jy$!$)sDUK6w$Q7q1~L-!z)v*KXT5#8>t6VYLj#Q~X;{s)J<#E)&~q`TUf$ z4q5-tn{sK&k!C+d)0Kv7n`KSS)MmPm{|sw8wJAiodQ7czg;BII1@D$FqvbIz?7aRW zNW^EHS)sD{XC?VE`8e{8kzjJK+qbUZ^q;ib_~|fR!!bUW!SAo8Qx>$7SzlTjwy2Xe zNIy9G0%LPJbx^~)xILnYuOr2W;~LL+nwmaJc2$XA{-_Rfe+9rVS!9gudcBxE;jE_`DHQd;` zeNKKkguFDhm?SmLufMjt26J9L`dMPcCsNZgjvppZt%-EEr_YJsS83sXmQWYiE%faD zwZ!<{A_LTia^KhD_rSaQE$@Dkh!KmGfMUwaUVZ6HYGm663vbR7CUO>-77y>Pab2{5;qeNU0-AM~AdlEbqB|+dBYo1dWri#w4*I4> zdyj^u#dJzH@@GYISL2l48sQ<1H7p*uZzQaQj9Ug$chhNczf0Hix$CG9xp^hFVd_3+ z_LD~?^62c8%cnv&a{k8A@H1Y=w!ctteSDvq%$4Bfns2toz{G43RiW2s*H#%Hl*1}j zv#6MLsi80Q(XYo6J_4RGGwj|WJ4P=y9yS$pQT8|Q#6O(qe!W6@Iq-e++C2UDQSHo6 zQa&q13fo?lE9V!|qVHeYLmGcuB6Dr3@ynnif2TZ8;*lAoU~F7hY&uiCHzF=|Jv1n2 zYTf4(TS28o$5`9rvO;%I!Ft_oGXD~Kveh<8bzMq&r*YQHnq1ZswHMj4Df&(}TO6gk zFkF|;Zf#a-cV{3k%m3=f8hgW~$>p&UbF`zye8-h>49-^8Tuq~)KPf*^9b8;!L1XEg zIyxHBTWb`TEgfr^9!JN}n<)2o&Cy4*&dt$9Um37|?z?KLdb~9A5ib7niOuypYy*8R zOm43{CkwSj&qX|S7S5lQkqG;qQ?9jA8D$my?V>5&I0;HE$m6JjqWj_{_F6k10!47o zFV(7my64t!zrPOnY9XOCq^DW-q9qo2Tik9;>q*g_z2BnS!rIM289xT=m zNd3(H5Who+nm5}et)tN5Ld7qXREHTDlA$Pi{4@wwrmL+!bPKqY#2$(L>>W z>p1t%6}^9Mg#LX)RN2@TbS{+p`%0{|-L2bpHpaK%cVY1ulpqd|#e>q7|J1j{;srr9 zN)+lp^(}D(K>`Mk!-86U|6GN|p$URW0vb#FZ}lxv;JPdkhah6WU06`h5)`^bqS>)n zq~QLNNOl5-C(|c{Z_X0zg=oX6L7y@X}lKIdD9q_YDaWgJxP30VT#bog(z;RCnO|sSzRNDG(CHK{P(pQ$+?Xgh z_rL|4RX0D_6pd2HPNt zF$JTfs`QzKTDJ8NE^2MDi;e^r_60fN8Hqkg^SkeeWWFsD1%7P4Vp-CbTN{iAHKdpV zjk*2g82ubC3x%@YIy%v|P5Zsmef-%PSGJyD%^UZpYhI^FN8`LxzSda#_#EV@?5T&J zP$cqSFRlN#%9}7T{lC6F`&T(wAWXlN-uz3D{y09rm5BY%?O7}u@qf5Hi$-ElzYE%X zZ7X{^IR@|1cW7b$&htw0wUMfxCuIe3~jfW}kG#^%{U^{GWij+XYr zw6wJ04{u9<8SIw-ga}fQ4}Qi$e@NlW$df{|_NyGv6$bC0tR_|1cIRLTGFR8%Hht>y z^6RRH=xA}>`q!EdXo&;t%oHTsPAZ!iTCTkVX?mvxk`0j+yv9A_f}fji9WY5Ud_EDI z9F%xrd3$kluuAi_=}U&)E!L#H3mwl_ZJk-2kTrLg$FJVXGx}g|QOxk`ggH$|%oWyd z+vK=_x&vuXFR_wzJ14WIk)fB#Hb(kJUZz|57IYtyZ>uMI=$#sRSr`<=a?n59z(~pT zTGRV+@4mpFy&2zcHXLj!3!1(v>uIm9q_4d`*gI=<5K}2`Wo27j%vWm=A2t{9`Dc@@ z^C)Y%%EU%%rj3#2hXG56llljm4NtRtd^7fuzR2(JRLzcC>*JPiQx$Ro|;Ms8*%|nQcY>9UgQo09@7&UruesJ}p(zeu-K3x9J-P|)z6R$)y z^`(+IM6=MH$uG<;r~5ID?kdYbxs=||$1TI`h0lwu>9g|D%-n&zPZ;yiZb}0y71mK) zyQKMg&Ku2S>L(V&&&8w~F`wBvvOXvCO!!s6;@z_y>V5S(HlzlFM;@7;N06}G`#5-{ z%TFWhaRTa>gF?>cvEq^^55xRTW z?CQagM~9l)%C1L+`(52S>cv<^I-u;5W+6FpK9>E}r%1y)XCCKKBFExB6wThAR&I@? z)ZvpnlBQ4=;LF=WO0hAf$R=AuInOO}=>%S)(F8Iu+GK7Zm`99G`& z&7QEMX%ixM!p|mOx$_p&p*l~6k&Qv6(6Q4Mu_Chd4?IWr@-`b(qI^o`gD{Ve+nT>| zk?G4TR6p|U^gxrcoM>jiRRr+1jiR{b?4_7rSvO-5%bmypw@@LO(Wp~<{HOLjADK)ENqC>Yow!{euq5Sh zxR;qBTHxddA&tz=yvfXm_f~ziBTER%^&tt}`B%xZ8eTP2T@LWX76dJmmX-2!s85kk zADKxlz0hlN=Y*qb@M4tS8Qyf(*w3T)UC(BGYjph>j5LT~I^~e6JT;7LnGei4A}dW% zX`I0uCe_YbF~(LQ78{X_rC*>Py!%pH0$n~anD*jL+m+VbdBRw5^=+@G_Rc39)$OzB zw>#1`lb`elindl!TaomTzJ6FNAx0`s+s%D2fnD@mTzH3aoMa-6Tw5Vs$Y}<%2-Stc z&p$Pk^OA&d!yQB|Q4ck5-f0=_hQNM~9)+iIS6HHZh}|S}ak0Y0+?ui~6RA_vPCq-Z z5uY&Zz8p#@y4=HQb1R-M!D55IPg^|bb`ZnIv}l4w5{3)k)LfMn%yWYOID*si_=}pI zaC)8;iPwm?^p(UIr^7c1RUy%n8mALG6-2m)iEcsB2<|5JcD-5?0i%-GVjULwj%M@u z1cRxOh@_*v&F$DEo9U^e+{VhczWxjj_(?DCe{Jup!IpTM*=bI2*)HugI;-=P z`6Wry)Z)P+i5OS1x0{9mYG0Mkn6P-&zLmP~fW55wZd#g*FOyR138lT)Gu0DRH-_lX z<~EA-K3%!4r}NnQ}8tZLk(HhMWJ^JQ(! zoB2UYWlRv6qOM&XD}%?b+k}ERrCXz0MDcNJp09xq1ICXY8c<`^8t2eqMYM6LFO$Az z=d+JhSI8EQ;YuMR>!_g=P+ou6)h?!a;AB1KBjfdx_U00yPLJhtHAU*i?0K#ShH^Yf zmNKt9HD!X>8Y$qkBviU=X^(dH&@6Ux$jh>xDkpoK&*<%-S3V| zDx%$W-JiPe?S#VBv*Ib9dyU?u7Q-#0p{f4yh2O6I~dy?u9HyIZ(NAp9Uyd3Qx65Fafa!B=J2bWU64|ISHe!*StYye z>oZMscGRz^TxGKnYuYTr4^jM=UF<7zU$Ch7XAYl^bkyooIgx1|)D1-#|D=Hwsl z5=(N3jxAN$BT1(#=5lCR@Vs(wExFWLPVrfCBytUZbF98CCx5D4k;ckDfX2p0_bGS2 z(HZoN_03q@IGQ?vNIa#znEFBqv=oNBv5DZE0rDrz?l>*`cIe*2i1 zbz}Ns$C$hD9q$*z<}V`zAMX;a3RB;=)j4!DjZ+wyxy*kO!pj^W|Ul0q+BC zzpV?-^uelRAB(W)@Bi zw#wyP&L7%jGo^8htDwrgzq=jiIeqZf*_1<5N=r04^t4OWU-is#4C7?u8-srpWC*RH zk%ujU-Wi;$ENBYFw0_xIo~Uma$uNoxdLM1c!^gS)HYhWgyX5V+_8o9h@P2m8otD9L zk?YQ(5>HJ_UF@rUoM+OmOEa41crb5r1csC6x_Fx7FVzV?5UN9~+% zJcX%td|x?v8uf}>-=@Y6W2fS?(xvXfKSxs(&GGZ|s>%?K?T50#i=CoMWH#&_3T(T$EDf?Pq*d%*C1#GUk(w^B9aGNAm5q3% za(qX-_}oR$1+>(2ewwBB4c0o;fdpO8xN=LK)=$CG1z%qgd1qAn93F1`EKE6cbNUR! znRzRR%0iqgg~MaFThm`Tstw}1FP3-jT%a$cbN zgXVat_3(kj&L4WtoB^f7%%ZM4E+%55C%>oe)ki;?&xrL%Smcq}Q5HA*x#XG1cAPd$ z+WW(Kt=%;GQztQgzIriL66|4rh-Fz`i~C{jJ!%8{oE)_cmMKpjT<-LtL1lx#@@}^ zAmMF^Jm_Jjmh-)irzf>&#DG8QCSvNz)lkkiEu81Se0g`HBv$9zijLZNJ&j)X7n0tj z8|1T!cF(78c$xG@X|E}$t>?cN@@}AZ#ttm7e`LM%qvOMiGwCbuubCOrWoJ@aXiVpZ z50&LOd@#6I`#g?c_Yz}zvU=0_yMSiY4oLx(jxCS0%aiveeacjnv62mezL6dYdE=*4 zLqm-MOFmrKc6Rt`+QNGyrCchgg-0G|-Of}Y>zHx%Ms9WUW#3D7*(o{#s@v&79$qRR7W9CQwCf!7CuZ1Eyk25$|Ry{t-N&enMJ`b8>uk43!w1|l* z8XX%`Lo5#{O1kSk+wr8Wd%i~@&z0x}50+54-}*ZI6WjlLIz#^NbcULpiJg<3z~3df z{*%+dffR=1-yJ%LD7+x(*|Fb`$D&b!cqE3fAG_}V!y*Zw3kpbz{LlZRFbF}wJHW`l|4zVSKrJ>Gvb;`INj}>jGVJU^z~1c3 z;y*YO(A(2fWM4@+`k5r%PAe_urhn6i!qpMMmYoUz4oTT3l%&*Sv)Sn4QGbcd?}JBD z<8Fz%cN@K)zIi;j&F$L*>w9IhgdycH`Hn6*vM*&3!D+O6%l!FU_k3J&8o+~bjx8w& zc2d@m5iXIRzW9dogpvmL%Vup{-QWI(bVPcb3szQ#xJ%dHcSdr zFBwRjmfEP*s9b2Xq|^Acb4WcSB;{X@HOO`SOX0r%mIL{BiT=M%g#1-L50VJ^t1{j{ z$L)@z`3*{thr=T%L5rRL`NNLGV$oRk8|?oJh6IVY{U7#Qf5VVyEa=hmCk*@Qr4SeagW8wv-^YR9L539uL+)2X`*R$~mqKs>_z^&1LFhRA{weu= zE|LfmvGC{Ni4dF-2pkbg8#r8u{f08XKM%l=1jrfyh6bhnpyPmUfWZLLFc=;Q!v#;k zK==&SAi{Y?Kq6pk5P&9uu0cRU_XvR?0IdNVhXYapp@V?mSHyqvfItM20)Y_`Xc!$t zBo4L)5k-XYkBC9R=pbU@azMm^tU7dE0t)^-;(me1KX3-UrC@uGM4(Vm8A2jJi9Og{ z3<1gmU`kO?9v~5TUq4!@={Ejn{NI=761BpY!_7_M2oDLig2g45sijV%e z1_Fsk!1;{dFDm*6E?^v*0Kpl+uz1K`0y=O+=zail5m4IDI3jc|0)+=jg$K$Q`aC?22%k$pL3x0}6ZdoDf8ql41`Iy} zzz{YLlzoN4uyEQ4I1GF)9wzrF0ugrJP(%dmtfGiW*f~c5zZJ5V2ow>6hn_*8T@Wx_ zz*fTN0*?to8yXlmD7|2ZV0s*lKoOv_3tlb2XhQ?@0mTIk3=JFx-YLRxA>yI?i$(&? z0UZZSGHfmq4Sc~r_Z$sea~Qoy92`F+o(PoLQU}WI72Mw4HqZgQD7@yIA5-2Wc49r(SV)4FfbjlwJ%75#Zx+XvjDq87TNTECP16KrLsePTXe! zd|fO7rrR+%By=yqy14!Jcz@_2EC@}Z=Mpr(LqTvxV1a>y@E*Y6a)m`=VYpxcn_1r)AVGiy^G~sO6dp1T0W1nk-(&GW$wFzv6JhoUV26S|4+MG;+5j#X7@u*#gNKX* z9taU;18`{Y83P0tV7f6-*#Kr5Cc8M`T0qtSxWM%|4yXgz^MILw>L#G+pz^nGX<<47 zkAVAEcmy7%|L_PR)DHvc4dCcN=mlOF3>RQRVft$SgA6FW7$8}&=Mg}cPUsp0BFrv; zr~--~aHPQD`g1P8nE=SxTLYj6v1P!+ z{HvAaA7^#nbVK)-0DN=^Z3qI87sxp9JRAbbQz8a5nEjJ4AX0<-)IXDZ zpfEOU4J>f>{+tVNAwuN^ga!nt{Qw?15-LLghJo5k0K-FL7XSlTL)Qh)BZOBVV+Km* zL&kwa4fWeWr~!+`0SpiIPr^^CD=(@n&fbARb$Dw)`cugSt z0Kpk#@}P0@zIO$cQvd_bGGs33ngBi1AbNxOdH@EOKVXre{yo?ZEKDX*L|Ckg1pX=X zEC3kH7XUCEG=BhKM5sI0}T4K#U-30ILeMGf4b?@C+RXWSL7 Date: Mon, 5 Feb 2024 16:24:06 +0100 Subject: [PATCH 19/29] feat: Add types for attributes (#870) * Add types for attributes * Fix lint --- constants.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/constants.ts b/constants.ts index 826945f80..17bb9eb7c 100644 --- a/constants.ts +++ b/constants.ts @@ -118,6 +118,13 @@ export type LSP4DigitalAssetMetadata = { images: ImageMetadata[][]; assets: AssetMetadata[]; icon: ImageMetadata[]; + attributes: AttributeMetadata[]; +}; + +export type AttributeMetadata = { + key: string; + value: string; + type: string | number | boolean; }; export type Verification = { From f2b1bc619aa65dcf1284262685dd0ff52fbc3e4b Mon Sep 17 00:00:00 2001 From: Dominik Zborowski Date: Tue, 27 Feb 2024 15:16:24 +0100 Subject: [PATCH 20/29] Make `attributes` optional (#872) --- constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.ts b/constants.ts index 17bb9eb7c..be6698ec4 100644 --- a/constants.ts +++ b/constants.ts @@ -118,7 +118,7 @@ export type LSP4DigitalAssetMetadata = { images: ImageMetadata[][]; assets: AssetMetadata[]; icon: ImageMetadata[]; - attributes: AttributeMetadata[]; + attributes?: AttributeMetadata[]; }; export type AttributeMetadata = { From 692fa6eae0c59b9e6e396b330cdcc0e9985db860 Mon Sep 17 00:00:00 2001 From: Dominik Zborowski Date: Tue, 27 Feb 2024 16:28:15 +0100 Subject: [PATCH 21/29] feat: Add contract asset type (#891) * Add contract asset * Make fileType optional * PR remarks * Change names --- constants.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/constants.ts b/constants.ts index be6698ec4..0ddf873d9 100644 --- a/constants.ts +++ b/constants.ts @@ -145,10 +145,17 @@ export type LinkMetadata = { url: string; }; -export type AssetMetadata = { - verification?: Verification; +export type AssetMetadata = AssetFile | DigitalAsset; + +export type AssetFile = { url: string; - fileType: string; + verification?: Verification; + fileType?: string; +}; + +export type DigitalAsset = { + address: string; + tokenId?: string; }; /** From 654eb8b4a6825f14fe60d3e1038f02b2eeeeb67d Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Wed, 28 Feb 2024 14:37:48 +0200 Subject: [PATCH 22/29] feat!: allow Operator to revoke himself (#893) * feat!: allow operator to revoke himself * test: add test for operator revoking himself * refactor!: change LSP7 interfaceId * chore: fix parameter and generate natspec * chore: do suggested changes --------- Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> --- constants.ts | 2 +- .../LSP7DigitalAsset/ILSP7DigitalAsset.sol | 10 +- contracts/LSP7DigitalAsset/LSP7Constants.sol | 2 +- .../LSP7DigitalAsset/LSP7DigitalAssetCore.sol | 35 +++- contracts/LSP7DigitalAsset/LSP7Errors.sol | 23 ++- .../LSP8Errors.sol | 14 +- .../LSP8IdentifiableDigitalAssetCore.sol | 20 ++- docs/_interface_ids_table.mdx | 2 +- .../LSP7DigitalAsset/LSP7DigitalAsset.md | 95 ++++++++--- .../extensions/LSP7Burnable.md | 95 ++++++++--- .../extensions/LSP7CappedSupply.md | 95 ++++++++--- .../LSP7DigitalAsset/presets/LSP7Mintable.md | 95 ++++++++--- .../LSP8IdentifiableDigitalAsset.md | 50 +++--- .../extensions/LSP8Burnable.md | 50 +++--- .../extensions/LSP8CappedSupply.md | 50 +++--- .../extensions/LSP8Enumerable.md | 50 +++--- .../presets/LSP8Mintable.md | 50 +++--- .../LSP7DigitalAsset.behaviour.ts | 154 +++++++++++++----- .../LSP8IdentifiableDigitalAsset.behaviour.ts | 56 ++++--- 19 files changed, 657 insertions(+), 291 deletions(-) diff --git a/constants.ts b/constants.ts index 0ddf873d9..c2b1402b9 100644 --- a/constants.ts +++ b/constants.ts @@ -29,7 +29,7 @@ export const INTERFACE_IDS = { LSP1UniversalReceiver: '0x6bb56a14', LSP1UniversalReceiverDelegate: '0xa245bbda', LSP6KeyManager: '0x23f34c62', - LSP7DigitalAsset: '0xb3c4928f', + LSP7DigitalAsset: '0xc52d6008', LSP8IdentifiableDigitalAsset: '0x3a271706', LSP9Vault: '0x28af17e6', LSP11BasicSocialRecovery: '0x049a28f1', diff --git a/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol b/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol index 2a30c935a..1fafbe646 100644 --- a/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol +++ b/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol @@ -122,21 +122,23 @@ interface ILSP7DigitalAsset is IERC165, IERC725Y { ) external; /** - * @dev Removes the `operator` address as an operator of callers tokens, disallowing it to send any amount of tokens - * on behalf of the token owner (the caller of the function `msg.sender`). See also {authorizedAmountFor}. + * @dev Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send any amount of tokens on its behalf. + * This function also allows the `operator` to remove itself if it is the caller of this function * * @param operator The address to revoke as an operator. + * @param tokenOwner The address of the token owner. * @param notify Boolean indicating whether to notify the operator or not. * @param operatorNotificationData The data to notify the operator about via LSP1. * * @custom:requirements - * - `operator` cannot be calling address. + * - caller MUST be `operator` or `tokenOwner` * - `operator` cannot be the zero address. * * @custom:events {OperatorRevoked} event with address of the operator being revoked for the caller (token holder). */ function revokeOperator( address operator, + address tokenOwner, bool notify, bytes memory operatorNotificationData ) external; @@ -184,6 +186,7 @@ interface ILSP7DigitalAsset is IERC165, IERC725Y { * indicating `operator` does not have any alauthorizedAmountForlowance left for `msg.sender`. * * @param operator The operator to decrease allowance for `msg.sender` + * @param tokenOwner The address of the token owner. * @param subtractedAmount The amount to decrease by in the operator's allowance. * * @custom:requirements @@ -192,6 +195,7 @@ interface ILSP7DigitalAsset is IERC165, IERC725Y { */ function decreaseAllowance( address operator, + address tokenOwner, uint256 subtractedAmount, bytes memory operatorNotificationData ) external; diff --git a/contracts/LSP7DigitalAsset/LSP7Constants.sol b/contracts/LSP7DigitalAsset/LSP7Constants.sol index 6bcc63db9..b56398da2 100644 --- a/contracts/LSP7DigitalAsset/LSP7Constants.sol +++ b/contracts/LSP7DigitalAsset/LSP7Constants.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.4; // --- ERC165 interface ids -bytes4 constant _INTERFACEID_LSP7 = 0xb3c4928f; +bytes4 constant _INTERFACEID_LSP7 = 0xc52d6008; // --- Token Hooks diff --git a/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol b/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol index f396cd570..9ca4798f9 100644 --- a/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol +++ b/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol @@ -20,7 +20,6 @@ import {LSP1Utils} from "../LSP1UniversalReceiver/LSP1Utils.sol"; // errors import { - LSP7CannotSendToSelf, LSP7AmountExceedsAuthorizedAmount, LSP7InvalidTransferBatch, LSP7AmountExceedsBalance, @@ -31,7 +30,9 @@ import { LSP7NotifyTokenReceiverContractMissingLSP1Interface, LSP7NotifyTokenReceiverIsEOA, OperatorAllowanceCannotBeIncreasedFromZero, - LSP7BatchCallFailed + LSP7BatchCallFailed, + LSP7RevokeOperatorNotAuthorized, + LSP7DecreaseAllowanceNotAuthorized } from "./LSP7Errors.sol"; // constants @@ -173,11 +174,20 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { */ function revokeOperator( address operator, + address tokenOwner, bool notify, bytes memory operatorNotificationData ) public virtual override { + if (msg.sender != tokenOwner && msg.sender != operator) { + revert LSP7RevokeOperatorNotAuthorized( + msg.sender, + tokenOwner, + operator + ); + } + _updateOperator( - msg.sender, + tokenOwner, operator, 0, notify, @@ -186,7 +196,7 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { if (notify) { bytes memory lsp1Data = abi.encode( - msg.sender, + tokenOwner, 0, operatorNotificationData ); @@ -254,10 +264,19 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { */ function decreaseAllowance( address operator, + address tokenOwner, uint256 subtractedAmount, bytes memory operatorNotificationData ) public virtual override { - uint256 currentAllowance = authorizedAmountFor(operator, msg.sender); + if (msg.sender != tokenOwner && msg.sender != operator) { + revert LSP7DecreaseAllowanceNotAuthorized( + msg.sender, + tokenOwner, + operator + ); + } + + uint256 currentAllowance = authorizedAmountFor(operator, tokenOwner); if (currentAllowance < subtractedAmount) { revert LSP7DecreasedAllowanceBelowZero(); } @@ -266,7 +285,7 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { unchecked { newAllowance = currentAllowance - subtractedAmount; _updateOperator( - msg.sender, + tokenOwner, operator, newAllowance, true, @@ -275,7 +294,7 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { } bytes memory lsp1Data = abi.encode( - msg.sender, + tokenOwner, newAllowance, operatorNotificationData ); @@ -295,8 +314,6 @@ abstract contract LSP7DigitalAssetCore is ILSP7DigitalAsset { bool force, bytes memory data ) public virtual override { - if (from == to) revert LSP7CannotSendToSelf(); - if (msg.sender != from) { _spendAllowance({ operator: msg.sender, diff --git a/contracts/LSP7DigitalAsset/LSP7Errors.sol b/contracts/LSP7DigitalAsset/LSP7Errors.sol index 62fa06908..3a247a3f0 100644 --- a/contracts/LSP7DigitalAsset/LSP7Errors.sol +++ b/contracts/LSP7DigitalAsset/LSP7Errors.sol @@ -36,11 +36,6 @@ error LSP7CannotUseAddressZeroAsOperator(); */ error LSP7CannotSendWithAddressZero(); -/** - * @dev reverts when specifying the same address for `from` or `to` in a token transfer. - */ -error LSP7CannotSendToSelf(); - /** * @dev reverts when the array parameters used in {transferBatch} have different lengths. */ @@ -88,3 +83,21 @@ error OperatorAllowanceCannotBeIncreasedFromZero(address operator); * @notice Batch call failed. */ error LSP7BatchCallFailed(uint256 callIndex); + +/** + * @dev Reverts when the call to revoke operator is not authorized. + */ +error LSP7RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + address operator +); + +/** + * @dev Reverts when the call to decrease allowance is not authorized. + */ +error LSP7DecreaseAllowanceNotAuthorized( + address caller, + address tokenOwner, + address operator +); diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol b/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol index 472ce6016..a74dc36d3 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol @@ -33,11 +33,6 @@ error LSP8CannotUseAddressZeroAsOperator(); */ error LSP8CannotSendToAddressZero(); -/** - * @dev Reverts when specifying the same address for `from` and `to` in a token transfer. - */ -error LSP8CannotSendToSelf(); - /** * @dev Reverts when `operator` is not an operator for the `tokenId`. */ @@ -112,3 +107,12 @@ error LSP8TokenOwnerChanged( address oldOwner, address newOwner ); + +/** + * @dev Reverts when the call to revoke operator is not authorized. + */ +error LSP8RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + bytes32 tokenId +); diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol index 89f57b15d..2846c4ac0 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol +++ b/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol @@ -36,13 +36,13 @@ import { LSP8NonExistingOperator, LSP8CannotSendToAddressZero, LSP8TokenIdAlreadyMinted, - LSP8CannotSendToSelf, LSP8NotifyTokenReceiverContractMissingLSP1Interface, LSP8NotifyTokenReceiverIsEOA, LSP8TokenIdsDataLengthMismatch, LSP8TokenIdsDataEmptyArray, LSP8BatchCallFailed, - LSP8TokenOwnerChanged + LSP8TokenOwnerChanged, + LSP8RevokeOperatorNotAuthorized } from "./LSP8Errors.sol"; // constants @@ -293,8 +293,14 @@ abstract contract LSP8IdentifiableDigitalAssetCore is ) public virtual override { address tokenOwner = tokenOwnerOf(tokenId); - if (tokenOwner != msg.sender) { - revert LSP8NotTokenOwner(tokenOwner, tokenId, msg.sender); + if (msg.sender != tokenOwner) { + if (operator != msg.sender) { + revert LSP8RevokeOperatorNotAuthorized( + msg.sender, + tokenOwner, + tokenId + ); + } } if (operator == address(0)) { @@ -315,7 +321,7 @@ abstract contract LSP8IdentifiableDigitalAssetCore is if (notify) { bytes memory lsp1Data = abi.encode( - msg.sender, + tokenOwner, tokenId, false, // unauthorized operatorNotificationData @@ -625,10 +631,6 @@ abstract contract LSP8IdentifiableDigitalAssetCore is bool force, bytes memory data ) internal virtual { - if (from == to) { - revert LSP8CannotSendToSelf(); - } - address tokenOwner = tokenOwnerOf(tokenId); if (tokenOwner != from) { revert LSP8NotTokenOwner(tokenOwner, tokenId, from); diff --git a/docs/_interface_ids_table.mdx b/docs/_interface_ids_table.mdx index acba017e9..036a13f80 100644 --- a/docs/_interface_ids_table.mdx +++ b/docs/_interface_ids_table.mdx @@ -8,7 +8,7 @@ | **LSP1UniversalReceiver** | `0x6bb56a14` | Interface of the LSP1 - Universal Receiver standard, an entry function for a contract to receive arbitrary information. | | **LSP1UniversalReceiverDelegate** | `0xa245bbda` | Interface of the LSP1 - Universal Receiver Delegate standard. | | **LSP6KeyManager** | `0x23f34c62` | Interface of the LSP6 - Key Manager standard, a contract acting as a controller of an ERC725 Account using predfined permissions. | -| **LSP7DigitalAsset** | `0xb3c4928f` | Interface of the LSP7 - Digital Asset standard, a fungible digital asset. | +| **LSP7DigitalAsset** | `0xc52d6008` | Interface of the LSP7 - Digital Asset standard, a fungible digital asset. | | **LSP8IdentifiableDigitalAsset** | `0x3a271706` | Interface of the LSP8 - Identifiable Digital Asset standard, a non-fungible digital asset. | | **LSP9Vault** | `0x28af17e6` | Interface of LSP9 - Vault standard, a blockchain vault that can hold assets and interact with other smart contracts. | | **LSP11BasicSocialRecovery** | `0x049a28f1` | Interface of the LSP11 - Basic Social Recovery standard, a contract to recover access control into an account. | diff --git a/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md b/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md index 691daae1a..7766d68b5 100644 --- a/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md +++ b/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md @@ -250,14 +250,15 @@ Returns the number of decimals used to get its user representation. If the asset - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) - Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) -- Function signature: `decreaseAllowance(address,uint256,bytes)` -- Function selector: `0x7b204c4e` +- Function signature: `decreaseAllowance(address,address,uint256,bytes)` +- Function selector: `0x78381670` ::: ```solidity function decreaseAllowance( address operator, + address tokenOwner, uint256 subtractedAmount, bytes operatorNotificationData ) external nonpayable; @@ -272,6 +273,7 @@ Atomically decreases the allowance granted to `operator` by the caller. This is | Name | Type | Description | | -------------------------- | :-------: | ------------------------------------------------------ | | `operator` | `address` | The operator to decrease allowance for `msg.sender` | +| `tokenOwner` | `address` | The address of the token owner. | | `subtractedAmount` | `uint256` | The amount to decrease by in the operator's allowance. | | `operatorNotificationData` | `bytes` | - | @@ -459,26 +461,28 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) - Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) -- Function signature: `revokeOperator(address,bool,bytes)` -- Function selector: `0x4521748e` +- Function signature: `revokeOperator(address,address,bool,bytes)` +- Function selector: `0x30d0dc37` ::: ```solidity function revokeOperator( address operator, + address tokenOwner, bool notify, bytes operatorNotificationData ) external nonpayable; ``` -Removes the `operator` address as an operator of callers tokens, disallowing it to send any amount of tokens on behalf of the token owner (the caller of the function `msg.sender`). See also [`authorizedAmountFor`](#authorizedamountfor). +Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send any amount of tokens on its behalf. This function also allows the `operator` to remove itself if it is the caller of this function #### Parameters | Name | Type | Description | | -------------------------- | :-------: | --------------------------------------------------------- | | `operator` | `address` | The address to revoke as an operator. | +| `tokenOwner` | `address` | The address of the token owner. | | `notify` | `bool` | Boolean indicating whether to notify the operator or not. | | `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | @@ -1561,25 +1565,6 @@ Reverts when a batch call failed.
-### LSP7CannotSendToSelf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) -- Error signature: `LSP7CannotSendToSelf()` -- Error hash: `0xb9afb000` - -::: - -```solidity -error LSP7CannotSendToSelf(); -``` - -reverts when specifying the same address for `from` or `to` in a token transfer. - -
- ### LSP7CannotSendWithAddressZero :::note References @@ -1624,6 +1609,37 @@ reverts when trying to set the zero address as an operator.
+### LSP7DecreaseAllowanceNotAuthorized + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreaseallowancenotauthorized) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Error signature: `LSP7DecreaseAllowanceNotAuthorized(address,address,address)` +- Error hash: `0x98ce2945` + +::: + +```solidity +error LSP7DecreaseAllowanceNotAuthorized( + address caller, + address tokenOwner, + address operator +); +``` + +Reverts when the call to decrease allowance is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `operator` | `address` | - | + +
+ ### LSP7DecreasedAllowanceBelowZero :::note References @@ -1714,6 +1730,37 @@ reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit
+### LSP7RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7revokeoperatornotauthorized) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Error signature: `LSP7RevokeOperatorNotAuthorized(address,address,address)` +- Error hash: `0x1a525b32` + +::: + +```solidity +error LSP7RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + address operator +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `operator` | `address` | - | + +
+ ### LSP7TokenContractCannotHoldValue :::note References diff --git a/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md b/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md index ac6cbe517..6650eee99 100644 --- a/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md +++ b/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md @@ -275,14 +275,15 @@ Returns the number of decimals used to get its user representation. If the asset - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) - Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) -- Function signature: `decreaseAllowance(address,uint256,bytes)` -- Function selector: `0x7b204c4e` +- Function signature: `decreaseAllowance(address,address,uint256,bytes)` +- Function selector: `0x78381670` ::: ```solidity function decreaseAllowance( address operator, + address tokenOwner, uint256 subtractedAmount, bytes operatorNotificationData ) external nonpayable; @@ -297,6 +298,7 @@ Atomically decreases the allowance granted to `operator` by the caller. This is | Name | Type | Description | | -------------------------- | :-------: | ------------------------------------------------------ | | `operator` | `address` | The operator to decrease allowance for `msg.sender` | +| `tokenOwner` | `address` | The address of the token owner. | | `subtractedAmount` | `uint256` | The amount to decrease by in the operator's allowance. | | `operatorNotificationData` | `bytes` | - | @@ -484,26 +486,28 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) - Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) -- Function signature: `revokeOperator(address,bool,bytes)` -- Function selector: `0x4521748e` +- Function signature: `revokeOperator(address,address,bool,bytes)` +- Function selector: `0x30d0dc37` ::: ```solidity function revokeOperator( address operator, + address tokenOwner, bool notify, bytes operatorNotificationData ) external nonpayable; ``` -Removes the `operator` address as an operator of callers tokens, disallowing it to send any amount of tokens on behalf of the token owner (the caller of the function `msg.sender`). See also [`authorizedAmountFor`](#authorizedamountfor). +Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send any amount of tokens on its behalf. This function also allows the `operator` to remove itself if it is the caller of this function #### Parameters | Name | Type | Description | | -------------------------- | :-------: | --------------------------------------------------------- | | `operator` | `address` | The address to revoke as an operator. | +| `tokenOwner` | `address` | The address of the token owner. | | `notify` | `bool` | Boolean indicating whether to notify the operator or not. | | `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | @@ -1586,25 +1590,6 @@ Reverts when a batch call failed.
-### LSP7CannotSendToSelf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) -- Error signature: `LSP7CannotSendToSelf()` -- Error hash: `0xb9afb000` - -::: - -```solidity -error LSP7CannotSendToSelf(); -``` - -reverts when specifying the same address for `from` or `to` in a token transfer. - -
- ### LSP7CannotSendWithAddressZero :::note References @@ -1649,6 +1634,37 @@ reverts when trying to set the zero address as an operator.
+### LSP7DecreaseAllowanceNotAuthorized + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreaseallowancenotauthorized) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Error signature: `LSP7DecreaseAllowanceNotAuthorized(address,address,address)` +- Error hash: `0x98ce2945` + +::: + +```solidity +error LSP7DecreaseAllowanceNotAuthorized( + address caller, + address tokenOwner, + address operator +); +``` + +Reverts when the call to decrease allowance is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `operator` | `address` | - | + +
+ ### LSP7DecreasedAllowanceBelowZero :::note References @@ -1739,6 +1755,37 @@ reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit
+### LSP7RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7revokeoperatornotauthorized) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Error signature: `LSP7RevokeOperatorNotAuthorized(address,address,address)` +- Error hash: `0x1a525b32` + +::: + +```solidity +error LSP7RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + address operator +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `operator` | `address` | - | + +
+ ### LSP7TokenContractCannotHoldValue :::note References diff --git a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md b/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md index 9d9823443..c70451ebe 100644 --- a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md +++ b/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md @@ -248,14 +248,15 @@ Returns the number of decimals used to get its user representation. If the asset - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) - Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) -- Function signature: `decreaseAllowance(address,uint256,bytes)` -- Function selector: `0x7b204c4e` +- Function signature: `decreaseAllowance(address,address,uint256,bytes)` +- Function selector: `0x78381670` ::: ```solidity function decreaseAllowance( address operator, + address tokenOwner, uint256 subtractedAmount, bytes operatorNotificationData ) external nonpayable; @@ -270,6 +271,7 @@ Atomically decreases the allowance granted to `operator` by the caller. This is | Name | Type | Description | | -------------------------- | :-------: | ------------------------------------------------------ | | `operator` | `address` | The operator to decrease allowance for `msg.sender` | +| `tokenOwner` | `address` | The address of the token owner. | | `subtractedAmount` | `uint256` | The amount to decrease by in the operator's allowance. | | `operatorNotificationData` | `bytes` | - | @@ -457,26 +459,28 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) - Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) -- Function signature: `revokeOperator(address,bool,bytes)` -- Function selector: `0x4521748e` +- Function signature: `revokeOperator(address,address,bool,bytes)` +- Function selector: `0x30d0dc37` ::: ```solidity function revokeOperator( address operator, + address tokenOwner, bool notify, bytes operatorNotificationData ) external nonpayable; ``` -Removes the `operator` address as an operator of callers tokens, disallowing it to send any amount of tokens on behalf of the token owner (the caller of the function `msg.sender`). See also [`authorizedAmountFor`](#authorizedamountfor). +Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send any amount of tokens on its behalf. This function also allows the `operator` to remove itself if it is the caller of this function #### Parameters | Name | Type | Description | | -------------------------- | :-------: | --------------------------------------------------------- | | `operator` | `address` | The address to revoke as an operator. | +| `tokenOwner` | `address` | The address of the token owner. | | `notify` | `bool` | Boolean indicating whether to notify the operator or not. | | `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | @@ -1560,25 +1564,6 @@ Reverts when a batch call failed.
-### LSP7CannotSendToSelf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) -- Error signature: `LSP7CannotSendToSelf()` -- Error hash: `0xb9afb000` - -::: - -```solidity -error LSP7CannotSendToSelf(); -``` - -reverts when specifying the same address for `from` or `to` in a token transfer. - -
- ### LSP7CannotSendWithAddressZero :::note References @@ -1665,6 +1650,37 @@ Reverts when setting `0` for the [`tokenSupplyCap`](#tokensupplycap). The max to
+### LSP7DecreaseAllowanceNotAuthorized + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreaseallowancenotauthorized) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Error signature: `LSP7DecreaseAllowanceNotAuthorized(address,address,address)` +- Error hash: `0x98ce2945` + +::: + +```solidity +error LSP7DecreaseAllowanceNotAuthorized( + address caller, + address tokenOwner, + address operator +); +``` + +Reverts when the call to decrease allowance is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `operator` | `address` | - | + +
+ ### LSP7DecreasedAllowanceBelowZero :::note References @@ -1755,6 +1771,37 @@ reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit
+### LSP7RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7revokeoperatornotauthorized) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Error signature: `LSP7RevokeOperatorNotAuthorized(address,address,address)` +- Error hash: `0x1a525b32` + +::: + +```solidity +error LSP7RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + address operator +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `operator` | `address` | - | + +
+ ### LSP7TokenContractCannotHoldValue :::note References diff --git a/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md b/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md index 00e9cb8e7..eb1a125ae 100644 --- a/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md +++ b/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md @@ -281,14 +281,15 @@ Returns the number of decimals used to get its user representation. If the asset - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) - Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) -- Function signature: `decreaseAllowance(address,uint256,bytes)` -- Function selector: `0x7b204c4e` +- Function signature: `decreaseAllowance(address,address,uint256,bytes)` +- Function selector: `0x78381670` ::: ```solidity function decreaseAllowance( address operator, + address tokenOwner, uint256 subtractedAmount, bytes operatorNotificationData ) external nonpayable; @@ -303,6 +304,7 @@ Atomically decreases the allowance granted to `operator` by the caller. This is | Name | Type | Description | | -------------------------- | :-------: | ------------------------------------------------------ | | `operator` | `address` | The operator to decrease allowance for `msg.sender` | +| `tokenOwner` | `address` | The address of the token owner. | | `subtractedAmount` | `uint256` | The amount to decrease by in the operator's allowance. | | `operatorNotificationData` | `bytes` | - | @@ -523,26 +525,28 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) - Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) -- Function signature: `revokeOperator(address,bool,bytes)` -- Function selector: `0x4521748e` +- Function signature: `revokeOperator(address,address,bool,bytes)` +- Function selector: `0x30d0dc37` ::: ```solidity function revokeOperator( address operator, + address tokenOwner, bool notify, bytes operatorNotificationData ) external nonpayable; ``` -Removes the `operator` address as an operator of callers tokens, disallowing it to send any amount of tokens on behalf of the token owner (the caller of the function `msg.sender`). See also [`authorizedAmountFor`](#authorizedamountfor). +Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send any amount of tokens on its behalf. This function also allows the `operator` to remove itself if it is the caller of this function #### Parameters | Name | Type | Description | | -------------------------- | :-------: | --------------------------------------------------------- | | `operator` | `address` | The address to revoke as an operator. | +| `tokenOwner` | `address` | The address of the token owner. | | `notify` | `bool` | Boolean indicating whether to notify the operator or not. | | `operatorNotificationData` | `bytes` | The data to notify the operator about via LSP1. | @@ -1625,25 +1629,6 @@ Reverts when a batch call failed.
-### LSP7CannotSendToSelf - -:::note References - -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) -- Error signature: `LSP7CannotSendToSelf()` -- Error hash: `0xb9afb000` - -::: - -```solidity -error LSP7CannotSendToSelf(); -``` - -reverts when specifying the same address for `from` or `to` in a token transfer. - -
- ### LSP7CannotSendWithAddressZero :::note References @@ -1688,6 +1673,37 @@ reverts when trying to set the zero address as an operator.
+### LSP7DecreaseAllowanceNotAuthorized + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreaseallowancenotauthorized) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Error signature: `LSP7DecreaseAllowanceNotAuthorized(address,address,address)` +- Error hash: `0x98ce2945` + +::: + +```solidity +error LSP7DecreaseAllowanceNotAuthorized( + address caller, + address tokenOwner, + address operator +); +``` + +Reverts when the call to decrease allowance is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `operator` | `address` | - | + +
+ ### LSP7DecreasedAllowanceBelowZero :::note References @@ -1778,6 +1794,37 @@ reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit
+### LSP7RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7revokeoperatornotauthorized) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Error signature: `LSP7RevokeOperatorNotAuthorized(address,address,address)` +- Error hash: `0x1a525b32` + +::: + +```solidity +error LSP7RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + address operator +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `operator` | `address` | - | + +
+ ### LSP7TokenContractCannotHoldValue :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md b/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md index 708d6a325..227f072ba 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md @@ -1730,25 +1730,6 @@ Reverts when trying to send token to the zero address.
-### LSP8CannotSendToSelf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) -- Error signature: `LSP8CannotSendToSelf()` -- Error hash: `0x5d67d6c1` - -::: - -```solidity -error LSP8CannotSendToSelf(); -``` - -Reverts when specifying the same address for `from` and `to` in a token transfer. - -
- ### LSP8CannotUseAddressZeroAsOperator :::note References @@ -1969,6 +1950,37 @@ Reverts when `operator` is already authorized for the `tokenId`.
+### LSP8RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8revokeoperatornotauthorized) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Error signature: `LSP8RevokeOperatorNotAuthorized(address,address,bytes32)` +- Error hash: `0x760b5acd` + +::: + +```solidity +error LSP8RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + bytes32 tokenId +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `tokenId` | `bytes32` | - | + +
+ ### LSP8TokenContractCannotHoldValue :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md index 56f4230c9..86f50029d 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md @@ -1756,25 +1756,6 @@ Reverts when trying to send token to the zero address.
-### LSP8CannotSendToSelf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) -- Error signature: `LSP8CannotSendToSelf()` -- Error hash: `0x5d67d6c1` - -::: - -```solidity -error LSP8CannotSendToSelf(); -``` - -Reverts when specifying the same address for `from` and `to` in a token transfer. - -
- ### LSP8CannotUseAddressZeroAsOperator :::note References @@ -1995,6 +1976,37 @@ Reverts when `operator` is already authorized for the `tokenId`.
+### LSP8RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8revokeoperatornotauthorized) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Error signature: `LSP8RevokeOperatorNotAuthorized(address,address,bytes32)` +- Error hash: `0x760b5acd` + +::: + +```solidity +error LSP8RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + bytes32 tokenId +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `tokenId` | `bytes32` | - | + +
+ ### LSP8TokenContractCannotHoldValue :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md index 372210480..7315d4377 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md @@ -1730,25 +1730,6 @@ Reverts when trying to send token to the zero address.
-### LSP8CannotSendToSelf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) -- Error signature: `LSP8CannotSendToSelf()` -- Error hash: `0x5d67d6c1` - -::: - -```solidity -error LSP8CannotSendToSelf(); -``` - -Reverts when specifying the same address for `from` and `to` in a token transfer. - -
- ### LSP8CannotUseAddressZeroAsOperator :::note References @@ -2011,6 +1992,37 @@ Reverts when `operator` is already authorized for the `tokenId`.
+### LSP8RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8revokeoperatornotauthorized) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Error signature: `LSP8RevokeOperatorNotAuthorized(address,address,bytes32)` +- Error hash: `0x760b5acd` + +::: + +```solidity +error LSP8RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + bytes32 tokenId +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `tokenId` | `bytes32` | - | + +
+ ### LSP8TokenContractCannotHoldValue :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md index 9495edf7f..e73d15af1 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md @@ -1758,25 +1758,6 @@ Reverts when trying to send token to the zero address.
-### LSP8CannotSendToSelf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) -- Error signature: `LSP8CannotSendToSelf()` -- Error hash: `0x5d67d6c1` - -::: - -```solidity -error LSP8CannotSendToSelf(); -``` - -Reverts when specifying the same address for `from` and `to` in a token transfer. - -
- ### LSP8CannotUseAddressZeroAsOperator :::note References @@ -1997,6 +1978,37 @@ Reverts when `operator` is already authorized for the `tokenId`.
+### LSP8RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8revokeoperatornotauthorized) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Error signature: `LSP8RevokeOperatorNotAuthorized(address,address,bytes32)` +- Error hash: `0x760b5acd` + +::: + +```solidity +error LSP8RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + bytes32 tokenId +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `tokenId` | `bytes32` | - | + +
+ ### LSP8TokenContractCannotHoldValue :::note References diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md index 1a1c1ee76..fca4e87b5 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md +++ b/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md @@ -1796,25 +1796,6 @@ Reverts when trying to send token to the zero address.
-### LSP8CannotSendToSelf - -:::note References - -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) -- Error signature: `LSP8CannotSendToSelf()` -- Error hash: `0x5d67d6c1` - -::: - -```solidity -error LSP8CannotSendToSelf(); -``` - -Reverts when specifying the same address for `from` and `to` in a token transfer. - -
- ### LSP8CannotUseAddressZeroAsOperator :::note References @@ -2035,6 +2016,37 @@ Reverts when `operator` is already authorized for the `tokenId`.
+### LSP8RevokeOperatorNotAuthorized + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8revokeoperatornotauthorized) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Error signature: `LSP8RevokeOperatorNotAuthorized(address,address,bytes32)` +- Error hash: `0x760b5acd` + +::: + +```solidity +error LSP8RevokeOperatorNotAuthorized( + address caller, + address tokenOwner, + bytes32 tokenId +); +``` + +Reverts when the call to revoke operator is not authorized. + +#### Parameters + +| Name | Type | Description | +| ------------ | :-------: | ----------- | +| `caller` | `address` | - | +| `tokenOwner` | `address` | - | +| `tokenId` | `bytes32` | - | + +
+ ### LSP8TokenContractCannotHoldValue :::note References diff --git a/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts b/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts index 4761dfc0f..dff9137d8 100644 --- a/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts +++ b/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts @@ -446,10 +446,16 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { it('should revert', async () => { + const tokenOwner = context.accounts.owner.address; const subtractedAmount = ethers.BigNumber.from('1'); await expect( - context.lsp7.decreaseAllowance(ethers.constants.AddressZero, subtractedAmount, '0x'), + context.lsp7.decreaseAllowance( + ethers.constants.AddressZero, + tokenOwner, + subtractedAmount, + '0x', + ), ).to.be.revertedWithCustomError( context.lsp7, // Since we can never grant allowance for address(0), address(0) will always have 0 allowance @@ -469,7 +475,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { + it("should decrease the operator's allowance by the `subtractedAmount` + emit `OperatorAuthorizationChanged` event", async () => { + const operator = context.accounts.operator.address; + const tokenOwner = context.accounts.owner.address; + + const subtractedAmount = ethers.BigNumber.from('1'); + + const allowanceBefore = await context.lsp7.authorizedAmountFor(operator, tokenOwner); + + const tx = await context.lsp7 + .connect(context.accounts.operator) + .decreaseAllowance(operator, tokenOwner, subtractedAmount, '0x'); const expectedNewAllowance = allowanceBefore.sub(subtractedAmount); @@ -505,7 +541,12 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { it('should revert', async () => { + const tokenOwner = context.accounts.owner.address; const subtractedAmount = ethers.BigNumber.from('1'); await expect( - context.lsp7.decreaseAllowance(context.accounts.owner.address, subtractedAmount, '0x'), + context.lsp7.decreaseAllowance( + context.accounts.owner.address, + tokenOwner, + subtractedAmount, + '0x', + ), ).to.be.revertedWithCustomError(context.lsp7, 'LSP7TokenOwnerCannotBeOperator'); }); }); @@ -540,7 +587,12 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise Promise { + const operator = context.accounts.operator.address; + const tokenOwner = context.accounts.owner.address; + const amount = context.initialSupply; + + // pre-conditions + await context.lsp7.authorizeOperator(operator, amount, '0x'); + expect(await context.lsp7.authorizedAmountFor(operator, tokenOwner)).to.equal(amount); + + expect(await context.lsp7.getOperatorsOf(tokenOwner)).to.deep.equal([operator]); + + // effects + const tx = await context.lsp7 + .connect(context.accounts.operator) + .revokeOperator(operator, tokenOwner, false, '0x'); + await expect(tx) .to.emit(context.lsp7, 'OperatorRevoked') .withArgs(operator, tokenOwner, false, '0x'); @@ -598,10 +678,11 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { it('should revert', async () => { + const tokenOwner = context.accounts.owner.address; const operator = ethers.constants.AddressZero; await expect( - context.lsp7.revokeOperator(operator, false, '0x'), + context.lsp7.revokeOperator(operator, tokenOwner, false, '0x'), ).to.be.revertedWithCustomError(context.lsp7, 'LSP7CannotUseAddressZeroAsOperator'); }); }); @@ -611,7 +692,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise Promise { const operatorThatReverts: TokenReceiverWithLSP1Revert = await new TokenReceiverWithLSP1Revert__factory(context.accounts.owner).deploy(); + const tokenOwner = context.accounts.owner.address; const operator = operatorThatReverts.address; await context.lsp7.authorizeOperator(operator, 1, '0x'); await operatorThatReverts.addLSP1Support(); - await expect(context.lsp7.revokeOperator(operator, false, '0xaabbccdd')).to.emit( - context.lsp7, - 'OperatorRevoked', - ); + await expect( + context.lsp7.revokeOperator(operator, tokenOwner, false, '0xaabbccdd'), + ).to.emit(context.lsp7, 'OperatorRevoked'); }); }); @@ -1050,7 +1132,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise context.accounts.operator); describe('when `from` and `to` address are the same', () => { - it('should revert', async () => { + it('should pass', async () => { const operator = context.accounts.operator; const txParams = { @@ -1067,17 +1149,15 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise Promise context.accounts.operator); describe('when `to` and `from` are the same address', () => { - it('should revert', async () => { + it('should pass', async () => { const operator = context.accounts.operator; const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], @@ -1641,12 +1721,8 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { const revokeOperatorCalldata = context.lsp7.interface.encodeFunctionData( 'revokeOperator', - [context.accounts.tokenReceiver.address, true, '0x'], + [context.accounts.tokenReceiver.address, context.accounts.owner.address, true, '0x'], ); await expect( @@ -2335,7 +2411,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { + describe('when operator is not the zero address', () => { + it('should succeed', async () => { + const operator = context.accounts.operator.address; + const tokenOwner = context.accounts.owner.address; + const tokenId = mintedTokenId; + + // pre-conditions + await context.lsp8.authorizeOperator(operator, tokenId, '0x'); + expect(await context.lsp8.isOperatorFor(operator, tokenId)).to.be.true; + + // effects + const tx = await context.lsp8 + .connect(context.accounts.operator) + .revokeOperator(operator, tokenId, false, '0x'); + + await expect(tx) + .to.emit(context.lsp8, 'OperatorRevoked') + .withArgs(operator, tokenOwner, tokenId, false, '0x'); + + // post-conditions + expect(await context.lsp8.isOperatorFor(operator, tokenId)).to.be.false; + }); + }); + }); }); describe('isOperatorFor', () => { @@ -920,30 +946,6 @@ export const shouldBehaveLikeLSP8 = ( }); }); }); - - describe("when `from == to` address (= sending to tokenId's owner itself)", () => { - it('should revert', async () => { - const txParams = { - from: context.accounts.owner.address, - to: context.accounts.owner.address, - tokenId: mintedTokenId, - force, - data, - }; - - await expect( - context.lsp8 - .connect(operator) - .transfer( - txParams.from, - txParams.to, - txParams.tokenId, - txParams.force, - txParams.data, - ), - ).to.be.revertedWithCustomError(context.lsp8, 'LSP8CannotSendToSelf'); - }); - }); }); describe('when force=false', () => { @@ -1055,7 +1057,7 @@ export const shouldBehaveLikeLSP8 = ( txParams.force, txParams.data, ), - ).to.be.revertedWithCustomError(context.lsp8, 'LSP8CannotSendToSelf'); + ).to.be.revertedWithCustomError(context.lsp8, 'LSP8NotifyTokenReceiverIsEOA'); }); }); }); From f77b5582a7d190f1f83e349b9ad406f7beb60bb5 Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Sun, 3 Mar 2024 22:44:24 -0700 Subject: [PATCH 23/29] Setup LSP Smart Contracts as Monorepo on develop (#902) * build!: setup monorepo with turborepo for `@lukso/lsp-smart-contracts` * build!: move LSP2 as its own package (#829) * build: start setting Turborepo configs for the monorepo (#828) * build!: setup lsp-smart-contracts as monorepo * build: fix setup eslint for root + packages * build: setup LSP package template with instructions * build: add `COVERAGE` as env variable * build: fix package-lock * build: keep root config for eslint * ci: update CI commands to run temporarily steps for root + package * build: replace `dts` by `unbuild` * docs: apply new prettier to auto-generated docs * build: add missing npm command for `turbo test` * build!: setup lsp-smart-contracts as monorepo * build: fix setup eslint for root + packages * build: setup LSP package template with instructions * chore: start moving LSP2 in its own package * chore: setup Foundry tests for LSP2 * chore: remove other folders not relevant * build: upgrade packages dependencies * ci: update CI for solc_version to allow `packages/` path * build: use `eslint-config-custom` as internal dependency at root * docs: update autogenerated docs config * ci: remove `lsp2` in testing matrix * chore: update README of LSP2 + template packages * feat: remove duplicated content (#856) * ci: remove import require tests for testing constant imports (#859) * build!: move LSP25 in its own package (#851) * chore: disable generation of interfaceIds (#862) * build!: move LSP20 in its own package (#853) * build!: move `LSP4` in its own package (#855) * build!: move LSP5 + LSP10 in their own packages (#852) * build!: move LSP5 in its own package * build: add `lsp2` package dependency in root * ci: update remappings for compiling `solc_version` * build: setup LSP10 as its own package * docs: update dodoc config for LSP5 + LSP10 * build!: move LSP1 in its own package (#854) * build!: move LSP1 in its own package * refactor: update import paths for lsp1 * build!: move LSP17ContractExtension in its own package (#858) * ci: create deployment script to deploy + verify base contracts on mainnet (#849) * refactor: convert verify balance script into Hardhat task * ci: add script to deploy and verify base contracts on mainnet * ci: create bash file + setup mainnet deployer * ci: refactor workflow to deploy and verify contracts using Hardhat task * build!: move LSP17ContractExtension in its own package * docs: add latest LSP7 + LSP8 Tokens audit report (#861) * wip --------- Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Co-authored-by: CJ42 * build!: move LSP14 in its own package (#860) * build: move LSP14 in its own package * refactor: update import paths + add LSP14 in remappings * build: upgrade Typescript version in `packages` and `template/` (#867) * build!: move LSP0 in its own package (#864) * build!: move lsp0 to its own package * refactor: modify imports * chore: prettify * test: resolve foundry imports * test: resolve artifacts import * chore: add suggested changes * build!: move LSP6 in its own package (#866) * build!: move LSP6 in its own package * test: move most of LSP6 foundry tests in package * docs: update paths for LSP6 auto-generated docs * chore: disable prettier for permissions values * test: fix import paths in Foundry tests at root * style: ignore artifacts and types from prettier (#868) * style: ignore artifacts and types from prettier * build: upgrade Typescript version in `packages` and `template/` (#867) * build!: move LSP0 in its own package (#864) * build!: move lsp0 to its own package * refactor: modify imports * chore: prettify * test: resolve foundry imports * test: resolve artifacts import * chore: add suggested changes * build!: move LSP6 in its own package (#866) * build!: move LSP6 in its own package * test: move most of LSP6 foundry tests in package * docs: update paths for LSP6 auto-generated docs * chore: disable prettier for permissions values * test: fix import paths in Foundry tests at root --------- Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> * ci: cache Typescript `types/` of packages in CI (#863) * build!: move LSP7 in its own package (#865) * build!: move lsp17 to its own package (#871) * build!: re-open LSP16 PR to move it again as its own package (#877) * build!: move LSP17ContractExtension in its own package (#858) * ci: create deployment script to deploy + verify base contracts on mainnet (#849) * refactor: convert verify balance script into Hardhat task * ci: add script to deploy and verify base contracts on mainnet * ci: create bash file + setup mainnet deployer * ci: refactor workflow to deploy and verify contracts using Hardhat task * build!: move LSP17ContractExtension in its own package * docs: add latest LSP7 + LSP8 Tokens audit report (#861) * wip --------- Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Co-authored-by: CJ42 * build!: move lsp16 to its own package * build: update package-lock.json * docs: update docs * test: remove test command of lsp16 * ci: update ci reference for lsp16 * test: add mock contracts --------- Co-authored-by: Skima Harvey <64636974+skimaharvey@users.noreply.github.com> Co-authored-by: YamenMerhi * build!: move LSP8 in its own package (#878) * build!: move LSP8 in its own package * docs: update auto-generated docs for LSP8 package * test: update path for LSP8Mintable TS types * build!: move LSP3 and Universal Profile in their own package (#879) * build!: move LSP9 in its own package (#869) * feat: create LSP12 package (#882) * build!: move LSP1 URD in its own package (#880) * build!: create lsp23 package (#883) * build!: create lsp23 package * refactor: update types path in lsp23 tests * ci: fix benchmark * test: replace use of factories with types factories * tests: fix lsp6 types issue * tests: clean up lsp20 types issues * tests: clean up lsp7 types issue * tests: fix up types issues * tests: fix reentrancy tests * build: update package names (#885) * build: update package names * chore: update remmapingss * chore: fix import remappings * chore: update dodoc config --------- Co-authored-by: CJ42 * feat: move constants in their respective packages (#884) * build: setup template package as `module` * build: setup constant export file in template * refactor!: move each TS constants & Types into their respective packages * refactor: add constants and typings for LSP2 * refactor: import interface IDs, typeIds and data keys per sub-package into root * chore: rename prettier config files to `.cjs` * revert: remove type `module` * chore: update import paths * build: register `build:js` command * build: fix `build:js` command and missing dependencies and configs * ci: cache `dist` folder * test: update import paths for constants and types * docs: add missing generated docs paths * chore: update incorrect Typechain paths * chore: remove `smock` library * refactror: remove legacy contracts & tests (#890) * docs: add packages table, npm version to each package (#886) * chore: create packages table * chore: add npm versaion badges to packages * build!: upgrade all packages + root to latest Hardhat version and ethers v6 (#889) * build!: create final package for `@lukso/lsp-smart-contracts` (#896) * chore!: move `@lukso/lsp-smart-contracts` in its own package * build: move all the build and config files into `packages/lsp-smart-contracts` * test: move all the tests/ under `packages/lsp-smart-contracts` * build: organise `package.json` for root and `@lukso/lsp-smart-contracts` * build: cleanup test and scripts commands from root to package * ci: adjust CI for build lint test for all packages * chore: remap import paths for `LSP0ERC725Account` to `@lukso/lsp0-contracts/` * ci: update CI job path runner for `solc_version` * build: tmp turn off global import disallowed in `.sol` file for `lsp-smart-contracts` * chore: remap import paths * test: fix Benchmark tests for ethers v6 syntax * chore: fix some Solidity import path compiler errors * build: update `package-lock.json` * test: update foundry tests setting for `@lukso/lsp-smart-contracts` * chore: add missing environnement variable in `turbo.json` * test: repair tests that import helpers from root * chore: fix types imports in tests * build: adjust foundry build settings to prevent race condition when installing solc in CI * chore: ignore temporarily lsp16 package for foundry tests * ci: disable temporarily foundry gas report in CI * ci: specify working directory for gas benchmark CI --------- Co-authored-by: b00ste * chore: export artifacts from each package (#895) * chore: include types in the release package (#898) * build: prepare manifest file (#897) * chore: update manifest file for release * chore: add lsp-smart-contracts package * chiore: add pre-release true to lsp-smart-contracts package * build: remove `release-as` options in favour of git commit message `release-as` --------- Co-authored-by: CJ42 * ci: setup CI to release per packages individually (#900) * docs: add documentation in `RELEASE.md` for creating pre-releases per packages * ci: update CI for monorepo configs * docs: add extra mention for pre-releases * ci: create JS script to publish each packages on npm * feat!: allow operator to revoke himself (#901) * feat!: allow operator to revoke himself * test: add test for operator revoking himself * refactor!: change LSP7 interfaceId * chore: fix parameter and generate natspec * Make `attributes` optional (#872) * chore: do suggested changes * feat: Add contract asset type (#891) * Add contract asset * Make fileType optional * PR remarks * Change names * chore: re-add updated tests in LSP7 + LSP8 --------- Co-authored-by: Dominik Zborowski Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Co-authored-by: CJ42 --------- Co-authored-by: b00ste.lyx <62855857+b00ste@users.noreply.github.com> Co-authored-by: Skima Harvey <64636974+skimaharvey@users.noreply.github.com> Co-authored-by: Yamen Merhi Co-authored-by: b00ste Co-authored-by: Dominik Zborowski --- .eslintrc.json | 12 - .github/workflows/benchmark.yml | 9 +- .github/workflows/build-lint-test.yml | 109 +- .github/workflows/foundry-tests.yml | 38 +- .github/workflows/release.yml | 18 +- .github/workflows/solc_version.yml | 15 +- .gitignore | 15 +- .gitmodules | 2 +- .mythx.yml | 65 - .prettierignore | 6 +- .prettierrc | 2 +- .solcover.js | 3 - .vscode/settings.json | 3 + README.md | 28 + RELEASE.md | 54 +- config/eslint-config-custom/README.md | 1 + config/eslint-config-custom/index.js | 14 + config/eslint-config-custom/package.json | 13 + .../tsconfig/contracts.json | 4 +- config/tsconfig/package.json | 13 + constants.ts | 449 - contracts/Factories/Create2Factory.sol | 88 - contracts/LSP6KeyManager/LSP6Constants.sol | 64 - .../Legacy/Registries/AddressRegistry.sol | 52 - .../AddressRegistryRequiresERC725.sol | 37 - .../Legacy/UniversalReceiverAddressStore.sol | 64 - contracts/Mocks/NFTStorage.sol | 17 - deploy/001_deploy_universal_profile.ts | 4 - deploy/002_deploy_key_manager.ts | 4 - .../003_deploy_universal_receiver_delegate.ts | 4 - ...eploy_universal_receiver_delegate_vault.ts | 4 - deploy/006_deploy_base_universal_profile.ts | 4 - deploy/007_deploy_base_key_manager.ts | 4 - deploy/008_deploy_lsp7_mintable.ts | 6 +- deploy/009_deploy_lsp8_mintable.ts | 7 +- deploy/010_deploy_base_lsp7_mintable.ts | 4 - deploy/011_deploy_base_lsp8_mintable.ts | 4 - deploy/012_deploy_vault.ts | 4 - deploy/013_deploy_base_vault.ts | 4 - docs/_interface_ids_table.mdx | 20 - .../smart-contracts/contracts}/ERC725.md | 19 +- .../contracts}/LSP0ERC725Account.md | 228 +- .../contracts}/LSP14Ownable2Step.md | 78 +- .../contracts}/LSP17Extendable.md | 8 +- .../contracts}/LSP17Extension.md | 12 +- .../LSP1UniversalReceiverDelegateUP.md | 20 +- .../LSP1UniversalReceiverDelegateVault.md | 20 +- .../contracts}/LSP20CallVerification.md | 4 +- .../contracts}/IPostDeploymentModule.md | 8 +- .../contracts}/LSP23LinkedContractsFactory.md | 58 +- .../contracts}/LSP25MultiChannelNonce.md | 4 +- .../contracts}/LSP4DigitalAssetMetadata.md | 81 +- .../contracts}/LSP6KeyManager.md | 170 +- .../contracts}/LSP7DigitalAsset.md | 265 +- .../contracts}/extensions/LSP7Burnable.md | 269 +- .../contracts}/extensions/LSP7CappedSupply.md | 277 +- .../contracts}/presets/LSP7Mintable.md | 275 +- .../LSP8IdentifiableDigitalAsset.md | 298 +- .../contracts}/extensions/LSP8Burnable.md | 302 +- .../contracts}/extensions/LSP8CappedSupply.md | 310 +- .../contracts}/extensions/LSP8Enumerable.md | 302 +- .../contracts}/presets/LSP8Mintable.md | 312 +- .../lsp9-contracts/contracts}/LSP9Vault.md | 218 +- .../contracts}/UniversalProfile.md | 130 +- .../LSP11BasicSocialRecovery.md | 92 +- .../LSP16UniversalFactory.md | 429 - .../LSP17Extensions/Extension4337.md | 211 - .../OnERC721ReceivedExtension.md | 154 - .../lsp1-contracts/contracts}/LSP1Utils.md | 4 +- .../lsp10-contracts/contracts}/LSP10Utils.md | 4 +- .../lsp2-contracts/contracts}/LSP2Utils.md | 4 +- .../lsp5-contracts/contracts}/LSP5Utils.md | 4 +- .../lsp6-contracts/contracts}/LSP6Utils.md | 4 +- .../LSP17ContractExtension/LSP17Utils.md | 38 - dtsconfig.json | 12 - foundry.toml | 21 + gas_benchmark_result.json | 204 + package-lock.json | 38626 +++++----------- package.json | 193 +- packages/lsp-smart-contracts/.eslintrc.js | 4 + packages/lsp-smart-contracts/.solcover.js | 3 + packages/lsp-smart-contracts/.solhint.json | 25 + .../lsp-smart-contracts/CHANGELOG.md | 0 packages/lsp-smart-contracts/README.md | 3 + packages/lsp-smart-contracts/build.config.ts | 9 + packages/lsp-smart-contracts/constants.ts | 105 + .../LSP0ERC725Account/ILSP0ERC725Account.sol | 4 + .../LSP0ERC725Account/LSP0Constants.sol | 4 + .../LSP0ERC725Account/LSP0ERC725Account.sol | 4 + .../LSP0ERC725AccountCore.sol | 4 + .../LSP0ERC725AccountInit.sol | 4 + .../LSP0ERC725AccountInitAbstract.sol | 4 + .../LSP10ReceivedVaults/LSP10Constants.sol | 4 + .../LSP10ReceivedVaults/LSP10Utils.sol | 4 + .../ILSP11BasicSocialRecovery.sol | 0 .../LSP11BasicSocialRecovery.sol | 0 .../LSP11BasicSocialRecoveryCore.sol | 6 +- .../LSP11BasicSocialRecoveryInit.sol | 0 .../LSP11BasicSocialRecoveryInitAbstract.sol | 0 .../LSP11Constants.sol | 0 .../LSP11BasicSocialRecovery/LSP11Errors.sol | 0 .../LSP12IssuedAssets/LSP12Constants.sol | 4 + .../LSP14Ownable2Step/ILSP14Ownable2Step.sol | 4 + .../LSP14Ownable2Step/LSP14Constants.sol | 4 + .../LSP14Ownable2Step/LSP14Errors.sol | 4 + .../LSP14Ownable2Step/LSP14Ownable2Step.sol | 4 + .../LSP16UniversalFactory.sol | 4 + .../LSP17ContractExtension/LSP17Constants.sol | 4 + .../LSP17ContractExtension/LSP17Errors.sol | 4 + .../LSP17Extendable.sol | 4 + .../LSP17ContractExtension/LSP17Extension.sol | 4 + .../LSP17ContractExtension/LSP17Utils.sol | 4 + .../LSP17Extensions/Extension4337.sol | 4 + .../OnERC721ReceivedExtension.sol | 4 + .../ILSP1UniversalReceiver.sol | 4 + .../ILSP1UniversalReceiverDelegate.sol | 4 + .../LSP1UniversalReceiver/LSP1Constants.sol | 4 + .../LSP1UniversalReceiver/LSP1Errors.sol | 4 + .../LSP1UniversalReceiverDelegateUP.sol | 4 + .../LSP1UniversalReceiverDelegateVault.sol | 4 + .../LSP1UniversalReceiver/LSP1Utils.sol | 4 + .../ILSP20CallVerifier.sol | 4 + .../LSP20CallVerification.sol | 4 + .../LSP20CallVerification/LSP20Constants.sol | 4 + .../LSP20CallVerification/LSP20Errors.sol | 4 + .../ILSP23LinkedContractsFactory.sol | 4 + .../IPostDeploymentModule.sol | 4 + .../LSP23Errors.sol | 4 + .../LSP23LinkedContractsFactory.sol | 4 + .../modules/README.md | 0 ...iversalProfileInitPostDeploymentModule.sol | 4 + .../UniversalProfilePostDeploymentModule.sol | 4 + .../modules/deployment-UP-init-module.md | 0 .../modules/deployment-UP-module.md | 0 .../ILSP25ExecuteRelayCall.sol | 4 + .../LSP25ExecuteRelayCall/LSP25Constants.sol | 4 + .../LSP25ExecuteRelayCall/LSP25Errors.sol | 4 + .../LSP25MultiChannelNonce.sol | 4 + .../LSP2ERC725YJSONSchema/LSP2Utils.sol | 4 + .../LSP3ProfileMetadata/LSP3Constants.sol | 4 + .../LSP4Constants.sol | 4 + .../LSP4DigitalAssetMetadata.sol | 4 + .../LSP4DigitalAssetMetadataCore.sol | 4 + .../LSP4DigitalAssetMetadataInitAbstract.sol | 4 + .../LSP4DigitalAssetMetadata/LSP4Errors.sol | 4 + .../LSP5ReceivedAssets/LSP5Constants.sol | 4 + .../LSP5ReceivedAssets/LSP5Utils.sol | 4 + .../LSP6KeyManager/ILSP6KeyManager.sol | 4 + .../LSP6KeyManager/LSP6Constants.sol | 4 + .../contracts/LSP6KeyManager/LSP6Errors.sol | 4 + .../LSP6KeyManager/LSP6KeyManager.sol | 4 + .../LSP6KeyManager/LSP6KeyManagerCore.sol | 4 + .../LSP6KeyManager/LSP6KeyManagerInit.sol | 4 + .../LSP6KeyManagerInitAbstract.sol | 4 + .../LSP6Modules/LSP6ExecuteModule.sol | 4 + .../LSP6ExecuteRelayCallModule.sol | 4 + .../LSP6Modules/LSP6OwnershipModule.sol | 4 + .../LSP6Modules/LSP6SetDataModule.sol | 4 + .../contracts/LSP6KeyManager/LSP6Utils.sol | 4 + .../LSP7DigitalAsset/ILSP7DigitalAsset.sol | 4 + .../LSP7DigitalAsset/LSP7Constants.sol | 4 + .../LSP7DigitalAsset/LSP7DigitalAsset.sol | 4 + .../LSP7DigitalAsset/LSP7DigitalAssetCore.sol | 4 + .../LSP7DigitalAssetInitAbstract.sol | 4 + .../contracts/LSP7DigitalAsset/LSP7Errors.sol | 4 + .../extensions/LSP7Burnable.sol | 4 + .../extensions/LSP7BurnableInitAbstract.sol | 4 + .../extensions/LSP7CappedSupply.sol | 4 + .../LSP7CappedSupplyInitAbstract.sol | 4 + .../presets/ILSP7Mintable.sol | 4 + .../LSP7DigitalAsset/presets/LSP7Mintable.sol | 4 + .../presets/LSP7MintableInit.sol | 4 + .../presets/LSP7MintableInitAbstract.sol | 4 + .../ILSP8IdentifiableDigitalAsset.sol | 4 + .../LSP8Constants.sol | 4 + .../LSP8Errors.sol | 4 + .../LSP8IdentifiableDigitalAsset.sol | 4 + .../LSP8IdentifiableDigitalAssetCore.sol | 4 + ...P8IdentifiableDigitalAssetInitAbstract.sol | 4 + .../extensions/LSP8Burnable.sol | 4 + .../extensions/LSP8BurnableInitAbstract.sol | 4 + .../extensions/LSP8CappedSupply.sol | 4 + .../LSP8CappedSupplyInitAbstract.sol | 4 + .../extensions/LSP8Enumerable.sol | 4 + .../extensions/LSP8EnumerableInitAbstract.sol | 4 + .../presets/ILSP8Mintable.sol | 4 + .../presets/LSP8Mintable.sol | 4 + .../presets/LSP8MintableInit.sol | 4 + .../presets/LSP8MintableInitAbstract.sol | 4 + .../contracts/LSP9Vault/ILSP9Vault.sol | 4 + .../contracts/LSP9Vault/LSP9Constants.sol | 4 + .../contracts/LSP9Vault/LSP9Errors.sol | 4 + .../contracts/LSP9Vault/LSP9Vault.sol | 4 + .../contracts/LSP9Vault/LSP9VaultCore.sol | 4 + .../contracts/LSP9Vault/LSP9VaultInit.sol | 4 + .../LSP9Vault/LSP9VaultInitAbstract.sol | 4 + .../contracts}/Mocks/ABIEncoder.sol | 0 .../contracts}/Mocks/ERC165Interfaces.sol | 58 +- .../contracts}/Mocks/Executor.sol | 12 +- .../contracts}/Mocks/ExecutorLSP20.sol | 4 +- .../contracts/Mocks/FallbackContract.sol | 9 + .../Mocks/FallbackExtensions/AgeExtension.sol | 11 + .../Mocks/FallbackExtensions/Buy.sol | 0 .../FallbackExtensions/CheckerExtension.sol | 0 .../FallbackExtensions/ERC165Extension.sol | 0 .../FallbackExtensions/EmitEventExtension.sol | 0 .../GraffitiEventExtension.sol | 0 .../FallbackExtensions/NameExtension.sol | 11 + .../ReenterAccountExtension.sol | 0 .../RevertCustomExtension.sol | 0 .../RevertErrorsTestExtension.sol | 0 .../RevertFallbackExtension.sol | 0 .../RevertStringExtension.sol | 0 .../FallbackExtensions/TransferExtension.sol | 0 .../contracts}/Mocks/FallbackInitializer.sol | 0 .../contracts}/Mocks/FallbackRevert.sol | 0 .../contracts}/Mocks/GenericExecutor.sol | 0 .../GenericExecutorWithBalanceOfFunction.sol | 0 .../contracts}/Mocks/ImplementationTester.sol | 0 .../Mocks/KeyManager/ERC725YDelegateCall.sol | 0 .../KeyManager/KeyManagerInternalsTester.sol | 129 + .../KeyManager/TargetPayableContract.sol | 0 .../Mocks/KeyManagerInitWithExtraParams.sol | 4 +- .../Mocks/KeyManagerWithExtraParams.sol | 4 +- .../Mocks/LSP17ExtendableTester.sol | 4 +- .../contracts}/Mocks/LSP1TypeIDsTester.sol | 10 +- .../LSP20Owners/BothCallReturnMagicValue.sol | 28 + .../BothCallReturnSuccessValue.sol | 30 + .../FallbackReturnSuccessValue.sol | 4 +- .../FirstCallReturnExpandedInvalidValue.sol | 4 +- .../FirstCallReturnInvalidValue.sol | 14 +- .../LSP20Owners/FirstCallReturnMagicValue.sol | 31 + .../FirstCallReturnSuccessValue.sol | 35 + .../LSP20Owners/ImplementingFallback.sol | 2 +- .../LSP20Owners/NotImplementingVerifyCall.sol | 2 +- .../Mocks/LSP20Owners/OwnerWIthURD.sol | 8 +- .../SecondCallReturnExpandedSuccessValue.sol | 43 + .../SecondCallReturnExpandedValue.sol | 39 + .../SecondCallReturnFailureValue.sol | 32 + .../Mocks/MaliciousERC1271Wallet.sol | 0 .../contracts}/Mocks/NonPayableFallback.sol | 0 .../contracts}/Mocks/PayableContract.sol | 0 .../Reentrancy/BatchReentrancyRelayer.sol | 2 +- .../Reentrancy/LSP20ReentrantContract.sol | 4 +- .../LSP20ReentrantContractBatch.sol | 4 +- .../Mocks/Reentrancy/ReentrantContract.sol | 8 +- .../Reentrancy/SingleReentrancyRelayer.sol | 2 +- .../Mocks/Reentrancy/ThreeReentrancy.sol | 4 +- .../contracts}/Mocks/Security/Reentrancy.sol | 0 .../Mocks/SignatureValidatorContract.sol | 0 .../contracts}/Mocks/TargetContract.sol | 0 .../contracts}/Mocks/Tokens/IERC223.sol | 0 .../Tokens/LSP7CappedSupplyInitTester.sol | 4 +- .../Mocks/Tokens/LSP7CappedSupplyTester.sol | 6 +- .../Mocks/Tokens/LSP7InitTester.sol | 4 +- .../Mocks/Tokens/LSP7MintWhenDeployed.sol | 4 +- .../contracts}/Mocks/Tokens/LSP7Tester.sol | 8 +- .../Mocks/Tokens/LSP8BurnableInitTester.sol | 4 +- .../Mocks/Tokens/LSP8BurnableTester.sol | 4 +- .../Tokens/LSP8CappedSupplyInitTester.sol | 4 +- .../Mocks/Tokens/LSP8CappedSupplyTester.sol | 4 +- .../Mocks/Tokens/LSP8EnumerableInitTester.sol | 4 +- .../Mocks/Tokens/LSP8EnumerableTester.sol | 4 +- .../Mocks/Tokens/LSP8InitTester.sol | 4 +- .../contracts}/Mocks/Tokens/LSP8Tester.sol | 4 +- .../Mocks/Tokens/LSP8TransferOwnerChange.sol | 4 +- .../Mocks/Tokens/RequireCallbackToken.sol | 2 +- .../Mocks/Tokens/TokenReceiverWithLSP1.sol | 6 +- .../Tokens/TokenReceiverWithLSP1Revert.sol | 6 +- ...okenReceiverWithLSP1WithERC721Received.sol | 6 +- ...eiverWithLSP1WithERC721ReceivedInvalid.sol | 6 +- ...ceiverWithLSP1WithERC721ReceivedRevert.sol | 6 +- .../Mocks/Tokens/TokenReceiverWithoutLSP1.sol | 0 ...nReceiverWithoutLSP1WithERC721Received.sol | 0 ...erWithoutLSP1WithERC721ReceivedInvalid.sol | 0 ...verWithoutLSP1WithERC721ReceivedRevert.sol | 0 .../Mocks/UPWithInstantAcceptOwnership.sol | 12 +- .../UniversalReceiverDelegateDataLYX.sol | 10 +- .../UniversalReceiverDelegateDataUpdater.sol | 14 +- .../UniversalReceiverDelegateGasConsumer.sol | 4 +- .../UniversalReceiverDelegateRevert.sol | 4 +- ...niversalReceiverDelegateTokenReentrant.sol | 12 +- ...niversalReceiverDelegateVaultMalicious.sol | 8 +- ...iversalReceiverDelegateVaultReentrantA.sol | 4 +- ...iversalReceiverDelegateVaultReentrantB.sol | 4 +- .../UniversalReceiverDelegateVaultSetter.sol | 2 +- .../UniversalReceiverTester.sol | 2 +- .../contracts/UniversalProfile.sol | 4 + .../contracts/UniversalProfileInit.sol | 4 + .../UniversalProfileInitAbstract.sol | 4 + .../lsp-smart-contracts/dodoc}/config.ts | 217 +- .../lsp-smart-contracts/dodoc}/template.sqrl | 0 .../gas_benchmark_result.json | 204 + .../lsp-smart-contracts/hardhat.config.ts | 9 +- packages/lsp-smart-contracts/index.ts | 1 + packages/lsp-smart-contracts/package.json | 93 + .../lsp-smart-contracts/scripts}/ci/README.md | 0 .../scripts}/ci/check-deployer-balance.ts | 8 +- .../scripts}/ci/docs-generate.ts | 4 +- .../scripts}/ci/gas_benchmark.ts | 0 .../scripts}/ci/gas_benchmark_template.json | 0 .../scripts}/ci/verify-all-contracts.ts | 0 .../scripts}/fix_flattener.js | 0 .../scripts}/interfaceIds.ts | 28 +- .../lsp-smart-contracts/scripts/typesTs.sh | 92 + .../tests}/Benchmark.test.ts | 450 +- .../LSP11BasicSocialRecovery.behaviour.ts | 198 +- .../LSP11BasicSocialRecovery.test.ts | 6 +- .../LSP11BasicSocialRecoveryInit.test.ts | 11 +- .../LSP14Ownable2Step.behaviour.ts | 125 +- .../LSP17Extendable.behaviour.ts | 210 +- .../LSP17Extendable.test.ts | 36 +- .../LSP17ExtendableTokens.behaviour.ts | 133 +- .../Extension4337/4337.test.ts | 50 +- .../LSP17Extensions/helpers/Create2Factory.ts | 56 +- .../tests}/LSP17Extensions/helpers/UserOp.ts | 68 +- .../LSP17Extensions/helpers/solidityTypes.ts | 0 .../tests}/LSP17Extensions/helpers/utils.ts | 12 +- .../LSP1UniversalReceiver.behaviour.ts | 37 +- ...P1UniversalReceiverDelegateUP.behaviour.ts | 841 +- .../LSP1UniversalReceiverDelegateUP.test.ts | 1 + ...niversalReceiverDelegateVault.behaviour.ts | 573 +- ...LSP1UniversalReceiverDelegateVault.test.ts | 14 +- .../LSP20CallVerification.behaviour.ts | 213 +- .../LSP20WithLSP14.behaviour.ts | 129 +- .../PermissionChangeAddExtensions.test.ts | 88 +- .../LSP6/Admin/PermissionChangeAddURD.test.ts | 51 +- .../LSP6/Admin/PermissionChangeOwner.test.ts | 94 +- .../Interactions/AllowedAddresses.test.ts | 65 +- .../Interactions/AllowedFunctions.test.ts | 155 +- .../Interactions/AllowedStandards.test.ts | 115 +- .../Interactions/ERC725XExecuteBatch.test.ts | 150 +- .../LSP6/Interactions/OtherScenarios.test.ts | 11 +- .../LSP6/Interactions/PermissionCall.test.ts | 172 +- .../PermissionDelegateCall.test.ts | 33 +- .../Interactions/PermissionDeploy.test.ts | 61 +- .../Interactions/PermissionStaticCall.test.ts | 121 +- .../PermissionTransferValue.test.ts | 381 +- .../LSP6/Interactions/Security.test.ts | 126 +- .../LSP6/LSP20WithLSP6.behaviour.ts | 3 +- .../LSP6/LSP20WithLSP6.test.ts | 5 +- .../LSP6/LSP20WithLSP6Init.test.ts | 22 +- .../SetData/AllowedERC725YDataKeys.test.ts | 410 +- .../LSP6/SetData/PermissionSetData.test.ts | 260 +- .../PermissionChangeAddController.test.ts | 187 +- .../SetPermissions/SetAllowedCalls.test.ts | 5 +- .../SetAllowedERC725YDataKeys.test.ts | 23 +- .../LSP20CallVerification/LSP6/index.ts | 0 .../LSP23LinkedContractsDeployment.test.ts | 330 +- .../LSP23LinkedContractsDeployment/helpers.ts | 41 +- .../LSP4DigitalAssetMetadata.behaviour.ts | 30 +- .../PermissionChangeAddExtensions.test.ts | 124 +- .../Admin/PermissionChangeAddURD.test.ts | 51 +- .../Admin/PermissionChangeOwner.test.ts | 97 +- .../Admin/PermissionSign.test.ts | 30 +- .../Interactions/AllowedAddresses.test.ts | 58 +- .../Interactions/AllowedFunctions.test.ts | 157 +- .../Interactions/AllowedStandards.test.ts | 100 +- .../Interactions/BatchExecute.test.ts | 229 +- .../InvalidExecutePayloads.test.ts | 9 +- .../Interactions/PermissionCall.test.ts | 201 +- .../PermissionDelegateCall.test.ts | 36 +- .../Interactions/PermissionDeploy.test.ts | 224 +- .../Interactions/PermissionStaticCall.test.ts | 199 +- .../PermissionTransferValue.test.ts | 429 +- .../LSP6ControlledToken.test.ts | 71 +- .../LSP6KeyManager.behaviour.ts | 7 +- .../LSP6KeyManager/LSP6KeyManager.test.ts | 9 +- .../LSP6KeyManager/LSP6KeyManagerInit.test.ts | 19 +- .../Relay/ExecuteRelayCall.test.ts | 339 +- .../Relay/MultiChannelNonce.test.ts | 118 +- .../SetData/AllowedERC725YDataKeys.test.ts | 395 +- .../SetData/PermissionSetData.test.ts | 276 +- .../PermissionChangeAddController.test.ts | 155 +- .../SetPermissions/SetAllowedCalls.test.ts | 5 +- .../SetAllowedERC725YDataKeys.test.ts | 35 +- .../tests}/LSP6KeyManager/index.ts | 0 .../internals/AllowedCalls.internal.ts | 97 +- .../AllowedERC725YDataKeys.internal.ts | 240 +- .../internals/Execute.internal.ts | 8 +- .../internals/ReadPermissions.internal.ts | 7 +- .../internals/SetData.internal.ts | 35 +- .../LSP7CappedSupply.behaviour.ts | 18 +- .../LSP7DigitalAsset.behaviour.ts | 1877 +- .../LSP7Mintable.behaviour.ts | 54 +- .../proxy/LSP7CappedSupplyInit.test.ts | 15 +- .../proxy/LSP7DigitalAssetInit.test.ts | 12 +- .../proxy/LSP7MintableInit.test.ts | 14 +- .../standard/LSP7CappedSupply.test.ts | 6 +- .../standard/LSP7DigitalAsset.test.ts | 8 +- .../standard/LSP7Mintable.test.ts | 4 +- .../LSP8CappedSupply.behaviour.ts | 26 +- .../LSP8Enumerable.behaviour.ts | 32 +- .../LSP8IdentifiableDigitalAsset.behaviour.ts | 183 +- .../LSP8Mintable.behaviour.ts | 50 +- .../proxy/LSP8BurnableInit.test.ts | 14 +- .../proxy/LSP8CappedSupplyInit.test.ts | 16 +- .../proxy/LSP8EnumerableInit.test.ts | 12 +- .../LSP8IdentifiableDigitalAssetInit.test.ts | 10 +- .../proxy/LSP8MintableInit.test.ts | 15 +- .../standard/LSP8Burnable.test.ts | 7 +- .../standard/LSP8CappedSupply.test.ts | 7 +- .../standard/LSP8Enumerable.test.ts | 5 +- .../LSP8IdentifiableDigitalAsset.test.ts | 9 +- .../standard/LSP8Mintable.test.ts | 5 +- .../tests}/LSP9Vault/LSP9Vault.behaviour.ts | 220 +- .../tests}/LSP9Vault/LSP9Vault.test.ts | 10 +- .../tests}/LSP9Vault/LSP9VaultInit.test.ts | 17 +- .../tests}/Mocks/ABIEncoder.test.ts | 24 +- .../tests}/Mocks/ERC165Interfaces.test.ts | 2 +- .../Mocks/KeyManagerExecutionCosts.test.ts | 63 +- .../tests}/Mocks/LSP1TypeIDs.test.ts | 2 +- .../lsp-smart-contracts/tests}/README.md | 0 ...RC725XBatchExecuteToERC725XExecute.test.ts | 220 +- ...RC725XExecuteToERC725XBatchExecute.test.ts | 220 +- .../ERC725XExecuteToERC725XExecute.test.ts | 132 +- ...ExecuteToLSP6BatchExecuteRelayCall.test.ts | 66 +- ...C725XExecuteToLSP6ExecuteRelayCall.test.ts | 66 +- .../LSP20/LSP20WithLSP6Reentrancy.test.ts | 5 +- .../Reentrancy/LSP20/reentrancyHelpers.ts | 59 +- .../Reentrancy/LSP6/LSP6Reentrancy.test.ts | 150 +- ...gleExecuteRelayCallToSingleExecute.test.ts | 140 +- ...eRelayCallToSingleExecuteRelayCall.test.ts | 63 +- .../LSP6/SingleExecuteToBatchExecute.test.ts | 141 +- ...ngleExecuteToBatchExecuteRelayCall.test.ts | 63 +- .../LSP6/SingleExecuteToSingleExecute.test.ts | 141 +- ...gleExecuteToSingleExecuteRelayCall.test.ts | 64 +- .../Reentrancy/LSP6/reentrancyHelpers.ts | 61 +- .../tests}/Reentrancy/Reentrancy.test.ts | 5 +- .../tests}/Reentrancy/ReentrancyInit.test.ts | 17 +- .../tests}/UniversalProfile.behaviour.ts | 180 +- .../tests}/UniversalProfile.test.ts | 9 +- .../tests}/UniversalProfileInit.test.ts | 42 +- .../foundry/GasTests/LSP6s/LSP6ExecuteRC.sol | 2 +- .../foundry/GasTests/LSP6s/LSP6ExecuteUC.sol | 2 +- .../foundry/GasTests/LSP6s/LSP6SetDataRC.sol | 2 +- .../foundry/GasTests/LSP6s/LSP6SetDataUC.sol | 2 +- .../GasTests/UniversalProfileTestsHelper.sol | 15 +- .../GasTests/execute/RestrictedController.sol | 20 +- .../execute/UnrestrictedController.sol | 20 +- .../GasTests/setData/RestrictedController.sol | 11 +- .../setData/UnrestrictedController.sol | 11 +- .../LSP11BasicSocialRecovery.t.sol | 0 .../LSP11BasicSocialRecovery/LSP11Mock.sol | 0 .../AcceptOwnershipCleanState.sol | 6 +- .../LSP14Ownable2Step/TwoStepOwnership.sol | 6 +- .../TwoStepRenounceOwnership.sol | 6 +- .../LSP6RestrictedController.t.sol | 16 +- .../tests}/utils/context.ts | 7 +- .../tests}/utils/fixtures.ts | 71 +- .../tests}/utils/helpers.ts | 71 +- .../tests}/utils/tokens.ts | 4 +- packages/lsp-smart-contracts/tsconfig.json | 4 + packages/lsp0-contracts/.eslintrc.js | 4 + .../lsp0-contracts/.solhint.json | 0 packages/lsp0-contracts/README.md | 3 + packages/lsp0-contracts/build.config.ts | 9 + packages/lsp0-contracts/constants.ts | 44 + .../contracts}/ILSP0ERC725Account.sol | 0 .../contracts}/LSP0Constants.sol | 0 .../contracts}/LSP0ERC725Account.sol | 2 +- .../contracts}/LSP0ERC725AccountCore.sol | 30 +- .../contracts}/LSP0ERC725AccountInit.sol | 2 +- .../LSP0ERC725AccountInitAbstract.sol | 0 .../lsp0-contracts/contracts}/Version.sol | 0 packages/lsp0-contracts/hardhat.config.ts | 128 + packages/lsp0-contracts/index.ts | 1 + packages/lsp0-contracts/package.json | 57 + packages/lsp0-contracts/tsconfig.json | 4 + packages/lsp1-contracts/.eslintrc.js | 4 + packages/lsp1-contracts/.solhint.json | 25 + packages/lsp1-contracts/README.md | 3 + packages/lsp1-contracts/build.config.ts | 9 + packages/lsp1-contracts/constants.ts | 10 + .../contracts}/ILSP1UniversalReceiver.sol | 0 .../ILSP1UniversalReceiverDelegate.sol | 0 .../contracts}/LSP1Constants.sol | 0 .../lsp1-contracts/contracts}/LSP1Utils.sol | 4 +- packages/lsp1-contracts/hardhat.config.ts | 128 + packages/lsp1-contracts/index.ts | 1 + packages/lsp1-contracts/package.json | 48 + packages/lsp1-contracts/tsconfig.json | 4 + packages/lsp10-contracts/.eslintrc.js | 4 + packages/lsp10-contracts/.solhint.json | 25 + packages/lsp10-contracts/README.md | 3 + packages/lsp10-contracts/build.config.ts | 9 + packages/lsp10-contracts/constants.ts | 12 + .../contracts}/LSP10Constants.sol | 0 .../lsp10-contracts/contracts}/LSP10Utils.sol | 9 +- packages/lsp10-contracts/hardhat.config.ts | 128 + packages/lsp10-contracts/index.ts | 1 + packages/lsp10-contracts/package.json | 48 + packages/lsp10-contracts/tsconfig.json | 4 + packages/lsp12-contracts/.eslintrc.js | 4 + packages/lsp12-contracts/.solhint.json | 25 + packages/lsp12-contracts/README.md | 3 + packages/lsp12-contracts/build.config.ts | 9 + packages/lsp12-contracts/constants.ts | 12 + .../contracts/LSP12Constants.sol | 8 + packages/lsp12-contracts/hardhat.config.ts | 128 + packages/lsp12-contracts/index.ts | 1 + packages/lsp12-contracts/package.json | 47 + packages/lsp12-contracts/tsconfig.json | 4 + packages/lsp14-contracts/.eslintrc.js | 4 + packages/lsp14-contracts/.solhint.json | 25 + packages/lsp14-contracts/README.md | 3 + packages/lsp14-contracts/build.config.ts | 9 + packages/lsp14-contracts/constants.ts | 15 + .../contracts}/ILSP14Ownable2Step.sol | 0 .../contracts}/LSP14Constants.sol | 0 .../contracts}/LSP14Errors.sol | 0 .../contracts}/LSP14Ownable2Step.sol | 2 +- packages/lsp14-contracts/hardhat.config.ts | 128 + packages/lsp14-contracts/index.ts | 1 + packages/lsp14-contracts/package.json | 48 + packages/lsp14-contracts/tsconfig.json | 4 + packages/lsp16-contracts/.eslintrc.js | 4 + packages/lsp16-contracts/.solhint.json | 25 + packages/lsp16-contracts/README.md | 3 + .../contracts}/LSP16UniversalFactory.sol | 0 .../contracts/Mocks/Account.sol | 9 + .../contracts/Mocks/AccountInit.sol | 13 + .../contracts/Mocks/ContractNoConstructor.sol | 14 + .../contracts/Mocks/FallbackContract.sol | 9 + .../contracts/Mocks/FallbackInitializer.sol | 21 + .../contracts/Mocks/ImplementationTester.sol | 18 + .../contracts/Mocks/NonPayableContract.sol | 14 + .../contracts/Mocks/NonPayableFallback.sol | 7 + .../contracts/Mocks/PayableContract.sol | 16 + .../lsp16-contracts/contracts}/README.md | 0 .../foundry/LSP16UniversalFactory.t.sol | 58 +- packages/lsp16-contracts/hardhat.config.ts | 134 + packages/lsp16-contracts/package.json | 51 + .../tests}/LSP16UniversalFactory.test.ts | 539 +- packages/lsp16-contracts/tsconfig.json | 4 + packages/lsp17-contracts/.eslintrc.js | 4 + packages/lsp17-contracts/.solhint.json | 25 + packages/lsp17-contracts/README.md | 6 + packages/lsp17-contracts/build.config.ts | 9 + packages/lsp17-contracts/constants.ts | 1 + .../contracts}/Extension4337.sol | 12 +- .../contracts}/OnERC721ReceivedExtension.sol | 8 +- packages/lsp17-contracts/hardhat.config.ts | 128 + packages/lsp17-contracts/index.ts | 1 + packages/lsp17-contracts/package.json | 52 + packages/lsp17-contracts/tsconfig.json | 4 + .../.eslintrc.js | 4 + .../.gitmodules | 3 + .../.solhint.json | 25 + .../README.md | 3 + .../build.config.ts | 9 + .../constants.ts | 7 + .../contracts}/LSP17Constants.sol | 0 .../contracts}/LSP17Errors.sol | 0 .../contracts}/LSP17Extendable.sol | 0 .../contracts}/LSP17Extension.sol | 2 +- .../contracts}/LSP17Utils.sol | 0 .../contracts/Version.sol | 17 + .../foundry.toml | 10 + .../hardhat.config.ts | 128 + .../lsp17contractextension-contracts/index.ts | 1 + .../package.json | 48 + .../tsconfig.json | 4 + packages/lsp1delegate-contracts/.eslintrc.js | 4 + packages/lsp1delegate-contracts/.solhint.json | 25 + packages/lsp1delegate-contracts/README.md | 12 + .../lsp1delegate-contracts/build.config.ts | 9 + packages/lsp1delegate-contracts/constants.ts | 3 + .../contracts}/LSP1Errors.sol | 0 .../LSP1UniversalReceiverDelegateUP.sol | 24 +- .../LSP1UniversalReceiverDelegateVault.sol | 20 +- .../contracts/Version.sol | 17 + .../lsp1delegate-contracts/hardhat.config.ts | 128 + packages/lsp1delegate-contracts/index.ts | 1 + packages/lsp1delegate-contracts/package.json | 58 + packages/lsp1delegate-contracts/tsconfig.json | 4 + packages/lsp2-contracts/.eslintrc.js | 4 + packages/lsp2-contracts/.gitmodules | 3 + packages/lsp2-contracts/.solhint.json | 25 + packages/lsp2-contracts/README.md | 3 + packages/lsp2-contracts/build.config.ts | 9 + packages/lsp2-contracts/constants.ts | 7 + .../lsp2-contracts/contracts}/LSP2Utils.sol | 0 .../Mocks/LSP2UtilsLibraryTester.sol | 2 +- .../lsp2-contracts/foundry}/LSP2Utils.t.sol | 2 +- packages/lsp2-contracts/hardhat.config.ts | 128 + packages/lsp2-contracts/index.ts | 1 + packages/lsp2-contracts/package.json | 52 + .../tests}/LSP2UtilsLibrary.test.ts | 19 +- packages/lsp2-contracts/tsconfig.json | 4 + packages/lsp20-contracts/.eslintrc.js | 4 + packages/lsp20-contracts/.solhint.json | 25 + packages/lsp20-contracts/README.md | 3 + packages/lsp20-contracts/build.config.ts | 9 + packages/lsp20-contracts/constants.ts | 17 + .../contracts}/ILSP20CallVerifier.sol | 0 .../contracts}/LSP20CallVerification.sol | 0 .../contracts}/LSP20Constants.sol | 0 .../contracts}/LSP20Errors.sol | 0 packages/lsp20-contracts/hardhat.config.ts | 128 + packages/lsp20-contracts/index.ts | 1 + packages/lsp20-contracts/package.json | 44 + packages/lsp20-contracts/tsconfig.json | 4 + packages/lsp23-contracts/.eslintrc.js | 4 + packages/lsp23-contracts/.solhint.json | 25 + packages/lsp23-contracts/README.md | 3 + .../ILSP23LinkedContractsFactory.sol | 0 .../contracts}/IPostDeploymentModule.sol | 0 .../contracts}/LSP23Errors.sol | 0 .../LSP23LinkedContractsFactory.sol | 0 .../contracts/modules/README.md | 23 + ...iversalProfileInitPostDeploymentModule.sol | 4 +- .../UniversalProfilePostDeploymentModule.sol | 4 +- .../modules/deployment-UP-init-module.md | 92 + .../contracts/modules/deployment-UP-module.md | 90 + packages/lsp23-contracts/hardhat.config.ts | 128 + packages/lsp23-contracts/package.json | 52 + packages/lsp23-contracts/tsconfig.json | 4 + packages/lsp25-contracts/.eslintrc.js | 4 + packages/lsp25-contracts/.solhint.json | 25 + packages/lsp25-contracts/README.md | 3 + packages/lsp25-contracts/build.config.ts | 9 + packages/lsp25-contracts/constants.ts | 7 + .../contracts}/ILSP25ExecuteRelayCall.sol | 0 .../contracts}/LSP25Constants.sol | 0 .../contracts}/LSP25Errors.sol | 0 .../contracts}/LSP25MultiChannelNonce.sol | 0 .../Mocks/LSP25MultiChannelNonceTester.sol | 4 +- packages/lsp25-contracts/hardhat.config.ts | 128 + packages/lsp25-contracts/index.ts | 1 + packages/lsp25-contracts/package.json | 49 + .../tests}/LSP25MultiChannelNonce.test.ts | 36 +- packages/lsp25-contracts/tsconfig.json | 4 + packages/lsp3-contracts/.eslintrc.cjs | 4 + packages/lsp3-contracts/.solhint.json | 25 + packages/lsp3-contracts/README.md | 3 + packages/lsp3-contracts/build.config.ts | 9 + packages/lsp3-contracts/constants.ts | 44 + .../contracts}/LSP3Constants.sol | 0 packages/lsp3-contracts/hardhat.config.ts | 128 + packages/lsp3-contracts/index.ts | 1 + packages/lsp3-contracts/package.json | 46 + packages/lsp3-contracts/tsconfig.json | 4 + packages/lsp4-contracts/.eslintrc.js | 4 + packages/lsp4-contracts/.gitmodules | 3 + packages/lsp4-contracts/.solhint.json | 25 + packages/lsp4-contracts/README.md | 3 + packages/lsp4-contracts/build.config.ts | 9 + packages/lsp4-contracts/constants.ts | 78 + .../contracts}/LSP4Constants.sol | 0 .../contracts}/LSP4DigitalAssetMetadata.sol | 0 .../LSP4DigitalAssetMetadataCore.sol | 0 .../LSP4DigitalAssetMetadataInitAbstract.sol | 0 .../lsp4-contracts/contracts}/LSP4Errors.sol | 0 packages/lsp4-contracts/hardhat.config.ts | 131 + packages/lsp4-contracts/index.ts | 1 + packages/lsp4-contracts/package.json | 52 + packages/lsp4-contracts/tsconfig.json | 4 + packages/lsp5-contracts/.eslintrc.js | 4 + packages/lsp5-contracts/.solhint.json | 25 + packages/lsp5-contracts/README.md | 3 + packages/lsp5-contracts/build.config.ts | 9 + packages/lsp5-contracts/constants.ts | 12 + .../contracts}/LSP5Constants.sol | 0 .../lsp5-contracts/contracts}/LSP5Utils.sol | 4 +- packages/lsp5-contracts/hardhat.config.ts | 128 + packages/lsp5-contracts/index.ts | 1 + packages/lsp5-contracts/package.json | 48 + packages/lsp5-contracts/tsconfig.json | 4 + packages/lsp6-contracts/.eslintrc.js | 4 + packages/lsp6-contracts/.prettierignore | 1 + packages/lsp6-contracts/.solhint.json | 25 + packages/lsp6-contracts/README.md | 3 + packages/lsp6-contracts/build.config.ts | 9 + packages/lsp6-contracts/constants.ts | 78 + .../contracts}/ILSP6KeyManager.sol | 0 .../contracts/LSP6Constants.sol | 64 + .../lsp6-contracts/contracts}/LSP6Errors.sol | 0 .../contracts}/LSP6KeyManager.sol | 2 +- .../contracts}/LSP6KeyManagerCore.sol | 18 +- .../contracts}/LSP6KeyManagerInit.sol | 2 +- .../contracts}/LSP6KeyManagerInitAbstract.sol | 0 .../LSP6Modules/LSP6ExecuteModule.sol | 0 .../LSP6ExecuteRelayCallModule.sol | 0 .../LSP6Modules/LSP6OwnershipModule.sol | 0 .../LSP6Modules/LSP6SetDataModule.sol | 6 +- .../lsp6-contracts/contracts}/LSP6Utils.sol | 2 +- .../contracts/Mocks/FallbackInitializer.sol | 21 + .../Mocks}/KeyManagerInternalsTester.sol | 4 +- .../contracts/Mocks/TargetContract.sol | 52 + packages/lsp6-contracts/contracts/Version.sol | 17 + .../lsp6-contracts/contracts/constants.sol | 9 + .../foundry}/LSP6AllowedCallsTest.t.sol | 26 +- .../foundry}/LSP6SetDataTest.t.sol | 80 +- .../lsp6-contracts/foundry}/LSP6Utils.t.sol | 4 +- packages/lsp6-contracts/hardhat.config.ts | 131 + packages/lsp6-contracts/index.ts | 1 + packages/lsp6-contracts/package.json | 60 + packages/lsp6-contracts/tsconfig.json | 4 + packages/lsp7-contracts/.eslintrc.js | 4 + packages/lsp7-contracts/.solhint.json | 25 + packages/lsp7-contracts/README.md | 3 + packages/lsp7-contracts/build.config.ts | 9 + packages/lsp7-contracts/constants.ts | 15 + .../contracts}/ILSP7DigitalAsset.sol | 0 .../contracts}/LSP7Constants.sol | 0 .../contracts}/LSP7DigitalAsset.sol | 12 +- .../contracts}/LSP7DigitalAssetCore.sol | 8 +- .../LSP7DigitalAssetInitAbstract.sol | 12 +- .../lsp7-contracts/contracts}/LSP7Errors.sol | 0 .../contracts}/extensions/LSP7Burnable.sol | 0 .../extensions/LSP7BurnableInitAbstract.sol | 0 .../extensions/LSP7CappedSupply.sol | 0 .../LSP7CappedSupplyInitAbstract.sol | 0 .../contracts}/presets/ILSP7Mintable.sol | 0 .../contracts}/presets/LSP7Mintable.sol | 0 .../contracts}/presets/LSP7MintableInit.sol | 0 .../presets/LSP7MintableInitAbstract.sol | 0 packages/lsp7-contracts/hardhat.config.ts | 139 + packages/lsp7-contracts/index.ts | 1 + packages/lsp7-contracts/package.json | 54 + packages/lsp7-contracts/tsconfig.json | 4 + packages/lsp8-contracts/.eslintrc.js | 4 + packages/lsp8-contracts/.solhint.json | 25 + packages/lsp8-contracts/README.md | 3 + packages/lsp8-contracts/build.config.ts | 9 + packages/lsp8-contracts/constants.ts | 38 + .../ILSP8IdentifiableDigitalAsset.sol | 0 .../contracts}/LSP8Constants.sol | 0 .../lsp8-contracts/contracts}/LSP8Errors.sol | 0 .../LSP8IdentifiableDigitalAsset.sol | 14 +- .../LSP8IdentifiableDigitalAssetCore.sol | 10 +- ...P8IdentifiableDigitalAssetInitAbstract.sol | 14 +- .../contracts}/extensions/LSP8Burnable.sol | 0 .../extensions/LSP8BurnableInitAbstract.sol | 0 .../extensions/LSP8CappedSupply.sol | 0 .../LSP8CappedSupplyInitAbstract.sol | 0 .../contracts}/extensions/LSP8Enumerable.sol | 0 .../extensions/LSP8EnumerableInitAbstract.sol | 0 .../contracts}/presets/ILSP8Mintable.sol | 0 .../contracts}/presets/LSP8Mintable.sol | 0 .../contracts}/presets/LSP8MintableInit.sol | 0 .../presets/LSP8MintableInitAbstract.sol | 0 packages/lsp8-contracts/hardhat.config.ts | 139 + packages/lsp8-contracts/index.ts | 1 + packages/lsp8-contracts/package.json | 56 + packages/lsp8-contracts/tsconfig.json | 4 + packages/lsp9-contracts/.eslintrc.js | 4 + packages/lsp9-contracts/.solhint.json | 25 + packages/lsp9-contracts/README.md | 3 + packages/lsp9-contracts/build.config.ts | 9 + packages/lsp9-contracts/constants.ts | 54 + .../lsp9-contracts/contracts}/ILSP9Vault.sol | 0 .../contracts}/LSP9Constants.sol | 0 .../lsp9-contracts/contracts}/LSP9Errors.sol | 2 +- .../lsp9-contracts/contracts}/LSP9Vault.sol | 6 +- .../contracts}/LSP9VaultCore.sol | 28 +- .../contracts}/LSP9VaultInit.sol | 2 +- .../contracts}/LSP9VaultInitAbstract.sol | 4 +- packages/lsp9-contracts/contracts/Version.sol | 17 + packages/lsp9-contracts/hardhat.config.ts | 131 + packages/lsp9-contracts/index.ts | 1 + packages/lsp9-contracts/package.json | 54 + packages/lsp9-contracts/tsconfig.json | 4 + .../universalprofile-contracts/.eslintrc.js | 4 + .../universalprofile-contracts/.solhint.json | 25 + packages/universalprofile-contracts/README.md | 16 + .../contracts/Constants.sol | 14 + .../contracts}/UniversalProfile.sol | 6 +- .../contracts}/UniversalProfileInit.sol | 0 .../UniversalProfileInitAbstract.sol | 4 +- .../contracts/Version.sol | 17 + .../hardhat.config.ts | 131 + .../universalprofile-contracts/package.json | 49 + .../universalprofile-contracts/tsconfig.json | 4 + publish.mjs | 12 + release-please-config.json | 196 +- remappings.txt | 4 +- template/.eslintrc.js | 4 + template/.solhint.json | 25 + template/README.md | 51 + template/build.config.ts | 9 + template/constants.ts | 4 + template/hardhat.config.ts | 128 + template/index.ts | 1 + template/package.json | 56 + template/tsconfig.json | 4 + tests/Mocks/AddressRegistry.test.ts | 122 - tests/Mocks/NFTStorage.test.ts | 58 - tests/importRequire.sh | 148 - tsconfig.module.json | 10 - turbo.json | 43 + 792 files changed, 30915 insertions(+), 38403 deletions(-) delete mode 100644 .eslintrc.json delete mode 100644 .mythx.yml delete mode 100644 .solcover.js create mode 100644 .vscode/settings.json create mode 100755 config/eslint-config-custom/README.md create mode 100755 config/eslint-config-custom/index.js create mode 100755 config/eslint-config-custom/package.json rename tsconfig.json => config/tsconfig/contracts.json (73%) mode change 100644 => 100755 create mode 100755 config/tsconfig/package.json delete mode 100644 constants.ts delete mode 100644 contracts/Factories/Create2Factory.sol delete mode 100644 contracts/LSP6KeyManager/LSP6Constants.sol delete mode 100644 contracts/Legacy/Registries/AddressRegistry.sol delete mode 100644 contracts/Legacy/Registries/AddressRegistryRequiresERC725.sol delete mode 100644 contracts/Legacy/UniversalReceiverAddressStore.sol delete mode 100644 contracts/Mocks/NFTStorage.sol delete mode 100644 docs/_interface_ids_table.mdx rename docs/contracts/{ERC725 => @erc725/smart-contracts/contracts}/ERC725.md (99%) rename docs/contracts/{LSP0ERC725Account => @lukso/lsp0-contracts/contracts}/LSP0ERC725Account.md (87%) rename docs/contracts/{LSP14Ownable2Step => @lukso/lsp14-contracts/contracts}/LSP14Ownable2Step.md (82%) rename docs/contracts/{LSP17ContractExtension => @lukso/lsp17contractextension-contracts/contracts}/LSP17Extendable.md (91%) rename docs/contracts/{LSP17ContractExtension => @lukso/lsp17contractextension-contracts/contracts}/LSP17Extension.md (84%) rename docs/contracts/{LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP => @lukso/lsp1delegate-contracts/contracts}/LSP1UniversalReceiverDelegateUP.md (90%) rename docs/contracts/{LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault => @lukso/lsp1delegate-contracts/contracts}/LSP1UniversalReceiverDelegateVault.md (88%) rename docs/contracts/{LSP20CallVerification => @lukso/lsp20-contracts/contracts}/LSP20CallVerification.md (90%) rename docs/contracts/{LSP23LinkedContractsFactory => @lukso/lsp23-contracts/contracts}/IPostDeploymentModule.md (85%) rename docs/contracts/{LSP23LinkedContractsFactory => @lukso/lsp23-contracts/contracts}/LSP23LinkedContractsFactory.md (91%) rename docs/contracts/{LSP25ExecuteRelayCall => @lukso/lsp25-contracts/contracts}/LSP25MultiChannelNonce.md (97%) rename docs/contracts/{LSP4DigitalAssetMetadata => @lukso/lsp4-contracts/contracts}/LSP4DigitalAssetMetadata.md (73%) rename docs/contracts/{LSP6KeyManager => @lukso/lsp6-contracts/contracts}/LSP6KeyManager.md (91%) rename docs/contracts/{LSP7DigitalAsset => @lukso/lsp7-contracts/contracts}/LSP7DigitalAsset.md (85%) rename docs/contracts/{LSP7DigitalAsset => @lukso/lsp7-contracts/contracts}/extensions/LSP7Burnable.md (85%) rename docs/contracts/{LSP7DigitalAsset => @lukso/lsp7-contracts/contracts}/extensions/LSP7CappedSupply.md (84%) rename docs/contracts/{LSP7DigitalAsset => @lukso/lsp7-contracts/contracts}/presets/LSP7Mintable.md (85%) rename docs/contracts/{LSP8IdentifiableDigitalAsset => @lukso/lsp8-contracts/contracts}/LSP8IdentifiableDigitalAsset.md (88%) rename docs/contracts/{LSP8IdentifiableDigitalAsset => @lukso/lsp8-contracts/contracts}/extensions/LSP8Burnable.md (85%) rename docs/contracts/{LSP8IdentifiableDigitalAsset => @lukso/lsp8-contracts/contracts}/extensions/LSP8CappedSupply.md (84%) rename docs/contracts/{LSP8IdentifiableDigitalAsset => @lukso/lsp8-contracts/contracts}/extensions/LSP8Enumerable.md (85%) rename docs/contracts/{LSP8IdentifiableDigitalAsset => @lukso/lsp8-contracts/contracts}/presets/LSP8Mintable.md (85%) rename docs/contracts/{LSP9Vault => @lukso/lsp9-contracts/contracts}/LSP9Vault.md (88%) rename docs/contracts/{ => @lukso/universalprofile-contracts/contracts}/UniversalProfile.md (94%) delete mode 100644 docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md delete mode 100644 docs/contracts/LSP17Extensions/Extension4337.md delete mode 100644 docs/contracts/LSP17Extensions/OnERC721ReceivedExtension.md rename docs/libraries/{LSP1UniversalReceiver => @lukso/lsp1-contracts/contracts}/LSP1Utils.md (96%) rename docs/libraries/{LSP10ReceivedVaults => @lukso/lsp10-contracts/contracts}/LSP10Utils.md (96%) rename docs/libraries/{LSP2ERC725YJSONSchema => @lukso/lsp2-contracts/contracts}/LSP2Utils.md (98%) rename docs/libraries/{LSP5ReceivedAssets => @lukso/lsp5-contracts/contracts}/LSP5Utils.md (96%) rename docs/libraries/{LSP6KeyManager => @lukso/lsp6-contracts/contracts}/LSP6Utils.md (98%) delete mode 100644 docs/libraries/LSP17ContractExtension/LSP17Utils.md delete mode 100644 dtsconfig.json create mode 100644 gas_benchmark_result.json create mode 100644 packages/lsp-smart-contracts/.eslintrc.js create mode 100644 packages/lsp-smart-contracts/.solcover.js create mode 100644 packages/lsp-smart-contracts/.solhint.json rename CHANGELOG.md => packages/lsp-smart-contracts/CHANGELOG.md (100%) create mode 100644 packages/lsp-smart-contracts/README.md create mode 100644 packages/lsp-smart-contracts/build.config.ts create mode 100644 packages/lsp-smart-contracts/constants.ts create mode 100644 packages/lsp-smart-contracts/contracts/LSP0ERC725Account/ILSP0ERC725Account.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725Account.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountCore.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP10ReceivedVaults/LSP10Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP10ReceivedVaults/LSP10Utils.sol rename {contracts => packages/lsp-smart-contracts/contracts}/LSP11BasicSocialRecovery/ILSP11BasicSocialRecovery.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryCore.sol (98%) rename {contracts => packages/lsp-smart-contracts/contracts}/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInitAbstract.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/LSP11BasicSocialRecovery/LSP11Constants.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/LSP11BasicSocialRecovery/LSP11Errors.sol (100%) create mode 100644 packages/lsp-smart-contracts/contracts/LSP12IssuedAssets/LSP12Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/ILSP14Ownable2Step.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Extendable.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Extension.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Utils.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP17Extensions/Extension4337.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiver.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Utils.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP20CallVerification/ILSP20CallVerifier.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20CallVerification.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/ILSP23LinkedContractsFactory.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/LSP23Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol rename {contracts => packages/lsp-smart-contracts/contracts}/LSP23LinkedContractsFactory/modules/README.md (100%) create mode 100644 packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/UniversalProfileInitPostDeploymentModule.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/UniversalProfilePostDeploymentModule.sol rename {contracts => packages/lsp-smart-contracts/contracts}/LSP23LinkedContractsFactory/modules/deployment-UP-init-module.md (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/LSP23LinkedContractsFactory/modules/deployment-UP-module.md (100%) create mode 100644 packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP3ProfileMetadata/LSP3Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP5ReceivedAssets/LSP5Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP5ReceivedAssets/LSP5Utils.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/ILSP6KeyManager.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManager.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerCore.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerInit.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteModule.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteRelayCallModule.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6OwnershipModule.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6SetDataModule.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Utils.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7BurnableInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupplyInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/ILSP7Mintable.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7MintableInit.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7MintableInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/ILSP8IdentifiableDigitalAsset.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8BurnableInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/ILSP8Mintable.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInit.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInitAbstract.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP9Vault/ILSP9Vault.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Constants.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Errors.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Vault.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultCore.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultInit.sol create mode 100644 packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultInitAbstract.sol rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/ABIEncoder.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/ERC165Interfaces.sol (85%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Executor.sol (95%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/ExecutorLSP20.sol (97%) create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/FallbackContract.sol create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/AgeExtension.sol rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/Buy.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/CheckerExtension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/ERC165Extension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/EmitEventExtension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/GraffitiEventExtension.sol (100%) create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/NameExtension.sol rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/ReenterAccountExtension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/RevertCustomExtension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/RevertErrorsTestExtension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/RevertFallbackExtension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/RevertStringExtension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackExtensions/TransferExtension.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackInitializer.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/FallbackRevert.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/GenericExecutor.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/GenericExecutorWithBalanceOfFunction.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/ImplementationTester.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/KeyManager/ERC725YDelegateCall.sol (100%) create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/KeyManager/KeyManagerInternalsTester.sol rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/KeyManager/TargetPayableContract.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/KeyManagerInitWithExtraParams.sol (82%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/KeyManagerWithExtraParams.sol (82%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/LSP17ExtendableTester.sol (95%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/LSP1TypeIDsTester.sol (92%) create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/BothCallReturnMagicValue.sol create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/BothCallReturnSuccessValue.sol rename contracts/Mocks/LSP20Owners/FallbackReturnMagicValue.sol => packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FallbackReturnSuccessValue.sol (87%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/LSP20Owners/FirstCallReturnExpandedInvalidValue.sol (88%) rename contracts/Mocks/LSP20Owners/FirstCallReturnInvalidMagicValue.sol => packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnInvalidValue.sol (69%) create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnMagicValue.sol create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnSuccessValue.sol rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/LSP20Owners/ImplementingFallback.sol (90%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/LSP20Owners/NotImplementingVerifyCall.sol (88%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/LSP20Owners/OwnerWIthURD.sol (86%) create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnExpandedSuccessValue.sol create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnExpandedValue.sol create mode 100644 packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnFailureValue.sol rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/MaliciousERC1271Wallet.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/NonPayableFallback.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/PayableContract.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Reentrancy/BatchReentrancyRelayer.sol (94%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Reentrancy/LSP20ReentrantContract.sol (96%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Reentrancy/LSP20ReentrantContractBatch.sol (97%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Reentrancy/ReentrantContract.sol (92%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Reentrancy/SingleReentrancyRelayer.sol (93%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Reentrancy/ThreeReentrancy.sol (96%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Security/Reentrancy.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/SignatureValidatorContract.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/TargetContract.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/IERC223.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP7CappedSupplyInitTester.sol (85%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP7CappedSupplyTester.sol (81%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP7InitTester.sol (84%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP7MintWhenDeployed.sol (80%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP7Tester.sol (73%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8BurnableInitTester.sol (78%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8BurnableTester.sol (78%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8CappedSupplyInitTester.sol (84%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8CappedSupplyTester.sol (84%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8EnumerableInitTester.sol (83%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8EnumerableTester.sol (83%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8InitTester.sol (83%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8Tester.sol (83%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/LSP8TransferOwnerChange.sol (88%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/RequireCallbackToken.sol (90%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithLSP1.sol (82%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithLSP1Revert.sol (78%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithLSP1WithERC721Received.sol (85%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedInvalid.sol (87%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedRevert.sol (88%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithoutLSP1.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721Received.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedInvalid.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedRevert.sol (100%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UPWithInstantAcceptOwnership.sol (77%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateDataLYX.sol (76%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateDataUpdater.sol (75%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateGasConsumer.sol (90%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateRevert.sol (89%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateTokenReentrant.sol (84%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultMalicious.sol (94%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantA.sol (88%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantB.sol (88%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultSetter.sol (93%) rename {contracts => packages/lsp-smart-contracts/contracts}/Mocks/UniversalReceivers/UniversalReceiverTester.sol (94%) create mode 100644 packages/lsp-smart-contracts/contracts/UniversalProfile.sol create mode 100644 packages/lsp-smart-contracts/contracts/UniversalProfileInit.sol create mode 100644 packages/lsp-smart-contracts/contracts/UniversalProfileInitAbstract.sol rename {dodoc => packages/lsp-smart-contracts/dodoc}/config.ts (60%) rename {dodoc => packages/lsp-smart-contracts/dodoc}/template.sqrl (100%) create mode 100644 packages/lsp-smart-contracts/gas_benchmark_result.json rename hardhat.config.ts => packages/lsp-smart-contracts/hardhat.config.ts (96%) create mode 100644 packages/lsp-smart-contracts/index.ts create mode 100644 packages/lsp-smart-contracts/package.json rename {scripts => packages/lsp-smart-contracts/scripts}/ci/README.md (100%) rename {scripts => packages/lsp-smart-contracts/scripts}/ci/check-deployer-balance.ts (83%) rename {scripts => packages/lsp-smart-contracts/scripts}/ci/docs-generate.ts (98%) rename {scripts => packages/lsp-smart-contracts/scripts}/ci/gas_benchmark.ts (100%) rename {scripts => packages/lsp-smart-contracts/scripts}/ci/gas_benchmark_template.json (100%) rename {scripts => packages/lsp-smart-contracts/scripts}/ci/verify-all-contracts.ts (100%) rename {scripts => packages/lsp-smart-contracts/scripts}/fix_flattener.js (100%) rename {scripts => packages/lsp-smart-contracts/scripts}/interfaceIds.ts (71%) create mode 100755 packages/lsp-smart-contracts/scripts/typesTs.sh rename {tests => packages/lsp-smart-contracts/tests}/Benchmark.test.ts (82%) rename {tests => packages/lsp-smart-contracts/tests}/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.behaviour.ts (85%) rename {tests => packages/lsp-smart-contracts/tests}/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts (90%) rename {tests => packages/lsp-smart-contracts/tests}/LSP14Ownable2Step/LSP14Ownable2Step.behaviour.ts (83%) rename {tests => packages/lsp-smart-contracts/tests}/LSP17ContractExtension/LSP17Extendable.behaviour.ts (84%) rename {tests => packages/lsp-smart-contracts/tests}/LSP17ContractExtension/LSP17Extendable.test.ts (81%) rename {tests => packages/lsp-smart-contracts/tests}/LSP17ContractExtension/LSP17ExtendableTokens.behaviour.ts (85%) rename {tests => packages/lsp-smart-contracts/tests}/LSP17Extensions/Extension4337/4337.test.ts (82%) rename {tests => packages/lsp-smart-contracts/tests}/LSP17Extensions/helpers/Create2Factory.ts (67%) rename {tests => packages/lsp-smart-contracts/tests}/LSP17Extensions/helpers/UserOp.ts (79%) rename {tests => packages/lsp-smart-contracts/tests}/LSP17Extensions/helpers/solidityTypes.ts (100%) rename {tests => packages/lsp-smart-contracts/tests}/LSP17Extensions/helpers/utils.ts (74%) rename {tests => packages/lsp-smart-contracts/tests}/LSP1UniversalReceiver/LSP1UniversalReceiver.behaviour.ts (87%) rename {tests => packages/lsp-smart-contracts/tests}/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP.behaviour.ts (78%) rename {tests => packages/lsp-smart-contracts/tests}/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP.test.ts (99%) rename {tests => packages/lsp-smart-contracts/tests}/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault.behaviour.ts (76%) rename {tests => packages/lsp-smart-contracts/tests}/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault.test.ts (79%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP20CallVerification.behaviour.ts (71%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP20WithLSP14.behaviour.ts (83%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Admin/PermissionChangeAddExtensions.test.ts (92%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Admin/PermissionChangeAddURD.test.ts (95%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Admin/PermissionChangeOwner.test.ts (81%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/AllowedAddresses.test.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/AllowedFunctions.test.ts (73%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/AllowedStandards.test.ts (76%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/ERC725XExecuteBatch.test.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/OtherScenarios.test.ts (84%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/PermissionCall.test.ts (85%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/PermissionDelegateCall.test.ts (92%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/PermissionDeploy.test.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/PermissionStaticCall.test.ts (80%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/PermissionTransferValue.test.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/Interactions/Security.test.ts (76%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/LSP20WithLSP6.behaviour.ts (96%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts (84%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts (72%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/SetData/AllowedERC725YDataKeys.test.ts (74%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/SetData/PermissionSetData.test.ts (71%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/SetPermissions/PermissionChangeAddController.test.ts (88%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/SetPermissions/SetAllowedCalls.test.ts (99%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/SetPermissions/SetAllowedERC725YDataKeys.test.ts (92%) rename {tests => packages/lsp-smart-contracts/tests}/LSP20CallVerification/LSP6/index.ts (100%) rename {tests => packages/lsp-smart-contracts/tests}/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts (74%) rename {tests => packages/lsp-smart-contracts/tests}/LSP23LinkedContractsDeployment/helpers.ts (68%) rename {tests => packages/lsp-smart-contracts/tests}/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Admin/PermissionChangeAddExtensions.test.ts (92%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Admin/PermissionChangeAddURD.test.ts (96%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Admin/PermissionChangeOwner.test.ts (84%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Admin/PermissionSign.test.ts (76%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/AllowedAddresses.test.ts (81%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/AllowedFunctions.test.ts (81%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/AllowedStandards.test.ts (81%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/BatchExecute.test.ts (78%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/InvalidExecutePayloads.test.ts (92%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/PermissionCall.test.ts (88%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/PermissionDelegateCall.test.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/PermissionDeploy.test.ts (82%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/PermissionStaticCall.test.ts (84%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Interactions/PermissionTransferValue.test.ts (80%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/LSP6ControlledToken.test.ts (92%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/LSP6KeyManager.behaviour.ts (95%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/LSP6KeyManager.test.ts (89%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/LSP6KeyManagerInit.test.ts (78%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Relay/ExecuteRelayCall.test.ts (87%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/Relay/MultiChannelNonce.test.ts (76%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/SetData/AllowedERC725YDataKeys.test.ts (78%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/SetData/PermissionSetData.test.ts (72%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/SetPermissions/PermissionChangeAddController.test.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/SetPermissions/SetAllowedCalls.test.ts (99%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/SetPermissions/SetAllowedERC725YDataKeys.test.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/index.ts (100%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/internals/AllowedCalls.internal.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/internals/AllowedERC725YDataKeys.internal.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/internals/Execute.internal.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/internals/ReadPermissions.internal.ts (97%) rename {tests => packages/lsp-smart-contracts/tests}/LSP6KeyManager/internals/SetData.internal.ts (70%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/LSP7CappedSupply.behaviour.ts (82%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts (60%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/LSP7Mintable.behaviour.ts (75%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/proxy/LSP7CappedSupplyInit.test.ts (83%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/proxy/LSP7DigitalAssetInit.test.ts (90%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/proxy/LSP7MintableInit.test.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/standard/LSP7CappedSupply.test.ts (88%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/standard/LSP7DigitalAsset.test.ts (94%) rename {tests => packages/lsp-smart-contracts/tests}/LSP7DigitalAsset/standard/LSP7Mintable.test.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/LSP8CappedSupply.behaviour.ts (78%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/LSP8Enumerable.behaviour.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts (92%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts (79%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/proxy/LSP8BurnableInit.test.ts (83%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/proxy/LSP8CappedSupplyInit.test.ts (82%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/proxy/LSP8EnumerableInit.test.ts (88%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/proxy/LSP8IdentifiableDigitalAssetInit.test.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/proxy/LSP8MintableInit.test.ts (90%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/standard/LSP8Burnable.test.ts (84%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/standard/LSP8CappedSupply.test.ts (86%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/standard/LSP8Enumerable.test.ts (88%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/standard/LSP8IdentifiableDigitalAsset.test.ts (93%) rename {tests => packages/lsp-smart-contracts/tests}/LSP8IdentifiableDigitalAsset/standard/LSP8Mintable.test.ts (88%) rename {tests => packages/lsp-smart-contracts/tests}/LSP9Vault/LSP9Vault.behaviour.ts (78%) rename {tests => packages/lsp-smart-contracts/tests}/LSP9Vault/LSP9Vault.test.ts (91%) rename {tests => packages/lsp-smart-contracts/tests}/LSP9Vault/LSP9VaultInit.test.ts (87%) rename {tests => packages/lsp-smart-contracts/tests}/Mocks/ABIEncoder.test.ts (84%) rename {tests => packages/lsp-smart-contracts/tests}/Mocks/ERC165Interfaces.test.ts (98%) rename {tests => packages/lsp-smart-contracts/tests}/Mocks/KeyManagerExecutionCosts.test.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/Mocks/LSP1TypeIDs.test.ts (94%) rename {tests => packages/lsp-smart-contracts/tests}/README.md (100%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP20/ERC725XBatchExecuteToERC725XExecute.test.ts (63%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP20/ERC725XExecuteToERC725XBatchExecute.test.ts (63%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP20/ERC725XExecuteToERC725XExecute.test.ts (78%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP20/ERC725XExecuteToLSP6BatchExecuteRelayCall.test.ts (88%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP20/ERC725XExecuteToLSP6ExecuteRelayCall.test.ts (88%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP20/LSP20WithLSP6Reentrancy.test.ts (94%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP20/reentrancyHelpers.ts (90%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP6/LSP6Reentrancy.test.ts (80%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecute.test.ts (77%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecuteRelayCall.test.ts (89%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP6/SingleExecuteToBatchExecute.test.ts (72%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP6/SingleExecuteToBatchExecuteRelayCall.test.ts (87%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP6/SingleExecuteToSingleExecute.test.ts (71%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP6/SingleExecuteToSingleExecuteRelayCall.test.ts (87%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/LSP6/reentrancyHelpers.ts (90%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/Reentrancy.test.ts (87%) rename {tests => packages/lsp-smart-contracts/tests}/Reentrancy/ReentrancyInit.test.ts (73%) rename {tests => packages/lsp-smart-contracts/tests}/UniversalProfile.behaviour.ts (82%) rename {tests => packages/lsp-smart-contracts/tests}/UniversalProfile.test.ts (93%) rename {tests => packages/lsp-smart-contracts/tests}/UniversalProfileInit.test.ts (87%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/LSP6s/LSP6ExecuteRC.sol (94%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/LSP6s/LSP6ExecuteUC.sol (94%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/LSP6s/LSP6SetDataRC.sol (89%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/LSP6s/LSP6SetDataUC.sol (89%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/UniversalProfileTestsHelper.sol (90%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/execute/RestrictedController.sol (96%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/execute/UnrestrictedController.sol (94%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/setData/RestrictedController.sol (94%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/GasTests/setData/UnrestrictedController.sol (94%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.t.sol (100%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/LSP11BasicSocialRecovery/LSP11Mock.sol (100%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/LSP14Ownable2Step/AcceptOwnershipCleanState.sol (94%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/LSP14Ownable2Step/TwoStepOwnership.sol (94%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/LSP14Ownable2Step/TwoStepRenounceOwnership.sol (92%) rename {tests => packages/lsp-smart-contracts/tests}/foundry/LSP6KeyManager/LSP6RestrictedController.t.sol (84%) rename {tests => packages/lsp-smart-contracts/tests}/utils/context.ts (73%) rename {tests => packages/lsp-smart-contracts/tests}/utils/fixtures.ts (74%) rename {tests => packages/lsp-smart-contracts/tests}/utils/helpers.ts (76%) rename {tests => packages/lsp-smart-contracts/tests}/utils/tokens.ts (52%) create mode 100644 packages/lsp-smart-contracts/tsconfig.json create mode 100644 packages/lsp0-contracts/.eslintrc.js rename .solhint.json => packages/lsp0-contracts/.solhint.json (100%) create mode 100644 packages/lsp0-contracts/README.md create mode 100644 packages/lsp0-contracts/build.config.ts create mode 100644 packages/lsp0-contracts/constants.ts rename {contracts/LSP0ERC725Account => packages/lsp0-contracts/contracts}/ILSP0ERC725Account.sol (100%) rename {contracts/LSP0ERC725Account => packages/lsp0-contracts/contracts}/LSP0Constants.sol (100%) rename {contracts/LSP0ERC725Account => packages/lsp0-contracts/contracts}/LSP0ERC725Account.sol (98%) rename {contracts/LSP0ERC725Account => packages/lsp0-contracts/contracts}/LSP0ERC725AccountCore.sol (97%) rename {contracts/LSP0ERC725Account => packages/lsp0-contracts/contracts}/LSP0ERC725AccountInit.sol (98%) rename {contracts/LSP0ERC725Account => packages/lsp0-contracts/contracts}/LSP0ERC725AccountInitAbstract.sol (100%) rename {contracts => packages/lsp0-contracts/contracts}/Version.sol (100%) create mode 100644 packages/lsp0-contracts/hardhat.config.ts create mode 100644 packages/lsp0-contracts/index.ts create mode 100644 packages/lsp0-contracts/package.json create mode 100644 packages/lsp0-contracts/tsconfig.json create mode 100644 packages/lsp1-contracts/.eslintrc.js create mode 100644 packages/lsp1-contracts/.solhint.json create mode 100755 packages/lsp1-contracts/README.md create mode 100644 packages/lsp1-contracts/build.config.ts create mode 100644 packages/lsp1-contracts/constants.ts rename {contracts/LSP1UniversalReceiver => packages/lsp1-contracts/contracts}/ILSP1UniversalReceiver.sol (100%) rename {contracts/LSP1UniversalReceiver => packages/lsp1-contracts/contracts}/ILSP1UniversalReceiverDelegate.sol (100%) rename {contracts/LSP1UniversalReceiver => packages/lsp1-contracts/contracts}/LSP1Constants.sol (100%) rename {contracts/LSP1UniversalReceiver => packages/lsp1-contracts/contracts}/LSP1Utils.sol (96%) create mode 100755 packages/lsp1-contracts/hardhat.config.ts create mode 100644 packages/lsp1-contracts/index.ts create mode 100644 packages/lsp1-contracts/package.json create mode 100755 packages/lsp1-contracts/tsconfig.json create mode 100644 packages/lsp10-contracts/.eslintrc.js create mode 100644 packages/lsp10-contracts/.solhint.json create mode 100755 packages/lsp10-contracts/README.md create mode 100644 packages/lsp10-contracts/build.config.ts create mode 100644 packages/lsp10-contracts/constants.ts rename {contracts/LSP10ReceivedVaults => packages/lsp10-contracts/contracts}/LSP10Constants.sol (100%) rename {contracts/LSP10ReceivedVaults => packages/lsp10-contracts/contracts}/LSP10Utils.sol (97%) create mode 100755 packages/lsp10-contracts/hardhat.config.ts create mode 100644 packages/lsp10-contracts/index.ts create mode 100644 packages/lsp10-contracts/package.json create mode 100755 packages/lsp10-contracts/tsconfig.json create mode 100644 packages/lsp12-contracts/.eslintrc.js create mode 100644 packages/lsp12-contracts/.solhint.json create mode 100644 packages/lsp12-contracts/README.md create mode 100644 packages/lsp12-contracts/build.config.ts create mode 100644 packages/lsp12-contracts/constants.ts create mode 100644 packages/lsp12-contracts/contracts/LSP12Constants.sol create mode 100644 packages/lsp12-contracts/hardhat.config.ts create mode 100644 packages/lsp12-contracts/index.ts create mode 100644 packages/lsp12-contracts/package.json create mode 100644 packages/lsp12-contracts/tsconfig.json create mode 100644 packages/lsp14-contracts/.eslintrc.js create mode 100644 packages/lsp14-contracts/.solhint.json create mode 100755 packages/lsp14-contracts/README.md create mode 100644 packages/lsp14-contracts/build.config.ts create mode 100644 packages/lsp14-contracts/constants.ts rename {contracts/LSP14Ownable2Step => packages/lsp14-contracts/contracts}/ILSP14Ownable2Step.sol (100%) rename {contracts/LSP14Ownable2Step => packages/lsp14-contracts/contracts}/LSP14Constants.sol (100%) rename {contracts/LSP14Ownable2Step => packages/lsp14-contracts/contracts}/LSP14Errors.sol (100%) rename {contracts/LSP14Ownable2Step => packages/lsp14-contracts/contracts}/LSP14Ownable2Step.sol (99%) create mode 100755 packages/lsp14-contracts/hardhat.config.ts create mode 100644 packages/lsp14-contracts/index.ts create mode 100644 packages/lsp14-contracts/package.json create mode 100755 packages/lsp14-contracts/tsconfig.json create mode 100644 packages/lsp16-contracts/.eslintrc.js create mode 100644 packages/lsp16-contracts/.solhint.json create mode 100644 packages/lsp16-contracts/README.md rename {contracts/LSP16UniversalFactory => packages/lsp16-contracts/contracts}/LSP16UniversalFactory.sol (100%) create mode 100644 packages/lsp16-contracts/contracts/Mocks/Account.sol create mode 100644 packages/lsp16-contracts/contracts/Mocks/AccountInit.sol create mode 100644 packages/lsp16-contracts/contracts/Mocks/ContractNoConstructor.sol create mode 100644 packages/lsp16-contracts/contracts/Mocks/FallbackContract.sol create mode 100644 packages/lsp16-contracts/contracts/Mocks/FallbackInitializer.sol create mode 100644 packages/lsp16-contracts/contracts/Mocks/ImplementationTester.sol create mode 100644 packages/lsp16-contracts/contracts/Mocks/NonPayableContract.sol create mode 100644 packages/lsp16-contracts/contracts/Mocks/NonPayableFallback.sol create mode 100644 packages/lsp16-contracts/contracts/Mocks/PayableContract.sol rename {contracts/LSP16UniversalFactory => packages/lsp16-contracts/contracts}/README.md (100%) rename tests/foundry/LSP16UniversalFactory/LSP16UniversalProfile.t.sol => packages/lsp16-contracts/foundry/LSP16UniversalFactory.t.sol (91%) create mode 100644 packages/lsp16-contracts/hardhat.config.ts create mode 100644 packages/lsp16-contracts/package.json rename {tests/LSP16UniversalFactory => packages/lsp16-contracts/tests}/LSP16UniversalFactory.test.ts (64%) create mode 100644 packages/lsp16-contracts/tsconfig.json create mode 100644 packages/lsp17-contracts/.eslintrc.js create mode 100644 packages/lsp17-contracts/.solhint.json create mode 100644 packages/lsp17-contracts/README.md create mode 100644 packages/lsp17-contracts/build.config.ts create mode 100644 packages/lsp17-contracts/constants.ts rename {contracts/LSP17Extensions => packages/lsp17-contracts/contracts}/Extension4337.sol (93%) rename {contracts/LSP17Extensions => packages/lsp17-contracts/contracts}/OnERC721ReceivedExtension.sol (78%) create mode 100644 packages/lsp17-contracts/hardhat.config.ts create mode 100644 packages/lsp17-contracts/index.ts create mode 100644 packages/lsp17-contracts/package.json create mode 100644 packages/lsp17-contracts/tsconfig.json create mode 100644 packages/lsp17contractextension-contracts/.eslintrc.js create mode 100644 packages/lsp17contractextension-contracts/.gitmodules create mode 100644 packages/lsp17contractextension-contracts/.solhint.json create mode 100644 packages/lsp17contractextension-contracts/README.md create mode 100644 packages/lsp17contractextension-contracts/build.config.ts create mode 100644 packages/lsp17contractextension-contracts/constants.ts rename {contracts/LSP17ContractExtension => packages/lsp17contractextension-contracts/contracts}/LSP17Constants.sol (100%) rename {contracts/LSP17ContractExtension => packages/lsp17contractextension-contracts/contracts}/LSP17Errors.sol (100%) rename {contracts/LSP17ContractExtension => packages/lsp17contractextension-contracts/contracts}/LSP17Extendable.sol (100%) rename {contracts/LSP17ContractExtension => packages/lsp17contractextension-contracts/contracts}/LSP17Extension.sol (97%) rename {contracts/LSP17ContractExtension => packages/lsp17contractextension-contracts/contracts}/LSP17Utils.sol (100%) create mode 100644 packages/lsp17contractextension-contracts/contracts/Version.sol create mode 100644 packages/lsp17contractextension-contracts/foundry.toml create mode 100644 packages/lsp17contractextension-contracts/hardhat.config.ts create mode 100644 packages/lsp17contractextension-contracts/index.ts create mode 100644 packages/lsp17contractextension-contracts/package.json create mode 100644 packages/lsp17contractextension-contracts/tsconfig.json create mode 100644 packages/lsp1delegate-contracts/.eslintrc.js create mode 100644 packages/lsp1delegate-contracts/.solhint.json create mode 100644 packages/lsp1delegate-contracts/README.md create mode 100644 packages/lsp1delegate-contracts/build.config.ts create mode 100644 packages/lsp1delegate-contracts/constants.ts rename {contracts/LSP1UniversalReceiver => packages/lsp1delegate-contracts/contracts}/LSP1Errors.sol (100%) rename {contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP => packages/lsp1delegate-contracts/contracts}/LSP1UniversalReceiverDelegateUP.sol (94%) rename {contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault => packages/lsp1delegate-contracts/contracts}/LSP1UniversalReceiverDelegateVault.sol (93%) create mode 100644 packages/lsp1delegate-contracts/contracts/Version.sol create mode 100644 packages/lsp1delegate-contracts/hardhat.config.ts create mode 100644 packages/lsp1delegate-contracts/index.ts create mode 100644 packages/lsp1delegate-contracts/package.json create mode 100644 packages/lsp1delegate-contracts/tsconfig.json create mode 100644 packages/lsp2-contracts/.eslintrc.js create mode 100644 packages/lsp2-contracts/.gitmodules create mode 100644 packages/lsp2-contracts/.solhint.json create mode 100755 packages/lsp2-contracts/README.md create mode 100644 packages/lsp2-contracts/build.config.ts create mode 100644 packages/lsp2-contracts/constants.ts rename {contracts/LSP2ERC725YJSONSchema => packages/lsp2-contracts/contracts}/LSP2Utils.sol (100%) rename {contracts => packages/lsp2-contracts/contracts}/Mocks/LSP2UtilsLibraryTester.sol (79%) rename {tests/foundry/LSP2ERC725YJSONSchema => packages/lsp2-contracts/foundry}/LSP2Utils.t.sol (98%) create mode 100755 packages/lsp2-contracts/hardhat.config.ts create mode 100644 packages/lsp2-contracts/index.ts create mode 100644 packages/lsp2-contracts/package.json rename {tests/LSP2ERC725YJSONSchema => packages/lsp2-contracts/tests}/LSP2UtilsLibrary.test.ts (87%) create mode 100755 packages/lsp2-contracts/tsconfig.json create mode 100644 packages/lsp20-contracts/.eslintrc.js create mode 100644 packages/lsp20-contracts/.solhint.json create mode 100755 packages/lsp20-contracts/README.md create mode 100644 packages/lsp20-contracts/build.config.ts create mode 100644 packages/lsp20-contracts/constants.ts rename {contracts/LSP20CallVerification => packages/lsp20-contracts/contracts}/ILSP20CallVerifier.sol (100%) rename {contracts/LSP20CallVerification => packages/lsp20-contracts/contracts}/LSP20CallVerification.sol (100%) rename {contracts/LSP20CallVerification => packages/lsp20-contracts/contracts}/LSP20Constants.sol (100%) rename {contracts/LSP20CallVerification => packages/lsp20-contracts/contracts}/LSP20Errors.sol (100%) create mode 100755 packages/lsp20-contracts/hardhat.config.ts create mode 100644 packages/lsp20-contracts/index.ts create mode 100644 packages/lsp20-contracts/package.json create mode 100755 packages/lsp20-contracts/tsconfig.json create mode 100644 packages/lsp23-contracts/.eslintrc.js create mode 100644 packages/lsp23-contracts/.solhint.json create mode 100644 packages/lsp23-contracts/README.md rename {contracts/LSP23LinkedContractsFactory => packages/lsp23-contracts/contracts}/ILSP23LinkedContractsFactory.sol (100%) rename {contracts/LSP23LinkedContractsFactory => packages/lsp23-contracts/contracts}/IPostDeploymentModule.sol (100%) rename {contracts/LSP23LinkedContractsFactory => packages/lsp23-contracts/contracts}/LSP23Errors.sol (100%) rename {contracts/LSP23LinkedContractsFactory => packages/lsp23-contracts/contracts}/LSP23LinkedContractsFactory.sol (100%) create mode 100644 packages/lsp23-contracts/contracts/modules/README.md rename {contracts/LSP23LinkedContractsFactory => packages/lsp23-contracts/contracts}/modules/UniversalProfileInitPostDeploymentModule.sol (94%) rename {contracts/LSP23LinkedContractsFactory => packages/lsp23-contracts/contracts}/modules/UniversalProfilePostDeploymentModule.sol (94%) create mode 100644 packages/lsp23-contracts/contracts/modules/deployment-UP-init-module.md create mode 100644 packages/lsp23-contracts/contracts/modules/deployment-UP-module.md create mode 100644 packages/lsp23-contracts/hardhat.config.ts create mode 100644 packages/lsp23-contracts/package.json create mode 100644 packages/lsp23-contracts/tsconfig.json create mode 100644 packages/lsp25-contracts/.eslintrc.js create mode 100644 packages/lsp25-contracts/.solhint.json create mode 100644 packages/lsp25-contracts/README.md create mode 100644 packages/lsp25-contracts/build.config.ts create mode 100644 packages/lsp25-contracts/constants.ts rename {contracts/LSP25ExecuteRelayCall => packages/lsp25-contracts/contracts}/ILSP25ExecuteRelayCall.sol (100%) rename {contracts/LSP25ExecuteRelayCall => packages/lsp25-contracts/contracts}/LSP25Constants.sol (100%) rename {contracts/LSP25ExecuteRelayCall => packages/lsp25-contracts/contracts}/LSP25Errors.sol (100%) rename {contracts/LSP25ExecuteRelayCall => packages/lsp25-contracts/contracts}/LSP25MultiChannelNonce.sol (100%) rename {contracts => packages/lsp25-contracts/contracts}/Mocks/LSP25MultiChannelNonceTester.sol (92%) create mode 100644 packages/lsp25-contracts/hardhat.config.ts create mode 100644 packages/lsp25-contracts/index.ts create mode 100644 packages/lsp25-contracts/package.json rename {tests/LSP25ExecuteRelayCall => packages/lsp25-contracts/tests}/LSP25MultiChannelNonce.test.ts (75%) create mode 100644 packages/lsp25-contracts/tsconfig.json create mode 100644 packages/lsp3-contracts/.eslintrc.cjs create mode 100644 packages/lsp3-contracts/.solhint.json create mode 100644 packages/lsp3-contracts/README.md create mode 100644 packages/lsp3-contracts/build.config.ts create mode 100644 packages/lsp3-contracts/constants.ts rename {contracts/LSP3ProfileMetadata => packages/lsp3-contracts/contracts}/LSP3Constants.sol (100%) create mode 100644 packages/lsp3-contracts/hardhat.config.ts create mode 100644 packages/lsp3-contracts/index.ts create mode 100644 packages/lsp3-contracts/package.json create mode 100644 packages/lsp3-contracts/tsconfig.json create mode 100644 packages/lsp4-contracts/.eslintrc.js create mode 100644 packages/lsp4-contracts/.gitmodules create mode 100644 packages/lsp4-contracts/.solhint.json create mode 100644 packages/lsp4-contracts/README.md create mode 100644 packages/lsp4-contracts/build.config.ts create mode 100644 packages/lsp4-contracts/constants.ts rename {contracts/LSP4DigitalAssetMetadata => packages/lsp4-contracts/contracts}/LSP4Constants.sol (100%) rename {contracts/LSP4DigitalAssetMetadata => packages/lsp4-contracts/contracts}/LSP4DigitalAssetMetadata.sol (100%) rename {contracts/LSP4DigitalAssetMetadata => packages/lsp4-contracts/contracts}/LSP4DigitalAssetMetadataCore.sol (100%) rename {contracts/LSP4DigitalAssetMetadata => packages/lsp4-contracts/contracts}/LSP4DigitalAssetMetadataInitAbstract.sol (100%) rename {contracts/LSP4DigitalAssetMetadata => packages/lsp4-contracts/contracts}/LSP4Errors.sol (100%) create mode 100644 packages/lsp4-contracts/hardhat.config.ts create mode 100644 packages/lsp4-contracts/index.ts create mode 100644 packages/lsp4-contracts/package.json create mode 100644 packages/lsp4-contracts/tsconfig.json create mode 100644 packages/lsp5-contracts/.eslintrc.js create mode 100644 packages/lsp5-contracts/.solhint.json create mode 100644 packages/lsp5-contracts/README.md create mode 100644 packages/lsp5-contracts/build.config.ts create mode 100644 packages/lsp5-contracts/constants.ts rename {contracts/LSP5ReceivedAssets => packages/lsp5-contracts/contracts}/LSP5Constants.sol (100%) rename {contracts/LSP5ReceivedAssets => packages/lsp5-contracts/contracts}/LSP5Utils.sol (98%) create mode 100644 packages/lsp5-contracts/hardhat.config.ts create mode 100644 packages/lsp5-contracts/index.ts create mode 100644 packages/lsp5-contracts/package.json create mode 100644 packages/lsp5-contracts/tsconfig.json create mode 100644 packages/lsp6-contracts/.eslintrc.js create mode 100644 packages/lsp6-contracts/.prettierignore create mode 100644 packages/lsp6-contracts/.solhint.json create mode 100644 packages/lsp6-contracts/README.md create mode 100644 packages/lsp6-contracts/build.config.ts create mode 100644 packages/lsp6-contracts/constants.ts rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/ILSP6KeyManager.sol (100%) create mode 100644 packages/lsp6-contracts/contracts/LSP6Constants.sol rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6Errors.sol (100%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6KeyManager.sol (96%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6KeyManagerCore.sol (98%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6KeyManagerInit.sol (97%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6KeyManagerInitAbstract.sol (100%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6Modules/LSP6ExecuteModule.sol (100%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6Modules/LSP6ExecuteRelayCallModule.sol (100%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6Modules/LSP6OwnershipModule.sol (100%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6Modules/LSP6SetDataModule.sol (99%) rename {contracts/LSP6KeyManager => packages/lsp6-contracts/contracts}/LSP6Utils.sol (99%) create mode 100644 packages/lsp6-contracts/contracts/Mocks/FallbackInitializer.sol rename {contracts/Mocks/KeyManager => packages/lsp6-contracts/contracts/Mocks}/KeyManagerInternalsTester.sol (96%) create mode 100644 packages/lsp6-contracts/contracts/Mocks/TargetContract.sol create mode 100644 packages/lsp6-contracts/contracts/Version.sol create mode 100644 packages/lsp6-contracts/contracts/constants.sol rename {tests/foundry/LSP6KeyManager => packages/lsp6-contracts/foundry}/LSP6AllowedCallsTest.t.sol (92%) rename {tests/foundry/LSP6KeyManager => packages/lsp6-contracts/foundry}/LSP6SetDataTest.t.sol (76%) rename {tests/foundry/LSP6KeyManager => packages/lsp6-contracts/foundry}/LSP6Utils.t.sol (99%) create mode 100644 packages/lsp6-contracts/hardhat.config.ts create mode 100644 packages/lsp6-contracts/index.ts create mode 100644 packages/lsp6-contracts/package.json create mode 100644 packages/lsp6-contracts/tsconfig.json create mode 100644 packages/lsp7-contracts/.eslintrc.js create mode 100644 packages/lsp7-contracts/.solhint.json create mode 100644 packages/lsp7-contracts/README.md create mode 100644 packages/lsp7-contracts/build.config.ts create mode 100644 packages/lsp7-contracts/constants.ts rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/ILSP7DigitalAsset.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/LSP7Constants.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/LSP7DigitalAsset.sol (95%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/LSP7DigitalAssetCore.sol (99%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/LSP7DigitalAssetInitAbstract.sol (94%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/LSP7Errors.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/extensions/LSP7Burnable.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/extensions/LSP7BurnableInitAbstract.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/extensions/LSP7CappedSupply.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/extensions/LSP7CappedSupplyInitAbstract.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/presets/ILSP7Mintable.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/presets/LSP7Mintable.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/presets/LSP7MintableInit.sol (100%) rename {contracts/LSP7DigitalAsset => packages/lsp7-contracts/contracts}/presets/LSP7MintableInitAbstract.sol (100%) create mode 100644 packages/lsp7-contracts/hardhat.config.ts create mode 100644 packages/lsp7-contracts/index.ts create mode 100644 packages/lsp7-contracts/package.json create mode 100644 packages/lsp7-contracts/tsconfig.json create mode 100644 packages/lsp8-contracts/.eslintrc.js create mode 100644 packages/lsp8-contracts/.solhint.json create mode 100644 packages/lsp8-contracts/README.md create mode 100644 packages/lsp8-contracts/build.config.ts create mode 100644 packages/lsp8-contracts/constants.ts rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/ILSP8IdentifiableDigitalAsset.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/LSP8Constants.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/LSP8Errors.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/LSP8IdentifiableDigitalAsset.sol (95%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/LSP8IdentifiableDigitalAssetCore.sol (98%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/LSP8IdentifiableDigitalAssetInitAbstract.sol (95%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/extensions/LSP8Burnable.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/extensions/LSP8BurnableInitAbstract.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/extensions/LSP8CappedSupply.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/extensions/LSP8CappedSupplyInitAbstract.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/extensions/LSP8Enumerable.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/extensions/LSP8EnumerableInitAbstract.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/presets/ILSP8Mintable.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/presets/LSP8Mintable.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/presets/LSP8MintableInit.sol (100%) rename {contracts/LSP8IdentifiableDigitalAsset => packages/lsp8-contracts/contracts}/presets/LSP8MintableInitAbstract.sol (100%) create mode 100644 packages/lsp8-contracts/hardhat.config.ts create mode 100644 packages/lsp8-contracts/index.ts create mode 100644 packages/lsp8-contracts/package.json create mode 100644 packages/lsp8-contracts/tsconfig.json create mode 100644 packages/lsp9-contracts/.eslintrc.js create mode 100644 packages/lsp9-contracts/.solhint.json create mode 100644 packages/lsp9-contracts/README.md create mode 100644 packages/lsp9-contracts/build.config.ts create mode 100644 packages/lsp9-contracts/constants.ts rename {contracts/LSP9Vault => packages/lsp9-contracts/contracts}/ILSP9Vault.sol (100%) rename {contracts/LSP9Vault => packages/lsp9-contracts/contracts}/LSP9Constants.sol (100%) rename {contracts/LSP9Vault => packages/lsp9-contracts/contracts}/LSP9Errors.sol (88%) rename {contracts/LSP9Vault => packages/lsp9-contracts/contracts}/LSP9Vault.sol (93%) rename {contracts/LSP9Vault => packages/lsp9-contracts/contracts}/LSP9VaultCore.sol (96%) rename {contracts/LSP9Vault => packages/lsp9-contracts/contracts}/LSP9VaultInit.sol (97%) rename {contracts/LSP9Vault => packages/lsp9-contracts/contracts}/LSP9VaultInitAbstract.sol (95%) create mode 100644 packages/lsp9-contracts/contracts/Version.sol create mode 100644 packages/lsp9-contracts/hardhat.config.ts create mode 100644 packages/lsp9-contracts/index.ts create mode 100644 packages/lsp9-contracts/package.json create mode 100644 packages/lsp9-contracts/tsconfig.json create mode 100644 packages/universalprofile-contracts/.eslintrc.js create mode 100644 packages/universalprofile-contracts/.solhint.json create mode 100644 packages/universalprofile-contracts/README.md create mode 100644 packages/universalprofile-contracts/contracts/Constants.sol rename {contracts => packages/universalprofile-contracts/contracts}/UniversalProfile.sol (90%) rename {contracts => packages/universalprofile-contracts/contracts}/UniversalProfileInit.sol (100%) rename {contracts => packages/universalprofile-contracts/contracts}/UniversalProfileInitAbstract.sol (92%) create mode 100644 packages/universalprofile-contracts/contracts/Version.sol create mode 100644 packages/universalprofile-contracts/hardhat.config.ts create mode 100644 packages/universalprofile-contracts/package.json create mode 100644 packages/universalprofile-contracts/tsconfig.json create mode 100644 publish.mjs create mode 100644 template/.eslintrc.js create mode 100644 template/.solhint.json create mode 100644 template/README.md create mode 100644 template/build.config.ts create mode 100644 template/constants.ts create mode 100644 template/hardhat.config.ts create mode 100644 template/index.ts create mode 100644 template/package.json create mode 100644 template/tsconfig.json delete mode 100644 tests/Mocks/AddressRegistry.test.ts delete mode 100644 tests/Mocks/NFTStorage.test.ts delete mode 100755 tests/importRequire.sh delete mode 100644 tsconfig.module.json create mode 100644 turbo.json diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 5f84463e4..000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "ignorePatterns": ["artifacts/", "cache/", "dist/", "types/", "contracts.ts"], - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" - ], - "plugins": ["@typescript-eslint/eslint-plugin", "prettier"], - "rules": { - "prettier/prettier": "error", - "@typescript-eslint/no-explicit-any": "off" - } -} diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index edb5a2057..0005deac8 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -13,7 +13,7 @@ on: # compare gas diff only when editing Solidity smart contract code paths: - - "contracts/**/*.sol" + - "packages/**/contracts/**/*.sol" # do not run on releases (merging to main) branches-ignore: @@ -22,6 +22,9 @@ on: jobs: benchmark: runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/lsp-smart-contracts steps: - name: Checkout base branch @@ -40,7 +43,9 @@ jobs: run: npm ci - name: 🏗️ Build contract artifacts - run: npx hardhat compile + run: | + npm run build + npm run build:turbo - name: 🧪 Run Benchmark tests # Rename the file to be able to generate benchmark JSON report diff --git a/.github/workflows/build-lint-test.yml b/.github/workflows/build-lint-test.yml index d5cf13392..94745231b 100644 --- a/.github/workflows/build-lint-test.yml +++ b/.github/workflows/build-lint-test.yml @@ -5,17 +5,17 @@ name: Node.js CI - Build + Lint + Test on: pull_request jobs: - build: + build-lint-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - name: Use Node.js '16.15.0' - uses: actions/setup-node@v2 + - name: Use Node.js v20 + uses: actions/setup-node@v3 with: - node-version: "16.15.0" + node-version: "20.x" cache: "npm" - name: 📦 Install dependencies @@ -29,87 +29,20 @@ jobs: # This will also generate the Typechain types used by the Chai tests - name: 🏗️ Build contract artifacts - run: npx hardhat compile - - - name: 📤 cache dependencies + build - uses: actions/cache@v2 - with: - path: | - artifacts - node_modules - types - contracts.ts - key: ${{ github.run_id }} - - - name: 🧪 run import/requires tests - run: npm run test:importRequire - - - name: 📚 generate ABI docs - run: npm run build:docs - - - name: 🔍 check if ABI auto-generated docs need to be updated - run: |- - if [[ $(git diff --name-only) != "" ]]; - then - echo "Error: Please generate ABI docs after making changes to Solidity code and Natspec comments!" - exit 1 - fi - - test-suites: - strategy: - matrix: - lsp: - [ - "up", - "upinit", - "lsp1", - "lsp2", - "lsp6", - "lsp6init", - "lsp7", - "lsp7init", - "lsp8", - "lsp8init", - "lsp9", - "lsp9init", - "lsp11", - "lsp11init", - "lsp17", - "lsp17extensions", - "lsp20", - "lsp20init", - "lsp23", - "universalfactory", - "reentrancy", - "reentrancyinit", - "mocks", - ] - - runs-on: ubuntu-latest - needs: [build] - steps: - - uses: actions/checkout@v3 - - - name: 📥 restore cache - uses: actions/cache@v2 - id: "build-cache" - with: - path: | - artifacts - node_modules - types - contracts.ts - key: ${{ github.run_id }} - - - name: Use Node.js v16 - uses: actions/setup-node@v2 - with: - node-version: "16.x" - cache: "npm" - - - name: Install dependencies - if: steps.build-cache.outputs.cache-hit != 'true' - run: npm ci - - - name: 🧪 run tests - run: npm run test:${{ matrix.lsp }} + run: | + npm run build + npm run build:js + + # - name: 📚 generate ABI docs + # run: npm run build:docs + + # - name: 🔍 check if ABI auto-generated docs need to be updated + # run: |- + # if [[ $(git diff --name-only) != "" ]]; + # then + # echo "Error: Please generate ABI docs after making changes to Solidity code and Natspec comments!" + # exit 1 + # fi + + - name: 🧪 Run tests for each package + run: npm run test diff --git a/.github/workflows/foundry-tests.yml b/.github/workflows/foundry-tests.yml index cbfbe8a99..0f450fc69 100644 --- a/.github/workflows/foundry-tests.yml +++ b/.github/workflows/foundry-tests.yml @@ -4,8 +4,8 @@ on: pull_request: # compare gas diff only when editing Solidity smart contract code paths: - - "contracts/**/*.sol" - - "tests/foundry/**/*.sol" + - "packages/**/*.sol" + - "packages/lsp-smart-contracts/tests/foundry/**/*.sol" jobs: foundry-tests: @@ -24,7 +24,9 @@ jobs: run: npm ci - name: NPM build - run: npx hardhat compile + run: | + npm run build + npm run build:foundry - name: Run Foundry tests run: npm run test:foundry @@ -34,18 +36,18 @@ jobs: # due to non-deterministic fuzzing (but still use pseudo-random fuzzing seeds) FOUNDRY_FUZZ_SEED: 0x${{ github.event.pull_request.base.sha || github.sha }} - - name: Compare gas reports - uses: Rubilmax/foundry-gas-diff@v3.13.1 - with: - summaryQuantile: 0.9 # only display the 10% most significant gas diffs in the summary (defaults to 20%) - sortCriteria: avg,max # sort diff rows by criteria - sortOrders: desc,asc # and directions - id: gas_diff - - - name: Add gas diff to sticky comment - if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target' - uses: marocchino/sticky-pull-request-comment@v2 - with: - # delete the comment in case changes no longer impact gas costs - delete: ${{ !steps.gas_diff.outputs.markdown }} - message: ${{ steps.gas_diff.outputs.markdown }} + # - name: Compare gas reports + # uses: Rubilmax/foundry-gas-diff@v3.13.1 + # with: + # summaryQuantile: 0.9 # only display the 10% most significant gas diffs in the summary (defaults to 20%) + # sortCriteria: avg,max # sort diff rows by criteria + # sortOrders: desc,asc # and directions + # id: gas_diff + + # - name: Add gas diff to sticky comment + # if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target' + # uses: marocchino/sticky-pull-request-comment@v2 + # with: + # # delete the comment in case changes no longer impact gas costs + # delete: ${{ !steps.gas_diff.outputs.markdown }} + # message: ${{ steps.gas_diff.outputs.markdown }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0a28c2f91..cc392765a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,11 +28,11 @@ jobs: # a new release is created: - uses: actions/checkout@v3 - if: ${{ steps.release.outputs.release_created }} + if: ${{ steps.release.outputs.releases_created }} - name: Use Node.js '16.15.0' uses: actions/setup-node@v2 - if: ${{ steps.release.outputs.release_created }} + if: ${{ steps.release.outputs.releases_created }} with: node-version: "16.15.0" registry-url: "https://registry.npmjs.org" @@ -40,20 +40,26 @@ jobs: cache: "npm" - name: Install Dependencies - if: ${{ steps.release.outputs.release_created }} + if: ${{ steps.release.outputs.releases_created }} run: npm ci # `npm run build:js` will also generate the auto-generated constants for methods, errors and events, # including extracting their devdocs and userdocs - name: Prepare artifacts to publish - if: ${{ steps.release.outputs.release_created }} + if: ${{ steps.release.outputs.releases_created }} run: | npm run build npm run build:js npm run package + npm run build:types - name: Publish on NPM - if: ${{ steps.release.outputs.release_created }} - run: npm publish --access public + if: ${{ steps.release.outputs.releases_created }} + run: | + (cat < outputs.json + ${{toJSON(steps.release.outputs)}} + END + ) + node ./publish.mjs outputs.json env: NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_KEY }} diff --git a/.github/workflows/solc_version.yml b/.github/workflows/solc_version.yml index 4aad0e860..469cf228a 100644 --- a/.github/workflows/solc_version.yml +++ b/.github/workflows/solc_version.yml @@ -11,15 +11,18 @@ on: - "develop" # Only run when `.sol` files have been changed paths: - - "contracts/**/*.sol" + - "*.sol" pull_request: paths: - - "contracts/**/*.sol" + - "*.sol" jobs: solc_version: runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/lsp-smart-contracts strategy: matrix: solc: [ @@ -75,12 +78,12 @@ jobs: - name: Compile Smart Contracts run: | if [[ "<" == "${{ steps.comparison.outputs.comparison-result }}" ]] - then + then solc $(ls contracts/**/*.sol | grep -v "Extension4337\|contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset") \ - --allow-paths $(pwd)/node_modules/ \ + --allow-paths $(pwd)/node_modules/,$(pwd)/packages/ \ + ../=$(pwd)/contracts/ \ @=node_modules/@ \ - solidity-bytes-utils/=node_modules/solidity-bytes-utils/ \ - ../=$(pwd)/contracts/ + solidity-bytes-utils/=node_modules/solidity-bytes-utils/ else solc contracts/**/*.sol \ @=node_modules/@ \ diff --git a/.gitignore b/.gitignore index c1824b6ac..085bc659e 100644 --- a/.gitignore +++ b/.gitignore @@ -135,11 +135,16 @@ forge-cache/ gas_benchmark.md # Exclude build output folders -/common -/module -/contracts.ts -/devdocs -/userdocs +/**/dist +/**/contracts.ts +/**/devdocs +/**/userdocs # test temporary folder /.test + +# Turborepo +.turbo + +# Custom setup +foundry_artifacts/ diff --git a/.gitmodules b/.gitmodules index 7fea7ee1b..f67502a86 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "lib/forge-std"] path = lib/forge-std - url = git@github.com:foundry-rs/forge-std.git + url = https://github.com/foundry-rs/forge-std.git diff --git a/.mythx.yml b/.mythx.yml deleted file mode 100644 index ce2c2cb35..000000000 --- a/.mythx.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Run me by typing `mythx analyze` in the directory of the yml file! :) - -ci: true # make the workflow fail on high severity issues -confirm: true # automatic confirmation of multiple file submissions (equivalent to --yes) - -analyze: - mode: deep - async: true - create-group: true - group-name: "@lukso/lsp-smart-contracts" - solc: 0.8.15 - remappings: - - "@erc725/smart-contracts/=node_modules/@erc725/smart-contracts/" - - "@openzeppelin/=node_modules/@openzeppelin/" - - "solidity-bytes-utils/=node_modules/solidity-bytes-utils/" - targets: - # LSP1 - # ------------------ - - contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol - - contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol - - # Standard version - # ------------------ - - contracts/UniversalProfile.sol - - contracts/LSP0ERC725Account/LSP0ERC725Account.sol - - contracts/LSP6KeyManager/LSP6KeyManager.sol - # - Tokens & NFTs - - contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol - - contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol - - contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol - - contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol - - contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol - - contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol - - contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol - - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol - - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol - - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol - # - Vault & Social Recovery - - contracts/LSP9Vault/LSP9Vault.sol - - contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol - - # Proxy version - # ------------------ - - contracts/UniversalProfileInit.sol - - contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol - - contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol - - contracts/LSP6KeyManager/LSP6KeyManagerInit.sol - # - Tokens & NFTs - - contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol - - contracts/LSP7DigitalAsset/presets/LSP7MintableInit.sol - - contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol - - contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInit.sol - - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol - - contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol - # - Vault & Social Recovery - - contracts/LSP9Vault/LSP9VaultInit.sol - - contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.sol - - # Generic Modules & Factories - # ------------------ - - contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol - - contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol - - contracts/LSP17ContractExtension/LSP17Extendable.sol - - contracts/LSP17ContractExtension/LSP17Extension.sol - - contracts/LSP20CallVerification/LSP20CallVerification.sol diff --git a/.prettierignore b/.prettierignore index b6c3cab4e..cc34a39c8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,4 @@ -/contracts/LSP6KeyManager/LSP6Constants.sol +/packages/LSP6KeyManager/contracts/LSP6Constants.sol /artifacts /cache /types @@ -10,4 +10,6 @@ /userdocs /common /package -/module \ No newline at end of file +/module +packages/*/types/ +packages/*/artifacts/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index d00fc296f..7eaec9766 100644 --- a/.prettierrc +++ b/.prettierrc @@ -16,7 +16,7 @@ "options": { "tabWidth": 4, "printWidth": 80, - "compiler": "0.8.15" + "compiler": "0.8.17" } } ] diff --git a/.solcover.js b/.solcover.js deleted file mode 100644 index 357ee84cb..000000000 --- a/.solcover.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - skipFiles: ['Mocks', 'Legacy', 'Create2Factory'], -}; diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..1ea4962ab --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "CodeGPT.apiKey": "CodeGPT Plus Beta" +} diff --git a/README.md b/README.md index 9144893d9..aa4d42795 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,34 @@ For more information see [Documentation](https://docs.lukso.tech/standards/smart | :warning: | _This package is currently in early stages of development,
use for testing or experimentation purposes only._ | | :-------: | :----------------------------------------------------------------------------------------------------------------- | +## Packages + +This repo contains packages for the Solidity implementation of the LSP smart contracts. + +| Package | NPM | Description | +| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | +| [`@lukso/lsp0-contracts`](./packages/lsp0-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp0-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp0-contracts) | LSP0 ERC725Account | +| [`@lukso/lsp1-contracts`](./packages/lsp1-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp1-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp1-contracts) | LSP1 Universal Receiver | +| [`@lukso/lsp1delegate-contracts`](./packages/lsp1delegate-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp1delegate-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp1delegate-contracts) | LSP1 Universal Receiver Delegate | +| [`@lukso/lsp2-contracts`](./packages/lsp2-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp2-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp2-contracts) | LSP2 ERC725Y JSON Schema | +| [`@lukso/lsp3-contracts`](./packages/lsp3-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp3-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp3-contracts) | LSP3 Profile Metadata | +| [`@lukso/lsp4-contracts`](./packages/lsp4-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp4-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp4-contracts) | LSP4 Digital Asset Metadata | +| [`@lukso/lsp5-contracts`](./packages/lsp5-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp5-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp5-contracts) | LSP5 Received Assets | +| [`@lukso/lsp6-contracts`](./packages/lsp6-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp6-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp6-contracts) | LSP6 Key Manager | +| [`@lukso/lsp7-contracts`](./packages/lsp7-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp7-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp7-contracts) | LSP7 Digital Asset | +| [`@lukso/lsp8-contracts`](./packages/lsp8-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp8-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp8-contracts) | LSP8 Identifiable Digital Asset | +| [`@lukso/lsp9-contracts`](./packages/lsp9-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp9-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp9-contracts) | LSP9 Vault | +| [`@lukso/lsp10-contracts`](./packages/lsp10-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp10-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp10-contracts) | LSP10 Received Vaults | +| [`@lukso/lsp12-contracts`](./packages/lsp12-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp12-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp12-contracts) | LSP12 Issued Assets | +| [`@lukso/lsp14-contracts`](./packages/lsp14-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp14-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp14-contracts) | LSP14 Ownable 2 Step | +| [`@lukso/lsp16-contracts`](./packages/lsp16-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp16-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp16-contracts) | LSP16 Universal Factory | +| [`@lukso/lsp17-contracts`](./packages/lsp17-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp17-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp17-contracts) | LSP17 Extensions Package | +| [`@lukso/lsp17contractextension-contracts`](./packages/lsp17contractextension-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp17contractextension-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp17contractextension-contracts) | LSP17 Contract Extension Package | +| [`@lukso/lsp20-contracts`](./packages/lsp20-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp20-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp20-contracts) | LSP20 Call Verification | +| [`@lukso/lsp23-contracts`](./packages/lsp23-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp23-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp23-contracts) | LSP23 Linked Contracts Factory | +| [`@lukso/lsp25-contracts`](./packages/lsp25-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/lsp25-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp25-contracts) | LSP25 Execute Relay Call | +| [`@lukso/universalprofile-contracts`](./packages/universalprofile-contracts) | [![npm version](https://img.shields.io/npm/v/@lukso/universalprofile-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/universalprofile-contracts) | Universal Profile | + ## Installation ### npm diff --git a/RELEASE.md b/RELEASE.md index e455d5a12..cbef62462 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,15 +1,17 @@ # **Release Process** -Releases are created on the Github repository and published to [npm]() using the [Release Please](https://github.com/googleapis/release-please) via the [`release-please`](https://github.com/google-github-actions/release-please-action#automating-publication-to-npm) Github action. +> 📒 See [**release-please** documentation](See release-please documentation for more infos.) for more infos and configurations. -This package automates CHANGELOG generation, version bumps and npm releases by parsing the git history, looking for [Conventional Commit messages](https://www.conventionalcommits.org/). +Releases are created on the Github repository and published to [npm]() using [Release Please](https://github.com/googleapis/release-please) via the [`release-please`](https://github.com/google-github-actions/release-please-action#automating-publication-to-npm) Github action. -When changes and feature PRs are merged from develop to main, release-please will open and maintain a release PR with the updated CHANGELOG and new version number. When this PR is merged, a release will be created and the package published to NPM. +The workflow [`release.yml`](./workflow/release.yml) automates CHANGELOG generation, version bumps and npm releases by parsing the git history, looking for [Conventional Commit messages](https://www.conventionalcommits.org/). -1. Merge develop into main. -2. Release Please will create the release PR going to main. +When changes and feature PRs are merged from `develop` to `main`, release-please will open and maintain a release PR for a specific package with the updated CHANGELOG and new version number. When this PR is merged, a release will be created and the package published to NPM. + +1. Merge `develop` into `main`. +2. Release Please will create the release PR going to `main` for the affected package(s). 3. Merge the generated release PR. -4. Package will be published to NPM. +4. Package will be published to [NPM](https://npmjs.org). ## Conventional Commit prefixes? @@ -43,6 +45,46 @@ chore: release 2.0.0 Release-As: 2.0.0 ``` +The following [commit pattern](https://github.com/googleapis/release-please/blob/main/docs/customizing.md#pull-request-title) can also be specified to instruct release-please to trigger a specific release for a specific package. + +``` +chore: release${component} ${version} +``` + +Where: + +- `${component}`: the name of the LSP package listed under `packages/` to release. +- `${version}`: the version number to release for. + +_Example:_ + +A common release pull request title would be: + +``` +chore: release lsp-smart-contracts v0.15.0 +``` + +## Creating pre-release + +We use the suffix `-rc` to specify release versions that are not ready for production and may be unstable. This usually takes the following pattern as an example: `@lukso/lsp7-contracts-v0.15.0-rc.0`. Each pre-release can then in turn be incremented as `rc.1`, `rc.2`, etc... + +If you would like to publish a package as a pre-release version, you can enforce it by: + +1. creating a commit that includes the following pattern (for example): + +``` +chore: release lsp-smart-contracts v0.15.0-rc.0 +``` + +2. specifying the following fields for this package under the `.release-please-manifest.json`. + +```json + "prerelease-type": "rc", + "prerelease": true +``` + +Pre-releases will show up with a "Pre-Release" badge on the [list of Github Releases](https://github.com/lukso-network/lsp-smart-contracts/releases) of the repository. + ## How can I fix release notes? If you have merged a pull request and would like to amend the commit message diff --git a/config/eslint-config-custom/README.md b/config/eslint-config-custom/README.md new file mode 100755 index 000000000..3c7105373 --- /dev/null +++ b/config/eslint-config-custom/README.md @@ -0,0 +1 @@ +# `eslint-custom-config` diff --git a/config/eslint-config-custom/index.js b/config/eslint-config-custom/index.js new file mode 100755 index 000000000..c0b77b943 --- /dev/null +++ b/config/eslint-config-custom/index.js @@ -0,0 +1,14 @@ +module.exports = { + ignorePatterns: ['artifacts/', 'cache/', 'dist/', 'types/', 'contracts.ts'], + extends: ['turbo', 'prettier'], + plugins: ['@typescript-eslint', 'prettier'], + rules: { + 'prettier/prettier': 'error', + '@typescript-eslint/no-explicit-any': 'off', + }, + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020, + }, +}; diff --git a/config/eslint-config-custom/package.json b/config/eslint-config-custom/package.json new file mode 100755 index 000000000..8fa4803cd --- /dev/null +++ b/config/eslint-config-custom/package.json @@ -0,0 +1,13 @@ +{ + "name": "eslint-config-custom", + "version": "0.0.0", + "main": "index.cjs", + "private": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.2.1", + "@typescript-eslint/parser": "^6.2.1", + "eslint-config-prettier": "^8.8.0", + "eslint-config-turbo": "^1.9.3", + "eslint-plugin-prettier": "^4.2.1" + } +} diff --git a/tsconfig.json b/config/tsconfig/contracts.json old mode 100644 new mode 100755 similarity index 73% rename from tsconfig.json rename to config/tsconfig/contracts.json index 8a50ef546..a7aa16218 --- a/tsconfig.json +++ b/config/tsconfig/contracts.json @@ -1,4 +1,6 @@ { + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", "compilerOptions": { "target": "ES2019", "module": "commonjs", @@ -10,6 +12,6 @@ "skipLibCheck": true, "lib": ["ES2019", "es2019.array", "ES2021.String"] }, - "include": ["./tests", "./deploy", "hardhat"], + "include": ["./tests", "hardhat", "./deploy"], "files": ["./hardhat.config.ts"] } diff --git a/config/tsconfig/package.json b/config/tsconfig/package.json new file mode 100755 index 000000000..57b2ff987 --- /dev/null +++ b/config/tsconfig/package.json @@ -0,0 +1,13 @@ +{ + "name": "tsconfig", + "version": "0.0.0", + "private": true, + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "files": [ + "contracts.json", + "contracts.module.json" + ] +} diff --git a/constants.ts b/constants.ts deleted file mode 100644 index c2b1402b9..000000000 --- a/constants.ts +++ /dev/null @@ -1,449 +0,0 @@ -/** - * Set of constants values as defined in each LUKSO Standards Proposals (LSPs). - * @see https://github.com/lukso-network/LIPs/tree/main/LSPs - */ - -export * from './contracts'; - -// ERC165 -// --------- - -/** - * @dev ERC165 interface IDs for the LSP interface standards + some backward compatible ERC token standards. - * These `bytes4` values can be used to detect if a contract implements a specific interface - * with `supportsInterface(interfaceId)`. - */ -export const INTERFACE_IDS = { - ERC165: '0x01ffc9a7', - ERC1271: '0x1626ba7e', - ERC20: '0x36372b07', - ERC20Metadata: '0xa219a025', - ERC223: '0x87d43052', - ERC721: '0x80ac58cd', - ERC721Metadata: '0x5b5e139f', - ERC777: '0xe58e113c', - ERC1155: '0xd9b67a26', - ERC725X: '0x7545acac', - ERC725Y: '0x629aa694', - LSP0ERC725Account: '0x24871b3d', - LSP1UniversalReceiver: '0x6bb56a14', - LSP1UniversalReceiverDelegate: '0xa245bbda', - LSP6KeyManager: '0x23f34c62', - LSP7DigitalAsset: '0xc52d6008', - LSP8IdentifiableDigitalAsset: '0x3a271706', - LSP9Vault: '0x28af17e6', - LSP11BasicSocialRecovery: '0x049a28f1', - LSP14Ownable2Step: '0x94be5999', - LSP17Extendable: '0xa918fa6b', - LSP17Extension: '0xcee78b40', - LSP20CallVerification: '0x1a0eb6a5', - LSP20CallVerifier: '0x0d6ecac7', - LSP25ExecuteRelayCall: '0x5ac79908', -}; - -// ERC1271 -// ---------- - -/** - * @dev values returned by the `isValidSignature` function of the ERC1271 standard. - * Can be used to check if a signature is valid or not. - */ -export const ERC1271_VALUES = { - SUCCESS_VALUE: '0x1626ba7e', - FAIL_VALUE: '0xffffffff', -}; - -// LSP20 -// ---------- - -/** - * @dev values returned by the `lsp20VerifyCall` and `lsp20VerifyCallResult` functions of the LSP20 standard. - * Can be used to check if a calldata payload was check and verified. - */ -export const LSP20_SUCCESS_VALUES = { - VERIFY_CALL: { - // bytes3(keccak256("lsp20VerifyCall(address,address,address,uint256,bytes)")) + "0x00" - NO_POST_VERIFICATION: '0xde928f00', - // bytes3(keccak256("lsp20VerifyCall(address,address,address,uint256,bytes)")) + "0x01" - WITH_POST_VERIFICATION: '0xde928f01', - }, - // bytes4(keccak256("lsp20VerifyCallResult(bytes32,bytes)")) - VERIFY_CALL_RESULT: '0xd3fc45d3', -}; - -// ERC725X -// ---------- - -/** - * @dev list of ERC725X operation types. - * @see https://github.com/ERC725Alliance/ERC725/blob/develop/docs/ERC-725.md#execute - */ -export const OPERATION_TYPES = { - CALL: 0, - CREATE: 1, - CREATE2: 2, - STATICCALL: 3, - DELEGATECALL: 4, -}; - -// ERC725Y -// ---------- - -export type LSP2ArrayKey = { length: string; index: string }; -export type LSPSupportedStandard = { key: string; value: string }; - -// JSON Metadata - -export type LSP3ProfileMetadataJSON = { - LSP3Profile: LSP3ProfileMetadata; -}; - -export type LSP3ProfileMetadata = { - name: string; - description: string; - profileImage?: ImageMetadata[]; - backgroundImage?: ImageMetadata[]; - tags?: string[]; - links?: LinkMetadata[]; - avatar?: AssetMetadata[]; -}; - -export type LSP4DigitalAssetMetadataJSON = { - LSP4Metadata: LSP4DigitalAssetMetadata; -}; - -export type LSP4DigitalAssetMetadata = { - description: string; - links: LinkMetadata[]; - images: ImageMetadata[][]; - assets: AssetMetadata[]; - icon: ImageMetadata[]; - attributes?: AttributeMetadata[]; -}; - -export type AttributeMetadata = { - key: string; - value: string; - type: string | number | boolean; -}; - -export type Verification = { - method: string; - data: string; - source?: string; -}; - -export type ImageMetadata = { - width: number; - height: number; - verification?: Verification; - url: string; -}; - -export type LinkMetadata = { - title: string; - url: string; -}; - -export type AssetMetadata = AssetFile | DigitalAsset; - -export type AssetFile = { - url: string; - verification?: Verification; - fileType?: string; -}; - -export type DigitalAsset = { - address: string; - tokenId?: string; -}; - -/** - * @dev list of ERC725Y keys from the LSP standards. - * Can be used to detect if a contract implements a specific LSP Metadata standard - * and contain a set of pre-defined ERC725Y Data Keys. - */ -export const SupportedStandards = { - LSP3Profile: { - key: '0xeafec4d89fa9619884b600005ef83ad9559033e6e941db7d7c495acdce616347', - value: '0x5ef83ad9', - } as LSPSupportedStandard, - LSP4DigitalAsset: { - key: '0xeafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c', - value: '0xa4d96624', - } as LSPSupportedStandard, - LSP9Vault: { - key: '0xeafec4d89fa9619884b600007c0334a14085fefa8b51ae5a40895018882bdb90', - value: '0x7c0334a1', - } as LSPSupportedStandard, -}; - -/** - * @dev list of ERC725Y Metadata keys from the LSP standards. - * @see https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-2-ERC725YJSONSchema.md - */ -export const ERC725YDataKeys = { - LSP1: { - // bytes10(keccak256('LSP1UniversalReceiverDelegate')) + bytes2(0) - LSP1UniversalReceiverDelegatePrefix: '0x0cfc51aec37c55a4d0b10000', - - // keccak256('LSP1UniversalReceiverDelegate') - LSP1UniversalReceiverDelegate: - '0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47', - }, - LSP3: { - SupportedStandards_LSP3: SupportedStandards.LSP3Profile.key, - - // keccak256('LSP3Profile') - LSP3Profile: '0x5ef83ad9559033e6e941db7d7c495acdce616347d28e90c7ce47cbfcfcad3bc5', - }, - LSP4: { - SupportedStandards_LSP4: SupportedStandards.LSP4DigitalAsset.key, - - // keccak256('LSP4TokenName') - LSP4TokenName: '0xdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af1', - - // keccak256('LSP4TokenSymbol') - LSP4TokenSymbol: '0x2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db932756', - - // keccak256('LSP4TokenType) - LSP4TokenType: '0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3', - - // keccak256('LSP4Metadata') - LSP4Metadata: '0x9afb95cacc9f95858ec44aa8c3b685511002e30ae54415823f406128b85b238e', - - // LSP4CreatorsMap:
+ bytes2(0) - LSP4CreatorsMap: '0x6de85eaf5d982b4e5da00000', - - // keccak256('"LSP4Creators[]') - 'LSP4Creators[]': { - length: '0x114bd03b3a46d48759680d81ebb2b414fda7d030a7105a851867accf1c2352e7', - index: '0x114bd03b3a46d48759680d81ebb2b414', - } as LSP2ArrayKey, - }, - LSP5: { - // LSP5ReceivedAssetsMap:
+ bytes2(0) - LSP5ReceivedAssetsMap: '0x812c4334633eb816c80d0000', - - // keccak256('LSP5ReceivedAssets[]') - 'LSP5ReceivedAssets[]': { - length: '0x6460ee3c0aac563ccbf76d6e1d07bada78e3a9514e6382b736ed3f478ab7b90b', - index: '0x6460ee3c0aac563ccbf76d6e1d07bada', - } as LSP2ArrayKey, - }, - LSP6: { - // keccak256('AddressPermissions[]') - 'AddressPermissions[]': { - length: '0xdf30dba06db6a30e65354d9a64c609861f089545ca58c6b4dbe31a5f338cb0e3', - index: '0xdf30dba06db6a30e65354d9a64c60986', - } as LSP2ArrayKey, - - AddressPermissionsPrefix: '0x4b80742de2bf', - - // AddressPermissions:Permissions:
+ bytes2(0) - 'AddressPermissions:Permissions': '0x4b80742de2bf82acb3630000', - - // AddressPermissions:AllowedERC725YDataKeys:
+ bytes2(0) - 'AddressPermissions:AllowedERC725YDataKeys': '0x4b80742de2bf866c29110000', - - // AddressPermissions:AllowedCalls:
+ bytes2(0) - 'AddressPermissions:AllowedCalls': '0x4b80742de2bf393a64c70000', - }, - LSP8: { - LSP8TokenIdFormat: '0xf675e9361af1c1664c1868cfa3eb97672d6b1a513aa5b81dec34c9ee330e818d', - LSP8TokenMetadataBaseURI: '0x1a7628600c3bac7101f53697f48df381ddc36b9015e7d7c9c5633d1252aa2843', - LSP8ReferenceContract: '0x708e7b881795f2e6b6c2752108c177ec89248458de3bf69d0d43480b3e5034e6', - }, - LSP9: { - SupportedStandards_LSP9: SupportedStandards.LSP9Vault.key, - }, - LSP10: { - // keccak256('LSP10VaultsMap') + bytes2(0) - LSP10VaultsMap: '0x192448c3c0f88c7f238c0000', - - // keccak256('LSP10Vaults[]') - 'LSP10Vaults[]': { - length: '0x55482936e01da86729a45d2b87a6b1d3bc582bea0ec00e38bdb340e3af6f9f06', - index: '0x55482936e01da86729a45d2b87a6b1d3', - } as LSP2ArrayKey, - }, - LSP12: { - // LSP12IssuedAssetsMap:
+ bytes2(0) - LSP12IssuedAssetsMap: '0x74ac2555c10b9349e78f0000', - - // keccak256('LSP12IssuedAssets[]') - 'LSP12IssuedAssets[]': { - length: '0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd', - index: '0x7c8c3416d6cda87cd42c71ea1843df28', - } as LSP2ArrayKey, - }, - LSP17: { - // bytes10(keccak256('LSP17Extension')) + bytes2(0) - LSP17ExtensionPrefix: '0xcee78b4094da860110960000', - }, -}; - -// LSP6 -// ---------- - -/** - * @dev The types of calls for an AllowedCall - */ -export const CALLTYPE = { - VALUE: '0x00000001', - CALL: '0x00000002', - STATICCALL: '0x00000004', - DELEGATECALL: '0x00000008', -}; - -/** - * @dev `bytes32` hex value for all the LSP6 permissions excluding REENTRANCY, DELEGATECALL and SUPER_DELEGATECALL for security (these should be set manually) - */ -export const ALL_PERMISSIONS = '0x00000000000000000000000000000000000000000000000000000000007f3f7f'; - -export type LSP6PermissionName = keyof typeof PERMISSIONS; - -/** - * @dev List of `bytes32` permissions from LSP6 Key Manager Standard - */ -// prettier-ignore -export const PERMISSIONS = { - CHANGEOWNER: '0x0000000000000000000000000000000000000000000000000000000000000001', // .... .... .... .... .... 0001 - ADDCONTROLLER: '0x0000000000000000000000000000000000000000000000000000000000000002', // .... .... .... .... .... 0010 - EDITPERMISSIONS: '0x0000000000000000000000000000000000000000000000000000000000000004', // .... .... .... .... .... 0100 - ADDEXTENSIONS: '0x0000000000000000000000000000000000000000000000000000000000000008', // .... .... .... .... .... 1000 - CHANGEEXTENSIONS: '0x0000000000000000000000000000000000000000000000000000000000000010', // .... .... .... .... 0001 0000 - ADDUNIVERSALRECEIVERDELEGATE: '0x0000000000000000000000000000000000000000000000000000000000000020', // .... .... .... .... 0010 0000 - CHANGEUNIVERSALRECEIVERDELEGATE: '0x0000000000000000000000000000000000000000000000000000000000000040', // .... .... .... .... 0100 0000 - REENTRANCY: '0x0000000000000000000000000000000000000000000000000000000000000080', // .... .... .... .... 1000 0000 - SUPER_TRANSFERVALUE: '0x0000000000000000000000000000000000000000000000000000000000000100', // .... .... .... 0001 0000 0000 - TRANSFERVALUE: '0x0000000000000000000000000000000000000000000000000000000000000200', // .... .... .... 0010 0000 0000 - SUPER_CALL: '0x0000000000000000000000000000000000000000000000000000000000000400', // .... .... .... 0100 0000 0000 - CALL: '0x0000000000000000000000000000000000000000000000000000000000000800', // .... .... .... 1000 0000 0000 - SUPER_STATICCALL: '0x0000000000000000000000000000000000000000000000000000000000001000', // .... .... 0001 0000 0000 0000 - STATICCALL: '0x0000000000000000000000000000000000000000000000000000000000002000', // .... .... 0010 0000 0000 0000 - SUPER_DELEGATECALL: '0x0000000000000000000000000000000000000000000000000000000000004000', // .... .... 0100 0000 0000 0000 - DELEGATECALL: '0x0000000000000000000000000000000000000000000000000000000000008000', // .... .... 1000 0000 0000 0000 - DEPLOY: '0x0000000000000000000000000000000000000000000000000000000000010000', // .... 0001 0000 0000 0000 0000 - SUPER_SETDATA: '0x0000000000000000000000000000000000000000000000000000000000020000', // .... 0010 0000 0000 0000 0000 - SETDATA: '0x0000000000000000000000000000000000000000000000000000000000040000', // .... 0100 0000 0000 0000 0000 - ENCRYPT: '0x0000000000000000000000000000000000000000000000000000000000080000', // .... 1000 0000 0000 0000 0000 - DECRYPT: '0x0000000000000000000000000000000000000000000000000000000000100000', // 0001 0000 0000 0000 0000 0000 - SIGN: '0x0000000000000000000000000000000000000000000000000000000000200000', // 0010 0000 0000 0000 0000 0000 - EXECUTE_RELAY_CALL: '0x0000000000000000000000000000000000000000000000000000000000400000', // 0100 0000 0000 0000 0000 0000 -} - -/** - * @dev list of standard type IDs ("hooks") defined in the LSPs that can be used to notify - * a LSP1 compliant contract about certain type of transactions or information - * (e.g: token transfer, vault transfer, ownership transfer, etc...) - */ -export const LSP1_TYPE_IDS = { - // keccak256('LSP0ValueReceived') - LSP0ValueReceived: '0x9c4705229491d365fb5434052e12a386d6771d976bea61070a8c694e8affea3d', - - // keccak256('LSP0OwnershipTransferStarted') - LSP0OwnershipTransferStarted: - '0xe17117c9d2665d1dbeb479ed8058bbebde3c50ac50e2e65619f60006caac6926', - - // keccak256('LSP0OwnershipTransferred_SenderNotification') - LSP0OwnershipTransferred_SenderNotification: - '0xa4e59c931d14f7c8a7a35027f92ee40b5f2886b9fdcdb78f30bc5ecce5a2f814', - - // keccak256('LSP0OwnershipTransferred_RecipientNotification') - LSP0OwnershipTransferred_RecipientNotification: - '0xceca317f109c43507871523e82dc2a3cc64dfa18f12da0b6db14f6e23f995538', - - // keccak256('LSP7Tokens_SenderNotification') - LSP7Tokens_SenderNotification: - '0x429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea', - - // keccak256('LSP7Tokens_RecipientNotification') - LSP7Tokens_RecipientNotification: - '0x20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c', - - // keccak256('LSP7Tokens_OperatorNotification') - LSP7Tokens_OperatorNotification: - '0x386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc', - - // keccak256('LSP8Tokens_SenderNotification') - LSP8Tokens_SenderNotification: - '0xb23eae7e6d1564b295b4c3e3be402d9a2f0776c57bdf365903496f6fa481ab00', - - // keccak256('LSP8Tokens_RecipientNotification') - LSP8Tokens_RecipientNotification: - '0x0b084a55ebf70fd3c06fd755269dac2212c4d3f0f4d09079780bfa50c1b2984d', - - // keccak256('LSP8Tokens_OperatorNotification') - LSP8Tokens_OperatorNotification: - '0x8a1c15a8799f71b547e08e2bcb2e85257e81b0a07eee2ce6712549eef1f00970', - - // keccak256('LSP9ValueReceived') - LSP9ValueReceived: '0x468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc', - - // keccak256('LSP9OwnershipTransferStarted') - LSP9OwnershipTransferStarted: - '0xaefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f', - - // keccak256('LSP9OwnershipTransferred_SenderNotification') - LSP9OwnershipTransferred_SenderNotification: - '0x0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471', - - // keccak256('LSP9OwnershipTransferred_RecipientNotification') - LSP9OwnershipTransferred_RecipientNotification: - '0x79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c', - - // keccak256('LSP14OwnershipTransferStarted') - LSP14OwnershipTransferStarted: - '0xee9a7c0924f740a2ca33d59b7f0c2929821ea9837ce043ce91c1823e9c4e52c0', - - // keccak256('LSP14OwnershipTransferred_SenderNotification') - LSP14OwnershipTransferred_SenderNotification: - '0xa124442e1cc7b52d8e2ede2787d43527dc1f3ae0de87f50dd03e27a71834f74c', - - // keccak256('LSP14OwnershipTransferred_RecipientNotification') - LSP14OwnershipTransferred_RecipientNotification: - '0xe32c7debcb817925ba4883fdbfc52797187f28f73f860641dab1a68d9b32902c', -}; - -// LSP4 -// ---------- - -/** - * @dev List of LSP4 Token types to describe the type of token a digital asset contract represents. - * @see for details see: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#lsp4tokentype - */ -export const LSP4_TOKEN_TYPES = { - TOKEN: 0, - NFT: 1, - COLLECTION: 2, -}; - -// LSP8 -// ---------- - -/** - * @dev List of LSP8 Token ID Formats that can be used to create different types of NFTs and represent each NFT identifiers (= tokenIds) differently. - * @see For details see: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformat - */ -export const LSP8_TOKEN_ID_FORMAT = { - NUMBER: 0, - STRING: 1, - ADDRESS: 2, - UNIQUE_ID: 3, - HASH: 4, - MIXED_DEFAULT_NUMBER: 100, - MIXED_DEFAULT_STRING: 101, - MIXED_DEFAULT_ADDRESS: 102, - MIXED_DEFAULT_UNIQUE_ID: 103, - MIXED_DEFAULT_HASH: 104, -}; - -// LSP25 -// ---------- - -/** - * @dev LSP25 version number for signing `executeRelayCall(...)` transaction using EIP191 - * @see for details see: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-25-ExecuteRelayCall.md#executerelaycall - */ -export const LSP25_VERSION = 25; diff --git a/contracts/Factories/Create2Factory.sol b/contracts/Factories/Create2Factory.sol deleted file mode 100644 index 05cc2052d..000000000 --- a/contracts/Factories/Create2Factory.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.4; - -// DO NOT TOUCH -// -------------------- -// bytecode -// solidity compiler 0.6.1, no optimization -// 0x608060405234801561001057600080fd5b50610520806100206000396000f3fe6080604052600436106100345760003560e01c8063481286e61461003957806378065306146100be578063cdcb760a14610163575b600080fd5b34801561004557600080fd5b5061007c6004803603604081101561005c57600080fd5b810190808035906020019092919080359060200190929190505050610268565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100ca57600080fd5b50610121600480360360608110156100e157600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061027d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102266004803603604081101561017957600080fd5b8101908080359060200190929190803590602001906401000000008111156101a057600080fd5b8201836020820111156101b257600080fd5b803590602001918460018302840111640100000000831117156101d457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610346565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600061027583833061027d565b905092915050565b60008060ff60f81b83868660405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012090508060001c9150509392505050565b60008060003490506000845114156103c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437265617465323a2062797465636f6465206c656e677468206973207a65726f81525060200191505060405180910390fd5b8484516020860183f59150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610474576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f437265617465323a204661696c6564206f6e206465706c6f790000000000000081525060200191505060405180910390fd5b7fc16bb3dbd36917c7aa3e76b988c2cd35e74bb230a02fef61e7376d8b4bfaea778286604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a181925050509291505056fea26469706673582212208e45d684157bfc10076a3d284f8c3899cd5ecf31abade0a086223e0886a8a68164736f6c63430006010033 -// -// fixed deployment, compiled with 0.6.12 -// 0xC2f81D5a8c51c1E877B2720E0bEB59642c807315 -// deployer address: 0x0a481e47Fcf329d0CafDd74A46f54f21eeDF5d68 -// cost 0.0801 -// RAW Tx: -// 0xf9059380852e90edd0008306f2cc8080b90540608060405234801561001057600080fd5b50610520806100206000396000f3fe6080604052600436106100345760003560e01c8063481286e61461003957806378065306146100be578063cdcb760a14610163575b600080fd5b34801561004557600080fd5b5061007c6004803603604081101561005c57600080fd5b810190808035906020019092919080359060200190929190505050610268565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100ca57600080fd5b50610121600480360360608110156100e157600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061027d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102266004803603604081101561017957600080fd5b8101908080359060200190929190803590602001906401000000008111156101a057600080fd5b8201836020820111156101b257600080fd5b803590602001918460018302840111640100000000831117156101d457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610346565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600061027583833061027d565b905092915050565b60008060ff60f81b83868660405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012090508060001c9150509392505050565b60008060003490506000845114156103c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437265617465323a2062797465636f6465206c656e677468206973207a65726f81525060200191505060405180910390fd5b8484516020860183f59150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610474576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f437265617465323a204661696c6564206f6e206465706c6f790000000000000081525060200191505060405180910390fd5b7fc16bb3dbd36917c7aa3e76b988c2cd35e74bb230a02fef61e7376d8b4bfaea778286604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a181925050509291505056fea26469706673582212208e45d684157bfc10076a3d284f8c3899cd5ecf31abade0a086223e0886a8a68164736f6c634300060100331ba01234123412341234123412341234123412341234123412341234123412341234a01234123412341234123412341234123412341234123412341234123412341234 - -/** - * @title contract to deploy contracts with precomputed addresses, using create2 opcode - * based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Create2.sol - * DO NOT TOUCH - */ - -// NOTE -// fix proxy deployement -// change deploy to do: create2, then call init -// the salt needs to be the inital owner -// pick you identicon by generating different initial owner keys - -contract Create2Factory { - event ContractCreated(address addr, bytes32 salt); - - /** - * @dev Deploys a contract using `CREATE2`. The address where the contract - * will be deployed can be known in advance via {computeAddress}. - * - * The bytecode for a contract can be obtained from Solidity with - * `type(contractName).creationCode`. - * - * Requirements: - * - * - `bytecode` must not be empty. - * - `salt` must have not been used for `bytecode` already. - */ - function deploy( - bytes32 salt, - bytes memory bytecode - ) public payable returns (address) { - address addr; - uint256 amount = msg.value; - - require(bytecode.length != 0, "Create2: bytecode length is zero"); - // solhint-disable-next-line no-inline-assembly - assembly { - addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) - } - require(addr != address(0), "Create2: Failed on deploy"); - - emit ContractCreated(addr, salt); - - return addr; - } - - /** - * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the - * `bytecodeHash` or `salt` will result in a new destination address. - */ - function computeAddress( - bytes32 salt, - bytes32 bytecodeHash - ) public view returns (address) { - return computeAddress(salt, bytecodeHash, address(this)); - } - - /** - * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at - * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. - */ - function computeAddress( - bytes32 salt, - bytes32 bytecodeHash, - address deployer - ) public pure returns (address) { - bytes32 _data = keccak256( - abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash) - ); - return address(uint160(uint256(_data))); - } -} diff --git a/contracts/LSP6KeyManager/LSP6Constants.sol b/contracts/LSP6KeyManager/LSP6Constants.sol deleted file mode 100644 index 79d3fd7e1..000000000 --- a/contracts/LSP6KeyManager/LSP6Constants.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.4; - -// --- ERC165 interface ids -bytes4 constant _INTERFACEID_LSP6 = 0x23f34c62; - -// --- ERC725Y Data Keys - -// PERMISSIONS KEYS - -// keccak256('AddressPermissions[]') -bytes32 constant _LSP6KEY_ADDRESSPERMISSIONS_ARRAY = 0xdf30dba06db6a30e65354d9a64c609861f089545ca58c6b4dbe31a5f338cb0e3; - -// AddressPermissions[index] -bytes16 constant _LSP6KEY_ADDRESSPERMISSIONS_ARRAY_PREFIX = 0xdf30dba06db6a30e65354d9a64c60986; - -// AddressPermissions:... -bytes6 constant _LSP6KEY_ADDRESSPERMISSIONS_PREFIX = 0x4b80742de2bf; - -// bytes6(keccak256('AddressPermissions')) + bytes4(keccak256('Permissions')) -bytes10 constant _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX = 0x4b80742de2bf82acb363; // AddressPermissions:Permissions:
--> bytes32 - -// bytes6(keccak256('AddressPermissions')) + bytes4(keccak256('AllowedERC725YDataKeys')) -bytes10 constant _LSP6KEY_ADDRESSPERMISSIONS_AllowedERC725YDataKeys_PREFIX = 0x4b80742de2bf866c2911; // AddressPermissions:AllowedERC725YDataKeys:
--> bytes[CompactBytesArray] - -// bytes6(keccak256('AddressPermissions')) + bytes4(keccak256('AllowedCalls')) -bytes10 constant _LSP6KEY_ADDRESSPERMISSIONS_ALLOWEDCALLS_PREFIX = 0x4b80742de2bf393a64c7; // AddressPermissions:AllowedCalls:
- -// DEFAULT PERMISSIONS VALUES -// NB: the SUPER PERMISSIONS allow to not check for: -// - AddressPermissions:AllowedERC725YDataKeys:... -// - AddressPermissions:AllowedCalls -bytes32 constant _PERMISSION_CHANGEOWNER = 0x0000000000000000000000000000000000000000000000000000000000000001; -bytes32 constant _PERMISSION_ADDCONTROLLER = 0x0000000000000000000000000000000000000000000000000000000000000002; -bytes32 constant _PERMISSION_EDITPERMISSIONS = 0x0000000000000000000000000000000000000000000000000000000000000004; -bytes32 constant _PERMISSION_ADDEXTENSIONS = 0x0000000000000000000000000000000000000000000000000000000000000008; -bytes32 constant _PERMISSION_CHANGEEXTENSIONS = 0x0000000000000000000000000000000000000000000000000000000000000010; -bytes32 constant _PERMISSION_ADDUNIVERSALRECEIVERDELEGATE = 0x0000000000000000000000000000000000000000000000000000000000000020; -bytes32 constant _PERMISSION_CHANGEUNIVERSALRECEIVERDELEGATE = 0x0000000000000000000000000000000000000000000000000000000000000040; -bytes32 constant _PERMISSION_REENTRANCY = 0x0000000000000000000000000000000000000000000000000000000000000080; -bytes32 constant _PERMISSION_SUPER_TRANSFERVALUE = 0x0000000000000000000000000000000000000000000000000000000000000100; -bytes32 constant _PERMISSION_TRANSFERVALUE = 0x0000000000000000000000000000000000000000000000000000000000000200; -bytes32 constant _PERMISSION_SUPER_CALL = 0x0000000000000000000000000000000000000000000000000000000000000400; -bytes32 constant _PERMISSION_CALL = 0x0000000000000000000000000000000000000000000000000000000000000800; -bytes32 constant _PERMISSION_SUPER_STATICCALL = 0x0000000000000000000000000000000000000000000000000000000000001000; -bytes32 constant _PERMISSION_STATICCALL = 0x0000000000000000000000000000000000000000000000000000000000002000; -bytes32 constant _PERMISSION_SUPER_DELEGATECALL = 0x0000000000000000000000000000000000000000000000000000000000004000; -bytes32 constant _PERMISSION_DELEGATECALL = 0x0000000000000000000000000000000000000000000000000000000000008000; -bytes32 constant _PERMISSION_DEPLOY = 0x0000000000000000000000000000000000000000000000000000000000010000; -bytes32 constant _PERMISSION_SUPER_SETDATA = 0x0000000000000000000000000000000000000000000000000000000000020000; -bytes32 constant _PERMISSION_SETDATA = 0x0000000000000000000000000000000000000000000000000000000000040000; -bytes32 constant _PERMISSION_ENCRYPT = 0x0000000000000000000000000000000000000000000000000000000000080000; -bytes32 constant _PERMISSION_DECRYPT = 0x0000000000000000000000000000000000000000000000000000000000100000; -bytes32 constant _PERMISSION_SIGN = 0x0000000000000000000000000000000000000000000000000000000000200000; -bytes32 constant _PERMISSION_EXECUTE_RELAY_CALL = 0x0000000000000000000000000000000000000000000000000000000000400000; - -// All Permissions currently exclude REENTRANCY, DELEGATECALL and SUPER_DELEGATECALL for security -bytes32 constant ALL_REGULAR_PERMISSIONS = 0x00000000000000000000000000000000000000000000000000000000007f3f7f; - -// AllowedCalls types -bytes4 constant _ALLOWEDCALLS_TRANSFERVALUE = 0x00000001; // 0000 0001 -bytes4 constant _ALLOWEDCALLS_CALL = 0x00000002; // 0000 0010 -bytes4 constant _ALLOWEDCALLS_STATICCALL = 0x00000004; // 0000 0100 -bytes4 constant _ALLOWEDCALLS_DELEGATECALL = 0x00000008; // 0000 1000 diff --git a/contracts/Legacy/Registries/AddressRegistry.sol b/contracts/Legacy/Registries/AddressRegistry.sol deleted file mode 100644 index e2d109c1e..000000000 --- a/contracts/Legacy/Registries/AddressRegistry.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.4; - -// libraries -import { - EnumerableSet -} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; - -// modules -import { - ERC165Storage -} from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; - -contract AddressRegistry is ERC165Storage { - using EnumerableSet for EnumerableSet.AddressSet; - - EnumerableSet.AddressSet internal _addressStore; - - function addAddress(address _address) public virtual returns (bool) { - return _addressStore.add(_address); - } - - function removeAddress(address _address) public virtual returns (bool) { - return _addressStore.remove(_address); - } - - function getAddress(uint256 _index) public view returns (address) { - return _addressStore.at(_index); - } - - function getIndex(address _address) public view returns (uint256) { - require( - _addressStore.contains(_address), - "EnumerableSet: Index not found" - ); - return - _addressStore._inner._indexes[bytes32(uint256(uint160(_address)))] - - 1; - } - - function getAllRawValues() public view returns (bytes32[] memory) { - return _addressStore._inner._values; - } - - function containsAddress(address _address) public view returns (bool) { - return _addressStore.contains(_address); - } - - function length() public view returns (uint256) { - return _addressStore.length(); - } -} diff --git a/contracts/Legacy/Registries/AddressRegistryRequiresERC725.sol b/contracts/Legacy/Registries/AddressRegistryRequiresERC725.sol deleted file mode 100644 index 5dff87e56..000000000 --- a/contracts/Legacy/Registries/AddressRegistryRequiresERC725.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.4; - -// libraries -import { - EnumerableSet -} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; - -// modules -import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; -import {AddressRegistry} from "./AddressRegistry.sol"; - -// constants -import { - _INTERFACEID_ERC725Y -} from "@erc725/smart-contracts/contracts/constants.sol"; - -contract AddressRegistryRequiresERC725 is AddressRegistry { - using EnumerableSet for EnumerableSet.AddressSet; - - function addAddress(address _address) public override returns (bool) { - require( - ERC165(_address).supportsInterface(_INTERFACEID_ERC725Y), - "Only ERC725Y addresses can be added" - ); - return _addressStore.add(_address); - } - - function removeAddress(address _address) public override returns (bool) { - require( - ERC165(msg.sender).supportsInterface(_INTERFACEID_ERC725Y), - "Only ERC725Y can call this function" - ); - require(msg.sender == _address, "Only an address can remove itself."); - return _addressStore.remove(_address); - } -} diff --git a/contracts/Legacy/UniversalReceiverAddressStore.sol b/contracts/Legacy/UniversalReceiverAddressStore.sol deleted file mode 100644 index cdf186902..000000000 --- a/contracts/Legacy/UniversalReceiverAddressStore.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.4; - -// libraries -import { - EnumerableSet -} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; - -// modules -import { - ERC165Storage -} from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; -import {AddressRegistry} from "./Registries/AddressRegistry.sol"; - -contract UniversalReceiverAddressStore is ERC165Storage, AddressRegistry { - using EnumerableSet for EnumerableSet.AddressSet; - - bytes4 internal constant _INTERFACE_ID_LSP1DELEGATE = 0xa245bbda; - - bytes32 internal constant _TOKENS_RECIPIENT_INTERFACE_HASH = - 0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b; // keccak256("ERC777TokensRecipient") - - address public account; - - constructor(address _account) { - account = _account; - _registerInterface(_INTERFACE_ID_LSP1DELEGATE); - } - - function addAddress( - address _address - ) public override onlyAccount returns (bool) { - return _addressStore.add(_address); - } - - function removeAddress( - address _address - ) public override onlyAccount returns (bool) { - return _addressStore.remove(_address); - } - - function universalReceiverDelegate( - address sender, - uint256 /* value */, - bytes32 typeId, - bytes memory - ) external onlyAccount returns (bytes memory) { - // require(typeId == _TOKENS_RECIPIENT_INTERFACE_HASH, 'UniversalReceiverDelegate: Type not supported'); - - // store tokens only if received, DO NOT revert on _TOKENS_SENDER_INTERFACE_HASH - if (typeId == _TOKENS_RECIPIENT_INTERFACE_HASH) addAddress(sender); - - return abi.encodePacked(typeId); - } - - /* Modifers */ - modifier onlyAccount() { - require( - msg.sender == account, - "Only the connected account call this function" - ); - _; - } -} diff --git a/contracts/Mocks/NFTStorage.sol b/contracts/Mocks/NFTStorage.sol deleted file mode 100644 index c37aabfb1..000000000 --- a/contracts/Mocks/NFTStorage.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.4; - -// libraries -import { - MerkleProof -} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; - -contract NFTStorageMerkle { - function verifyMerkleProof( - bytes32[] memory _proof, - bytes32 _root, - bytes32 _leaf - ) public pure returns (bool) { - return MerkleProof.verify(_proof, _root, _leaf); - } -} diff --git a/deploy/001_deploy_universal_profile.ts b/deploy/001_deploy_universal_profile.ts index 3c35d1c2b..7e37e668a 100644 --- a/deploy/001_deploy_universal_profile.ts +++ b/deploy/001_deploy_universal_profile.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; const deployUniversalProfile: DeployFunction = async ({ deployments, @@ -9,12 +8,9 @@ const deployUniversalProfile: DeployFunction = async ({ const { deploy } = deployments; const { owner } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('UniversalProfile', { from: owner, args: [owner], - gasPrice, log: true, }); }; diff --git a/deploy/002_deploy_key_manager.ts b/deploy/002_deploy_key_manager.ts index 0f357baab..60b9be419 100644 --- a/deploy/002_deploy_key_manager.ts +++ b/deploy/002_deploy_key_manager.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; const deployKeyManager: DeployFunction = async ({ deployments, @@ -11,12 +10,9 @@ const deployKeyManager: DeployFunction = async ({ const UniversalProfile = await deployments.get('UniversalProfile'); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP6KeyManager', { from: owner, args: [UniversalProfile.address], - gasPrice, log: true, }); }; diff --git a/deploy/003_deploy_universal_receiver_delegate.ts b/deploy/003_deploy_universal_receiver_delegate.ts index 2b751b7af..d4b9472cf 100644 --- a/deploy/003_deploy_universal_receiver_delegate.ts +++ b/deploy/003_deploy_universal_receiver_delegate.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; import { SALT } from './salt'; const deployUniversalReceiverDelegateUPDeterministic: DeployFunction = async ({ @@ -10,11 +9,8 @@ const deployUniversalReceiverDelegateUPDeterministic: DeployFunction = async ({ const { deploy } = deployments; const { owner: deployer } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP1UniversalReceiverDelegateUP', { from: deployer, - gasPrice, log: true, deterministicDeployment: SALT, }); diff --git a/deploy/005_deploy_universal_receiver_delegate_vault.ts b/deploy/005_deploy_universal_receiver_delegate_vault.ts index 795933b4b..1830d040d 100644 --- a/deploy/005_deploy_universal_receiver_delegate_vault.ts +++ b/deploy/005_deploy_universal_receiver_delegate_vault.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; import { SALT } from './salt'; const deployUniversalReceiverDelegateVaultDeterministic: DeployFunction = async ({ @@ -10,11 +9,8 @@ const deployUniversalReceiverDelegateVaultDeterministic: DeployFunction = async const { deploy } = deployments; const { owner: deployer } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP1UniversalReceiverDelegateVault', { from: deployer, - gasPrice, log: true, deterministicDeployment: SALT, }); diff --git a/deploy/006_deploy_base_universal_profile.ts b/deploy/006_deploy_base_universal_profile.ts index 1064f4c67..d48e5a29a 100644 --- a/deploy/006_deploy_base_universal_profile.ts +++ b/deploy/006_deploy_base_universal_profile.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; import { SALT } from './salt'; const deployBaseUniversalProfileDeterministic: DeployFunction = async ({ @@ -10,12 +9,9 @@ const deployBaseUniversalProfileDeterministic: DeployFunction = async ({ const { deploy } = deployments; const { owner: deployer } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('UniversalProfileInit', { from: deployer, log: true, - gasPrice, deterministicDeployment: SALT, }); }; diff --git a/deploy/007_deploy_base_key_manager.ts b/deploy/007_deploy_base_key_manager.ts index 2b2ed835e..f314be008 100644 --- a/deploy/007_deploy_base_key_manager.ts +++ b/deploy/007_deploy_base_key_manager.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; import { SALT } from './salt'; const deployBaseKeyManagerDeterministic: DeployFunction = async ({ @@ -10,13 +9,10 @@ const deployBaseKeyManagerDeterministic: DeployFunction = async ({ const { deploy } = deployments; const { owner: deployer } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP6KeyManagerInit', { from: deployer, log: true, gasLimit: 5_000_000, - gasPrice, deterministicDeployment: SALT, }); }; diff --git a/deploy/008_deploy_lsp7_mintable.ts b/deploy/008_deploy_lsp7_mintable.ts index 6faefd686..a06490aa9 100644 --- a/deploy/008_deploy_lsp7_mintable.ts +++ b/deploy/008_deploy_lsp7_mintable.ts @@ -1,7 +1,6 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; -import { LSP4_TOKEN_TYPES } from '../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts/constants'; const deployLSP7Mintable: DeployFunction = async ({ deployments, @@ -10,12 +9,9 @@ const deployLSP7Mintable: DeployFunction = async ({ const { deploy } = deployments; const { owner } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP7Mintable', { from: owner, args: ['LSP7 Mintable', 'LSP7M', owner, LSP4_TOKEN_TYPES.TOKEN, false], - gasPrice, log: true, }); }; diff --git a/deploy/009_deploy_lsp8_mintable.ts b/deploy/009_deploy_lsp8_mintable.ts index 7453ae7ac..aca565cbe 100644 --- a/deploy/009_deploy_lsp8_mintable.ts +++ b/deploy/009_deploy_lsp8_mintable.ts @@ -1,7 +1,7 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts/constants'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts/constants'; const deployLSP8MintableDeterministic: DeployFunction = async ({ deployments, @@ -10,12 +10,9 @@ const deployLSP8MintableDeterministic: DeployFunction = async ({ const { deploy } = deployments; const { owner: deployer } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP8Mintable', { from: deployer, args: ['LSP8 Mintable', 'LSP8M', deployer, LSP4_TOKEN_TYPES.NFT, LSP8_TOKEN_ID_FORMAT.NUMBER], - gasPrice, log: true, }); }; diff --git a/deploy/010_deploy_base_lsp7_mintable.ts b/deploy/010_deploy_base_lsp7_mintable.ts index e6e5a708a..ef7365b31 100644 --- a/deploy/010_deploy_base_lsp7_mintable.ts +++ b/deploy/010_deploy_base_lsp7_mintable.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; import { SALT } from './salt'; const deployBaseLSP7MintableDeterministic: DeployFunction = async ({ @@ -10,11 +9,8 @@ const deployBaseLSP7MintableDeterministic: DeployFunction = async ({ const { deploy } = deployments; const { owner: deployer } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP7MintableInit', { from: deployer, - gasPrice, log: true, deterministicDeployment: SALT, }); diff --git a/deploy/011_deploy_base_lsp8_mintable.ts b/deploy/011_deploy_base_lsp8_mintable.ts index 6b2f8915e..d50851af0 100644 --- a/deploy/011_deploy_base_lsp8_mintable.ts +++ b/deploy/011_deploy_base_lsp8_mintable.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; import { SALT } from './salt'; const deployBaseLSP8Mintable: DeployFunction = async ({ @@ -10,11 +9,8 @@ const deployBaseLSP8Mintable: DeployFunction = async ({ const { deploy } = deployments; const { owner } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP8MintableInit', { from: owner, - gasPrice, log: true, deterministicDeployment: SALT, }); diff --git a/deploy/012_deploy_vault.ts b/deploy/012_deploy_vault.ts index 55ab6e4d0..6dfecf79f 100644 --- a/deploy/012_deploy_vault.ts +++ b/deploy/012_deploy_vault.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; const deployVault: DeployFunction = async ({ deployments, @@ -9,12 +8,9 @@ const deployVault: DeployFunction = async ({ const { deploy } = deployments; const { owner } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP9Vault', { from: owner, args: [owner], - gasPrice, log: true, }); }; diff --git a/deploy/013_deploy_base_vault.ts b/deploy/013_deploy_base_vault.ts index 9cc49e1b2..7090bd43a 100644 --- a/deploy/013_deploy_base_vault.ts +++ b/deploy/013_deploy_base_vault.ts @@ -1,6 +1,5 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; -import { ethers } from 'hardhat'; import { SALT } from './salt'; const deployBaseVaultDeterministic: DeployFunction = async ({ @@ -10,12 +9,9 @@ const deployBaseVaultDeterministic: DeployFunction = async ({ const { deploy } = deployments; const { owner: deployer } = await getNamedAccounts(); - const gasPrice = await ethers.provider.getGasPrice(); - await deploy('LSP9VaultInit', { from: deployer, log: true, - gasPrice, deterministicDeployment: SALT, }); }; diff --git a/docs/_interface_ids_table.mdx b/docs/_interface_ids_table.mdx deleted file mode 100644 index 036a13f80..000000000 --- a/docs/_interface_ids_table.mdx +++ /dev/null @@ -1,20 +0,0 @@ -| Contract | Interface ID | Description | -| :-------------------------------- | :----------: | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **ERC165** | `0x01ffc9a7` | Standard Interface Detection. | -| **ERC1271** | `0x1626ba7e` | Standard Signature Validation Method for Contracts. | -| **ERC725X** | `0x7545acac` | General executor. | -| **ERC725Y** | `0x629aa694` | General Data key-value store. | -| **LSP0ERC725Account** | `0x24871b3d` | Interface of the [LSP-0-ERC725Account] standard, an account based smart contract that represents an identity on-chain. | -| **LSP1UniversalReceiver** | `0x6bb56a14` | Interface of the LSP1 - Universal Receiver standard, an entry function for a contract to receive arbitrary information. | -| **LSP1UniversalReceiverDelegate** | `0xa245bbda` | Interface of the LSP1 - Universal Receiver Delegate standard. | -| **LSP6KeyManager** | `0x23f34c62` | Interface of the LSP6 - Key Manager standard, a contract acting as a controller of an ERC725 Account using predfined permissions. | -| **LSP7DigitalAsset** | `0xc52d6008` | Interface of the LSP7 - Digital Asset standard, a fungible digital asset. | -| **LSP8IdentifiableDigitalAsset** | `0x3a271706` | Interface of the LSP8 - Identifiable Digital Asset standard, a non-fungible digital asset. | -| **LSP9Vault** | `0x28af17e6` | Interface of LSP9 - Vault standard, a blockchain vault that can hold assets and interact with other smart contracts. | -| **LSP11BasicSocialRecovery** | `0x049a28f1` | Interface of the LSP11 - Basic Social Recovery standard, a contract to recover access control into an account. | -| **LSP14Ownable2Step** | `0x94be5999` | Interface of the LSP14 - Ownable 2-step standard, an extension of the [EIP173] (Ownable) standard with 2-step process to transfer or renounce ownership. | -| **LSP17Extendable** | `0xa918fa6b` | Module to add more functionalities to a contract using extensions. | -| **LSP17Extension** | `0xcee78b40` | Module to create a contract that can act as an extension. | -| **LSP20CallVerification** | `0x1a0eb6a5` | Implementation of a contract calling the verification functions according to LSP20 - Call Verification standard. | -| **LSP20CallVerifier** | `0x0d6ecac7` | Interface for the LSP20 Call Verification standard, a set of functions intended to perform verifications on behalf of another contract. | -| **LSP25ExecuteRelayCall** | `0x5ac79908` | | diff --git a/docs/contracts/ERC725/ERC725.md b/docs/contracts/@erc725/smart-contracts/contracts/ERC725.md similarity index 99% rename from docs/contracts/ERC725/ERC725.md rename to docs/contracts/@erc725/smart-contracts/contracts/ERC725.md index 6605d5b17..442380f1f 100644 --- a/docs/contracts/ERC725/ERC725.md +++ b/docs/contracts/@erc725/smart-contracts/contracts/ERC725.md @@ -723,7 +723,12 @@ mapping(bytes32 => bytes) _store ::: ```solidity -event ContractCreated(uint256 indexed operationType, address indexed contractAddress, uint256 value, bytes32 indexed salt); +event ContractCreated( + uint256 indexed operationType, + address indexed contractAddress, + uint256 value, + bytes32 indexed salt +); ``` _Deployed new contract at address `contractAddress` and funded with `value` wei (deployed using opcode: `operationType`)._ @@ -781,7 +786,12 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` ::: ```solidity -event Executed(uint256 indexed operationType, address indexed target, uint256 value, bytes4 indexed selector); +event Executed( + uint256 indexed operationType, + address indexed target, + uint256 value, + bytes4 indexed selector +); ``` _Called address `target` using `operationType` with `value` wei and `data`._ @@ -811,7 +821,10 @@ Emitted when calling an address `target` (EOA or contract) with `value`. ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters diff --git a/docs/contracts/LSP0ERC725Account/LSP0ERC725Account.md b/docs/contracts/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.md similarity index 87% rename from docs/contracts/LSP0ERC725Account/LSP0ERC725Account.md rename to docs/contracts/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.md index 3ed7db7b4..2eabd25e8 100644 --- a/docs/contracts/LSP0ERC725Account/LSP0ERC725Account.md +++ b/docs/contracts/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-0-ERC725Account`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md) +[`LSP-0-ERC725Account`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md) ::: :::info Solidity implementation -[`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +[`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) ::: @@ -43,8 +43,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#constructor) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#constructor) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) ::: @@ -81,8 +81,8 @@ Set `initialOwner` as the contract owner. :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#fallback) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#fallback) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) ::: @@ -131,8 +131,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#receive) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#receive) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) ::: @@ -167,8 +167,8 @@ Executed: :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#renounce_ownership_confirmation_delay) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#renounce_ownership_confirmation_delay) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY()` - Function selector: `0xead3fbdf` @@ -193,8 +193,8 @@ function RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY() :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#renounce_ownership_confirmation_period) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#renounce_ownership_confirmation_period) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD()` - Function selector: `0x01bfba61` @@ -219,8 +219,8 @@ function RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD() :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#version) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#version) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `VERSION()` - Function selector: `0xffa1ad74` @@ -244,8 +244,8 @@ _Contract version._ :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#acceptownership) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#acceptownership) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `acceptOwnership()` - Function selector: `0x79ba5097` @@ -279,8 +279,8 @@ Transfer ownership of the contract from the current [`owner()`](#owner) to the [ :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#batchcalls) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#batchcalls) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -318,8 +318,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#execute) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#execute) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `execute(uint256,address,uint256,bytes)` - Function selector: `0x44c028fe` @@ -386,8 +386,8 @@ Generic executor function to: :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#executebatch) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#executebatch) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `executeBatch(uint256[],address[],uint256[],bytes[])` - Function selector: `0x31858452` @@ -455,8 +455,8 @@ Batch executor function that behaves the same as [`execute`](#execute) but allow :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#getdata) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#getdata) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -488,8 +488,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#getdatabatch) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#getdatabatch) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -523,8 +523,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#isvalidsignature) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#isvalidsignature) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `isValidSignature(bytes32,bytes)` - Function selector: `0x1626ba7e` @@ -578,8 +578,8 @@ Handles two cases: :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#owner) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#owner) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -603,8 +603,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#pendingowner) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#pendingowner) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `pendingOwner()` - Function selector: `0xe30c3978` @@ -634,8 +634,8 @@ The address that ownership of the contract is transferred to. This address may u :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#renounceownership) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#renounceownership) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -673,8 +673,8 @@ Renounce ownership of the contract in a 2-step process. :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#setdata) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#setdata) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -718,8 +718,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#setdatabatch) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#setdatabatch) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -763,8 +763,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#supportsinterface) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#supportsinterface) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -796,8 +796,8 @@ Achieves the goal of [ERC-165] to detect supported interfaces and [LSP-17-Contra :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#transferownership) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#transferownership) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -833,8 +833,8 @@ Initiate the process of transferring ownership of the contract by setting the ne :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#universalreceiver) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#universalreceiver) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Function signature: `universalReceiver(bytes32,bytes)` - Function selector: `0x6bb56a14` @@ -1283,15 +1283,20 @@ function _revertWithLSP20DefaultError( :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#contractcreated) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#contractcreated) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Event signature: `ContractCreated(uint256,address,uint256,bytes32)` - Event topic hash: `0xa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c3` ::: ```solidity -event ContractCreated(uint256 indexed operationType, address indexed contractAddress, uint256 value, bytes32 indexed salt); +event ContractCreated( + uint256 indexed operationType, + address indexed contractAddress, + uint256 value, + bytes32 indexed salt +); ``` _Deployed new contract at address `contractAddress` and funded with `value` wei (deployed using opcode: `operationType`)._ @@ -1313,8 +1318,8 @@ Emitted when a new contract was created and deployed. :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#datachanged) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#datachanged) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1341,15 +1346,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#executed) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#executed) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Event signature: `Executed(uint256,address,uint256,bytes4)` - Event topic hash: `0x4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e` ::: ```solidity -event Executed(uint256 indexed operationType, address indexed target, uint256 value, bytes4 indexed selector); +event Executed( + uint256 indexed operationType, + address indexed target, + uint256 value, + bytes4 indexed selector +); ``` _Called address `target` using `operationType` with `value` wei and `data`._ @@ -1371,8 +1381,8 @@ Emitted when calling an address `target` (EOA or contract) with `value`. :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#ownershiprenounced) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#ownershiprenounced) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Event signature: `OwnershipRenounced()` - Event topic hash: `0xd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce` @@ -1392,15 +1402,18 @@ Emitted when the ownership of the contract has been renounced. :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#ownershiptransferstarted) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#ownershiptransferstarted) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Event signature: `OwnershipTransferStarted(address,address)` - Event topic hash: `0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700` ::: ```solidity -event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferStarted( + address indexed previousOwner, + address indexed newOwner +); ``` _The transfer of ownership of the contract was initiated. Pending new owner set to: `newOwner`._ @@ -1420,15 +1433,18 @@ Emitted when [`transferOwnership(..)`](#transferownership) was called and the fi :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#ownershiptransferred) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#ownershiptransferred) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1444,8 +1460,8 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#renounceownershipstarted) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#renounceownershipstarted) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Event signature: `RenounceOwnershipStarted()` - Event topic hash: `0x81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e7` @@ -1465,15 +1481,21 @@ Emitted when starting the [`renounceOwnership(..)`](#renounceownership) 2-step p :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#universalreceiver) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#universalreceiver) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Event signature: `UniversalReceiver(address,uint256,bytes32,bytes,bytes)` - Event topic hash: `0x9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c2` ::: ```solidity -event UniversalReceiver(address indexed from, uint256 indexed value, bytes32 indexed typeId, bytes receivedData, bytes returnedValue); +event UniversalReceiver( + address indexed from, + uint256 indexed value, + bytes32 indexed typeId, + bytes receivedData, + bytes returnedValue +); ``` \*Address `from` called the `universalReceiver(...)` function while sending `value` LYX. Notification type (typeId): `typeId` @@ -1500,8 +1522,8 @@ Emitted when the [`universalReceiver`](#universalreceiver) function was called w :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_contractdeploymentfailed) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_contractdeploymentfailed) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_ContractDeploymentFailed()` - Error hash: `0x0b07489b` @@ -1519,8 +1541,8 @@ Reverts when contract deployment failed via [`execute`](#execute) or [`executeBa :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_createoperationsrequireemptyrecipientaddress) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_createoperationsrequireemptyrecipientaddress) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_CreateOperationsRequireEmptyRecipientAddress()` - Error hash: `0x3041824a` @@ -1538,8 +1560,8 @@ Reverts when passing a `to` address that is not `address(0)` (= address zero) wh :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_executeparametersemptyarray) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_executeparametersemptyarray) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_ExecuteParametersEmptyArray()` - Error hash: `0xe9ad2b5f` @@ -1557,8 +1579,8 @@ Reverts when one of the array parameter provided to the [`executeBatch`](#execut :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_executeparameterslengthmismatch) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_executeparameterslengthmismatch) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_ExecuteParametersLengthMismatch()` - Error hash: `0x3ff55f4d` @@ -1576,8 +1598,8 @@ Reverts when there is not the same number of elements in the `operationTypes`, ` :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_insufficientbalance) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_insufficientbalance) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_InsufficientBalance(uint256,uint256)` - Error hash: `0x0df9a8f8` @@ -1602,8 +1624,8 @@ Reverts when trying to send more native tokens `value` than available in current :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_msgvaluedisallowedindelegatecall) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_msgvaluedisallowedindelegatecall) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_MsgValueDisallowedInDelegateCall()` - Error hash: `0x5ac83135` @@ -1621,8 +1643,8 @@ Reverts when trying to send native tokens (`value` / `values[]` parameter of [`e :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_msgvaluedisallowedinstaticcall) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_msgvaluedisallowedinstaticcall) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_MsgValueDisallowedInStaticCall()` - Error hash: `0x72f2bc6a` @@ -1640,8 +1662,8 @@ Reverts when trying to send native tokens (`value` / `values[]` parameter of [`e :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_nocontractbytecodeprovided) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_nocontractbytecodeprovided) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_NoContractBytecodeProvided()` - Error hash: `0xb81cd8d9` @@ -1659,8 +1681,8 @@ Reverts when no contract bytecode was provided as parameter when trying to deplo :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725x_unknownoperationtype) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725x_unknownoperationtype) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725X_UnknownOperationType(uint256)` - Error hash: `0x7583b3bc` @@ -1684,8 +1706,8 @@ Reverts when the `operationTypeProvided` is none of the default operation types :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1703,8 +1725,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1722,8 +1744,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#lsp14callernotpendingowner) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#lsp14callernotpendingowner) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `LSP14CallerNotPendingOwner(address)` - Error hash: `0x451e4528` @@ -1747,8 +1769,8 @@ Reverts when the `caller` that is trying to accept ownership of the contract is :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#lsp14cannottransferownershiptoself) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#lsp14cannottransferownershiptoself) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `LSP14CannotTransferOwnershipToSelf()` - Error hash: `0xe052a6f8` @@ -1768,8 +1790,8 @@ Reverts when trying to transfer ownership to the `address(this)`. :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#lsp14mustacceptownershipinseparatetransaction) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#lsp14mustacceptownershipinseparatetransaction) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `LSP14MustAcceptOwnershipInSeparateTransaction()` - Error hash: `0x5758dd07` @@ -1789,8 +1811,8 @@ Reverts when pending owner accept ownership in the same transaction of transferr :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#lsp14notinrenounceownershipinterval) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#lsp14notinrenounceownershipinterval) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `LSP14NotInRenounceOwnershipInterval(uint256,uint256)` - Error hash: `0x1b080942` @@ -1820,8 +1842,8 @@ Reverts when trying to renounce ownership before the initial confirmation delay. :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#lsp20callverificationfailed) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#lsp20callverificationfailed) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `LSP20CallVerificationFailed(bool,bytes4)` - Error hash: `0x9d6741e3` @@ -1846,8 +1868,8 @@ reverts when the call to the owner does not return the LSP20 success value :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#lsp20callingverifierfailed) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#lsp20callingverifierfailed) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `LSP20CallingVerifierFailed(bool)` - Error hash: `0x8c6a8ae3` @@ -1871,8 +1893,8 @@ reverts when the call to the owner fail with no revert reason :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#lsp20eoacannotverifycall) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#lsp20eoacannotverifycall) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `LSP20EOACannotVerifyCall(address)` - Error hash: `0x0c392301` @@ -1896,8 +1918,8 @@ Reverts when the logic verifier is an Externally Owned Account (EOA) that cannot :::note References -- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-0-ERC725Account.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP0ERC725Account/LSP0ERC725Account.sol) +- Specification details: [**LSP-0-ERC725Account**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-0-ERC725Account.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP0ERC725Account.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` diff --git a/docs/contracts/LSP14Ownable2Step/LSP14Ownable2Step.md b/docs/contracts/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.md similarity index 82% rename from docs/contracts/LSP14Ownable2Step/LSP14Ownable2Step.md rename to docs/contracts/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.md index a305eab1b..7370f7005 100644 --- a/docs/contracts/LSP14Ownable2Step/LSP14Ownable2Step.md +++ b/docs/contracts/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-14-Ownable2Step`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md) +[`LSP-14-Ownable2Step`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md) ::: :::info Solidity implementation -[`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +[`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) ::: @@ -27,8 +27,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#renounce_ownership_confirmation_delay) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#renounce_ownership_confirmation_delay) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Function signature: `RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY()` - Function selector: `0xead3fbdf` @@ -55,8 +55,8 @@ The number of block that MUST pass before one is able to confirm renouncing owne :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#renounce_ownership_confirmation_period) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#renounce_ownership_confirmation_period) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Function signature: `RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD()` - Function selector: `0x01bfba61` @@ -83,8 +83,8 @@ The number of blocks during which one can renounce ownership. :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#acceptownership) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#acceptownership) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Function signature: `acceptOwnership()` - Function selector: `0x79ba5097` @@ -116,8 +116,8 @@ Transfer ownership of the contract from the current [`owner()`](#owner) to the [ :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#owner) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#owner) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -141,8 +141,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#pendingowner) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#pendingowner) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Function signature: `pendingOwner()` - Function selector: `0xe30c3978` @@ -172,8 +172,8 @@ The address that ownership of the contract is transferred to. This address may u :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#renounceownership) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#renounceownership) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -203,8 +203,8 @@ Renounce ownership of the contract in a 2-step process. :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#transferownership) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#transferownership) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -311,8 +311,8 @@ Initiate or confirm the process of renouncing ownership after a specific delay o :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#ownershiprenounced) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#ownershiprenounced) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Event signature: `OwnershipRenounced()` - Event topic hash: `0xd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce` @@ -332,15 +332,18 @@ Emitted when the ownership of the contract has been renounced. :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#ownershiptransferstarted) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#ownershiptransferstarted) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Event signature: `OwnershipTransferStarted(address,address)` - Event topic hash: `0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700` ::: ```solidity -event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferStarted( + address indexed previousOwner, + address indexed newOwner +); ``` _The transfer of ownership of the contract was initiated. Pending new owner set to: `newOwner`._ @@ -360,15 +363,18 @@ Emitted when [`transferOwnership(..)`](#transferownership) was called and the fi :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#ownershiptransferred) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#ownershiptransferred) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -384,8 +390,8 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#renounceownershipstarted) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#renounceownershipstarted) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Event signature: `RenounceOwnershipStarted()` - Event topic hash: `0x81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e7` @@ -407,8 +413,8 @@ Emitted when starting the [`renounceOwnership(..)`](#renounceownership) 2-step p :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#lsp14callernotpendingowner) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#lsp14callernotpendingowner) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Error signature: `LSP14CallerNotPendingOwner(address)` - Error hash: `0x451e4528` @@ -432,8 +438,8 @@ Reverts when the `caller` that is trying to accept ownership of the contract is :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#lsp14cannottransferownershiptoself) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#lsp14cannottransferownershiptoself) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Error signature: `LSP14CannotTransferOwnershipToSelf()` - Error hash: `0xe052a6f8` @@ -453,8 +459,8 @@ Reverts when trying to transfer ownership to the `address(this)`. :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#lsp14mustacceptownershipinseparatetransaction) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#lsp14mustacceptownershipinseparatetransaction) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Error signature: `LSP14MustAcceptOwnershipInSeparateTransaction()` - Error hash: `0x5758dd07` @@ -474,8 +480,8 @@ Reverts when pending owner accept ownership in the same transaction of transferr :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#lsp14notinrenounceownershipinterval) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#lsp14notinrenounceownershipinterval) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Error signature: `LSP14NotInRenounceOwnershipInterval(uint256,uint256)` - Error hash: `0x1b080942` @@ -505,8 +511,8 @@ Reverts when trying to renounce ownership before the initial confirmation delay. :::note References -- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-14-Ownable2Step.md#ownablecallernottheowner) -- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol) +- Specification details: [**LSP-14-Ownable2Step**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-14-Ownable2Step.md#ownablecallernottheowner) +- Solidity implementation: [`LSP14Ownable2Step.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` diff --git a/docs/contracts/LSP17ContractExtension/LSP17Extendable.md b/docs/contracts/@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.md similarity index 91% rename from docs/contracts/LSP17ContractExtension/LSP17Extendable.md rename to docs/contracts/@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.md index dfd87b045..096815e1b 100644 --- a/docs/contracts/LSP17ContractExtension/LSP17Extendable.md +++ b/docs/contracts/@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-17-ContractExtension`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-ContractExtension.md) +[`LSP-17-ContractExtension`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-17-ContractExtension.md) ::: :::info Solidity implementation -[`LSP17Extendable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17ContractExtension/LSP17Extendable.sol) +[`LSP17Extendable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol) ::: @@ -29,8 +29,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-17-ContractExtension**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-ContractExtension.md#supportsinterface) -- Solidity implementation: [`LSP17Extendable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17ContractExtension/LSP17Extendable.sol) +- Specification details: [**LSP-17-ContractExtension**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-17-ContractExtension.md#supportsinterface) +- Solidity implementation: [`LSP17Extendable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` diff --git a/docs/contracts/LSP17ContractExtension/LSP17Extension.md b/docs/contracts/@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.md similarity index 84% rename from docs/contracts/LSP17ContractExtension/LSP17Extension.md rename to docs/contracts/@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.md index 9206a06c9..006e93803 100644 --- a/docs/contracts/LSP17ContractExtension/LSP17Extension.md +++ b/docs/contracts/@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-17-ContractExtension`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-ContractExtension.md) +[`LSP-17-ContractExtension`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-17-ContractExtension.md) ::: :::info Solidity implementation -[`LSP17Extension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17ContractExtension/LSP17Extension.sol) +[`LSP17Extension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.sol) ::: @@ -27,8 +27,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-17-ContractExtension**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-ContractExtension.md#version) -- Solidity implementation: [`LSP17Extension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17ContractExtension/LSP17Extension.sol) +- Specification details: [**LSP-17-ContractExtension**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-17-ContractExtension.md#version) +- Solidity implementation: [`LSP17Extension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.sol) - Function signature: `VERSION()` - Function selector: `0xffa1ad74` @@ -52,8 +52,8 @@ _Contract version._ :::note References -- Specification details: [**LSP-17-ContractExtension**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-ContractExtension.md#supportsinterface) -- Solidity implementation: [`LSP17Extension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17ContractExtension/LSP17Extension.sol) +- Specification details: [**LSP-17-ContractExtension**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-17-ContractExtension.md#supportsinterface) +- Solidity implementation: [`LSP17Extension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` diff --git a/docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md b/docs/contracts/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.md similarity index 90% rename from docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md rename to docs/contracts/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.md index 4dde9b462..5961d3795 100644 --- a/docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md +++ b/docs/contracts/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-1-UniversalReceiver`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md) +[`LSP-1-UniversalReceiver`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md) ::: :::info Solidity implementation -[`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol) +[`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol) ::: @@ -31,8 +31,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md#version) -- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol) +- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md#version) +- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol) - Function signature: `VERSION()` - Function selector: `0xffa1ad74` @@ -56,8 +56,8 @@ _Contract version._ :::note References -- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md#supportsinterface) -- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol) +- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md#supportsinterface) +- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -87,8 +87,8 @@ See [`IERC165-supportsInterface`](#ierc165-supportsinterface). :::note References -- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md#universalreceiverdelegate) -- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol) +- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md#universalreceiverdelegate) +- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol) - Function signature: `universalReceiverDelegate(address,uint256,bytes32,bytes)` - Function selector: `0xa245bbda` @@ -254,8 +254,8 @@ Calls `bytes4(keccak256(setDataBatch(bytes32[],bytes[])))` without checking for :::note References -- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md#cannotregistereoasasassets) -- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol) +- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md#cannotregistereoasasassets) +- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol) - Error signature: `CannotRegisterEOAsAsAssets(address)` - Error hash: `0xa5295345` diff --git a/docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md b/docs/contracts/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.md similarity index 88% rename from docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md rename to docs/contracts/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.md index 368b82286..faa4be318 100644 --- a/docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md +++ b/docs/contracts/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-1-UniversalReceiver`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md) +[`LSP-1-UniversalReceiver`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md) ::: :::info Solidity implementation -[`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol) +[`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol) ::: @@ -29,8 +29,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md#version) -- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol) +- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md#version) +- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol) - Function signature: `VERSION()` - Function selector: `0xffa1ad74` @@ -54,8 +54,8 @@ _Contract version._ :::note References -- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md#supportsinterface) -- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol) +- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md#supportsinterface) +- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -85,8 +85,8 @@ See [`IERC165-supportsInterface`](#ierc165-supportsinterface). :::note References -- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md#universalreceiverdelegate) -- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol) +- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md#universalreceiverdelegate) +- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol) - Function signature: `universalReceiverDelegate(address,uint256,bytes32,bytes)` - Function selector: `0xa245bbda` @@ -211,8 +211,8 @@ Calls `bytes4(keccak256(setDataBatch(bytes32[],bytes[])))` without checking for :::note References -- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md#cannotregistereoasasassets) -- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol) +- Specification details: [**LSP-1-UniversalReceiver**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md#cannotregistereoasasassets) +- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol) - Error signature: `CannotRegisterEOAsAsAssets(address)` - Error hash: `0xa5295345` diff --git a/docs/contracts/LSP20CallVerification/LSP20CallVerification.md b/docs/contracts/@lukso/lsp20-contracts/contracts/LSP20CallVerification.md similarity index 90% rename from docs/contracts/LSP20CallVerification/LSP20CallVerification.md rename to docs/contracts/@lukso/lsp20-contracts/contracts/LSP20CallVerification.md index 78e29308a..b9f29ae58 100644 --- a/docs/contracts/LSP20CallVerification/LSP20CallVerification.md +++ b/docs/contracts/@lukso/lsp20-contracts/contracts/LSP20CallVerification.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-20-CallVerification`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-20-CallVerification.md) +[`LSP-20-CallVerification`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-20-CallVerification.md) ::: :::info Solidity implementation -[`LSP20CallVerification.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP20CallVerification/LSP20CallVerification.sol) +[`LSP20CallVerification.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp20-contracts/contracts/LSP20CallVerification.sol) ::: diff --git a/docs/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.md b/docs/contracts/@lukso/lsp23-contracts/contracts/IPostDeploymentModule.md similarity index 85% rename from docs/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.md rename to docs/contracts/@lukso/lsp23-contracts/contracts/IPostDeploymentModule.md index c9efd3a70..d3f02a12b 100644 --- a/docs/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.md +++ b/docs/contracts/@lukso/lsp23-contracts/contracts/IPostDeploymentModule.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-23-LinkedContractsFactory`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md) +[`LSP-23-LinkedContractsFactory`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md) ::: :::info Solidity implementation -[`IPostDeploymentModule.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol) +[`IPostDeploymentModule.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/IPostDeploymentModule.sol) ::: @@ -23,8 +23,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#executepostdeployment) -- Solidity implementation: [`IPostDeploymentModule.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#executepostdeployment) +- Solidity implementation: [`IPostDeploymentModule.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/IPostDeploymentModule.sol) - Function signature: `executePostDeployment(address,address,bytes)` - Function selector: `0x28c4d14e` diff --git a/docs/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.md b/docs/contracts/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.md similarity index 91% rename from docs/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.md rename to docs/contracts/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.md index 1eab86124..864523823 100644 --- a/docs/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.md +++ b/docs/contracts/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-23-LinkedContractsFactory`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md) +[`LSP-23-LinkedContractsFactory`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md) ::: :::info Solidity implementation -[`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +[`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) ::: @@ -23,8 +23,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#computeaddresses) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#computeaddresses) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Function signature: `computeAddresses(ILSP23LinkedContractsFactory.PrimaryContractDeployment,ILSP23LinkedContractsFactory.SecondaryContractDeployment,address,bytes)` - Function selector: `0xdecfb0b9` @@ -66,8 +66,8 @@ Computes the addresses of a primary contract and a secondary linked contract :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#computeerc1167addresses) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#computeerc1167addresses) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Function signature: `computeERC1167Addresses(ILSP23LinkedContractsFactory.PrimaryContractDeploymentInit,ILSP23LinkedContractsFactory.SecondaryContractDeploymentInit,address,bytes)` - Function selector: `0x8da85898` @@ -109,8 +109,8 @@ Computes the addresses of a primary and a secondary linked contracts ERC1167 pro :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#deploycontracts) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#deploycontracts) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Function signature: `deployContracts(ILSP23LinkedContractsFactory.PrimaryContractDeployment,ILSP23LinkedContractsFactory.SecondaryContractDeployment,address,bytes)` - Function selector: `0xf830c0ab` @@ -154,8 +154,8 @@ Deploys a primary and a secondary linked contract. :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#deployerc1167proxies) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#deployerc1167proxies) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Function signature: `deployERC1167Proxies(ILSP23LinkedContractsFactory.PrimaryContractDeploymentInit,ILSP23LinkedContractsFactory.SecondaryContractDeploymentInit,address,bytes)` - Function selector: `0x17c042c4` @@ -255,15 +255,22 @@ function _generatePrimaryContractProxySalt(struct ILSP23LinkedContractsFactory.P :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#deployedcontracts) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#deployedcontracts) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Event signature: `DeployedContracts(address,address,ILSP23LinkedContractsFactory.PrimaryContractDeployment,ILSP23LinkedContractsFactory.SecondaryContractDeployment,address,bytes)` - Event topic hash: `0x1ea27dabd8fd1508e844ab51c2fd3d9081f2684346857f9187da6d4a1aa7d3e6` ::: ```solidity -event DeployedContracts(address indexed primaryContract, address indexed secondaryContract, ILSP23LinkedContractsFactory.PrimaryContractDeployment primaryContractDeployment, ILSP23LinkedContractsFactory.SecondaryContractDeployment secondaryContractDeployment, address postDeploymentModule, bytes postDeploymentModuleCalldata); +event DeployedContracts( + address indexed primaryContract, + address indexed secondaryContract, + ILSP23LinkedContractsFactory.PrimaryContractDeployment primaryContractDeployment, + ILSP23LinkedContractsFactory.SecondaryContractDeployment secondaryContractDeployment, + address postDeploymentModule, + bytes postDeploymentModuleCalldata +); ``` Emitted when a primary and secondary contract are deployed. @@ -285,15 +292,22 @@ Emitted when a primary and secondary contract are deployed. :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#deployederc1167proxies) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#deployederc1167proxies) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Event signature: `DeployedERC1167Proxies(address,address,ILSP23LinkedContractsFactory.PrimaryContractDeploymentInit,ILSP23LinkedContractsFactory.SecondaryContractDeploymentInit,address,bytes)` - Event topic hash: `0xb03dbe7a02c063899f863d542410b5b038c8f537045be3a26e7144e0074e1c7b` ::: ```solidity -event DeployedERC1167Proxies(address indexed primaryContract, address indexed secondaryContract, ILSP23LinkedContractsFactory.PrimaryContractDeploymentInit primaryContractDeploymentInit, ILSP23LinkedContractsFactory.SecondaryContractDeploymentInit secondaryContractDeploymentInit, address postDeploymentModule, bytes postDeploymentModuleCalldata); +event DeployedERC1167Proxies( + address indexed primaryContract, + address indexed secondaryContract, + ILSP23LinkedContractsFactory.PrimaryContractDeploymentInit primaryContractDeploymentInit, + ILSP23LinkedContractsFactory.SecondaryContractDeploymentInit secondaryContractDeploymentInit, + address postDeploymentModule, + bytes postDeploymentModuleCalldata +); ``` Emitted when proxies of a primary and secondary contract are deployed. @@ -317,8 +331,8 @@ Emitted when proxies of a primary and secondary contract are deployed. :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#invalidvaluesum) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#invalidvaluesum) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Error signature: `InvalidValueSum()` - Error hash: `0x2fd9ca91` @@ -338,8 +352,8 @@ Reverts when the `msg.value` sent is not equal to the sum of value used for the :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#primarycontractproxyinitfailureerror) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#primarycontractproxyinitfailureerror) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Error signature: `PrimaryContractProxyInitFailureError(bytes)` - Error hash: `0x4364b6ee` @@ -365,8 +379,8 @@ Reverts when the deployment & intialization of the contract has failed. :::note References -- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-23-LinkedContractsFactory.md#secondarycontractproxyinitfailureerror) -- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol) +- Specification details: [**LSP-23-LinkedContractsFactory**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#secondarycontractproxyinitfailureerror) +- Solidity implementation: [`LSP23LinkedContractsFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol) - Error signature: `SecondaryContractProxyInitFailureError(bytes)` - Error hash: `0x9654a854` diff --git a/docs/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.md b/docs/contracts/@lukso/lsp25-contracts/contracts/LSP25MultiChannelNonce.md similarity index 97% rename from docs/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.md rename to docs/contracts/@lukso/lsp25-contracts/contracts/LSP25MultiChannelNonce.md index e789fed02..f6a4ac3a0 100644 --- a/docs/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.md +++ b/docs/contracts/@lukso/lsp25-contracts/contracts/LSP25MultiChannelNonce.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-25-ExecuteRelayCall`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-25-ExecuteRelayCall.md) +[`LSP-25-ExecuteRelayCall`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-25-ExecuteRelayCall.md) ::: :::info Solidity implementation -[`LSP25MultiChannelNonce.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol) +[`LSP25MultiChannelNonce.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp25-contracts/contracts/LSP25MultiChannelNonce.sol) ::: diff --git a/docs/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.md b/docs/contracts/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.md similarity index 73% rename from docs/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.md rename to docs/contracts/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.md index 19b5f7b31..d4f6dc591 100644 --- a/docs/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.md +++ b/docs/contracts/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-4-DigitalAssetMetadata`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md) +[`LSP-4-DigitalAsset-Metadata`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md) ::: :::info Solidity implementation -[`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +[`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) ::: @@ -27,8 +27,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#getdata) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#getdata) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -60,8 +60,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#getdatabatch) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#getdatabatch) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -95,8 +95,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#owner) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#owner) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -120,8 +120,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#renounceownership) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#renounceownership) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -139,8 +139,8 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#setdata) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#setdata) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -189,8 +189,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#setdatabatch) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#setdatabatch) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -239,8 +239,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#supportsinterface) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#supportsinterface) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -270,8 +270,8 @@ See [`IERC165-supportsInterface`](#ierc165-supportsinterface). :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#transferownership) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#transferownership) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -362,8 +362,8 @@ via this function once the digital asset contract has been deployed. :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#datachanged) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#datachanged) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -390,15 +390,18 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#ownershiptransferred) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#ownershiptransferred) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -416,8 +419,8 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -435,8 +438,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -454,8 +457,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -473,8 +476,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -492,8 +495,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -511,8 +514,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -530,8 +533,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#ownablecallernottheowner) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#ownablecallernottheowner) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -555,8 +558,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-4-DigitalAssetMetadata**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-4-DigitalAssetMetadata.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol) +- Specification details: [**LSP-4-DigitalAsset-Metadata**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP4DigitalAssetMetadata.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP6KeyManager/LSP6KeyManager.md b/docs/contracts/@lukso/lsp6-contracts/contracts/LSP6KeyManager.md similarity index 91% rename from docs/contracts/LSP6KeyManager/LSP6KeyManager.md rename to docs/contracts/@lukso/lsp6-contracts/contracts/LSP6KeyManager.md index cab1844e8..5138a2a11 100644 --- a/docs/contracts/LSP6KeyManager/LSP6KeyManager.md +++ b/docs/contracts/@lukso/lsp6-contracts/contracts/LSP6KeyManager.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-6-KeyManager`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md) +[`LSP-6-KeyManager`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md) ::: :::info Solidity implementation -[`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +[`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) ::: @@ -27,8 +27,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#constructor) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#constructor) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) ::: @@ -52,8 +52,8 @@ Deploy a Key Manager and set the `target_` address in the contract storage, maki :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#version) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#version) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `VERSION()` - Function selector: `0xffa1ad74` @@ -77,8 +77,8 @@ _Contract version._ :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#execute) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#execute) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `execute(bytes)` - Function selector: `0x09c5eabe` @@ -118,8 +118,8 @@ Execute A `payload` on the linked [`target`](#target) contract after having veri :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#executebatch) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#executebatch) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `executeBatch(uint256[],bytes[])` - Function selector: `0xbf0176ff` @@ -167,8 +167,8 @@ Same as [`execute`](#execute) but execute a batch of payloads (abi-encoded funct :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#executerelaycall) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#executerelaycall) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `executeRelayCall(bytes,uint256,uint256,bytes)` - Function selector: `0x4c8a4e74` @@ -222,8 +222,8 @@ Allows any address (executor) to execute a payload (= abi-encoded function call) :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#executerelaycallbatch) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#executerelaycallbatch) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `executeRelayCallBatch(bytes[],uint256[],uint256[],uint256[],bytes[])` - Function selector: `0xa20856a5` @@ -274,8 +274,8 @@ Same as [`executeRelayCall`](#executerelaycall) but execute a batch of signed ca :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#getnonce) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#getnonce) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `getNonce(address,uint128)` - Function selector: `0xb44581d9` @@ -320,8 +320,8 @@ Get the nonce for a specific `from` address that can be used for signing relay t :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#isvalidsignature) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#isvalidsignature) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `isValidSignature(bytes32,bytes)` - Function selector: `0x1626ba7e` @@ -361,8 +361,8 @@ Checks if a signature was signed by a controller that has the permission `SIGN`. :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#lsp20verifycall) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#lsp20verifycall) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `lsp20VerifyCall(address,address,address,uint256,bytes)` - Function selector: `0xde928f14` @@ -409,8 +409,8 @@ function lsp20VerifyCall( :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#lsp20verifycallresult) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#lsp20verifycallresult) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `lsp20VerifyCallResult(bytes32,bytes)` - Function selector: `0xd3fc45d3` @@ -442,8 +442,8 @@ function lsp20VerifyCallResult( :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#supportsinterface) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#supportsinterface) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -473,8 +473,8 @@ See [`IERC165-supportsInterface`](#ierc165-supportsinterface). :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#target) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#target) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Function signature: `target()` - Function selector: `0xd4b83992` @@ -1254,15 +1254,19 @@ Used at the end of the [`lsp20VerifyCall`](#`lsp20verifycall`), [`_execute`](#`_ :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#permissionsverified) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#permissionsverified) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Event signature: `PermissionsVerified(address,uint256,bytes4)` - Event topic hash: `0xc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e` ::: ```solidity -event PermissionsVerified(address indexed signer, uint256 indexed value, bytes4 indexed selector); +event PermissionsVerified( + address indexed signer, + uint256 indexed value, + bytes4 indexed selector +); ``` _Verified the permissions of `signer` for calling function `selector` on the linked account and sending `value` of native token._ @@ -1285,8 +1289,8 @@ Emitted when the LSP6KeyManager contract verified the permissions of the `signer :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#batchexecuteparamslengthmismatch) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#batchexecuteparamslengthmismatch) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `BatchExecuteParamsLengthMismatch()` - Error hash: `0x55a187db` @@ -1306,8 +1310,8 @@ Reverts when the array parameters `uint256[] value` and `bytes[] payload` have d :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#batchexecuterelaycallparamslengthmismatch) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#batchexecuterelaycallparamslengthmismatch) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `BatchExecuteRelayCallParamsLengthMismatch()` - Error hash: `0xb4d50d21` @@ -1327,8 +1331,8 @@ Reverts when providing array parameters of different sizes to `executeRelayCallB :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#callingkeymanagernotallowed) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#callingkeymanagernotallowed) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `CallingKeyManagerNotAllowed()` - Error hash: `0xa431b236` @@ -1348,8 +1352,8 @@ Reverts when calling the KeyManager through `execute(uint256,address,uint256,byt :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#delegatecalldisallowedviakeymanager) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#delegatecalldisallowedviakeymanager) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `DelegateCallDisallowedViaKeyManager()` - Error hash: `0x80d6ebae` @@ -1369,8 +1373,8 @@ Reverts when trying to do a `delegatecall` via the ERC725X.execute(uint256,addre :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#erc725x_executeparametersemptyarray) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#erc725x_executeparametersemptyarray) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `ERC725X_ExecuteParametersEmptyArray()` - Error hash: `0xe9ad2b5f` @@ -1388,8 +1392,8 @@ Reverts when one of the array parameter provided to the [`executeBatch`](#execut :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#erc725x_executeparameterslengthmismatch) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#erc725x_executeparameterslengthmismatch) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `ERC725X_ExecuteParametersLengthMismatch()` - Error hash: `0x3ff55f4d` @@ -1407,8 +1411,8 @@ Reverts when there is not the same number of elements in the `operationTypes`, ` :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1426,8 +1430,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#invaliddatavaluesfordatakeys) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#invaliddatavaluesfordatakeys) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `InvalidDataValuesForDataKeys(bytes32,bytes)` - Error hash: `0x1fa41397` @@ -1454,8 +1458,8 @@ Reverts when the data value length is not one of the required lengths for the sp :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#invaliderc725function) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#invaliderc725function) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `InvalidERC725Function(bytes4)` - Error hash: `0x2ba8851c` @@ -1493,8 +1497,8 @@ Reverts when trying to call a function on the linked [`target`](#target), that i :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#invalidencodedallowedcalls) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#invalidencodedallowedcalls) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `InvalidEncodedAllowedCalls(bytes)` - Error hash: `0x187e77ab` @@ -1520,8 +1524,8 @@ Reverts when `allowedCallsValue` is not properly encoded as a `(bytes4,address,b :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#invalidencodedallowederc725ydatakeys) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#invalidencodedallowederc725ydatakeys) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `InvalidEncodedAllowedERC725YDataKeys(bytes,string)` - Error hash: `0xae6cbd37` @@ -1548,8 +1552,8 @@ Reverts when `value` is not encoded properly as a `bytes32[CompactBytesArray]`. :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#invalidlsp6target) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#invalidlsp6target) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `InvalidLSP6Target()` - Error hash: `0xfc854579` @@ -1569,8 +1573,8 @@ Reverts when the address provided to set as the [`target`](#target) linked to th :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#invalidpayload) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#invalidpayload) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `InvalidPayload(bytes)` - Error hash: `0x3621bbcc` @@ -1596,8 +1600,8 @@ Reverts when the payload is invalid. :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#invalidrelaynonce) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#invalidrelaynonce) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `InvalidRelayNonce(address,uint256,bytes)` - Error hash: `0xc9bd9eb9` @@ -1625,8 +1629,8 @@ Reverts when the `signer` address retrieved from the `signature` has an invalid :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#invalidwhitelistedcall) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#invalidwhitelistedcall) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `InvalidWhitelistedCall(address)` - Error hash: `0x6fd203c5` @@ -1652,8 +1656,8 @@ Reverts when a `from` address has _"any whitelisted call"_ as allowed call set. :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#keymanagercannotbesetasextensionforlsp20functions) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#keymanagercannotbesetasextensionforlsp20functions) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `KeyManagerCannotBeSetAsExtensionForLSP20Functions()` - Error hash: `0x4a9fa8cf` @@ -1673,8 +1677,8 @@ Reverts when the address of the Key Manager is being set as extensions for lsp20 :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#lsp6batchexcessivevaluesent) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#lsp6batchexcessivevaluesent) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `LSP6BatchExcessiveValueSent(uint256,uint256)` - Error hash: `0xa51868b6` @@ -1705,8 +1709,8 @@ This error occurs when there was too much funds sent to the batch functions `exe :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#lsp6batchinsufficientvaluesent) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#lsp6batchinsufficientvaluesent) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `LSP6BatchInsufficientValueSent(uint256,uint256)` - Error hash: `0x30a324ac` @@ -1733,8 +1737,8 @@ This error occurs when there was not enough funds sent to the batch functions `e :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#nocallsallowed) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#nocallsallowed) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `NoCallsAllowed(address)` - Error hash: `0x6cb60587` @@ -1760,8 +1764,8 @@ Reverts when the `from` address has no `AllowedCalls` set and cannot interact wi :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#noerc725ydatakeysallowed) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#noerc725ydatakeysallowed) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `NoERC725YDataKeysAllowed(address)` - Error hash: `0xed7fa509` @@ -1787,8 +1791,8 @@ Reverts when the `from` address has no AllowedERC725YDataKeys set and cannot set :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#nopermissionsset) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#nopermissionsset) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `NoPermissionsSet(address)` - Error hash: `0xf292052a` @@ -1814,8 +1818,8 @@ Reverts when address `from` does not have any permissions set on the account lin :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#notallowedcall) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#notallowedcall) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `NotAllowedCall(address,address,bytes4)` - Error hash: `0x45147bce` @@ -1843,8 +1847,8 @@ Reverts when `from` is not authorised to call the `execute(uint256,address,uint2 :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#notallowederc725ydatakey) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#notallowederc725ydatakey) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `NotAllowedERC725YDataKey(address,bytes32)` - Error hash: `0x557ae079` @@ -1871,8 +1875,8 @@ Reverts when address `from` is not authorised to set the key `disallowedKey` on :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#notauthorised) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#notauthorised) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `NotAuthorised(address,string)` - Error hash: `0x3bdad6e6` @@ -1899,8 +1903,8 @@ Reverts when address `from` is not authorised and does not have `permission` on :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#notrecognisedpermissionkey) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#notrecognisedpermissionkey) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `NotRecognisedPermissionKey(bytes32)` - Error hash: `0x0f7d735b` @@ -1926,8 +1930,8 @@ Reverts when `dataKey` is a `bytes32` value that does not adhere to any of the p :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#relaycallbeforestarttime) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#relaycallbeforestarttime) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `RelayCallBeforeStartTime()` - Error hash: `0x00de4b8a` @@ -1947,8 +1951,8 @@ Reverts when the relay call is cannot yet bet executed. This mean that the start :::note References -- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md#relaycallexpired) -- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6KeyManager.sol) +- Specification details: [**LSP-6-KeyManager**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md#relaycallexpired) +- Solidity implementation: [`LSP6KeyManager.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol) - Error signature: `RelayCallExpired()` - Error hash: `0x5c53a98c` diff --git a/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md b/docs/contracts/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.md similarity index 85% rename from docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md rename to docs/contracts/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.md index 7766d68b5..fb884f102 100644 --- a/docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md +++ b/docs/contracts/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-7-DigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md) +[`LSP-7-DigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md) ::: :::info Solidity implementation -[`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +[`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) ::: @@ -27,8 +27,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#fallback) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#fallback) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) ::: @@ -62,8 +62,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#receive) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#receive) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) ::: @@ -81,8 +81,8 @@ Reverts whenever someone tries to send native tokens to a LSP7 contract. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `authorizeOperator(address,uint256,bytes)` - Function selector: `0xb49506fd` @@ -118,8 +118,8 @@ Sets an `amount` of tokens that an `operator` has access from the caller's balan :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `authorizedAmountFor(address,address)` - Function selector: `0x65aeaa95` @@ -153,8 +153,8 @@ Get the amount of tokens `operator` address has access to from `tokenOwner`. Ope :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#balanceof) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#balanceof) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -184,8 +184,8 @@ Get the number of tokens owned by `tokenOwner`. If the token is divisible (the [ :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -223,8 +223,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decimals) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#decimals) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `decimals()` - Function selector: `0x313ce567` @@ -248,10 +248,17 @@ Returns the number of decimals used to get its user representation. If the asset :::note References +<<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md + - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) - Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) - Function signature: `decreaseAllowance(address,address,uint256,bytes)` -- Function selector: `0x78381670` +- # Function selector: `0x78381670` +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) +- Function signature: `decreaseAllowance(address,uint256,bytes)` +- Function selector: `0x7b204c4e` + > > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.md ::: @@ -283,8 +290,8 @@ Atomically decreases the allowance granted to `operator` by the caller. This is :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdata) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getdata) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -316,8 +323,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -351,8 +358,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `getOperatorsOf(address)` - Function selector: `0xd72fc29a` @@ -382,8 +389,8 @@ Returns all `operator` addresses that are allowed to transfer or burn on behalf :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `increaseAllowance(address,uint256,bytes)` - Function selector: `0x2bc1da82` @@ -415,8 +422,8 @@ Atomically increases the allowance granted to `operator` by the caller. This is :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#owner) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#owner) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -440,8 +447,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -459,10 +466,17 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References +<<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md + - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) - Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) - Function signature: `revokeOperator(address,address,bool,bytes)` -- Function selector: `0x30d0dc37` +- # Function selector: `0x30d0dc37` +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) +- Function signature: `revokeOperator(address,bool,bytes)` +- Function selector: `0x4521748e` + > > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.md ::: @@ -492,8 +506,8 @@ Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdata) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#setdata) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -542,8 +556,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -592,8 +606,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -623,8 +637,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -648,8 +662,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transfer) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `transfer(address,address,uint256,bool,bytes)` - Function selector: `0x760d9bba` @@ -683,8 +697,8 @@ Transfers an `amount` of tokens from the `from` address to the `to` address and :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `transferBatch(address[],address[],uint256[],bool[],bytes[])` - Function selector: `0x2d7667c9` @@ -718,8 +732,8 @@ Same as [`transfer(...)`](#`transfer) but transfer multiple tokens based on the :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferownership) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transferownership) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1174,8 +1188,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#datachanged) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#datachanged) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1202,15 +1216,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Event signature: `OperatorAuthorizationChanged(address,address,uint256,bytes)` - Event topic hash: `0xf772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, uint256 indexed amount, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + uint256 indexed amount, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` for `amount` tokens. @@ -1230,15 +1249,20 @@ Emitted when `tokenOwner` enables `operator` for `amount` tokens. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Event signature: `OperatorRevoked(address,address,bool,bytes)` - Event topic hash: `0x0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bool indexed notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bool indexed notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [`authorizedAmountFor(...)`](#`authorizedamountfor) to `0`. @@ -1258,15 +1282,18 @@ Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [` :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1282,15 +1309,22 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transfer) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Event signature: `Transfer(address,address,address,uint256,bool,bytes)` - Event topic hash: `0x3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a6` ::: ```solidity -event Transfer(address indexed operator, address indexed from, address indexed to, uint256 amount, bool force, bytes data); +event Transfer( + address indexed operator, + address indexed from, + address indexed to, + uint256 amount, + bool force, + bytes data +); ``` Emitted when the `from` transferred successfully `amount` of tokens to `to`. @@ -1314,8 +1348,8 @@ Emitted when the `from` transferred successfully `amount` of tokens to `to`. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1333,8 +1367,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1352,8 +1386,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1371,8 +1405,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1396,8 +1430,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1421,8 +1455,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1440,8 +1474,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1459,8 +1493,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1478,8 +1512,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7AmountExceedsAuthorizedAmount(address,uint256,address,uint256)` - Error hash: `0xf3a6b691` @@ -1511,8 +1545,8 @@ reverts when `operator` of `tokenOwner` send an `amount` of tokens larger than t :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7AmountExceedsBalance(uint256,address,uint256)` - Error hash: `0x08d47949` @@ -1542,8 +1576,8 @@ reverts when sending an `amount` of tokens larger than the current `balance` of :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7BatchCallFailed(uint256)` - Error hash: `0xb774c284` @@ -1565,12 +1599,35 @@ Reverts when a batch call failed.
+# <<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/LSP7DigitalAsset.md + +### LSP7CannotSendToSelf + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) +- Error signature: `LSP7CannotSendToSelf()` +- Error hash: `0xb9afb000` + +::: + +```solidity +error LSP7CannotSendToSelf(); +``` + +reverts when specifying the same address for `from` or `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.md + ### LSP7CannotSendWithAddressZero :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7CannotSendWithAddressZero()` - Error hash: `0xd2d5ec30` @@ -1594,8 +1651,8 @@ reverts when trying to: :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7CannotUseAddressZeroAsOperator()` - Error hash: `0x6355e766` @@ -1644,8 +1701,8 @@ Reverts when the call to decrease allowance is not authorized. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7DecreasedAllowanceBelowZero()` - Error hash: `0x0ef76c35` @@ -1663,8 +1720,8 @@ Reverts when trying to decrease an operator's allowance to more than its current :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7InvalidTransferBatch()` - Error hash: `0x263eee8d` @@ -1682,8 +1739,8 @@ reverts when the array parameters used in [`transferBatch`](#transferbatch) have :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0xa608fbb6` @@ -1709,8 +1766,8 @@ reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7NotifyTokenReceiverIsEOA(address)` - Error hash: `0x26c247f4` @@ -1765,8 +1822,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7TokenContractCannotHoldValue()` - Error hash: `0x388f5adc` @@ -1786,8 +1843,8 @@ Error occurs when sending native tokens to the LSP7 contract without sending any :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `LSP7TokenOwnerCannotBeOperator()` - Error hash: `0xdab75047` @@ -1805,8 +1862,8 @@ reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -1830,8 +1887,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `OperatorAllowanceCannotBeIncreasedFromZero(address)` - Error hash: `0xcba6e977` @@ -1855,8 +1912,8 @@ Reverts when token owner call [`increaseAllowance`](#increaseallowance) for an o :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -1880,8 +1937,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP7DigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md b/docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.md similarity index 85% rename from docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md rename to docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.md index 6650eee99..8978db911 100644 --- a/docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md +++ b/docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-7-DigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md) +[`LSP-7-DigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md) ::: :::info Solidity implementation -[`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +[`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) ::: @@ -25,8 +25,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#fallback) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#fallback) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) ::: @@ -60,8 +60,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#receive) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#receive) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) ::: @@ -79,8 +79,8 @@ Reverts whenever someone tries to send native tokens to a LSP7 contract. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `authorizeOperator(address,uint256,bytes)` - Function selector: `0xb49506fd` @@ -116,8 +116,8 @@ Sets an `amount` of tokens that an `operator` has access from the caller's balan :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `authorizedAmountFor(address,address)` - Function selector: `0x65aeaa95` @@ -151,8 +151,8 @@ Get the amount of tokens `operator` address has access to from `tokenOwner`. Ope :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#balanceof) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#balanceof) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -182,8 +182,8 @@ Get the number of tokens owned by `tokenOwner`. If the token is divisible (the [ :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -221,8 +221,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#burn) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#burn) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `burn(address,uint256,bytes)` - Function selector: `0x44d17187` @@ -248,8 +248,8 @@ See internal [`_burn`](#_burn) function for details. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decimals) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#decimals) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `decimals()` - Function selector: `0x313ce567` @@ -273,10 +273,17 @@ Returns the number of decimals used to get its user representation. If the asset :::note References +<<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md + - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) - Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) - Function signature: `decreaseAllowance(address,address,uint256,bytes)` -- Function selector: `0x78381670` +- # Function selector: `0x78381670` +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) +- Function signature: `decreaseAllowance(address,uint256,bytes)` +- Function selector: `0x7b204c4e` + > > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.md ::: @@ -308,8 +315,8 @@ Atomically decreases the allowance granted to `operator` by the caller. This is :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdata) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getdata) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -341,8 +348,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -376,8 +383,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `getOperatorsOf(address)` - Function selector: `0xd72fc29a` @@ -407,8 +414,8 @@ Returns all `operator` addresses that are allowed to transfer or burn on behalf :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `increaseAllowance(address,uint256,bytes)` - Function selector: `0x2bc1da82` @@ -440,8 +447,8 @@ Atomically increases the allowance granted to `operator` by the caller. This is :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#owner) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#owner) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -465,8 +472,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -484,10 +491,17 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References +<<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md + - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) - Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) - Function signature: `revokeOperator(address,address,bool,bytes)` -- Function selector: `0x30d0dc37` +- # Function selector: `0x30d0dc37` +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) +- Function signature: `revokeOperator(address,bool,bytes)` +- Function selector: `0x4521748e` + > > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.md ::: @@ -517,8 +531,8 @@ Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdata) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#setdata) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -567,8 +581,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -617,8 +631,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -648,8 +662,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -673,8 +687,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transfer) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `transfer(address,address,uint256,bool,bytes)` - Function selector: `0x760d9bba` @@ -708,8 +722,8 @@ Transfers an `amount` of tokens from the `from` address to the `to` address and :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `transferBatch(address[],address[],uint256[],bool[],bytes[])` - Function selector: `0x2d7667c9` @@ -743,8 +757,8 @@ Same as [`transfer(...)`](#`transfer) but transfer multiple tokens based on the :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferownership) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transferownership) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1199,8 +1213,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#datachanged) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#datachanged) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1227,15 +1241,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Event signature: `OperatorAuthorizationChanged(address,address,uint256,bytes)` - Event topic hash: `0xf772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, uint256 indexed amount, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + uint256 indexed amount, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` for `amount` tokens. @@ -1255,15 +1274,20 @@ Emitted when `tokenOwner` enables `operator` for `amount` tokens. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Event signature: `OperatorRevoked(address,address,bool,bytes)` - Event topic hash: `0x0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bool indexed notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bool indexed notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [`authorizedAmountFor(...)`](#`authorizedamountfor) to `0`. @@ -1283,15 +1307,18 @@ Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [` :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1307,15 +1334,22 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transfer) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Event signature: `Transfer(address,address,address,uint256,bool,bytes)` - Event topic hash: `0x3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a6` ::: ```solidity -event Transfer(address indexed operator, address indexed from, address indexed to, uint256 amount, bool force, bytes data); +event Transfer( + address indexed operator, + address indexed from, + address indexed to, + uint256 amount, + bool force, + bytes data +); ``` Emitted when the `from` transferred successfully `amount` of tokens to `to`. @@ -1339,8 +1373,8 @@ Emitted when the `from` transferred successfully `amount` of tokens to `to`. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1358,8 +1392,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1377,8 +1411,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1396,8 +1430,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1421,8 +1455,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1446,8 +1480,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1465,8 +1499,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1484,8 +1518,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1503,8 +1537,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7AmountExceedsAuthorizedAmount(address,uint256,address,uint256)` - Error hash: `0xf3a6b691` @@ -1536,8 +1570,8 @@ reverts when `operator` of `tokenOwner` send an `amount` of tokens larger than t :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7AmountExceedsBalance(uint256,address,uint256)` - Error hash: `0x08d47949` @@ -1567,8 +1601,8 @@ reverts when sending an `amount` of tokens larger than the current `balance` of :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7BatchCallFailed(uint256)` - Error hash: `0xb774c284` @@ -1590,12 +1624,35 @@ Reverts when a batch call failed.
+# <<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.md + +### LSP7CannotSendToSelf + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) +- Error signature: `LSP7CannotSendToSelf()` +- Error hash: `0xb9afb000` + +::: + +```solidity +error LSP7CannotSendToSelf(); +``` + +reverts when specifying the same address for `from` or `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.md + ### LSP7CannotSendWithAddressZero :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7CannotSendWithAddressZero()` - Error hash: `0xd2d5ec30` @@ -1619,8 +1676,8 @@ reverts when trying to: :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7CannotUseAddressZeroAsOperator()` - Error hash: `0x6355e766` @@ -1669,8 +1726,8 @@ Reverts when the call to decrease allowance is not authorized. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7DecreasedAllowanceBelowZero()` - Error hash: `0x0ef76c35` @@ -1688,8 +1745,8 @@ Reverts when trying to decrease an operator's allowance to more than its current :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7InvalidTransferBatch()` - Error hash: `0x263eee8d` @@ -1707,8 +1764,8 @@ reverts when the array parameters used in [`transferBatch`](#transferbatch) have :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0xa608fbb6` @@ -1734,8 +1791,8 @@ reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7NotifyTokenReceiverIsEOA(address)` - Error hash: `0x26c247f4` @@ -1790,8 +1847,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7TokenContractCannotHoldValue()` - Error hash: `0x388f5adc` @@ -1811,8 +1868,8 @@ Error occurs when sending native tokens to the LSP7 contract without sending any :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `LSP7TokenOwnerCannotBeOperator()` - Error hash: `0xdab75047` @@ -1830,8 +1887,8 @@ reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -1855,8 +1912,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `OperatorAllowanceCannotBeIncreasedFromZero(address)` - Error hash: `0xcba6e977` @@ -1880,8 +1937,8 @@ Reverts when token owner call [`increaseAllowance`](#increaseallowance) for an o :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -1905,8 +1962,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP7Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md b/docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.md similarity index 84% rename from docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md rename to docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.md index c70451ebe..9a980e015 100644 --- a/docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md +++ b/docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-7-DigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md) +[`LSP-7-DigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md) ::: :::info Solidity implementation -[`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +[`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) ::: @@ -25,8 +25,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#fallback) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#fallback) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) ::: @@ -60,8 +60,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#receive) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#receive) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) ::: @@ -79,8 +79,8 @@ Reverts whenever someone tries to send native tokens to a LSP7 contract. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `authorizeOperator(address,uint256,bytes)` - Function selector: `0xb49506fd` @@ -116,8 +116,8 @@ Sets an `amount` of tokens that an `operator` has access from the caller's balan :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `authorizedAmountFor(address,address)` - Function selector: `0x65aeaa95` @@ -151,8 +151,8 @@ Get the amount of tokens `operator` address has access to from `tokenOwner`. Ope :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#balanceof) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#balanceof) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -182,8 +182,8 @@ Get the number of tokens owned by `tokenOwner`. If the token is divisible (the [ :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -221,8 +221,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decimals) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#decimals) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `decimals()` - Function selector: `0x313ce567` @@ -246,10 +246,17 @@ Returns the number of decimals used to get its user representation. If the asset :::note References +<<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md + - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) - Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) - Function signature: `decreaseAllowance(address,address,uint256,bytes)` -- Function selector: `0x78381670` +- # Function selector: `0x78381670` +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) +- Function signature: `decreaseAllowance(address,uint256,bytes)` +- Function selector: `0x7b204c4e` + > > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.md ::: @@ -281,8 +288,8 @@ Atomically decreases the allowance granted to `operator` by the caller. This is :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdata) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getdata) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -314,8 +321,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -349,8 +356,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `getOperatorsOf(address)` - Function selector: `0xd72fc29a` @@ -380,8 +387,8 @@ Returns all `operator` addresses that are allowed to transfer or burn on behalf :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `increaseAllowance(address,uint256,bytes)` - Function selector: `0x2bc1da82` @@ -413,8 +420,8 @@ Atomically increases the allowance granted to `operator` by the caller. This is :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#owner) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#owner) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -438,8 +445,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -457,10 +464,17 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References +<<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md + - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) - Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) - Function signature: `revokeOperator(address,address,bool,bytes)` -- Function selector: `0x30d0dc37` +- # Function selector: `0x30d0dc37` +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) +- Function signature: `revokeOperator(address,bool,bytes)` +- Function selector: `0x4521748e` + > > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.md ::: @@ -490,8 +504,8 @@ Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdata) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#setdata) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -540,8 +554,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -590,8 +604,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -621,8 +635,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#tokensupplycap) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#tokensupplycap) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `tokenSupplyCap()` - Function selector: `0x52058d8a` @@ -648,8 +662,8 @@ Get the maximum number of tokens that can exist to circulate. Once [`totalSupply :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -673,8 +687,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transfer) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `transfer(address,address,uint256,bool,bytes)` - Function selector: `0x760d9bba` @@ -708,8 +722,8 @@ Transfers an `amount` of tokens from the `from` address to the `to` address and :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `transferBatch(address[],address[],uint256[],bool[],bytes[])` - Function selector: `0x2d7667c9` @@ -743,8 +757,8 @@ Same as [`transfer(...)`](#`transfer) but transfer multiple tokens based on the :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferownership) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transferownership) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1173,8 +1187,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#datachanged) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#datachanged) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1201,15 +1215,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Event signature: `OperatorAuthorizationChanged(address,address,uint256,bytes)` - Event topic hash: `0xf772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, uint256 indexed amount, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + uint256 indexed amount, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` for `amount` tokens. @@ -1229,15 +1248,20 @@ Emitted when `tokenOwner` enables `operator` for `amount` tokens. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Event signature: `OperatorRevoked(address,address,bool,bytes)` - Event topic hash: `0x0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bool indexed notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bool indexed notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [`authorizedAmountFor(...)`](#`authorizedamountfor) to `0`. @@ -1257,15 +1281,18 @@ Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [` :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1281,15 +1308,22 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transfer) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Event signature: `Transfer(address,address,address,uint256,bool,bytes)` - Event topic hash: `0x3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a6` ::: ```solidity -event Transfer(address indexed operator, address indexed from, address indexed to, uint256 amount, bool force, bytes data); +event Transfer( + address indexed operator, + address indexed from, + address indexed to, + uint256 amount, + bool force, + bytes data +); ``` Emitted when the `from` transferred successfully `amount` of tokens to `to`. @@ -1313,8 +1347,8 @@ Emitted when the `from` transferred successfully `amount` of tokens to `to`. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1332,8 +1366,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1351,8 +1385,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1370,8 +1404,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1395,8 +1429,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1420,8 +1454,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1439,8 +1473,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1458,8 +1492,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1477,8 +1511,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7AmountExceedsAuthorizedAmount(address,uint256,address,uint256)` - Error hash: `0xf3a6b691` @@ -1510,8 +1544,8 @@ reverts when `operator` of `tokenOwner` send an `amount` of tokens larger than t :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7AmountExceedsBalance(uint256,address,uint256)` - Error hash: `0x08d47949` @@ -1541,8 +1575,8 @@ reverts when sending an `amount` of tokens larger than the current `balance` of :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7BatchCallFailed(uint256)` - Error hash: `0xb774c284` @@ -1564,12 +1598,35 @@ Reverts when a batch call failed.
+# <<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.md + +### LSP7CannotSendToSelf + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) +- Error signature: `LSP7CannotSendToSelf()` +- Error hash: `0xb9afb000` + +::: + +```solidity +error LSP7CannotSendToSelf(); +``` + +reverts when specifying the same address for `from` or `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.md + ### LSP7CannotSendWithAddressZero :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7CannotSendWithAddressZero()` - Error hash: `0xd2d5ec30` @@ -1593,8 +1650,8 @@ reverts when trying to: :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7CannotUseAddressZeroAsOperator()` - Error hash: `0x6355e766` @@ -1612,8 +1669,8 @@ reverts when trying to set the zero address as an operator. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cappedsupplycannotmintovercap) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cappedsupplycannotmintovercap) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7CappedSupplyCannotMintOverCap()` - Error hash: `0xeacbf0d1` @@ -1633,8 +1690,8 @@ Reverts when trying to mint tokens but the [`totalSupply`](#totalsupply) has rea :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cappedsupplyrequired) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cappedsupplyrequired) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7CappedSupplyRequired()` - Error hash: `0xacf1d8c5` @@ -1685,8 +1742,8 @@ Reverts when the call to decrease allowance is not authorized. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7DecreasedAllowanceBelowZero()` - Error hash: `0x0ef76c35` @@ -1704,8 +1761,8 @@ Reverts when trying to decrease an operator's allowance to more than its current :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7InvalidTransferBatch()` - Error hash: `0x263eee8d` @@ -1723,8 +1780,8 @@ reverts when the array parameters used in [`transferBatch`](#transferbatch) have :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0xa608fbb6` @@ -1750,8 +1807,8 @@ reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7NotifyTokenReceiverIsEOA(address)` - Error hash: `0x26c247f4` @@ -1806,8 +1863,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7TokenContractCannotHoldValue()` - Error hash: `0x388f5adc` @@ -1827,8 +1884,8 @@ Error occurs when sending native tokens to the LSP7 contract without sending any :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `LSP7TokenOwnerCannotBeOperator()` - Error hash: `0xdab75047` @@ -1846,8 +1903,8 @@ reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -1871,8 +1928,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `OperatorAllowanceCannotBeIncreasedFromZero(address)` - Error hash: `0xcba6e977` @@ -1896,8 +1953,8 @@ Reverts when token owner call [`increaseAllowance`](#increaseallowance) for an o :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -1921,8 +1978,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP7CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md b/docs/contracts/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.md similarity index 85% rename from docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md rename to docs/contracts/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.md index eb1a125ae..d8c574a1f 100644 --- a/docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md +++ b/docs/contracts/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-7-DigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md) +[`LSP-7-DigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md) ::: :::info Solidity implementation -[`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +[`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) ::: @@ -25,8 +25,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#constructor) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#constructor) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) ::: @@ -40,7 +40,7 @@ constructor( ); ``` -_Deploying a `LSP7Mintable` token contract with: token name = `name_`, token symbol = `symbol_`, and address `newOwner_` as the token contract owner._ +_Deploying a `LSP7Mintable` token contract with: token name = `name_`, token symbol = `symbol*`, and address `newOwner*` as the token contract owner.\_ #### Parameters @@ -58,8 +58,8 @@ _Deploying a `LSP7Mintable` token contract with: token name = `name_`, token sym :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#fallback) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#fallback) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) ::: @@ -93,8 +93,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#receive) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#receive) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) ::: @@ -112,8 +112,8 @@ Reverts whenever someone tries to send native tokens to a LSP7 contract. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `authorizeOperator(address,uint256,bytes)` - Function selector: `0xb49506fd` @@ -149,8 +149,8 @@ Sets an `amount` of tokens that an `operator` has access from the caller's balan :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#authorizedamountfor) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `authorizedAmountFor(address,address)` - Function selector: `0x65aeaa95` @@ -184,8 +184,8 @@ Get the amount of tokens `operator` address has access to from `tokenOwner`. Ope :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#balanceof) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#balanceof) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -215,8 +215,8 @@ Get the number of tokens owned by `tokenOwner`. If the token is divisible (the [ :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -254,8 +254,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decimals) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#decimals) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `decimals()` - Function selector: `0x313ce567` @@ -279,10 +279,17 @@ Returns the number of decimals used to get its user representation. If the asset :::note References +<<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md + - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) - Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) - Function signature: `decreaseAllowance(address,address,uint256,bytes)` -- Function selector: `0x78381670` +- # Function selector: `0x78381670` +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#decreaseallowance) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) +- Function signature: `decreaseAllowance(address,uint256,bytes)` +- Function selector: `0x7b204c4e` + > > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.md ::: @@ -314,8 +321,8 @@ Atomically decreases the allowance granted to `operator` by the caller. This is :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdata) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getdata) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -347,8 +354,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -382,8 +389,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `getOperatorsOf(address)` - Function selector: `0xd72fc29a` @@ -413,8 +420,8 @@ Returns all `operator` addresses that are allowed to transfer or burn on behalf :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#increaseallowance) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `increaseAllowance(address,uint256,bytes)` - Function selector: `0x2bc1da82` @@ -446,8 +453,8 @@ Atomically increases the allowance granted to `operator` by the caller. This is :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#mint) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#mint) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `mint(address,uint256,bool,bytes)` - Function selector: `0x7580d920` @@ -479,8 +486,8 @@ Public [`_mint`](#_mint) function only callable by the [`owner`](#owner). :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#owner) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#owner) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -504,8 +511,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -523,10 +530,17 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References +<<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md + - Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) - Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) - Function signature: `revokeOperator(address,address,bool,bytes)` -- Function selector: `0x30d0dc37` +- # Function selector: `0x30d0dc37` +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) +- Function signature: `revokeOperator(address,bool,bytes)` +- Function selector: `0x4521748e` + > > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.md ::: @@ -556,8 +570,8 @@ Enables `tokenOwner` to remove `operator` for its tokens, disallowing it to send :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdata) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#setdata) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -606,8 +620,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -656,8 +670,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -687,8 +701,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -712,8 +726,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transfer) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `transfer(address,address,uint256,bool,bytes)` - Function selector: `0x760d9bba` @@ -747,8 +761,8 @@ Transfers an `amount` of tokens from the `from` address to the `to` address and :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `transferBatch(address[],address[],uint256[],bool[],bytes[])` - Function selector: `0x2d7667c9` @@ -782,8 +796,8 @@ Same as [`transfer(...)`](#`transfer) but transfer multiple tokens based on the :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transferownership) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transferownership) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1238,8 +1252,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#datachanged) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#datachanged) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1266,15 +1280,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Event signature: `OperatorAuthorizationChanged(address,address,uint256,bytes)` - Event topic hash: `0xf772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, uint256 indexed amount, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + uint256 indexed amount, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` for `amount` tokens. @@ -1294,15 +1313,20 @@ Emitted when `tokenOwner` enables `operator` for `amount` tokens. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Event signature: `OperatorRevoked(address,address,bool,bytes)` - Event topic hash: `0x0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bool indexed notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bool indexed notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [`authorizedAmountFor(...)`](#`authorizedamountfor) to `0`. @@ -1322,15 +1346,18 @@ Emitted when `tokenOwner` disables `operator` for `amount` tokens and set its [` :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1346,15 +1373,22 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#transfer) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#transfer) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Event signature: `Transfer(address,address,address,uint256,bool,bytes)` - Event topic hash: `0x3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a6` ::: ```solidity -event Transfer(address indexed operator, address indexed from, address indexed to, uint256 amount, bool force, bytes data); +event Transfer( + address indexed operator, + address indexed from, + address indexed to, + uint256 amount, + bool force, + bytes data +); ``` Emitted when the `from` transferred successfully `amount` of tokens to `to`. @@ -1378,8 +1412,8 @@ Emitted when the `from` transferred successfully `amount` of tokens to `to`. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1397,8 +1431,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1416,8 +1450,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1435,8 +1469,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1460,8 +1494,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1485,8 +1519,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1504,8 +1538,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1523,8 +1557,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1542,8 +1576,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsauthorizedamount) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7AmountExceedsAuthorizedAmount(address,uint256,address,uint256)` - Error hash: `0xf3a6b691` @@ -1575,8 +1609,8 @@ reverts when `operator` of `tokenOwner` send an `amount` of tokens larger than t :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7amountexceedsbalance) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7AmountExceedsBalance(uint256,address,uint256)` - Error hash: `0x08d47949` @@ -1606,8 +1640,8 @@ reverts when sending an `amount` of tokens larger than the current `balance` of :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7batchcallfailed) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7BatchCallFailed(uint256)` - Error hash: `0xb774c284` @@ -1629,12 +1663,35 @@ Reverts when a batch call failed.
+# <<<<<<< HEAD:docs/contracts/LSP7DigitalAsset/presets/LSP7Mintable.md + +### LSP7CannotSendToSelf + +:::note References + +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendtoself) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) +- Error signature: `LSP7CannotSendToSelf()` +- Error hash: `0xb9afb000` + +::: + +```solidity +error LSP7CannotSendToSelf(); +``` + +reverts when specifying the same address for `from` or `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.md + ### LSP7CannotSendWithAddressZero :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotsendwithaddresszero) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7CannotSendWithAddressZero()` - Error hash: `0xd2d5ec30` @@ -1658,8 +1715,8 @@ reverts when trying to: :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7CannotUseAddressZeroAsOperator()` - Error hash: `0x6355e766` @@ -1708,8 +1765,8 @@ Reverts when the call to decrease allowance is not authorized. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7decreasedallowancebelowzero) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7DecreasedAllowanceBelowZero()` - Error hash: `0x0ef76c35` @@ -1727,8 +1784,8 @@ Reverts when trying to decrease an operator's allowance to more than its current :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7invalidtransferbatch) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7InvalidTransferBatch()` - Error hash: `0x263eee8d` @@ -1746,8 +1803,8 @@ reverts when the array parameters used in [`transferBatch`](#transferbatch) have :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0xa608fbb6` @@ -1773,8 +1830,8 @@ reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7notifytokenreceiveriseoa) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7NotifyTokenReceiverIsEOA(address)` - Error hash: `0x26c247f4` @@ -1829,8 +1886,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokencontractcannotholdvalue) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7TokenContractCannotHoldValue()` - Error hash: `0x388f5adc` @@ -1850,8 +1907,8 @@ Error occurs when sending native tokens to the LSP7 contract without sending any :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#lsp7tokenownercannotbeoperator) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `LSP7TokenOwnerCannotBeOperator()` - Error hash: `0xdab75047` @@ -1869,8 +1926,8 @@ reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -1894,8 +1951,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#operatorallowancecannotbeincreasedfromzero) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `OperatorAllowanceCannotBeIncreasedFromZero(address)` - Error hash: `0xcba6e977` @@ -1919,8 +1976,8 @@ Reverts when token owner call [`increaseAllowance`](#increaseallowance) for an o :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -1944,8 +2001,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol) +- Specification details: [**LSP-7-DigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-7-DigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP7Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md b/docs/contracts/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.md similarity index 88% rename from docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md rename to docs/contracts/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.md index 227f072ba..069c0693a 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md +++ b/docs/contracts/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) +[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) ::: :::info Solidity implementation -[`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +[`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) ::: @@ -27,8 +27,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) ::: @@ -62,8 +62,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) ::: @@ -81,8 +81,8 @@ Reverts whenever someone tries to send native tokens to a LSP8 contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `authorizeOperator(address,bytes32,bytes)` - Function selector: `0x86a10ddd` @@ -112,8 +112,8 @@ Allow an `operator` address to transfer or burn a specific `tokenId` on behalf o :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -143,8 +143,8 @@ Get the number of token IDs owned by `tokenOwner`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -182,8 +182,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -215,8 +215,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -250,8 +250,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `getDataBatchForTokenIds(bytes32[],bytes32[])` - Function selector: `0x1d26fce6` @@ -285,8 +285,8 @@ _Retrieves data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `getDataForTokenId(bytes32,bytes32)` - Function selector: `0x16e023b3` @@ -320,8 +320,8 @@ _Retrieves data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `getOperatorsOf(bytes32)` - Function selector: `0x49a6078d` @@ -351,8 +351,8 @@ Returns all `operator` addresses that are allowed to transfer or burn a specific :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `isOperatorFor(address,bytes32)` - Function selector: `0x2a3654a4` @@ -386,8 +386,8 @@ Returns whether `operator` address is an operator for a given `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -411,8 +411,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -430,8 +430,8 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `revokeOperator(address,bytes32,bool,bytes)` - Function selector: `0xdb8c9663` @@ -463,8 +463,8 @@ Remove access of `operator` for a given `tokenId`, disallowing it to transfer `t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -513,8 +513,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -563,8 +563,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `setDataBatchForTokenIds(bytes32[],bytes32[],bytes[])` - Function selector: `0xbe9f0e6f` @@ -594,8 +594,8 @@ _Sets data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `setDataForTokenId(bytes32,bytes32,bytes)` - Function selector: `0xd6c1407c` @@ -625,8 +625,8 @@ _Sets data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -656,8 +656,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `tokenIdsOf(address)` - Function selector: `0xa3b261f2` @@ -687,8 +687,8 @@ Returns the list of token IDs that the `tokenOwner` address owns. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `tokenOwnerOf(bytes32)` - Function selector: `0x217b2270` @@ -718,8 +718,8 @@ Returns the list of `tokenIds` for the `tokenOwner` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -743,8 +743,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `transfer(address,address,bytes32,bool,bytes)` - Function selector: `0x511b6952` @@ -778,8 +778,8 @@ Transfer a given `tokenId` token from the `from` address to the `to` address. If :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `transferBatch(address[],address[],bytes32[],bool[],bytes[])` - Function selector: `0x7e87632c` @@ -813,8 +813,8 @@ Transfers multiple tokens at once based on the arrays of `from`, `to` and `token :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1356,8 +1356,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1384,15 +1384,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Event signature: `OperatorAuthorizationChanged(address,address,bytes32,bytes)` - Event topic hash: `0x1b1b58aa2ec0cec2228b2d37124556d41f5a1f7b12f089171f896cc236671215` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. @@ -1412,15 +1417,21 @@ Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Event signature: `OperatorRevoked(address,address,bytes32,bool,bytes)` - Event topic hash: `0xc78cd419d6136f9f1c1c6aec1d3fae098cffaf8bc86314a8f2685e32fe574e3c` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bool notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bool notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on its behalf. @@ -1441,15 +1452,18 @@ Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on i :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1465,15 +1479,19 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Event signature: `TokenIdDataChanged(bytes32,bytes32,bytes)` - Event topic hash: `0xa6e4251f855f750545fe414f120db91c76b88def14d120969e5bb2d3f05debbb` ::: ```solidity -event TokenIdDataChanged(bytes32 indexed tokenId, bytes32 indexed dataKey, bytes dataValue); +event TokenIdDataChanged( + bytes32 indexed tokenId, + bytes32 indexed dataKey, + bytes dataValue +); ``` Emitted when setting data for `tokenId`. @@ -1492,15 +1510,22 @@ Emitted when setting data for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Event signature: `Transfer(address,address,address,bytes32,bool,bytes)` - Event topic hash: `0xb333c813a7426a7a11e2b190cad52c44119421594b47f6f32ace6d8c7207b2bf` ::: ```solidity -event Transfer(address operator, address indexed from, address indexed to, bytes32 indexed tokenId, bool force, bytes data); +event Transfer( + address operator, + address indexed from, + address indexed to, + bytes32 indexed tokenId, + bool force, + bytes data +); ``` Emitted when `tokenId` token is transferred from the `from` to the `to` address. @@ -1524,8 +1549,8 @@ Emitted when `tokenId` token is transferred from the `from` to the `to` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1543,8 +1568,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1562,8 +1587,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1581,8 +1606,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1606,8 +1631,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1631,8 +1656,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1650,8 +1675,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1669,8 +1694,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1688,8 +1713,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8BatchCallFailed(uint256)` - Error hash: `0x234eb819` @@ -1715,8 +1740,8 @@ Reverts when a batch call failed. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8CannotSendToAddressZero()` - Error hash: `0x24ecef4d` @@ -1730,12 +1755,35 @@ Reverts when trying to send token to the zero address.
+# <<<<<<< HEAD:docs/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.md + +### LSP8CannotSendToSelf + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) +- Error signature: `LSP8CannotSendToSelf()` +- Error hash: `0x5d67d6c1` + +::: + +```solidity +error LSP8CannotSendToSelf(); +``` + +Reverts when specifying the same address for `from` and `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.md + ### LSP8CannotUseAddressZeroAsOperator :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8CannotUseAddressZeroAsOperator()` - Error hash: `0x9577b8b3` @@ -1753,8 +1801,8 @@ Reverts when trying to set the zero address as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8InvalidTransferBatch()` - Error hash: `0x93a83119` @@ -1772,8 +1820,8 @@ Reverts when the parameters used for `transferBatch` have different lengths. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8NonExistentTokenId(bytes32)` - Error hash: `0xae8f9a36` @@ -1797,8 +1845,8 @@ Reverts when `tokenId` has not been minted. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8NonExistingOperator(address,bytes32)` - Error hash: `0x4aa31a8c` @@ -1823,8 +1871,8 @@ Reverts when `operator` is not an operator for the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8NotTokenOperator(bytes32,address)` - Error hash: `0x1294d2a9` @@ -1849,8 +1897,8 @@ Reverts when `caller` is not an allowed operator for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8NotTokenOwner(address,bytes32,address)` - Error hash: `0x5b271ea2` @@ -1876,8 +1924,8 @@ Reverts when `caller` is not the `tokenOwner` of the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0x4349776d` @@ -1903,8 +1951,8 @@ Reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8NotifyTokenReceiverIsEOA(address)` - Error hash: `0x03173137` @@ -1928,8 +1976,8 @@ Reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8OperatorAlreadyAuthorized(address,bytes32)` - Error hash: `0xa7626b68` @@ -1985,8 +2033,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8TokenContractCannotHoldValue()` - Error hash: `0x61f49442` @@ -2006,8 +2054,8 @@ Error occurs when sending native tokens to the LSP8 contract without sending any :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8TokenIdFormatNotEditable()` - Error hash: `0x3664800a` @@ -2025,8 +2073,8 @@ Reverts when trying to edit the data key `LSP8TokenIdFormat` after the identifia :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8TokenIdsDataEmptyArray()` - Error hash: `0x80c98305` @@ -2044,8 +2092,8 @@ Reverts when empty arrays is passed to the function :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8TokenIdsDataLengthMismatch()` - Error hash: `0x2fa71dfe` @@ -2063,8 +2111,8 @@ Reverts when the length of the token IDs data arrays is not equal :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8TokenOwnerCannotBeOperator()` - Error hash: `0x89fdad62` @@ -2082,8 +2130,8 @@ Reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` - Error hash: `0x5a9c31d3` @@ -2113,8 +2161,8 @@ Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_befor :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -2138,8 +2186,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -2163,8 +2211,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP8IdentifiableDigitalAsset.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md b/docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.md similarity index 85% rename from docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md rename to docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.md index 86f50029d..5c095d268 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md +++ b/docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) +[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) ::: :::info Solidity implementation -[`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +[`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) ::: @@ -25,8 +25,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) ::: @@ -60,8 +60,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) ::: @@ -79,8 +79,8 @@ Reverts whenever someone tries to send native tokens to a LSP8 contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `authorizeOperator(address,bytes32,bytes)` - Function selector: `0x86a10ddd` @@ -110,8 +110,8 @@ Allow an `operator` address to transfer or burn a specific `tokenId` on behalf o :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -141,8 +141,8 @@ Get the number of token IDs owned by `tokenOwner`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -180,8 +180,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#burn) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#burn) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `burn(bytes32,bytes)` - Function selector: `0x6c79b70b` @@ -208,8 +208,8 @@ See internal [`_burn`](#_burn) function for details. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -241,8 +241,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -276,8 +276,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `getDataBatchForTokenIds(bytes32[],bytes32[])` - Function selector: `0x1d26fce6` @@ -311,8 +311,8 @@ _Retrieves data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `getDataForTokenId(bytes32,bytes32)` - Function selector: `0x16e023b3` @@ -346,8 +346,8 @@ _Retrieves data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `getOperatorsOf(bytes32)` - Function selector: `0x49a6078d` @@ -377,8 +377,8 @@ Returns all `operator` addresses that are allowed to transfer or burn a specific :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `isOperatorFor(address,bytes32)` - Function selector: `0x2a3654a4` @@ -412,8 +412,8 @@ Returns whether `operator` address is an operator for a given `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -437,8 +437,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -456,8 +456,8 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `revokeOperator(address,bytes32,bool,bytes)` - Function selector: `0xdb8c9663` @@ -489,8 +489,8 @@ Remove access of `operator` for a given `tokenId`, disallowing it to transfer `t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -539,8 +539,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -589,8 +589,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `setDataBatchForTokenIds(bytes32[],bytes32[],bytes[])` - Function selector: `0xbe9f0e6f` @@ -620,8 +620,8 @@ _Sets data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `setDataForTokenId(bytes32,bytes32,bytes)` - Function selector: `0xd6c1407c` @@ -651,8 +651,8 @@ _Sets data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -682,8 +682,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `tokenIdsOf(address)` - Function selector: `0xa3b261f2` @@ -713,8 +713,8 @@ Returns the list of token IDs that the `tokenOwner` address owns. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `tokenOwnerOf(bytes32)` - Function selector: `0x217b2270` @@ -744,8 +744,8 @@ Returns the list of `tokenIds` for the `tokenOwner` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -769,8 +769,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `transfer(address,address,bytes32,bool,bytes)` - Function selector: `0x511b6952` @@ -804,8 +804,8 @@ Transfer a given `tokenId` token from the `from` address to the `to` address. If :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `transferBatch(address[],address[],bytes32[],bool[],bytes[])` - Function selector: `0x7e87632c` @@ -839,8 +839,8 @@ Transfers multiple tokens at once based on the arrays of `from`, `to` and `token :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1382,8 +1382,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1410,15 +1410,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Event signature: `OperatorAuthorizationChanged(address,address,bytes32,bytes)` - Event topic hash: `0x1b1b58aa2ec0cec2228b2d37124556d41f5a1f7b12f089171f896cc236671215` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. @@ -1438,15 +1443,21 @@ Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Event signature: `OperatorRevoked(address,address,bytes32,bool,bytes)` - Event topic hash: `0xc78cd419d6136f9f1c1c6aec1d3fae098cffaf8bc86314a8f2685e32fe574e3c` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bool notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bool notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on its behalf. @@ -1467,15 +1478,18 @@ Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on i :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1491,15 +1505,19 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Event signature: `TokenIdDataChanged(bytes32,bytes32,bytes)` - Event topic hash: `0xa6e4251f855f750545fe414f120db91c76b88def14d120969e5bb2d3f05debbb` ::: ```solidity -event TokenIdDataChanged(bytes32 indexed tokenId, bytes32 indexed dataKey, bytes dataValue); +event TokenIdDataChanged( + bytes32 indexed tokenId, + bytes32 indexed dataKey, + bytes dataValue +); ``` Emitted when setting data for `tokenId`. @@ -1518,15 +1536,22 @@ Emitted when setting data for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Event signature: `Transfer(address,address,address,bytes32,bool,bytes)` - Event topic hash: `0xb333c813a7426a7a11e2b190cad52c44119421594b47f6f32ace6d8c7207b2bf` ::: ```solidity -event Transfer(address operator, address indexed from, address indexed to, bytes32 indexed tokenId, bool force, bytes data); +event Transfer( + address operator, + address indexed from, + address indexed to, + bytes32 indexed tokenId, + bool force, + bytes data +); ``` Emitted when `tokenId` token is transferred from the `from` to the `to` address. @@ -1550,8 +1575,8 @@ Emitted when `tokenId` token is transferred from the `from` to the `to` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1569,8 +1594,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1588,8 +1613,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1607,8 +1632,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1632,8 +1657,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1657,8 +1682,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1676,8 +1701,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1695,8 +1720,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1714,8 +1739,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8BatchCallFailed(uint256)` - Error hash: `0x234eb819` @@ -1741,8 +1766,8 @@ Reverts when a batch call failed. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8CannotSendToAddressZero()` - Error hash: `0x24ecef4d` @@ -1756,12 +1781,35 @@ Reverts when trying to send token to the zero address.
+# <<<<<<< HEAD:docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.md + +### LSP8CannotSendToSelf + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) +- Error signature: `LSP8CannotSendToSelf()` +- Error hash: `0x5d67d6c1` + +::: + +```solidity +error LSP8CannotSendToSelf(); +``` + +Reverts when specifying the same address for `from` and `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.md + ### LSP8CannotUseAddressZeroAsOperator :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8CannotUseAddressZeroAsOperator()` - Error hash: `0x9577b8b3` @@ -1779,8 +1827,8 @@ Reverts when trying to set the zero address as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8InvalidTransferBatch()` - Error hash: `0x93a83119` @@ -1798,8 +1846,8 @@ Reverts when the parameters used for `transferBatch` have different lengths. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8NonExistentTokenId(bytes32)` - Error hash: `0xae8f9a36` @@ -1823,8 +1871,8 @@ Reverts when `tokenId` has not been minted. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8NonExistingOperator(address,bytes32)` - Error hash: `0x4aa31a8c` @@ -1849,8 +1897,8 @@ Reverts when `operator` is not an operator for the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8NotTokenOperator(bytes32,address)` - Error hash: `0x1294d2a9` @@ -1875,8 +1923,8 @@ Reverts when `caller` is not an allowed operator for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8NotTokenOwner(address,bytes32,address)` - Error hash: `0x5b271ea2` @@ -1902,8 +1950,8 @@ Reverts when `caller` is not the `tokenOwner` of the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0x4349776d` @@ -1929,8 +1977,8 @@ Reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8NotifyTokenReceiverIsEOA(address)` - Error hash: `0x03173137` @@ -1954,8 +2002,8 @@ Reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8OperatorAlreadyAuthorized(address,bytes32)` - Error hash: `0xa7626b68` @@ -2011,8 +2059,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8TokenContractCannotHoldValue()` - Error hash: `0x61f49442` @@ -2032,8 +2080,8 @@ Error occurs when sending native tokens to the LSP8 contract without sending any :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8TokenIdFormatNotEditable()` - Error hash: `0x3664800a` @@ -2051,8 +2099,8 @@ Reverts when trying to edit the data key `LSP8TokenIdFormat` after the identifia :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8TokenIdsDataEmptyArray()` - Error hash: `0x80c98305` @@ -2070,8 +2118,8 @@ Reverts when empty arrays is passed to the function :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8TokenIdsDataLengthMismatch()` - Error hash: `0x2fa71dfe` @@ -2089,8 +2137,8 @@ Reverts when the length of the token IDs data arrays is not equal :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8TokenOwnerCannotBeOperator()` - Error hash: `0x89fdad62` @@ -2108,8 +2156,8 @@ Reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` - Error hash: `0x5a9c31d3` @@ -2139,8 +2187,8 @@ Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_befor :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -2164,8 +2212,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -2189,8 +2237,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP8Burnable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md b/docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.md similarity index 84% rename from docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md rename to docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.md index 7315d4377..5f0a88017 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md +++ b/docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) +[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) ::: :::info Solidity implementation -[`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +[`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) ::: @@ -25,8 +25,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) ::: @@ -60,8 +60,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) ::: @@ -79,8 +79,8 @@ Reverts whenever someone tries to send native tokens to a LSP8 contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `authorizeOperator(address,bytes32,bytes)` - Function selector: `0x86a10ddd` @@ -110,8 +110,8 @@ Allow an `operator` address to transfer or burn a specific `tokenId` on behalf o :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -141,8 +141,8 @@ Get the number of token IDs owned by `tokenOwner`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -180,8 +180,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -213,8 +213,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -248,8 +248,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `getDataBatchForTokenIds(bytes32[],bytes32[])` - Function selector: `0x1d26fce6` @@ -283,8 +283,8 @@ _Retrieves data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `getDataForTokenId(bytes32,bytes32)` - Function selector: `0x16e023b3` @@ -318,8 +318,8 @@ _Retrieves data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `getOperatorsOf(bytes32)` - Function selector: `0x49a6078d` @@ -349,8 +349,8 @@ Returns all `operator` addresses that are allowed to transfer or burn a specific :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `isOperatorFor(address,bytes32)` - Function selector: `0x2a3654a4` @@ -384,8 +384,8 @@ Returns whether `operator` address is an operator for a given `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -409,8 +409,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -428,8 +428,8 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `revokeOperator(address,bytes32,bool,bytes)` - Function selector: `0xdb8c9663` @@ -461,8 +461,8 @@ Remove access of `operator` for a given `tokenId`, disallowing it to transfer `t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -511,8 +511,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -561,8 +561,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `setDataBatchForTokenIds(bytes32[],bytes32[],bytes[])` - Function selector: `0xbe9f0e6f` @@ -592,8 +592,8 @@ _Sets data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `setDataForTokenId(bytes32,bytes32,bytes)` - Function selector: `0xd6c1407c` @@ -623,8 +623,8 @@ _Sets data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -654,8 +654,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `tokenIdsOf(address)` - Function selector: `0xa3b261f2` @@ -685,8 +685,8 @@ Returns the list of token IDs that the `tokenOwner` address owns. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `tokenOwnerOf(bytes32)` - Function selector: `0x217b2270` @@ -716,8 +716,8 @@ Returns the list of `tokenIds` for the `tokenOwner` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokensupplycap) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokensupplycap) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `tokenSupplyCap()` - Function selector: `0x52058d8a` @@ -743,8 +743,8 @@ Get the maximum number of tokens that can exist to circulate. Once [`totalSupply :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -768,8 +768,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `transfer(address,address,bytes32,bool,bytes)` - Function selector: `0x511b6952` @@ -803,8 +803,8 @@ Transfer a given `tokenId` token from the `from` address to the `to` address. If :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `transferBatch(address[],address[],bytes32[],bool[],bytes[])` - Function selector: `0x7e87632c` @@ -838,8 +838,8 @@ Transfers multiple tokens at once based on the arrays of `from`, `to` and `token :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1356,8 +1356,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1384,15 +1384,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Event signature: `OperatorAuthorizationChanged(address,address,bytes32,bytes)` - Event topic hash: `0x1b1b58aa2ec0cec2228b2d37124556d41f5a1f7b12f089171f896cc236671215` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. @@ -1412,15 +1417,21 @@ Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Event signature: `OperatorRevoked(address,address,bytes32,bool,bytes)` - Event topic hash: `0xc78cd419d6136f9f1c1c6aec1d3fae098cffaf8bc86314a8f2685e32fe574e3c` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bool notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bool notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on its behalf. @@ -1441,15 +1452,18 @@ Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on i :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1465,15 +1479,19 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Event signature: `TokenIdDataChanged(bytes32,bytes32,bytes)` - Event topic hash: `0xa6e4251f855f750545fe414f120db91c76b88def14d120969e5bb2d3f05debbb` ::: ```solidity -event TokenIdDataChanged(bytes32 indexed tokenId, bytes32 indexed dataKey, bytes dataValue); +event TokenIdDataChanged( + bytes32 indexed tokenId, + bytes32 indexed dataKey, + bytes dataValue +); ``` Emitted when setting data for `tokenId`. @@ -1492,15 +1510,22 @@ Emitted when setting data for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Event signature: `Transfer(address,address,address,bytes32,bool,bytes)` - Event topic hash: `0xb333c813a7426a7a11e2b190cad52c44119421594b47f6f32ace6d8c7207b2bf` ::: ```solidity -event Transfer(address operator, address indexed from, address indexed to, bytes32 indexed tokenId, bool force, bytes data); +event Transfer( + address operator, + address indexed from, + address indexed to, + bytes32 indexed tokenId, + bool force, + bytes data +); ``` Emitted when `tokenId` token is transferred from the `from` to the `to` address. @@ -1524,8 +1549,8 @@ Emitted when `tokenId` token is transferred from the `from` to the `to` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1543,8 +1568,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1562,8 +1587,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1581,8 +1606,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1606,8 +1631,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1631,8 +1656,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1650,8 +1675,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1669,8 +1694,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1688,8 +1713,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8BatchCallFailed(uint256)` - Error hash: `0x234eb819` @@ -1715,8 +1740,8 @@ Reverts when a batch call failed. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8CannotSendToAddressZero()` - Error hash: `0x24ecef4d` @@ -1730,12 +1755,35 @@ Reverts when trying to send token to the zero address.
+# <<<<<<< HEAD:docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.md + +### LSP8CannotSendToSelf + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) +- Error signature: `LSP8CannotSendToSelf()` +- Error hash: `0x5d67d6c1` + +::: + +```solidity +error LSP8CannotSendToSelf(); +``` + +Reverts when specifying the same address for `from` and `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.md + ### LSP8CannotUseAddressZeroAsOperator :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8CannotUseAddressZeroAsOperator()` - Error hash: `0x9577b8b3` @@ -1753,8 +1801,8 @@ Reverts when trying to set the zero address as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cappedsupplycannotmintovercap) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cappedsupplycannotmintovercap) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8CappedSupplyCannotMintOverCap()` - Error hash: `0xe8ba2291` @@ -1774,8 +1822,8 @@ Reverts when trying to mint tokens but the [`totalSupply`](#totalsupply) has rea :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cappedsupplyrequired) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cappedsupplyrequired) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8CappedSupplyRequired()` - Error hash: `0x38d9fc30` @@ -1795,8 +1843,8 @@ Reverts when setting `0` for the [`tokenSupplyCap`](#tokensupplycap). The max to :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8InvalidTransferBatch()` - Error hash: `0x93a83119` @@ -1814,8 +1862,8 @@ Reverts when the parameters used for `transferBatch` have different lengths. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8NonExistentTokenId(bytes32)` - Error hash: `0xae8f9a36` @@ -1839,8 +1887,8 @@ Reverts when `tokenId` has not been minted. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8NonExistingOperator(address,bytes32)` - Error hash: `0x4aa31a8c` @@ -1865,8 +1913,8 @@ Reverts when `operator` is not an operator for the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8NotTokenOperator(bytes32,address)` - Error hash: `0x1294d2a9` @@ -1891,8 +1939,8 @@ Reverts when `caller` is not an allowed operator for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8NotTokenOwner(address,bytes32,address)` - Error hash: `0x5b271ea2` @@ -1918,8 +1966,8 @@ Reverts when `caller` is not the `tokenOwner` of the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0x4349776d` @@ -1945,8 +1993,8 @@ Reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8NotifyTokenReceiverIsEOA(address)` - Error hash: `0x03173137` @@ -1970,8 +2018,8 @@ Reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8OperatorAlreadyAuthorized(address,bytes32)` - Error hash: `0xa7626b68` @@ -2027,8 +2075,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8TokenContractCannotHoldValue()` - Error hash: `0x61f49442` @@ -2048,8 +2096,8 @@ Error occurs when sending native tokens to the LSP8 contract without sending any :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8TokenIdFormatNotEditable()` - Error hash: `0x3664800a` @@ -2067,8 +2115,8 @@ Reverts when trying to edit the data key `LSP8TokenIdFormat` after the identifia :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8TokenIdsDataEmptyArray()` - Error hash: `0x80c98305` @@ -2086,8 +2134,8 @@ Reverts when empty arrays is passed to the function :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8TokenIdsDataLengthMismatch()` - Error hash: `0x2fa71dfe` @@ -2105,8 +2153,8 @@ Reverts when the length of the token IDs data arrays is not equal :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8TokenOwnerCannotBeOperator()` - Error hash: `0x89fdad62` @@ -2124,8 +2172,8 @@ Reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` - Error hash: `0x5a9c31d3` @@ -2155,8 +2203,8 @@ Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_befor :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -2180,8 +2228,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -2205,8 +2253,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP8CappedSupply.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md b/docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.md similarity index 85% rename from docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md rename to docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.md index e73d15af1..867411ece 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md +++ b/docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) +[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) ::: :::info Solidity implementation -[`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +[`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) ::: @@ -25,8 +25,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) ::: @@ -60,8 +60,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) ::: @@ -79,8 +79,8 @@ Reverts whenever someone tries to send native tokens to a LSP8 contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `authorizeOperator(address,bytes32,bytes)` - Function selector: `0x86a10ddd` @@ -110,8 +110,8 @@ Allow an `operator` address to transfer or burn a specific `tokenId` on behalf o :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -141,8 +141,8 @@ Get the number of token IDs owned by `tokenOwner`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -180,8 +180,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -213,8 +213,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -248,8 +248,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `getDataBatchForTokenIds(bytes32[],bytes32[])` - Function selector: `0x1d26fce6` @@ -283,8 +283,8 @@ _Retrieves data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `getDataForTokenId(bytes32,bytes32)` - Function selector: `0x16e023b3` @@ -318,8 +318,8 @@ _Retrieves data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `getOperatorsOf(bytes32)` - Function selector: `0x49a6078d` @@ -349,8 +349,8 @@ Returns all `operator` addresses that are allowed to transfer or burn a specific :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `isOperatorFor(address,bytes32)` - Function selector: `0x2a3654a4` @@ -384,8 +384,8 @@ Returns whether `operator` address is an operator for a given `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -409,8 +409,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -428,8 +428,8 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `revokeOperator(address,bytes32,bool,bytes)` - Function selector: `0xdb8c9663` @@ -461,8 +461,8 @@ Remove access of `operator` for a given `tokenId`, disallowing it to transfer `t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -511,8 +511,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -561,8 +561,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `setDataBatchForTokenIds(bytes32[],bytes32[],bytes[])` - Function selector: `0xbe9f0e6f` @@ -592,8 +592,8 @@ _Sets data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `setDataForTokenId(bytes32,bytes32,bytes)` - Function selector: `0xd6c1407c` @@ -623,8 +623,8 @@ _Sets data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -654,8 +654,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenat) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenat) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `tokenAt(uint256)` - Function selector: `0x92a91a3a` @@ -687,8 +687,8 @@ Returns a token id at index. See [`totalSupply`](#totalsupply) to get total numb :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `tokenIdsOf(address)` - Function selector: `0xa3b261f2` @@ -718,8 +718,8 @@ Returns the list of token IDs that the `tokenOwner` address owns. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `tokenOwnerOf(bytes32)` - Function selector: `0x217b2270` @@ -749,8 +749,8 @@ Returns the list of `tokenIds` for the `tokenOwner` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -774,8 +774,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `transfer(address,address,bytes32,bool,bytes)` - Function selector: `0x511b6952` @@ -809,8 +809,8 @@ Transfer a given `tokenId` token from the `from` address to the `to` address. If :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `transferBatch(address[],address[],bytes32[],bool[],bytes[])` - Function selector: `0x7e87632c` @@ -844,8 +844,8 @@ Transfers multiple tokens at once based on the arrays of `from`, `to` and `token :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1384,8 +1384,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1412,15 +1412,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Event signature: `OperatorAuthorizationChanged(address,address,bytes32,bytes)` - Event topic hash: `0x1b1b58aa2ec0cec2228b2d37124556d41f5a1f7b12f089171f896cc236671215` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. @@ -1440,15 +1445,21 @@ Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Event signature: `OperatorRevoked(address,address,bytes32,bool,bytes)` - Event topic hash: `0xc78cd419d6136f9f1c1c6aec1d3fae098cffaf8bc86314a8f2685e32fe574e3c` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bool notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bool notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on its behalf. @@ -1469,15 +1480,18 @@ Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on i :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1493,15 +1507,19 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Event signature: `TokenIdDataChanged(bytes32,bytes32,bytes)` - Event topic hash: `0xa6e4251f855f750545fe414f120db91c76b88def14d120969e5bb2d3f05debbb` ::: ```solidity -event TokenIdDataChanged(bytes32 indexed tokenId, bytes32 indexed dataKey, bytes dataValue); +event TokenIdDataChanged( + bytes32 indexed tokenId, + bytes32 indexed dataKey, + bytes dataValue +); ``` Emitted when setting data for `tokenId`. @@ -1520,15 +1538,22 @@ Emitted when setting data for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Event signature: `Transfer(address,address,address,bytes32,bool,bytes)` - Event topic hash: `0xb333c813a7426a7a11e2b190cad52c44119421594b47f6f32ace6d8c7207b2bf` ::: ```solidity -event Transfer(address operator, address indexed from, address indexed to, bytes32 indexed tokenId, bool force, bytes data); +event Transfer( + address operator, + address indexed from, + address indexed to, + bytes32 indexed tokenId, + bool force, + bytes data +); ``` Emitted when `tokenId` token is transferred from the `from` to the `to` address. @@ -1552,8 +1577,8 @@ Emitted when `tokenId` token is transferred from the `from` to the `to` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1571,8 +1596,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1590,8 +1615,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1609,8 +1634,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1634,8 +1659,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1659,8 +1684,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1678,8 +1703,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1697,8 +1722,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1716,8 +1741,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8BatchCallFailed(uint256)` - Error hash: `0x234eb819` @@ -1743,8 +1768,8 @@ Reverts when a batch call failed. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8CannotSendToAddressZero()` - Error hash: `0x24ecef4d` @@ -1758,12 +1783,35 @@ Reverts when trying to send token to the zero address.
+# <<<<<<< HEAD:docs/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.md + +### LSP8CannotSendToSelf + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) +- Error signature: `LSP8CannotSendToSelf()` +- Error hash: `0x5d67d6c1` + +::: + +```solidity +error LSP8CannotSendToSelf(); +``` + +Reverts when specifying the same address for `from` and `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.md + ### LSP8CannotUseAddressZeroAsOperator :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8CannotUseAddressZeroAsOperator()` - Error hash: `0x9577b8b3` @@ -1781,8 +1829,8 @@ Reverts when trying to set the zero address as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8InvalidTransferBatch()` - Error hash: `0x93a83119` @@ -1800,8 +1848,8 @@ Reverts when the parameters used for `transferBatch` have different lengths. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8NonExistentTokenId(bytes32)` - Error hash: `0xae8f9a36` @@ -1825,8 +1873,8 @@ Reverts when `tokenId` has not been minted. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8NonExistingOperator(address,bytes32)` - Error hash: `0x4aa31a8c` @@ -1851,8 +1899,8 @@ Reverts when `operator` is not an operator for the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8NotTokenOperator(bytes32,address)` - Error hash: `0x1294d2a9` @@ -1877,8 +1925,8 @@ Reverts when `caller` is not an allowed operator for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8NotTokenOwner(address,bytes32,address)` - Error hash: `0x5b271ea2` @@ -1904,8 +1952,8 @@ Reverts when `caller` is not the `tokenOwner` of the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0x4349776d` @@ -1931,8 +1979,8 @@ Reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8NotifyTokenReceiverIsEOA(address)` - Error hash: `0x03173137` @@ -1956,8 +2004,8 @@ Reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8OperatorAlreadyAuthorized(address,bytes32)` - Error hash: `0xa7626b68` @@ -2013,8 +2061,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8TokenContractCannotHoldValue()` - Error hash: `0x61f49442` @@ -2034,8 +2082,8 @@ Error occurs when sending native tokens to the LSP8 contract without sending any :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8TokenIdFormatNotEditable()` - Error hash: `0x3664800a` @@ -2053,8 +2101,8 @@ Reverts when trying to edit the data key `LSP8TokenIdFormat` after the identifia :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8TokenIdsDataEmptyArray()` - Error hash: `0x80c98305` @@ -2072,8 +2120,8 @@ Reverts when empty arrays is passed to the function :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8TokenIdsDataLengthMismatch()` - Error hash: `0x2fa71dfe` @@ -2091,8 +2139,8 @@ Reverts when the length of the token IDs data arrays is not equal :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8TokenOwnerCannotBeOperator()` - Error hash: `0x89fdad62` @@ -2110,8 +2158,8 @@ Reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` - Error hash: `0x5a9c31d3` @@ -2141,8 +2189,8 @@ Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_befor :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -2166,8 +2214,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -2191,8 +2239,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP8Enumerable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md b/docs/contracts/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.md similarity index 85% rename from docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md rename to docs/contracts/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.md index fca4e87b5..81b567f38 100644 --- a/docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md +++ b/docs/contracts/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) +[`LSP-8-IdentifiableDigitalAsset`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md) ::: :::info Solidity implementation -[`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +[`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) ::: @@ -25,8 +25,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#constructor) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#constructor) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) ::: @@ -40,7 +40,7 @@ constructor( ); ``` -_Deploying a `LSP8Mintable` token contract with: token name = `name_`, token symbol = `symbol_`, and address `newOwner_` as the token contract owner._ +_Deploying a `LSP8Mintable` token contract with: token name = `name_`, token symbol = `symbol*`, and address `newOwner*` as the token contract owner.\_ #### Parameters @@ -58,8 +58,8 @@ _Deploying a `LSP8Mintable` token contract with: token name = `name_`, token sym :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#fallback) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) ::: @@ -93,8 +93,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#receive) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) ::: @@ -112,8 +112,8 @@ Reverts whenever someone tries to send native tokens to a LSP8 contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#authorizeoperator) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `authorizeOperator(address,bytes32,bytes)` - Function selector: `0x86a10ddd` @@ -143,8 +143,8 @@ Allow an `operator` address to transfer or burn a specific `tokenId` on behalf o :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#balanceof) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `balanceOf(address)` - Function selector: `0x70a08231` @@ -174,8 +174,8 @@ Get the number of token IDs owned by `tokenOwner`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#batchcalls) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -213,8 +213,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdata) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -246,8 +246,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatch) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -281,8 +281,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatabatchfortokenids) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `getDataBatchForTokenIds(bytes32[],bytes32[])` - Function selector: `0x1d26fce6` @@ -316,8 +316,8 @@ _Retrieves data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getdatafortokenid) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `getDataForTokenId(bytes32,bytes32)` - Function selector: `0x16e023b3` @@ -351,8 +351,8 @@ _Retrieves data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#getoperatorsof) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `getOperatorsOf(bytes32)` - Function selector: `0x49a6078d` @@ -382,8 +382,8 @@ Returns all `operator` addresses that are allowed to transfer or burn a specific :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#isoperatorfor) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `isOperatorFor(address,bytes32)` - Function selector: `0x2a3654a4` @@ -417,8 +417,8 @@ Returns whether `operator` address is an operator for a given `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#mint) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#mint) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `mint(address,bytes32,bool,bytes)` - Function selector: `0xaf255b61` @@ -452,8 +452,8 @@ Public [`_mint`](#_mint) function only callable by the [`owner`](#owner). :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#owner) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -477,8 +477,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#renounceownership) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -496,8 +496,8 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#revokeoperator) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `revokeOperator(address,bytes32,bool,bytes)` - Function selector: `0xdb8c9663` @@ -529,8 +529,8 @@ Remove access of `operator` for a given `tokenId`, disallowing it to transfer `t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdata) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -579,8 +579,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatch) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -629,8 +629,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatabatchfortokenids) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `setDataBatchForTokenIds(bytes32[],bytes32[],bytes[])` - Function selector: `0xbe9f0e6f` @@ -660,8 +660,8 @@ _Sets data in batch for multiple `tokenId` and `dataKey` pairs._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#setdatafortokenid) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `setDataForTokenId(bytes32,bytes32,bytes)` - Function selector: `0xd6c1407c` @@ -691,8 +691,8 @@ _Sets data for a specific `tokenId` and `dataKey`._ :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#supportsinterface) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -722,8 +722,8 @@ Returns true if this contract implements the interface defined by `interfaceId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenidsof) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `tokenIdsOf(address)` - Function selector: `0xa3b261f2` @@ -753,8 +753,8 @@ Returns the list of token IDs that the `tokenOwner` address owns. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokenownerof) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `tokenOwnerOf(bytes32)` - Function selector: `0x217b2270` @@ -784,8 +784,8 @@ Returns the list of `tokenIds` for the `tokenOwner` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#totalsupply) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `totalSupply()` - Function selector: `0x18160ddd` @@ -809,8 +809,8 @@ Returns the number of existing tokens that have been minted in this contract. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `transfer(address,address,bytes32,bool,bytes)` - Function selector: `0x511b6952` @@ -844,8 +844,8 @@ Transfer a given `tokenId` token from the `from` address to the `to` address. If :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferbatch) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `transferBatch(address[],address[],bytes32[],bool[],bytes[])` - Function selector: `0x7e87632c` @@ -879,8 +879,8 @@ Transfers multiple tokens at once based on the arrays of `from`, `to` and `token :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transferownership) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -1422,8 +1422,8 @@ CALL opcode, passing the [`msg.data`](#msg.data) appended with the 20 bytes of t :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#datachanged) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1450,15 +1450,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorauthorizationchanged) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Event signature: `OperatorAuthorizationChanged(address,address,bytes32,bytes)` - Event topic hash: `0x1b1b58aa2ec0cec2228b2d37124556d41f5a1f7b12f089171f896cc236671215` ::: ```solidity -event OperatorAuthorizationChanged(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bytes operatorNotificationData); +event OperatorAuthorizationChanged( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. @@ -1478,15 +1483,21 @@ Emitted when `tokenOwner` enables `operator` to transfer or burn the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#operatorrevoked) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Event signature: `OperatorRevoked(address,address,bytes32,bool,bytes)` - Event topic hash: `0xc78cd419d6136f9f1c1c6aec1d3fae098cffaf8bc86314a8f2685e32fe574e3c` ::: ```solidity -event OperatorRevoked(address indexed operator, address indexed tokenOwner, bytes32 indexed tokenId, bool notified, bytes operatorNotificationData); +event OperatorRevoked( + address indexed operator, + address indexed tokenOwner, + bytes32 indexed tokenId, + bool notified, + bytes operatorNotificationData +); ``` Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on its behalf. @@ -1507,15 +1518,18 @@ Emitted when `tokenOwner` disables `operator` to transfer or burn `tokenId` on i :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownershiptransferred) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1531,15 +1545,19 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#tokeniddatachanged) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Event signature: `TokenIdDataChanged(bytes32,bytes32,bytes)` - Event topic hash: `0xa6e4251f855f750545fe414f120db91c76b88def14d120969e5bb2d3f05debbb` ::: ```solidity -event TokenIdDataChanged(bytes32 indexed tokenId, bytes32 indexed dataKey, bytes dataValue); +event TokenIdDataChanged( + bytes32 indexed tokenId, + bytes32 indexed dataKey, + bytes dataValue +); ``` Emitted when setting data for `tokenId`. @@ -1558,15 +1576,22 @@ Emitted when setting data for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#transfer) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Event signature: `Transfer(address,address,address,bytes32,bool,bytes)` - Event topic hash: `0xb333c813a7426a7a11e2b190cad52c44119421594b47f6f32ace6d8c7207b2bf` ::: ```solidity -event Transfer(address operator, address indexed from, address indexed to, bytes32 indexed tokenId, bool force, bytes data); +event Transfer( + address operator, + address indexed from, + address indexed to, + bytes32 indexed tokenId, + bool force, + bytes data +); ``` Emitted when `tokenId` token is transferred from the `from` to the `to` address. @@ -1590,8 +1615,8 @@ Emitted when `tokenId` token is transferred from the `from` to the `to` address. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvaluesemptyarray) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1609,8 +1634,8 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1628,8 +1653,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1647,8 +1672,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidextensionaddress) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `InvalidExtensionAddress(bytes)` - Error hash: `0x42bfe79f` @@ -1672,8 +1697,8 @@ reverts when the bytes retrieved from the LSP17 data key is not a valid address :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#invalidfunctionselector) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `InvalidFunctionSelector(bytes)` - Error hash: `0xe5099ee3` @@ -1697,8 +1722,8 @@ reverts when the contract is called with a function selector not valid (less tha :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokennamenoteditable) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP4TokenNameNotEditable()` - Error hash: `0x85c169bd` @@ -1716,8 +1741,8 @@ Reverts when trying to edit the data key `LSP4TokenName` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokensymbolnoteditable) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP4TokenSymbolNotEditable()` - Error hash: `0x76755b38` @@ -1735,8 +1760,8 @@ Reverts when trying to edit the data key `LSP4TokenSymbol` after the digital ass :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp4tokentypenoteditable) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP4TokenTypeNotEditable()` - Error hash: `0x4ef6d7fb` @@ -1754,8 +1779,8 @@ Reverts when trying to edit the data key `LSP4TokenType` after the digital asset :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8batchcallfailed) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8BatchCallFailed(uint256)` - Error hash: `0x234eb819` @@ -1781,8 +1806,8 @@ Reverts when a batch call failed. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoaddresszero) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8CannotSendToAddressZero()` - Error hash: `0x24ecef4d` @@ -1796,12 +1821,35 @@ Reverts when trying to send token to the zero address.
+# <<<<<<< HEAD:docs/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md + +### LSP8CannotSendToSelf + +:::note References + +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotsendtoself) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) +- Error signature: `LSP8CannotSendToSelf()` +- Error hash: `0x5d67d6c1` + +::: + +```solidity +error LSP8CannotSendToSelf(); +``` + +Reverts when specifying the same address for `from` and `to` in a token transfer. + +
+ +> > > > > > > lsp-monorepo:docs/contracts/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.md + ### LSP8CannotUseAddressZeroAsOperator :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8cannotuseaddresszeroasoperator) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8CannotUseAddressZeroAsOperator()` - Error hash: `0x9577b8b3` @@ -1819,8 +1867,8 @@ Reverts when trying to set the zero address as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8invalidtransferbatch) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8InvalidTransferBatch()` - Error hash: `0x93a83119` @@ -1838,8 +1886,8 @@ Reverts when the parameters used for `transferBatch` have different lengths. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistenttokenid) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8NonExistentTokenId(bytes32)` - Error hash: `0xae8f9a36` @@ -1863,8 +1911,8 @@ Reverts when `tokenId` has not been minted. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nonexistingoperator) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8NonExistingOperator(address,bytes32)` - Error hash: `0x4aa31a8c` @@ -1889,8 +1937,8 @@ Reverts when `operator` is not an operator for the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenoperator) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8NotTokenOperator(bytes32,address)` - Error hash: `0x1294d2a9` @@ -1915,8 +1963,8 @@ Reverts when `caller` is not an allowed operator for `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8nottokenowner) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8NotTokenOwner(address,bytes32,address)` - Error hash: `0x5b271ea2` @@ -1942,8 +1990,8 @@ Reverts when `caller` is not the `tokenOwner` of the `tokenId`. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceivercontractmissinglsp1interface) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8NotifyTokenReceiverContractMissingLSP1Interface(address)` - Error hash: `0x4349776d` @@ -1969,8 +2017,8 @@ Reverts if the `tokenReceiver` does not implement LSP1 when minting or transferr :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8notifytokenreceiveriseoa) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8NotifyTokenReceiverIsEOA(address)` - Error hash: `0x03173137` @@ -1994,8 +2042,8 @@ Reverts if the `tokenReceiver` is an EOA when minting or transferring tokens wit :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8operatoralreadyauthorized) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8OperatorAlreadyAuthorized(address,bytes32)` - Error hash: `0xa7626b68` @@ -2051,8 +2099,8 @@ Reverts when the call to revoke operator is not authorized. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokencontractcannotholdvalue) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8TokenContractCannotHoldValue()` - Error hash: `0x61f49442` @@ -2072,8 +2120,8 @@ Error occurs when sending native tokens to the LSP8 contract without sending any :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidalreadyminted) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidalreadyminted) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8TokenIdAlreadyMinted(bytes32)` - Error hash: `0x34c7b511` @@ -2097,8 +2145,8 @@ Reverts when `tokenId` has already been minted. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformatnoteditable) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8TokenIdFormatNotEditable()` - Error hash: `0x3664800a` @@ -2116,8 +2164,8 @@ Reverts when trying to edit the data key `LSP8TokenIdFormat` after the identifia :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdataemptyarray) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8TokenIdsDataEmptyArray()` - Error hash: `0x80c98305` @@ -2135,8 +2183,8 @@ Reverts when empty arrays is passed to the function :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidsdatalengthmismatch) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8TokenIdsDataLengthMismatch()` - Error hash: `0x2fa71dfe` @@ -2154,8 +2202,8 @@ Reverts when the length of the token IDs data arrays is not equal :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownercannotbeoperator) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8TokenOwnerCannotBeOperator()` - Error hash: `0x89fdad62` @@ -2173,8 +2221,8 @@ Reverts when trying to authorize or revoke the token's owner as an operator. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenownerchanged) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `LSP8TokenOwnerChanged(bytes32,address,address)` - Error hash: `0x5a9c31d3` @@ -2204,8 +2252,8 @@ Reverts when the token owner changed inside the [`_beforeTokenTransfer`](#_befor :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -2229,8 +2277,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecallernottheowner) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -2254,8 +2302,8 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) -- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol) +- Specification details: [**LSP-8-IdentifiableDigitalAsset**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#ownablecannotsetzeroaddressasowner) +- Solidity implementation: [`LSP8Mintable.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` diff --git a/docs/contracts/LSP9Vault/LSP9Vault.md b/docs/contracts/@lukso/lsp9-contracts/contracts/LSP9Vault.md similarity index 88% rename from docs/contracts/LSP9Vault/LSP9Vault.md rename to docs/contracts/@lukso/lsp9-contracts/contracts/LSP9Vault.md index 292353e92..6155d48be 100644 --- a/docs/contracts/LSP9Vault/LSP9Vault.md +++ b/docs/contracts/@lukso/lsp9-contracts/contracts/LSP9Vault.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-9-Vault`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md) +[`LSP-9-Vault`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md) ::: :::info Solidity implementation -[`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +[`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) ::: @@ -27,8 +27,8 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#constructor) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#constructor) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) ::: @@ -63,8 +63,8 @@ Sets `initialOwner` as the contract owner and the `SupportedStandards:LSP9Vault` :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#fallback) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#fallback) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) ::: @@ -106,8 +106,8 @@ This function is executed when: :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#receive) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#receive) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) ::: @@ -135,8 +135,8 @@ Executed: :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#renounce_ownership_confirmation_delay) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#renounce_ownership_confirmation_delay) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY()` - Function selector: `0xead3fbdf` @@ -161,8 +161,8 @@ function RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY() :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#renounce_ownership_confirmation_period) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#renounce_ownership_confirmation_period) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD()` - Function selector: `0x01bfba61` @@ -187,8 +187,8 @@ function RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD() :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#version) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#version) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `VERSION()` - Function selector: `0xffa1ad74` @@ -212,8 +212,8 @@ _Contract version._ :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#acceptownership) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#acceptownership) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `acceptOwnership()` - Function selector: `0x79ba5097` @@ -247,8 +247,8 @@ Transfer ownership of the contract from the current [`owner()`](#owner) to the [ :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#batchcalls) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#batchcalls) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -286,8 +286,8 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#execute) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#execute) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `execute(uint256,address,uint256,bytes)` - Function selector: `0x44c028fe` @@ -360,8 +360,8 @@ Generic executor function to: :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#executebatch) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#executebatch) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `executeBatch(uint256[],address[],uint256[],bytes[])` - Function selector: `0x31858452` @@ -429,8 +429,8 @@ Batch executor function that behaves the same as [`execute`](#execute) but allow :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#getdata) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#getdata) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -462,8 +462,8 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#getdatabatch) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#getdatabatch) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -497,8 +497,8 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#owner) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#owner) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -522,8 +522,8 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#pendingowner) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#pendingowner) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `pendingOwner()` - Function selector: `0xe30c3978` @@ -553,8 +553,8 @@ The address that ownership of the contract is transferred to. This address may u :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#renounceownership) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#renounceownership) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -592,8 +592,8 @@ Renounce ownership of the contract in a 2-step process. :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#setdata) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#setdata) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -636,8 +636,8 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#setdatabatch) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#setdatabatch) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -680,8 +680,8 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#supportsinterface) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#supportsinterface) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -713,8 +713,8 @@ Achieves the goal of [ERC-165] to detect supported interfaces and [LSP-17-Contra :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#transferownership) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#transferownership) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -750,8 +750,8 @@ Initiate the process of transferring ownership of the contract by setting the ne :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#universalreceiver) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#universalreceiver) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Function signature: `universalReceiver(bytes32,bytes)` - Function selector: `0x6bb56a14` @@ -1193,15 +1193,20 @@ Internal method restricting the call to the owner of the contract and the Univer :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#contractcreated) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#contractcreated) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Event signature: `ContractCreated(uint256,address,uint256,bytes32)` - Event topic hash: `0xa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c3` ::: ```solidity -event ContractCreated(uint256 indexed operationType, address indexed contractAddress, uint256 value, bytes32 indexed salt); +event ContractCreated( + uint256 indexed operationType, + address indexed contractAddress, + uint256 value, + bytes32 indexed salt +); ``` _Deployed new contract at address `contractAddress` and funded with `value` wei (deployed using opcode: `operationType`)._ @@ -1223,8 +1228,8 @@ Emitted when a new contract was created and deployed. :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#datachanged) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#datachanged) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1251,15 +1256,20 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#executed) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#executed) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Event signature: `Executed(uint256,address,uint256,bytes4)` - Event topic hash: `0x4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e` ::: ```solidity -event Executed(uint256 indexed operationType, address indexed target, uint256 value, bytes4 indexed selector); +event Executed( + uint256 indexed operationType, + address indexed target, + uint256 value, + bytes4 indexed selector +); ``` _Called address `target` using `operationType` with `value` wei and `data`._ @@ -1281,8 +1291,8 @@ Emitted when calling an address `target` (EOA or contract) with `value`. :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#ownershiprenounced) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#ownershiprenounced) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Event signature: `OwnershipRenounced()` - Event topic hash: `0xd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce` @@ -1302,15 +1312,18 @@ Emitted when the ownership of the contract has been renounced. :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#ownershiptransferstarted) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#ownershiptransferstarted) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Event signature: `OwnershipTransferStarted(address,address)` - Event topic hash: `0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700` ::: ```solidity -event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferStarted( + address indexed previousOwner, + address indexed newOwner +); ``` _The transfer of ownership of the contract was initiated. Pending new owner set to: `newOwner`._ @@ -1330,15 +1343,18 @@ Emitted when [`transferOwnership(..)`](#transferownership) was called and the fi :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#ownershiptransferred) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#ownershiptransferred) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1354,8 +1370,8 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#renounceownershipstarted) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#renounceownershipstarted) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Event signature: `RenounceOwnershipStarted()` - Event topic hash: `0x81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e7` @@ -1375,15 +1391,21 @@ Emitted when starting the [`renounceOwnership(..)`](#renounceownership) 2-step p :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#universalreceiver) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#universalreceiver) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Event signature: `UniversalReceiver(address,uint256,bytes32,bytes,bytes)` - Event topic hash: `0x9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c2` ::: ```solidity -event UniversalReceiver(address indexed from, uint256 indexed value, bytes32 indexed typeId, bytes receivedData, bytes returnedValue); +event UniversalReceiver( + address indexed from, + uint256 indexed value, + bytes32 indexed typeId, + bytes receivedData, + bytes returnedValue +); ``` \*Address `from` called the `universalReceiver(...)` function while sending `value` LYX. Notification type (typeId): `typeId` @@ -1410,8 +1432,8 @@ Emitted when the [`universalReceiver`](#universalreceiver) function was called w :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725x_contractdeploymentfailed) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725x_contractdeploymentfailed) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725X_ContractDeploymentFailed()` - Error hash: `0x0b07489b` @@ -1429,8 +1451,8 @@ Reverts when contract deployment failed via [`execute`](#execute) or [`executeBa :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725x_createoperationsrequireemptyrecipientaddress) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725x_createoperationsrequireemptyrecipientaddress) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725X_CreateOperationsRequireEmptyRecipientAddress()` - Error hash: `0x3041824a` @@ -1448,8 +1470,8 @@ Reverts when passing a `to` address that is not `address(0)` (= address zero) wh :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725x_executeparametersemptyarray) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725x_executeparametersemptyarray) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725X_ExecuteParametersEmptyArray()` - Error hash: `0xe9ad2b5f` @@ -1467,8 +1489,8 @@ Reverts when one of the array parameter provided to the [`executeBatch`](#execut :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725x_executeparameterslengthmismatch) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725x_executeparameterslengthmismatch) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725X_ExecuteParametersLengthMismatch()` - Error hash: `0x3ff55f4d` @@ -1486,8 +1508,8 @@ Reverts when there is not the same number of elements in the `operationTypes`, ` :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725x_insufficientbalance) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725x_insufficientbalance) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725X_InsufficientBalance(uint256,uint256)` - Error hash: `0x0df9a8f8` @@ -1512,8 +1534,8 @@ Reverts when trying to send more native tokens `value` than available in current :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725x_msgvaluedisallowedinstaticcall) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725x_msgvaluedisallowedinstaticcall) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725X_MsgValueDisallowedInStaticCall()` - Error hash: `0x72f2bc6a` @@ -1531,8 +1553,8 @@ Reverts when trying to send native tokens (`value` / `values[]` parameter of [`e :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725x_nocontractbytecodeprovided) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725x_nocontractbytecodeprovided) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725X_NoContractBytecodeProvided()` - Error hash: `0xb81cd8d9` @@ -1550,8 +1572,8 @@ Reverts when no contract bytecode was provided as parameter when trying to deplo :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725x_unknownoperationtype) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725x_unknownoperationtype) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725X_UnknownOperationType(uint256)` - Error hash: `0x7583b3bc` @@ -1575,8 +1597,8 @@ Reverts when the `operationTypeProvided` is none of the default operation types :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725y_datakeysvalueslengthmismatch) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725y_datakeysvalueslengthmismatch) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1594,8 +1616,8 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#erc725y_msgvaluedisallowed) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#erc725y_msgvaluedisallowed) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `ERC725Y_MsgValueDisallowed()` - Error hash: `0xf36ba737` @@ -1613,8 +1635,8 @@ Reverts when sending value to the [`setData`](#setdata) or [`setDataBatch`](#set :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#lsp14callernotpendingowner) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#lsp14callernotpendingowner) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `LSP14CallerNotPendingOwner(address)` - Error hash: `0x451e4528` @@ -1638,8 +1660,8 @@ Reverts when the `caller` that is trying to accept ownership of the contract is :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#lsp14cannottransferownershiptoself) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#lsp14cannottransferownershiptoself) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `LSP14CannotTransferOwnershipToSelf()` - Error hash: `0xe052a6f8` @@ -1659,8 +1681,8 @@ Reverts when trying to transfer ownership to the `address(this)`. :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#lsp14mustacceptownershipinseparatetransaction) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#lsp14mustacceptownershipinseparatetransaction) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `LSP14MustAcceptOwnershipInSeparateTransaction()` - Error hash: `0x5758dd07` @@ -1680,8 +1702,8 @@ Reverts when pending owner accept ownership in the same transaction of transferr :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#lsp14notinrenounceownershipinterval) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#lsp14notinrenounceownershipinterval) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `LSP14NotInRenounceOwnershipInterval(uint256,uint256)` - Error hash: `0x1b080942` @@ -1711,8 +1733,8 @@ Reverts when trying to renounce ownership before the initial confirmation delay. :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#lsp1delegatenotallowedtosetdatakey) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#lsp1delegatenotallowedtosetdatakey) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `LSP1DelegateNotAllowedToSetDataKey(bytes32)` - Error hash: `0x199611f1` @@ -1724,7 +1746,7 @@ error LSP1DelegateNotAllowedToSetDataKey(bytes32 dataKey); _The `LSP1UniversalReceiverDelegate` is not allowed to set the following data key: `dataKey`._ -Reverts when the Vault version of [LSP1UniversalReceiverDelegate] sets LSP1/6/17 Data Keys. +Reverts when the Vault version of [LSP1UniversalReceiverDelegate] sets @lukso/lsp1-contracts/6/17 Data Keys. #### Parameters @@ -1738,8 +1760,8 @@ Reverts when the Vault version of [LSP1UniversalReceiverDelegate] sets LSP1/6/17 :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#noextensionfoundforfunctionselector) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#noextensionfoundforfunctionselector) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` @@ -1763,8 +1785,8 @@ reverts when there is no extension for the function selector being called with :::note References -- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-9-Vault.md#ownablecallernottheowner) -- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP9Vault/LSP9Vault.sol) +- Specification details: [**LSP-9-Vault**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-9-Vault.md#ownablecallernottheowner) +- Solidity implementation: [`LSP9Vault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp9-contracts/contracts/LSP9Vault.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` diff --git a/docs/contracts/UniversalProfile.md b/docs/contracts/@lukso/universalprofile-contracts/contracts/UniversalProfile.md similarity index 94% rename from docs/contracts/UniversalProfile.md rename to docs/contracts/@lukso/universalprofile-contracts/contracts/UniversalProfile.md index 0af3ab61c..32fedfa6c 100644 --- a/docs/contracts/UniversalProfile.md +++ b/docs/contracts/@lukso/universalprofile-contracts/contracts/UniversalProfile.md @@ -5,7 +5,7 @@ :::info Standard Specifications -[`UniversalProfile`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md) +[`UniversalProfile`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md) ::: :::info Solidity implementation @@ -27,7 +27,7 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#constructor) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#constructor) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) ::: @@ -66,7 +66,7 @@ Set `initialOwner` as the contract owner and the `SupportedStandards:LSP3Profile :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#fallback) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#fallback) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) ::: @@ -81,7 +81,7 @@ fallback() external payable; :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#receive) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#receive) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) ::: @@ -96,7 +96,7 @@ receive() external payable; :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#renounce_ownership_confirmation_delay) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#renounce_ownership_confirmation_delay) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY()` - Function selector: `0xead3fbdf` @@ -122,7 +122,7 @@ function RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY() :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#renounce_ownership_confirmation_period) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#renounce_ownership_confirmation_period) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD()` - Function selector: `0x01bfba61` @@ -148,7 +148,7 @@ function RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD() :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#version) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#version) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `VERSION()` - Function selector: `0xffa1ad74` @@ -173,7 +173,7 @@ _Contract version._ :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#acceptownership) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#acceptownership) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `acceptOwnership()` - Function selector: `0x79ba5097` @@ -208,7 +208,7 @@ Transfer ownership of the contract from the current [`owner()`](#owner) to the [ :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#batchcalls) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#batchcalls) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `batchCalls(bytes[])` - Function selector: `0x6963d438` @@ -247,7 +247,7 @@ Allows a caller to batch different function calls in one call. Perform a `delega :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#execute) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#execute) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `execute(uint256,address,uint256,bytes)` - Function selector: `0x44c028fe` @@ -315,7 +315,7 @@ Generic executor function to: :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#executebatch) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#executebatch) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `executeBatch(uint256[],address[],uint256[],bytes[])` - Function selector: `0x31858452` @@ -384,7 +384,7 @@ Batch executor function that behaves the same as [`execute`](#execute) but allow :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#getdata) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#getdata) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `getData(bytes32)` - Function selector: `0x54f6127f` @@ -417,7 +417,7 @@ Get in the ERC725Y storage the bytes data stored at a specific data key `dataKey :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#getdatabatch) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#getdatabatch) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `getDataBatch(bytes32[])` - Function selector: `0xdedff9c6` @@ -452,7 +452,7 @@ Get in the ERC725Y storage the bytes data stored at multiple data keys `dataKeys :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#isvalidsignature) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#isvalidsignature) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `isValidSignature(bytes32,bytes)` - Function selector: `0x1626ba7e` @@ -507,7 +507,7 @@ Handles two cases: :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#owner) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#owner) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -532,7 +532,7 @@ Returns the address of the current owner. :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#pendingowner) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#pendingowner) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `pendingOwner()` - Function selector: `0xe30c3978` @@ -563,7 +563,7 @@ The address that ownership of the contract is transferred to. This address may u :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#renounceownership) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#renounceownership) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -602,7 +602,7 @@ Renounce ownership of the contract in a 2-step process. :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#setdata) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#setdata) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `setData(bytes32,bytes)` - Function selector: `0x7f23690c` @@ -647,7 +647,7 @@ Sets a single bytes value `dataValue` in the ERC725Y storage for a specific data :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#setdatabatch) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#setdatabatch) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `setDataBatch(bytes32[],bytes[])` - Function selector: `0x97902421` @@ -692,7 +692,7 @@ Batch data setting function that behaves the same as [`setData`](#setdata) but a :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#supportsinterface) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#supportsinterface) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -725,7 +725,7 @@ Achieves the goal of [ERC-165] to detect supported interfaces and [LSP-17-Contra :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#transferownership) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#transferownership) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -762,7 +762,7 @@ Initiate the process of transferring ownership of the contract by setting the ne :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#universalreceiver) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#universalreceiver) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Function signature: `universalReceiver(bytes32,bytes)` - Function selector: `0x6bb56a14` @@ -1212,7 +1212,7 @@ function _revertWithLSP20DefaultError( :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#contractcreated) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#contractcreated) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Event signature: `ContractCreated(uint256,address,uint256,bytes32)` - Event topic hash: `0xa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c3` @@ -1220,7 +1220,12 @@ function _revertWithLSP20DefaultError( ::: ```solidity -event ContractCreated(uint256 indexed operationType, address indexed contractAddress, uint256 value, bytes32 indexed salt); +event ContractCreated( + uint256 indexed operationType, + address indexed contractAddress, + uint256 value, + bytes32 indexed salt +); ``` _Deployed new contract at address `contractAddress` and funded with `value` wei (deployed using opcode: `operationType`)._ @@ -1242,7 +1247,7 @@ Emitted when a new contract was created and deployed. :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#datachanged) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#datachanged) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Event signature: `DataChanged(bytes32,bytes)` - Event topic hash: `0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2` @@ -1270,7 +1275,7 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#executed) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#executed) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Event signature: `Executed(uint256,address,uint256,bytes4)` - Event topic hash: `0x4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e` @@ -1278,7 +1283,12 @@ Emitted when data at a specific `dataKey` was changed to a new value `dataValue` ::: ```solidity -event Executed(uint256 indexed operationType, address indexed target, uint256 value, bytes4 indexed selector); +event Executed( + uint256 indexed operationType, + address indexed target, + uint256 value, + bytes4 indexed selector +); ``` _Called address `target` using `operationType` with `value` wei and `data`._ @@ -1300,7 +1310,7 @@ Emitted when calling an address `target` (EOA or contract) with `value`. :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#ownershiprenounced) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#ownershiprenounced) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Event signature: `OwnershipRenounced()` - Event topic hash: `0xd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce` @@ -1321,7 +1331,7 @@ Emitted when the ownership of the contract has been renounced. :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#ownershiptransferstarted) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#ownershiptransferstarted) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Event signature: `OwnershipTransferStarted(address,address)` - Event topic hash: `0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700` @@ -1329,7 +1339,10 @@ Emitted when the ownership of the contract has been renounced. ::: ```solidity -event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferStarted( + address indexed previousOwner, + address indexed newOwner +); ``` _The transfer of ownership of the contract was initiated. Pending new owner set to: `newOwner`._ @@ -1349,7 +1362,7 @@ Emitted when [`transferOwnership(..)`](#transferownership) was called and the fi :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#ownershiptransferred) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#ownershiptransferred) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` @@ -1357,7 +1370,10 @@ Emitted when [`transferOwnership(..)`](#transferownership) was called and the fi ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -1373,7 +1389,7 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#renounceownershipstarted) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#renounceownershipstarted) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Event signature: `RenounceOwnershipStarted()` - Event topic hash: `0x81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e7` @@ -1394,7 +1410,7 @@ Emitted when starting the [`renounceOwnership(..)`](#renounceownership) 2-step p :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#universalreceiver) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#universalreceiver) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Event signature: `UniversalReceiver(address,uint256,bytes32,bytes,bytes)` - Event topic hash: `0x9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c2` @@ -1402,7 +1418,13 @@ Emitted when starting the [`renounceOwnership(..)`](#renounceownership) 2-step p ::: ```solidity -event UniversalReceiver(address indexed from, uint256 indexed value, bytes32 indexed typeId, bytes receivedData, bytes returnedValue); +event UniversalReceiver( + address indexed from, + uint256 indexed value, + bytes32 indexed typeId, + bytes receivedData, + bytes returnedValue +); ``` \*Address `from` called the `universalReceiver(...)` function while sending `value` LYX. Notification type (typeId): `typeId` @@ -1429,7 +1451,7 @@ Emitted when the [`universalReceiver`](#universalreceiver) function was called w :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_contractdeploymentfailed) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_contractdeploymentfailed) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_ContractDeploymentFailed()` - Error hash: `0x0b07489b` @@ -1448,7 +1470,7 @@ Reverts when contract deployment failed via [`execute`](#execute) or [`executeBa :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_createoperationsrequireemptyrecipientaddress) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_createoperationsrequireemptyrecipientaddress) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_CreateOperationsRequireEmptyRecipientAddress()` - Error hash: `0x3041824a` @@ -1467,7 +1489,7 @@ Reverts when passing a `to` address that is not `address(0)` (= address zero) wh :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_executeparametersemptyarray) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_executeparametersemptyarray) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_ExecuteParametersEmptyArray()` - Error hash: `0xe9ad2b5f` @@ -1486,7 +1508,7 @@ Reverts when one of the array parameter provided to the [`executeBatch`](#execut :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_executeparameterslengthmismatch) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_executeparameterslengthmismatch) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_ExecuteParametersLengthMismatch()` - Error hash: `0x3ff55f4d` @@ -1505,7 +1527,7 @@ Reverts when there is not the same number of elements in the `operationTypes`, ` :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_insufficientbalance) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_insufficientbalance) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_InsufficientBalance(uint256,uint256)` - Error hash: `0x0df9a8f8` @@ -1531,7 +1553,7 @@ Reverts when trying to send more native tokens `value` than available in current :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_msgvaluedisallowedindelegatecall) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_msgvaluedisallowedindelegatecall) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_MsgValueDisallowedInDelegateCall()` - Error hash: `0x5ac83135` @@ -1550,7 +1572,7 @@ Reverts when trying to send native tokens (`value` / `values[]` parameter of [`e :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_msgvaluedisallowedinstaticcall) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_msgvaluedisallowedinstaticcall) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_MsgValueDisallowedInStaticCall()` - Error hash: `0x72f2bc6a` @@ -1569,7 +1591,7 @@ Reverts when trying to send native tokens (`value` / `values[]` parameter of [`e :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_nocontractbytecodeprovided) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_nocontractbytecodeprovided) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_NoContractBytecodeProvided()` - Error hash: `0xb81cd8d9` @@ -1588,7 +1610,7 @@ Reverts when no contract bytecode was provided as parameter when trying to deplo :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_unknownoperationtype) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725x_unknownoperationtype) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725X_UnknownOperationType(uint256)` - Error hash: `0x7583b3bc` @@ -1613,7 +1635,7 @@ Reverts when the `operationTypeProvided` is none of the default operation types :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725y_datakeysvaluesemptyarray) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725y_datakeysvaluesemptyarray) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725Y_DataKeysValuesEmptyArray()` - Error hash: `0x97da5f95` @@ -1632,7 +1654,7 @@ Reverts when one of the array parameter provided to [`setDataBatch`](#setdatabat :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725y_datakeysvalueslengthmismatch) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#erc725y_datakeysvalueslengthmismatch) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `ERC725Y_DataKeysValuesLengthMismatch()` - Error hash: `0x3bcc8979` @@ -1651,7 +1673,7 @@ Reverts when there is not the same number of elements in the `datakeys` and `dat :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp14callernotpendingowner) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp14callernotpendingowner) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `LSP14CallerNotPendingOwner(address)` - Error hash: `0x451e4528` @@ -1676,7 +1698,7 @@ Reverts when the `caller` that is trying to accept ownership of the contract is :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp14cannottransferownershiptoself) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp14cannottransferownershiptoself) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `LSP14CannotTransferOwnershipToSelf()` - Error hash: `0xe052a6f8` @@ -1697,7 +1719,7 @@ Reverts when trying to transfer ownership to the `address(this)`. :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp14mustacceptownershipinseparatetransaction) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp14mustacceptownershipinseparatetransaction) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `LSP14MustAcceptOwnershipInSeparateTransaction()` - Error hash: `0x5758dd07` @@ -1718,7 +1740,7 @@ Reverts when pending owner accept ownership in the same transaction of transferr :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp14notinrenounceownershipinterval) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp14notinrenounceownershipinterval) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `LSP14NotInRenounceOwnershipInterval(uint256,uint256)` - Error hash: `0x1b080942` @@ -1749,7 +1771,7 @@ Reverts when trying to renounce ownership before the initial confirmation delay. :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp20callverificationfailed) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp20callverificationfailed) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `LSP20CallVerificationFailed(bool,bytes4)` - Error hash: `0x9d6741e3` @@ -1775,7 +1797,7 @@ reverts when the call to the owner does not return the LSP20 success value :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp20callingverifierfailed) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp20callingverifierfailed) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `LSP20CallingVerifierFailed(bool)` - Error hash: `0x8c6a8ae3` @@ -1800,7 +1822,7 @@ reverts when the call to the owner fail with no revert reason :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp20eoacannotverifycall) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#lsp20eoacannotverifycall) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `LSP20EOACannotVerifyCall(address)` - Error hash: `0x0c392301` @@ -1825,7 +1847,7 @@ Reverts when the logic verifier is an Externally Owned Account (EOA) that cannot :::note References -- Specification details: [**UniversalProfile**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md#noextensionfoundforfunctionselector) +- Specification details: [**UniversalProfile**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-3-UniversalProfile-Metadata.md#noextensionfoundforfunctionselector) - Solidity implementation: [`UniversalProfile.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/UniversalProfile.sol) - Error signature: `NoExtensionFoundForFunctionSelector(bytes4)` - Error hash: `0xbb370b2b` diff --git a/docs/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.md b/docs/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.md index ce65e86c1..bc371b131 100644 --- a/docs/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.md +++ b/docs/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.md @@ -5,7 +5,7 @@ :::info Standard Specifications -[`LSP-11-BasicSocialRecovery`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md) +[`LSP-11-BasicSocialRecovery`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md) ::: :::info Solidity implementation @@ -27,7 +27,7 @@ When marked as 'public', a method can be called both externally and internally, :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#constructor) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#constructor) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) ::: @@ -51,7 +51,7 @@ _Sets the target and the owner addresses_ :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#addguardian) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#addguardian) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `addGuardian(address)` - Function selector: `0xa526d83b` @@ -76,7 +76,7 @@ Adds a guardian of the targetCan be called only by the owner :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#getguardianchoice) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#getguardianchoice) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `getGuardianChoice(address)` - Function selector: `0xf6a22f02` @@ -107,7 +107,7 @@ Returns the address of a controller that a `guardian` selected for in order to r :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#getguardians) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#getguardians) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `getGuardians()` - Function selector: `0x0665f04b` @@ -132,7 +132,7 @@ Returns the addresses of all guardians The guardians will select an address to b :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#getguardiansthreshold) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#getguardiansthreshold) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `getGuardiansThreshold()` - Function selector: `0x187c5348` @@ -157,7 +157,7 @@ Returns the guardian threshold The guardian threshold represents the minimum num :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#getrecoverycounter) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#getrecoverycounter) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `getRecoveryCounter()` - Function selector: `0xf79c8b77` @@ -182,7 +182,7 @@ Returns the current recovery counter When a recovery process is successfully fin :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#getrecoverysecrethash) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#getrecoverysecrethash) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `getRecoverySecretHash()` - Function selector: `0x8f9083bb` @@ -207,7 +207,7 @@ Returns the recovery secret hash :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#isguardian) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#isguardian) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `isGuardian(address)` - Function selector: `0x0c68ba21` @@ -238,7 +238,7 @@ Returns TRUE if the address provided is a guardian, FALSE otherwise :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#owner) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#owner) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `owner()` - Function selector: `0x8da5cb5b` @@ -263,7 +263,7 @@ Returns the address of the current owner. :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#recoverownership) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#recoverownership) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `recoverOwnership(address,string,bytes32)` - Function selector: `0xae8481b2` @@ -298,7 +298,7 @@ Recovers the ownership permissions of an address in the linked target and increm :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#removeguardian) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#removeguardian) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `removeGuardian(address)` - Function selector: `0x71404156` @@ -323,7 +323,7 @@ Removes a guardian of the targetCan be called only by the owner :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#renounceownership) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#renounceownership) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `renounceOwnership()` - Function selector: `0x715018a6` @@ -342,7 +342,7 @@ Leaves the contract without owner. It will not be possible to call `onlyOwner` f :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#selectnewcontroller) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#selectnewcontroller) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `selectNewController(address)` - Function selector: `0xaa7806d6` @@ -369,7 +369,7 @@ select an address to be a potentiel controller address if he reaches the guardia :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#setguardiansthreshold) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#setguardiansthreshold) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `setGuardiansThreshold(uint256)` - Function selector: `0x6bfed20b` @@ -394,7 +394,7 @@ Sets the minimum number of selection by the guardians required so that an addres :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#setrecoverysecrethash) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#setrecoverysecrethash) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `setRecoverySecretHash(bytes32)` - Function selector: `0xf799e38d` @@ -421,7 +421,7 @@ Throws if hash provided is bytes32(0) :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#supportsinterface) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#supportsinterface) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `supportsInterface(bytes4)` - Function selector: `0x01ffc9a7` @@ -452,7 +452,7 @@ See [`IERC165-supportsInterface`](#ierc165-supportsinterface). :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#target) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#target) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `target()` - Function selector: `0xd4b83992` @@ -477,7 +477,7 @@ The address of an ERC725 contract where we want to recover and set permissions f :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#transferownership) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#transferownership) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Function signature: `transferOwnership(address)` - Function selector: `0xf2fde38b` @@ -570,7 +570,7 @@ To avoid keeping unnecessary state :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#guardianadded) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#guardianadded) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Event signature: `GuardianAdded(address)` - Event topic hash: `0x038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f969` @@ -595,7 +595,7 @@ _Emitted when setting a new guardian for the target_ :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#guardianremoved) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#guardianremoved) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Event signature: `GuardianRemoved(address)` - Event topic hash: `0xb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c52` @@ -620,7 +620,7 @@ _Emitted when removing an existing guardian for the target_ :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#guardiansthresholdchanged) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#guardiansthresholdchanged) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Event signature: `GuardiansThresholdChanged(uint256)` - Event topic hash: `0x7146d20a2c7b7c75c203774c9f241b61698fac43a4a81ccd828f0d8162392790` @@ -645,7 +645,7 @@ _Emitted when changing the guardian threshold_ :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#ownershiptransferred) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#ownershiptransferred) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Event signature: `OwnershipTransferred(address,address)` - Event topic hash: `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` @@ -653,7 +653,10 @@ _Emitted when changing the guardian threshold_ ::: ```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); +event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner +); ``` #### Parameters @@ -669,7 +672,7 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#recoveryprocesssuccessful) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#recoveryprocesssuccessful) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Event signature: `RecoveryProcessSuccessful(uint256,address,bytes32,address[])` - Event topic hash: `0xf4ff8803d6b43af46d48c200977209829c2f42f19f27eda1c89dbf26a28009cd` @@ -677,7 +680,12 @@ event OwnershipTransferred(address indexed previousOwner, address indexed newOwn ::: ```solidity -event RecoveryProcessSuccessful(uint256 indexed recoveryCounter, address indexed newController, bytes32 indexed newSecretHash, address[] guardians); +event RecoveryProcessSuccessful( + uint256 indexed recoveryCounter, + address indexed newController, + bytes32 indexed newSecretHash, + address[] guardians +); ``` _Emitted when the recovery process is finished by the controller who reached the guardian threshold and submitted the string that produce the secretHash_ @@ -697,7 +705,7 @@ _Emitted when the recovery process is finished by the controller who reached the :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#secrethashchanged) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#secrethashchanged) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Event signature: `SecretHashChanged(bytes32)` - Event topic hash: `0x2e8c5419a62207ade549fe0b66c1c85c16f5e1ed654815dee3a3f3ac41770df3` @@ -722,7 +730,7 @@ _Emitted when changing the secret hash_ :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#selectednewcontroller) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#selectednewcontroller) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Event signature: `SelectedNewController(uint256,address,address)` - Event topic hash: `0xe43f3c1093c69ab76b2cf6246090acb2f8eab7f19ba9942dfc8b8ec446e3a3de` @@ -730,7 +738,11 @@ _Emitted when changing the secret hash_ ::: ```solidity -event SelectedNewController(uint256 indexed recoveryCounter, address indexed guardian, address indexed addressSelected); +event SelectedNewController( + uint256 indexed recoveryCounter, + address indexed guardian, + address indexed addressSelected +); ``` _Emitted when a guardian select a new potentiel controller address for the target_ @@ -751,7 +763,7 @@ _Emitted when a guardian select a new potentiel controller address for the targe :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#addresszeronotallowed) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#addresszeronotallowed) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `AddressZeroNotAllowed()` - Error hash: `0x0855380c` @@ -770,7 +782,7 @@ reverts when the address zero calls `recoverOwnership(..)` function :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#callerisnotguardian) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#callerisnotguardian) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `CallerIsNotGuardian(address)` - Error hash: `0x5560e16d` @@ -795,7 +807,7 @@ reverts when the caller is not a guardian :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#guardianalreadyexist) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#guardianalreadyexist) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `GuardianAlreadyExist(address)` - Error hash: `0xd52858db` @@ -820,7 +832,7 @@ reverts when adding an already existing guardian :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#guardiandonotexist) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#guardiandonotexist) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `GuardianDoNotExist(address)` - Error hash: `0x3d8e524e` @@ -845,7 +857,7 @@ reverts when removing a non-existing guardian :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#guardiansnumbercannotgobelowthreshold) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#guardiansnumbercannotgobelowthreshold) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `GuardiansNumberCannotGoBelowThreshold(uint256)` - Error hash: `0x27113777` @@ -870,7 +882,7 @@ reverts when removing a guardian and the threshold is equal to the number of gua :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#ownablecallernottheowner) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#ownablecallernottheowner) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `OwnableCallerNotTheOwner(address)` - Error hash: `0xbf1169c5` @@ -895,7 +907,7 @@ Reverts when only the owner is allowed to call the function. :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#ownablecannotsetzeroaddressasowner) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#ownablecannotsetzeroaddressasowner) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `OwnableCannotSetZeroAddressAsOwner()` - Error hash: `0x1ad8836c` @@ -914,7 +926,7 @@ Reverts when trying to set `address(0)` as the contract owner when deploying the :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#secrethashcannotbezero) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#secrethashcannotbezero) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `SecretHashCannotBeZero()` - Error hash: `0x7f617002` @@ -933,7 +945,7 @@ reverts when the secret hash provided is equal to bytes32(0) :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#thresholdcannotbehigherthanguardiansnumber) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#thresholdcannotbehigherthanguardiansnumber) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `ThresholdCannotBeHigherThanGuardiansNumber(uint256,uint256)` - Error hash: `0xe3db80bd` @@ -962,7 +974,7 @@ reverts when setting the guardians threshold to a number higher than the guardia :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#thresholdnotreachedforrecoverer) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#thresholdnotreachedforrecoverer) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `ThresholdNotReachedForRecoverer(address,uint256,uint256)` - Error hash: `0xf78f0507` @@ -993,7 +1005,7 @@ reverts when `recoverOwnership(..)` is called with a recoverer that didn't reach :::note References -- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-11-BasicSocialRecovery.md#wrongplainsecret) +- Specification details: [**LSP-11-BasicSocialRecovery**](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-11-BasicSocialRecovery.md#wrongplainsecret) - Solidity implementation: [`LSP11BasicSocialRecovery.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol) - Error signature: `WrongPlainSecret()` - Error hash: `0x6fa723c3` diff --git a/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md b/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md deleted file mode 100644 index 6d2ba2d47..000000000 --- a/docs/contracts/LSP16UniversalFactory/LSP16UniversalFactory.md +++ /dev/null @@ -1,429 +0,0 @@ - - - -# LSP16UniversalFactory - -:::info Standard Specifications - -[`LSP-16-UniversalFactory`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md) - -::: -:::info Solidity implementation - -[`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) - -::: - -> LSP16 Universal Factory - -Factory contract to deploy different types of contracts using the CREATE2 opcode standardized as LSP16 - -- UniversalFactory: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-16-UniversalFactory.md The UniversalFactory will be deployed using Nick's Factory (0x4e59b44847b379578588920ca78fbf26c0b4956c) The deployed address can be found in the LSP16 specification. Please refer to the LSP16 Specification to obtain the exact creation bytecode and salt that should be used to produce the address of the UniversalFactory on different chains. This factory contract is designed to deploy contracts at the same address on multiple chains. The UniversalFactory can deploy 2 types of contracts: - -- non-initializable (normal deployment) - -- initializable (external call after deployment, e.g: proxy contracts) The `providedSalt` parameter given by the deployer is not used directly as the salt by the CREATE2 opcode. Instead, it is used along with these parameters: - -- `initializable` boolean - -- `initializeCalldata` (when the contract is initializable and `initializable` is set to `true`). These three parameters are concatenated together and hashed to generate the final salt for CREATE2. See [`generateSalt`](#generatesalt) function for more details. The constructor and `initializeCalldata` SHOULD NOT include any network-specific parameters (e.g: chain-id, a local token contract address), otherwise the deployed contract will not be recreated at the same address across different networks, thus defeating the purpose of the UniversalFactory. One way to solve this problem is to set an EOA owner in the `initializeCalldata`/constructor that can later call functions that set these parameters as variables in the contract. The UniversalFactory must be deployed at the same address on different chains to successfully deploy contracts at the same address across different chains. - -## Public Methods - -Public methods are accessible externally from users, allowing interaction with this function from dApps or other smart contracts. -When marked as 'public', a method can be called both externally and internally, on the other hand, when marked as 'external', a method can only be called externally. - -### computeAddress - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#computeaddress) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Function signature: `computeAddress(bytes32,bytes32,bool,bytes)` -- Function selector: `0x3b315680` - -::: - -```solidity -function computeAddress( - bytes32 creationBytecodeHash, - bytes32 providedSalt, - bool initializable, - bytes initializeCalldata -) external view returns (address); -``` - -Computes the address of a contract to be deployed using CREATE2, based on the input parameters. Any change in one of these parameters will result in a different address. When the `initializable` boolean is set to `false`, `initializeCalldata` will not affect the function output. - -#### Parameters - -| Name | Type | Description | -| ---------------------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `creationBytecodeHash` | `bytes32` | The keccak256 hash of the creation bytecode to be deployed | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | -| `initializable` | `bool` | A boolean that indicates whether an external call should be made to initialize the contract after deployment | -| `initializeCalldata` | `bytes` | The calldata to be executed on the created contract if `initializable` is set to `true` | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------------------------------------------- | -| `0` | `address` | The address where the contract will be deployed | - -
- -### computeERC1167Address - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#computeerc1167address) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Function signature: `computeERC1167Address(address,bytes32,bool,bytes)` -- Function selector: `0xe888edcb` - -::: - -```solidity -function computeERC1167Address( - address implementationContract, - bytes32 providedSalt, - bool initializable, - bytes initializeCalldata -) external view returns (address); -``` - -Computes the address of an ERC1167 proxy contract based on the input parameters. Any change in one of these parameters will result in a different address. When the `initializable` boolean is set to `false`, `initializeCalldata` will not affect the function output. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `implementationContract` | `address` | The contract to create a clone of according to ERC1167 | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | -| `initializable` | `bool` | A boolean that indicates whether an external call should be made to initialize the proxy contract after deployment | -| `initializeCalldata` | `bytes` | The calldata to be executed on the created contract if `initializable` is set to `true` | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------------------------------- | -| `0` | `address` | The address where the ERC1167 proxy contract will be deployed | - -
- -### deployCreate2 - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#deploycreate2) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Function signature: `deployCreate2(bytes,bytes32)` -- Function selector: `0x26736355` - -::: - -```solidity -function deployCreate2( - bytes creationBytecode, - bytes32 providedSalt -) external payable returns (address); -``` - -_Deploys a smart contract._ - -Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeAddress`](#computeaddress) function. This function deploys contracts without initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `creationBytecode` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. If the constructor of the contract to deploy is payable, value can be sent to this function to fund the created contract. However, sending value to this function while the constructor is not payable will result in a revert. - -#### Parameters - -| Name | Type | Description | -| ------------------ | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `creationBytecode` | `bytes` | The creation bytecode of the contract to be deployed | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------ | -| `0` | `address` | The address of the deployed contract | - -
- -### deployCreate2AndInitialize - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#deploycreate2andinitialize) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Function signature: `deployCreate2AndInitialize(bytes,bytes32,bytes,uint256,uint256)` -- Function selector: `0xcdbd473a` - -::: - -```solidity -function deployCreate2AndInitialize( - bytes creationBytecode, - bytes32 providedSalt, - bytes initializeCalldata, - uint256 constructorMsgValue, - uint256 initializeCalldataMsgValue -) external payable returns (address); -``` - -_Deploys a smart contract and initializes it._ - -Deploys a contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeAddress`](#computeaddress) function. This function deploys contracts with initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(true, initializeCalldata, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `creationBytecode`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. If the constructor or the initialize function of the contract to deploy is payable, value can be sent along with the deployment/initialization to fund the created contract. However, sending value to this function while the constructor/initialize function is not payable will result in a revert. Will revert if the `msg.value` sent to the function is not equal to the sum of `constructorMsgValue` and `initializeCalldataMsgValue`. - -#### Parameters - -| Name | Type | Description | -| ---------------------------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `creationBytecode` | `bytes` | The creation bytecode of the contract to be deployed | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | -| `initializeCalldata` | `bytes` | The calldata to be executed on the created contract | -| `constructorMsgValue` | `uint256` | The value sent to the contract during deployment | -| `initializeCalldataMsgValue` | `uint256` | The value sent to the contract during initialization | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------ | -| `0` | `address` | The address of the deployed contract | - -
- -### deployERC1167Proxy - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#deployerc1167proxy) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Function signature: `deployERC1167Proxy(address,bytes32)` -- Function selector: `0x49d8abed` - -::: - -```solidity -function deployERC1167Proxy( - address implementationContract, - bytes32 providedSalt -) external nonpayable returns (address); -``` - -_Deploys a proxy smart contract._ - -Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeERC1167Address`](#computeerc1167address) function. This function deploys contracts without initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(false, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `implementationContract` and `providedSalt` multiple times will revert, as the contract cannot be deployed twice at the same address. Sending value to the contract created is not possible since the constructor of the ERC1167 minimal proxy is not payable. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `implementationContract` | `address` | The contract address to use as the base implementation behind the proxy that will be deployed | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------------------------------------- | -| `0` | `address` | The address of the minimal proxy deployed | - -
- -### deployERC1167ProxyAndInitialize - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#deployerc1167proxyandinitialize) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Function signature: `deployERC1167ProxyAndInitialize(address,bytes32,bytes)` -- Function selector: `0x5340165f` - -::: - -```solidity -function deployERC1167ProxyAndInitialize( - address implementationContract, - bytes32 providedSalt, - bytes initializeCalldata -) external payable returns (address); -``` - -_Deploys a proxy smart contract and initializes it._ - -Deploys an ERC1167 minimal proxy contract using the CREATE2 opcode. The address where the contract will be deployed can be known in advance via the [`computeERC1167Address`](#computeerc1167address) function. This function deploys contracts with initialization (external call after deployment). The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is hashed with keccak256: `keccak256(abi.encodePacked(true, initializeCalldata, providedSalt))`. See [`generateSalt`](#generatesalt) function for more details. Using the same `implementationContract`, `providedSalt` and `initializeCalldata` multiple times will revert, as the contract cannot be deployed twice at the same address. If the initialize function of the contract to deploy is payable, value can be sent along to fund the created contract while initializing. However, sending value to this function while the initialize function is not payable will result in a revert. - -#### Parameters - -| Name | Type | Description | -| ------------------------ | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `implementationContract` | `address` | The contract address to use as the base implementation behind the proxy that will be deployed | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | -| `initializeCalldata` | `bytes` | The calldata to be executed on the created contract | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ----------------------------------------- | -| `0` | `address` | The address of the minimal proxy deployed | - -
- -### generateSalt - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#generatesalt) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Function signature: `generateSalt(bytes32,bool,bytes)` -- Function selector: `0x1a17ccbf` - -::: - -```solidity -function generateSalt( - bytes32 providedSalt, - bool initializable, - bytes initializeCalldata -) external pure returns (bytes32); -``` - -Generates the salt used to deploy the contract by hashing the following parameters (concatenated together) with keccak256: - -1. the `providedSalt` - -2. the `initializable` boolean - -3. the `initializeCalldata`, only if the contract is initializable (the `initializable` boolean is set to `true`) - -- The `providedSalt` parameter is not used directly as the salt by the CREATE2 opcode. Instead, it is used along with these parameters: - -1. `initializable` boolean - -2. `initializeCalldata` (when the contract is initializable and `initializable` is set to `true`). - -- This approach ensures that in order to reproduce an initializable contract at the same address on another chain, not only the `providedSalt` is required to be the same, but also the initialize parameters within the `initializeCalldata` must also be the same. This maintains consistent deployment behaviour. Users are required to initialize contracts with the same parameters across different chains to ensure contracts are deployed at the same address across different chains. - -1. Example (for initializable contracts) - -- For an existing contract A on chain 1 owned by X, to replicate the same contract at the same address with the same owner X on chain 2, the salt used to generate the address should include the initializeCalldata that assigns X as the owner of contract A. - -- For instance, if another user, Y, tries to deploy the contract at the same address on chain 2 using the same providedSalt, but with a different initializeCalldata to make Y the owner instead of X, the generated address would be different, preventing Y from deploying the contract with different ownership at the same address. - -- However, for non-initializable contracts, if the constructor has arguments that specify the deployment behavior, they will be included in the creation bytecode. Any change in the constructor arguments will lead to a different contract's creation bytecode which will result in a different address on other chains. - -2. Example (for non-initializable contracts) - -- If a contract is deployed with specific constructor arguments on chain 1, these arguments are embedded within the creation bytecode. For instance, if contract B is deployed with a specific `tokenName` and `tokenSymbol` on chain 1, and a user wants to deploy the same contract with the same `tokenName` and `tokenSymbol` on chain 2, they must use the same constructor arguments to produce the same creation bytecode. This ensures that the same deployment behaviour is maintained across different chains, as long as the same creation bytecode is used. - -- If another user Z, tries to deploy the same contract B at the same address on chain 2 using the same `providedSalt` but different constructor arguments (a different `tokenName` and/or `tokenSymbol`), the generated address will be different. This prevents user Z from deploying the contract with different constructor arguments at the same address on chain 2. - -- The providedSalt was hashed to produce the salt used by CREATE2 opcode to prevent users from deploying initializable contracts using non-initializable functions such as [`deployCreate2`](#deploycreate2) without having the initialization call. - -- In other words, if the providedSalt was not hashed and was used as it is as the salt by the CREATE2 opcode, malicious users can check the generated salt used for the already deployed initializable contract on chain 1, and deploy the contract from [`deployCreate2`](#deploycreate2) function on chain 2, with passing the generated salt of the deployed contract as providedSalt that will produce the same address but without the initialization, where the malicious user can initialize after. - -#### Parameters - -| Name | Type | Description | -| -------------------- | :-------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| `providedSalt` | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment | -| `initializable` | `bool` | The Boolean that specifies if the contract must be initialized or not | -| `initializeCalldata` | `bytes` | The calldata to be executed on the created contract if `initializable` is set to `true` | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | ------------------------------------------------------------ | -| `0` | `bytes32` | The generated salt which will be used for CREATE2 deployment | - -
- -## Internal Methods - -Any method labeled as `internal` serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs. - -Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities. - -### \_verifyCallResult - -```solidity -function _verifyCallResult(bool success, bytes returndata) internal pure; -``` - -Verifies that the contract created was initialized correctly. -Bubble the revert reason if present, revert with `ContractInitializationFailed` otherwise. - -
- -## Events - -### ContractCreated - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#contractcreated) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Event signature: `ContractCreated(address,bytes32,bytes32,bool,bytes)` -- Event topic hash: `0x8872a323d65599f01bf90dc61c94b4e0cc8e2347d6af4122fccc3e112ee34a84` - -::: - -```solidity -event ContractCreated(address indexed createdContract, bytes32 indexed providedSalt, bytes32 generatedSalt, bool indexed initialized, bytes initializeCalldata); -``` - -_Contract created. Contract address: `createdContract`._ - -Emitted whenever a contract is created. - -#### Parameters - -| Name | Type | Description | -| ------------------------------- | :-------: | --------------------------------------------------------------------------------------------------------------------------------------------------- | -| `createdContract` **`indexed`** | `address` | The address of the contract created. | -| `providedSalt` **`indexed`** | `bytes32` | The salt provided by the deployer, which will be used to generate the final salt that will be used by the `CREATE2` opcode for contract deployment. | -| `generatedSalt` | `bytes32` | The salt used by the `CREATE2` opcode for contract deployment. | -| `initialized` **`indexed`** | `bool` | The Boolean that specifies if the contract must be initialized or not. | -| `initializeCalldata` | `bytes` | The bytes provided as initializeCalldata (Empty string when `initialized` is set to false). | - -
- -## Errors - -### ContractInitializationFailed - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#contractinitializationfailed) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Error signature: `ContractInitializationFailed()` -- Error hash: `0xc1ee8543` - -::: - -```solidity -error ContractInitializationFailed(); -``` - -_Couldn't initialize the contract._ - -Reverts when there is no revert reason bubbled up by the created contract when initializing - -
- -### InvalidValueSum - -:::note References - -- Specification details: [**LSP-16-UniversalFactory**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-16-UniversalFactory.md#invalidvaluesum) -- Solidity implementation: [`LSP16UniversalFactory.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol) -- Error signature: `InvalidValueSum()` -- Error hash: `0x2fd9ca91` - -::: - -```solidity -error InvalidValueSum(); -``` - -Reverts when `msg.value` sent to [`deployCreate2AndInitialize(..)`](#deploycreate2andinitialize) function is not equal to the sum of the `initializeCalldataMsgValue` and `constructorMsgValue` - -
diff --git a/docs/contracts/LSP17Extensions/Extension4337.md b/docs/contracts/LSP17Extensions/Extension4337.md deleted file mode 100644 index c7632c1f7..000000000 --- a/docs/contracts/LSP17Extensions/Extension4337.md +++ /dev/null @@ -1,211 +0,0 @@ - - - -# Extension4337 - -:::info Standard Specifications - -[`LSP-17-Extensions`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md) - -::: -:::info Solidity implementation - -[`Extension4337.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/Extension4337.sol) - -::: - -## Public Methods - -Public methods are accessible externally from users, allowing interaction with this function from dApps or other smart contracts. -When marked as 'public', a method can be called both externally and internally, on the other hand, when marked as 'external', a method can only be called externally. - -### constructor - -:::note References - -- Specification details: [**LSP-17-Extensions**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md#constructor) -- Solidity implementation: [`Extension4337.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/Extension4337.sol) - -::: - -```solidity -constructor(address entryPoint_); -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | :-------: | ----------- | -| `entryPoint_` | `address` | - | - -
- -### VERSION - -:::note References - -- Specification details: [**LSP-17-Extensions**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md#version) -- Solidity implementation: [`Extension4337.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/Extension4337.sol) -- Function signature: `VERSION()` -- Function selector: `0xffa1ad74` - -::: - -```solidity -function VERSION() external view returns (string); -``` - -_Contract version._ - -#### Returns - -| Name | Type | Description | -| ---- | :------: | ----------- | -| `0` | `string` | - | - -
- -### entryPoint - -:::note References - -- Specification details: [**LSP-17-Extensions**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md#entrypoint) -- Solidity implementation: [`Extension4337.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/Extension4337.sol) -- Function signature: `entryPoint()` -- Function selector: `0xb0d691fe` - -::: - -```solidity -function entryPoint() external view returns (address); -``` - -Get the address of the Entry Point contract that will execute the user operation. - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | -------------------------------------- | -| `0` | `address` | The address of the EntryPoint contract | - -
- -### supportsInterface - -:::note References - -- Specification details: [**LSP-17-Extensions**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md#supportsinterface) -- Solidity implementation: [`Extension4337.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/Extension4337.sol) -- Function signature: `supportsInterface(bytes4)` -- Function selector: `0x01ffc9a7` - -::: - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool); -``` - -See [`IERC165-supportsInterface`](#ierc165-supportsinterface). - -#### Parameters - -| Name | Type | Description | -| ------------- | :------: | ----------- | -| `interfaceId` | `bytes4` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ----------- | -| `0` | `bool` | - | - -
- -### validateUserOp - -:::note References - -- Specification details: [**LSP-17-Extensions**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md#validateuserop) -- Solidity implementation: [`Extension4337.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/Extension4337.sol) -- Function signature: `validateUserOp(UserOperation,bytes32,uint256)` -- Function selector: `0xe86fc51e` - -::: - -:::info - -In addition to the logic of the `IAccount` interface from 4337, the permissions of the address that signed the user operation are checked to ensure that it has the permission `_4337_PERMISSION`. - -::: - -```solidity -function validateUserOp( - UserOperation userOp, - bytes32 userOpHash, - uint256 -) external nonpayable returns (uint256); -``` - -Validate user's signature and nonce. The entryPoint will make the call to the recipient only if this validation call returns successfully. Signature failure should be reported by returning `SIG_VALIDATION_FAILED` (`1`). This allows making a "simulation call" without a valid signature. Other failures (_e.g. nonce mismatch, or invalid signature format_) should still revert to signal failure. The third parameter (not mentioned but `missingAccountFunds` from the `IAccount` interface) describes the missing funds on the account's deposit in the entrypoint. This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call. The excess is left as a deposit in the entrypoint, for future calls. Can be withdrawn anytime using "entryPoint.withdrawTo()" In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero. - -
- -**Requirements:** - -- caller MUST be the **entrypoint contract**. -- the signature and nonce must be valid. - -
- -#### Parameters - -| Name | Type | Description | -| ------------ | :-------------: | ----------- | -| `userOp` | `UserOperation` | - | -| `userOpHash` | `bytes32` | - | -| `_2` | `uint256` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :-------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `0` | `uint256` | validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode - `<20-byte>` sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an "authorizer" contract. - `<6-byte>` validUntil - last timestamp this operation is valid. 0 for "indefinite" - `<6-byte>` validAfter - first timestamp this operation is valid If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure. Note that the validation code cannot use block.timestamp (or block.number) directly. | - -
- -## Internal Methods - -Any method labeled as `internal` serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs. - -Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities. - -### \_extendableMsgData - -```solidity -function _extendableMsgData() internal view returns (bytes); -``` - -Returns the original `msg.data` passed to the extendable contract -without the appended `msg.sender` and `msg.value`. - -
- -### \_extendableMsgSender - -```solidity -function _extendableMsgSender() internal view returns (address); -``` - -Returns the original `msg.sender` calling the extendable contract. - -
- -### \_extendableMsgValue - -```solidity -function _extendableMsgValue() internal view returns (uint256); -``` - -Returns the original `msg.value` sent to the extendable contract. - -
diff --git a/docs/contracts/LSP17Extensions/OnERC721ReceivedExtension.md b/docs/contracts/LSP17Extensions/OnERC721ReceivedExtension.md deleted file mode 100644 index bd763aff9..000000000 --- a/docs/contracts/LSP17Extensions/OnERC721ReceivedExtension.md +++ /dev/null @@ -1,154 +0,0 @@ - - - -# OnERC721ReceivedExtension - -:::info Standard Specifications - -[`LSP-17-Extensions`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md) - -::: -:::info Solidity implementation - -[`OnERC721ReceivedExtension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol) - -::: - -LSP17 Extension that can be attached to a LSP17Extendable contract to allow it to receive ERC721 tokens via `safeTransferFrom`. - -## Public Methods - -Public methods are accessible externally from users, allowing interaction with this function from dApps or other smart contracts. -When marked as 'public', a method can be called both externally and internally, on the other hand, when marked as 'external', a method can only be called externally. - -### VERSION - -:::note References - -- Specification details: [**LSP-17-Extensions**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md#version) -- Solidity implementation: [`OnERC721ReceivedExtension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol) -- Function signature: `VERSION()` -- Function selector: `0xffa1ad74` - -::: - -```solidity -function VERSION() external view returns (string); -``` - -_Contract version._ - -#### Returns - -| Name | Type | Description | -| ---- | :------: | ----------- | -| `0` | `string` | - | - -
- -### onERC721Received - -:::note References - -- Specification details: [**LSP-17-Extensions**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md#onerc721received) -- Solidity implementation: [`OnERC721ReceivedExtension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol) -- Function signature: `onERC721Received(address,address,uint256,bytes)` -- Function selector: `0x150b7a02` - -::: - -```solidity -function onERC721Received( - address, - address, - uint256, - bytes -) external nonpayable returns (bytes4); -``` - -See [`IERC721Receiver-onERC721Received`](#ierc721receiver-onerc721received). Always returns `IERC721Receiver.onERC721Received.selector`. - -#### Parameters - -| Name | Type | Description | -| ---- | :-------: | ----------- | -| `_0` | `address` | - | -| `_1` | `address` | - | -| `_2` | `uint256` | - | -| `_3` | `bytes` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :------: | ----------- | -| `0` | `bytes4` | - | - -
- -### supportsInterface - -:::note References - -- Specification details: [**LSP-17-Extensions**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-Extensions.md#supportsinterface) -- Solidity implementation: [`OnERC721ReceivedExtension.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol) -- Function signature: `supportsInterface(bytes4)` -- Function selector: `0x01ffc9a7` - -::: - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool); -``` - -See [`IERC165-supportsInterface`](#ierc165-supportsinterface). - -#### Parameters - -| Name | Type | Description | -| ------------- | :------: | ----------- | -| `interfaceId` | `bytes4` | - | - -#### Returns - -| Name | Type | Description | -| ---- | :----: | ----------- | -| `0` | `bool` | - | - -
- -## Internal Methods - -Any method labeled as `internal` serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs. - -Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities. - -### \_extendableMsgData - -```solidity -function _extendableMsgData() internal view returns (bytes); -``` - -Returns the original `msg.data` passed to the extendable contract -without the appended `msg.sender` and `msg.value`. - -
- -### \_extendableMsgSender - -```solidity -function _extendableMsgSender() internal view returns (address); -``` - -Returns the original `msg.sender` calling the extendable contract. - -
- -### \_extendableMsgValue - -```solidity -function _extendableMsgValue() internal view returns (uint256); -``` - -Returns the original `msg.value` sent to the extendable contract. - -
diff --git a/docs/libraries/LSP1UniversalReceiver/LSP1Utils.md b/docs/libraries/@lukso/lsp1-contracts/contracts/LSP1Utils.md similarity index 96% rename from docs/libraries/LSP1UniversalReceiver/LSP1Utils.md rename to docs/libraries/@lukso/lsp1-contracts/contracts/LSP1Utils.md index a897fa7d0..ea1f803ff 100644 --- a/docs/libraries/LSP1UniversalReceiver/LSP1Utils.md +++ b/docs/libraries/@lukso/lsp1-contracts/contracts/LSP1Utils.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-1-UniversalReceiver`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiver.md) +[`LSP-1-UniversalReceiver`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-1-UniversalReceiver.md) ::: :::info Solidity implementation -[`LSP1Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP1UniversalReceiver/LSP1Utils.sol) +[`LSP1Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp1-contracts/contracts/LSP1Utils.sol) ::: diff --git a/docs/libraries/LSP10ReceivedVaults/LSP10Utils.md b/docs/libraries/@lukso/lsp10-contracts/contracts/LSP10Utils.md similarity index 96% rename from docs/libraries/LSP10ReceivedVaults/LSP10Utils.md rename to docs/libraries/@lukso/lsp10-contracts/contracts/LSP10Utils.md index 7aeca69b5..f4c9ad65a 100644 --- a/docs/libraries/LSP10ReceivedVaults/LSP10Utils.md +++ b/docs/libraries/@lukso/lsp10-contracts/contracts/LSP10Utils.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-10-ReceivedVaults`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-10-ReceivedVaults.md) +[`LSP-10-ReceivedVaults`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-10-ReceivedVaults.md) ::: :::info Solidity implementation -[`LSP10Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP10ReceivedVaults/LSP10Utils.sol) +[`LSP10Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp10-contracts/contracts/LSP10Utils.sol) ::: diff --git a/docs/libraries/LSP2ERC725YJSONSchema/LSP2Utils.md b/docs/libraries/@lukso/lsp2-contracts/contracts/LSP2Utils.md similarity index 98% rename from docs/libraries/LSP2ERC725YJSONSchema/LSP2Utils.md rename to docs/libraries/@lukso/lsp2-contracts/contracts/LSP2Utils.md index b6a5f5b8e..184652fb3 100644 --- a/docs/libraries/LSP2ERC725YJSONSchema/LSP2Utils.md +++ b/docs/libraries/@lukso/lsp2-contracts/contracts/LSP2Utils.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-2-ERC725YJSONSchema`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-2-ERC725YJSONSchema.md) +[`LSP-2-ERC725YJSONSchema`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-2-ERC725YJSONSchema.md) ::: :::info Solidity implementation -[`LSP2Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol) +[`LSP2Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp2-contracts/contracts/LSP2Utils.sol) ::: diff --git a/docs/libraries/LSP5ReceivedAssets/LSP5Utils.md b/docs/libraries/@lukso/lsp5-contracts/contracts/LSP5Utils.md similarity index 96% rename from docs/libraries/LSP5ReceivedAssets/LSP5Utils.md rename to docs/libraries/@lukso/lsp5-contracts/contracts/LSP5Utils.md index b910fe422..167d71f92 100644 --- a/docs/libraries/LSP5ReceivedAssets/LSP5Utils.md +++ b/docs/libraries/@lukso/lsp5-contracts/contracts/LSP5Utils.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-5-ReceivedAssets`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-5-ReceivedAssets.md) +[`LSP-5-ReceivedAssets`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-5-ReceivedAssets.md) ::: :::info Solidity implementation -[`LSP5Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP5ReceivedAssets/LSP5Utils.sol) +[`LSP5Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp5-contracts/contracts/LSP5Utils.sol) ::: diff --git a/docs/libraries/LSP6KeyManager/LSP6Utils.md b/docs/libraries/@lukso/lsp6-contracts/contracts/LSP6Utils.md similarity index 98% rename from docs/libraries/LSP6KeyManager/LSP6Utils.md rename to docs/libraries/@lukso/lsp6-contracts/contracts/LSP6Utils.md index 61ad46ad3..495ad923d 100644 --- a/docs/libraries/LSP6KeyManager/LSP6Utils.md +++ b/docs/libraries/@lukso/lsp6-contracts/contracts/LSP6Utils.md @@ -5,12 +5,12 @@ :::info Standard Specifications -[`LSP-6-KeyManager`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-6-KeyManager.md) +[`LSP-6-KeyManager`](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-6-KeyManager.md) ::: :::info Solidity implementation -[`LSP6Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP6KeyManager/LSP6Utils.sol) +[`LSP6Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/@lukso/lsp6-contracts/contracts/LSP6Utils.sol) ::: diff --git a/docs/libraries/LSP17ContractExtension/LSP17Utils.md b/docs/libraries/LSP17ContractExtension/LSP17Utils.md deleted file mode 100644 index 57ca72d1b..000000000 --- a/docs/libraries/LSP17ContractExtension/LSP17Utils.md +++ /dev/null @@ -1,38 +0,0 @@ - - - -# LSP17Utils - -:::info Standard Specifications - -[`LSP-17-ContractExtension`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-17-ContractExtension.md) - -::: -:::info Solidity implementation - -[`LSP17Utils.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/contracts/LSP17ContractExtension/LSP17Utils.sol) - -::: - -> LSP17 Utility library to check an extension - -## Internal Methods - -Any method labeled as `internal` serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs. - -Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities. - -### isExtension - -```solidity -function isExtension( - uint256 parametersLengthWithOffset, - uint256 msgDataLength -) internal pure returns (bool); -``` - -Returns whether the call is a normal call or an extension call by checking if -the `parametersLengthWithOffset` with an additional of 52 bytes supposed msg.sender -and msg.value appended is equal to the msgDataLength - -
diff --git a/dtsconfig.json b/dtsconfig.json deleted file mode 100644 index d8667d26b..000000000 --- a/dtsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilationOptions": { - "preferredConfigPath": "./tsconfig.module.json" - }, - "entries": [ - { - "filePath": "constants.ts", - "outFile": "dist/constants.d.ts", - "failOnClass": true - } - ] -} diff --git a/foundry.toml b/foundry.toml index a10f28357..8271ca127 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,6 +6,27 @@ gas_reports = ["LSP6ExecuteRestrictedController", "LSP6ExecuteUnrestrictedContro cache_path = 'forge-cache' test = 'tests/foundry' solc_version = "0.8.17" + [fuzz] runs = 10_000 max_test_rejects = 200_000 + +[profile.lsp2] +src = 'packages/lsp2-contracts/contracts' +test = 'packages/lsp2-contracts/foundry' +out = 'packages/lsp2-contracts/contracts/foundry_artifacts' + +[profile.lsp6] +src = 'packages/lsp6-contracts/contracts' +test = 'packages/lsp6-contracts/foundry' +out = 'packages/lsp6-contracts/contracts/foundry_artifacts' + +[profile.lsp16] +src = 'packages/lsp16-contracts/contracts' +test = 'packages/lsp16-contracts/foundry' +out = 'packages/lsp16-contracts/contracts/foundry_artifacts' + +[profile.lsp_smart_contracts] +src = 'packages/lsp-smart-contracts/contracts' +test = 'packages/lsp-smart-contracts/tests/foundry' +out = 'packages/lsp-smart-contracts/contracts/foundry_artifacts' diff --git a/gas_benchmark_result.json b/gas_benchmark_result.json new file mode 100644 index 000000000..e21f05d3e --- /dev/null +++ b/gas_benchmark_result.json @@ -0,0 +1,204 @@ +{ + "deployment_costs": { + "UniversalProfile": "", + "KeyManager": "", + "LSP1DelegateUP": "", + "LSP7Mintable": "", + "LSP8Mintable": "" + }, + "runtime_costs": { + "EOA_owner": { + "execute": { + "case_1": { + "description": "Transfer 1 LYX to an EOA without data", + "gas_cost": "" + }, + "case_2": { + "description": "Transfer 1 LYX to a UP without data", + "gas_cost": "" + }, + "case_3": { + "description": "Transfer 1 LYX to an EOA with 256 bytes of data", + "gas_cost": "" + }, + "case_4": { + "description": "Transfer 1 LYX to a UP with 256 bytes of data", + "gas_cost": "" + }, + "case_5": { + "description": "Transfer 0.1 LYX to 3x EOA without data", + "gas_cost": "" + }, + "case_6": { + "description": "Transfer 0.1 LYX to 3x UP without data", + "gas_cost": "" + }, + "case_7": { + "description": "Transfer 0.1 LYX to 3x EOA with 256 bytes of data", + "gas_cost": "" + }, + "case_8": { + "description": "Transfer 0.1 LYX to 3x UPs with 256 bytes of data", + "gas_cost": "" + } + }, + "setData": { + "case_1": { + "description": "Set a 20 bytes long value", + "gas_cost": "" + }, + "case_2": { + "description": "Set a 60 bytes long value", + "gas_cost": "" + }, + "case_3": { + "description": "Set a 160 bytes long value", + "gas_cost": "" + }, + "case_4": { + "description": "Set a 300 bytes long value", + "gas_cost": "" + }, + "case_5": { + "description": "Set a 600 bytes long value", + "gas_cost": "" + }, + "case_6": { + "description": "Change the value of a data key already set", + "gas_cost": "" + }, + "case_7": { + "description": "Remove the value of a data key already set", + "gas_cost": "" + }, + "case_8": { + "description": "Set 2 data keys of 20 bytes long value", + "gas_cost": "" + }, + "case_9": { + "description": "Set 2 data keys of 100 bytes long value", + "gas_cost": "" + }, + "case_10": { + "description": "Set 3 data keys of 20 bytes long value", + "gas_cost": "" + }, + "case_11": { + "description": "Change the value of three data keys already set of 20 bytes long value", + "gas_cost": "" + }, + "case_12": { + "description": "Remove the value of three data keys already set", + "gas_cost": "" + } + }, + "tokens": { + "case_1": { + "description": "Minting a LSP7Token to a UP (No Delegate) from an EOA", + "gas_cost": "" + }, + "case_2": { + "description": "Minting a LSP7Token to an EOA from an EOA", + "gas_cost": "" + }, + "case_3": { + "description": "Transferring an LSP7Token from a UP to another UP (No Delegate)", + "gas_cost": "" + }, + "case_4": { + "description": "Minting a LSP8Token to a UP (No Delegate) from an EOA ", + "gas_cost": "" + }, + "case_5": { + "description": "Minting a LSP8Token to an EOA from an EOA ", + "gas_cost": "" + }, + "case_6": { + "description": "Transferring an LSP8Token from a UP to another UP (No Delegate)", + "gas_cost": "" + } + } + }, + "KeyManager_owner": { + "execute": { + "case_1": { + "description": "LYX transfer --> to an EOA", + "main_controller": "", + "restricted_controller": "" + }, + "case_2": { + "description": "LYX transfer --> to a UP", + "main_controller": "", + "restricted_controller": "" + }, + "case_3": { + "description": "LSP7 token transfer --> to an EOA", + "main_controller": "", + "restricted_controller": "" + }, + "case_4": { + "description": "LSP7 token transfer --> to a UP", + "main_controller": "", + "restricted_controller": "" + }, + "case_5": { + "description": "LSP8 NFT transfer --> to an EOA", + "main_controller": "", + "restricted_controller": "" + }, + "case_6": { + "description": "LSP8 NFT transfer --> to a UP", + "main_controller": "", + "restricted_controller": "" + } + }, + "setData": { + "case_1": { + "description": "Update Profile details (LSP3Profile Metadata)", + "main_controller": "", + "restricted_controller": "" + }, + "case_2": { + "description": "Add a new controller with permission to `SET_DATA` + 3x allowed data keys:
`AddressPermissions[]`
+ `AddressPermissions[index]`
+ `AddressPermissions:Permissions:`
+ `AddressPermissions:AllowedERC725YDataKeys: 1. decrease `AddressPermissions[]` Array length
2. remove the controller address at `AddressPermissions[index]`
3. set \"0x\" for the controller permissions under AddressPermissions:Permissions:", + "main_controller": "", + "restricted_controller": "" + }, + "case_5": { + "description": "Write 5x new LSP12 Issued Assets", + "main_controller": "", + "restricted_controller": "" + }, + "case_6": { + "description": "Update 3x data keys (first 3)", + "main_controller": "", + "restricted_controller": "" + }, + "case_7": { + "description": "Update 3x data keys (middle 3)", + "main_controller": "", + "restricted_controller": "" + }, + "case_8": { + "description": "Update 3x data keys (last 3)", + "main_controller": "", + "restricted_controller": "" + }, + "case_9": { + "description": "Set 2 x new data keys + add 3x new controllers", + "main_controller": "", + "restricted_controller": "" + } + } + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 927bad5fd..d8efb1989 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,47 +1,41 @@ { - "name": "@lukso/lsp-smart-contracts", - "version": "0.14.0", - "lockfileVersion": 2, + "name": "@lukso/lsp-smart-contracts-monorepo", + "version": "0.12.1", + "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@lukso/lsp-smart-contracts", - "version": "0.14.0", + "name": "@lukso/lsp-smart-contracts-monorepo", + "version": "0.12.1", + "hasInstallScript": true, "license": "Apache-2.0", - "dependencies": { - "@account-abstraction/contracts": "^0.6.0", - "@erc725/smart-contracts": "^7.0.0", - "@openzeppelin/contracts": "^4.9.2", - "@openzeppelin/contracts-upgradeable": "^4.9.2", - "solidity-bytes-utils": "0.8.0" - }, + "workspaces": [ + "config/*", + "packages/*" + ], "devDependencies": { - "@b00ste/hardhat-dodoc": "^0.3.15", - "@defi-wonderland/smock": "^2.3.4", - "@erc725/erc725.js": "0.17.2", + "@b00ste/hardhat-dodoc": "^0.3.16", + "@erc725/erc725.js": "0.23.0", "@lukso/eip191-signer.js": "^0.2.2", - "@nomicfoundation/hardhat-toolbox": "^2.0.2", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", "@nomiclabs/hardhat-web3": "^2.0.0", - "@remix-project/remixd": "^0.6.12", - "@typechain/ethers-v5": "^10.2.0", - "@typescript-eslint/eslint-plugin": "^5.60.0", - "all-contributors-cli": "^6.24.0", + "@turbo/gen": "^1.12.3", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "9.1.0", + "all-contributors-cli": "^6.26.1", "dotenv": "^16.0.3", - "dts-bundle-generator": "^8.0.0", "esbuild": "^0.17.15", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint": "^7.32.0", + "eslint-config-custom": "*", "eth-create2-calculator": "^1.1.5", - "ethers": "^5.7.2", - "hardhat": "^2.13.0", + "ethers": "^6.11.0", + "hardhat": "^2.20.1", "hardhat-contract-sizer": "^2.8.0", "hardhat-deploy": "^0.11.25", - "hardhat-deploy-ethers": "^0.3.0-beta.13", + "hardhat-deploy-ethers": "^0.4.1", "hardhat-gas-reporter": "^1.0.9", "hardhat-packager": "^1.4.2", - "keccak256": "1.0.6", "markdown-table-ts": "^1.0.3", - "merkletreejs": "0.2.32", "npm-run-all": "^4.1.5", "pluralize": "^8.0.0", "prettier": "^2.8.8", @@ -49,26 +43,54 @@ "rollup-plugin-esbuild": "^5.0.0", "solhint": "^3.6.2", "ts-node": "^10.2.0", - "typechain": "^8.0.0", - "typescript": "^4.9.5", - "vite": "^4.2.1", + "turbo": "latest", + "typechain": "^8.3.2", + "typescript": "^5.3.3", + "unbuild": "^2.0.0", "vite-plugin-checker": "^0.5.6", "vite-tsconfig-paths": "^4.0.7", "web3": "^1.5.2" } }, + "config/eslint-config-custom": { + "version": "0.0.0", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.2.1", + "@typescript-eslint/parser": "^6.2.1", + "eslint-config-prettier": "^8.8.0", + "eslint-config-turbo": "^1.9.3", + "eslint-plugin-prettier": "^4.2.1" + } + }, + "config/tsconfig": { + "version": "0.0.0", + "license": "Apache-2.0" + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@account-abstraction/contracts": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@account-abstraction/contracts/-/contracts-0.6.0.tgz", "integrity": "sha512-8ooRJuR7XzohMDM4MV34I12Ci2bmxfE9+cixakRL7lA4BAwJKQ3ahvd8FbJa9kiwkUPCUNtj+/zxDQWYYalLMQ==" }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "dev": true + }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "peer": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -76,11 +98,12 @@ } }, "node_modules/@b00ste/hardhat-dodoc": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@b00ste/hardhat-dodoc/-/hardhat-dodoc-0.3.15.tgz", - "integrity": "sha512-3aGhCRr09oe0meHxoE1xxk0aXbTe0XHcTbyeNEuaNBgCvN+ESAtsi/VUCL3IG9kWEgOgeXeEfHlPTGRjNx2dmg==", + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@b00ste/hardhat-dodoc/-/hardhat-dodoc-0.3.16.tgz", + "integrity": "sha512-ofCRmEkKG/DADlMzeMNQm1U5wthZpYdhOU4jQ2h3Enh3kygRBLqP7A7zAzOfFqLOvrGf+IsfZZosbcVtjhK1og==", "dev": true, "dependencies": { + "@lukso/lsp-smart-contracts": "^0.14.0", "squirrelly": "^8.0.8" }, "peerDependencies": { @@ -88,46 +111,55 @@ "squirrelly": "^8.0.8" } }, + "node_modules/@b00ste/hardhat-dodoc/node_modules/@lukso/lsp-smart-contracts": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@lukso/lsp-smart-contracts/-/lsp-smart-contracts-0.14.0.tgz", + "integrity": "sha512-HjMpO/DfcAnL2YAoGSq4TazwsKof3CClyi33cwkOIdH7b81DMP5Z4LLjOjAGURrJlMj8wH4cLp5+4nvZ4NVSIA==", + "dev": true, + "dependencies": { + "@account-abstraction/contracts": "^0.6.0", + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.2", + "@openzeppelin/contracts-upgradeable": "^4.9.2", + "solidity-bytes-utils": "0.8.0" + } + }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/highlight": "^7.10.4" } }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "peer": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -137,233 +169,213 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "peer": true, + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dependencies": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "peer": true, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "peer": true, + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "peer": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "peer": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "peer": true, + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "peer": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "peer": true, + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "peer": true, + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -371,10 +383,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "peer": true, + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -383,16 +394,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -401,67 +412,111 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "node_modules/@babel/runtime-corejs3": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.9.tgz", + "integrity": "sha512-oeOFTrYWdWXCvXGB5orvMTJ6gCZ9I6FBjR+M38iKNXCsPxr4xT0RTdg5uz1H7QP8pp74IzPtwritEr+JscqHXQ==", + "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/standalone": { + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.23.10.tgz", + "integrity": "sha512-xqWviI/pt1Zb/d+6ilWa5IDL2mkDzsBnlHbreqnfyP3/QB/ofQ1bNVcHj8YQX154Rf/xZKR6y0s1ydVF3nAS8g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "peer": true, + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "peer": true, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -490,136 +545,17 @@ "node": ">=12" } }, - "node_modules/@defi-wonderland/smock": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@defi-wonderland/smock/-/smock-2.3.4.tgz", - "integrity": "sha512-VYJbsoCOdFRyGkAwvaQhQRrU6V8AjK3five8xdbo41DEE9n3qXzUNBUxyD9HhXB/dWWPFWT21IGw5Ztl6Qw3Ew==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", - "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", - "diff": "^5.0.0", - "lodash.isequal": "^4.5.0", - "lodash.isequalwith": "^4.4.0", - "rxjs": "^7.2.0", - "semver": "^7.3.5" - }, - "peerDependencies": { - "@ethersproject/abi": "^5", - "@ethersproject/abstract-provider": "^5", - "@ethersproject/abstract-signer": "^5", - "@nomiclabs/hardhat-ethers": "^2", - "ethers": "^5", - "hardhat": "^2" - } - }, - "node_modules/@defi-wonderland/smock/node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@defi-wonderland/smock/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, "node_modules/@erc725/erc725.js": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@erc725/erc725.js/-/erc725.js-0.17.2.tgz", - "integrity": "sha512-PwlTnSY0VhhcovRsne4vDevYYEeiGxwRhueR9C457u9d9Cg7evPkoFb+hmCUrT5xuOdjAbqeAaV1V8QXAfhTuA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@erc725/erc725.js/-/erc725.js-0.23.0.tgz", + "integrity": "sha512-v2qPnH7IXSh4td3br+LNXdhfiFrtx/AOBnNbFZKZVHQdVdapKAtZVmrKV1svTlztxxRgQQ24wLgEMkxr9GiguA==", "dev": true, "dependencies": { + "add": "^2.0.6", "ethereumjs-util": "^7.1.5", - "web3-eth-abi": "^1.8.2", - "web3-providers-http": "^1.8.0", - "web3-utils": "^1.8.2" - } - }, - "node_modules/@erc725/erc725.js/node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/@erc725/erc725.js/node_modules/web3-core-helpers": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.9.0.tgz", - "integrity": "sha512-NeJzylAp9Yj9xAt2uTT+kyug3X0DLnfBdnAcGZuY6HhoNPDIfQRA9CkJjLngVRlGTLZGjNp9x9eR+RyZQgUlXg==", - "dev": true, - "dependencies": { - "web3-eth-iban": "1.9.0", - "web3-utils": "1.9.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@erc725/erc725.js/node_modules/web3-eth-abi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.9.0.tgz", - "integrity": "sha512-0BLQ3FKMrzJkA930jOX3fMaybAyubk06HChclLpiR0NWmgWXm1tmBrJdkyRy2ZTZpmfuZc9xTFRfl0yZID1voA==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.9.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@erc725/erc725.js/node_modules/web3-eth-iban": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.9.0.tgz", - "integrity": "sha512-jPAm77PuEs1kE/UrrBFJdPD2PN42pwfXA0gFuuw35bZezhskYML9W4QCxcqnUtceyEA4FUn7K2qTMuCk+23fog==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.9.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@erc725/erc725.js/node_modules/web3-providers-http": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.9.0.tgz", - "integrity": "sha512-5+dMNDAE0rRFz6SJpfnBqlVi2J5bB/Ivr2SanMt2YUrkxW5t8betZbzVwRkTbwtUvkqgj3xeUQzqpOttiv+IqQ==", - "dev": true, - "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.9.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@erc725/erc725.js/node_modules/web3-utils": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.9.0.tgz", - "integrity": "sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" + "web3-eth-abi": "^1.10.0", + "web3-providers-http": "^1.10.0", + "web3-utils": "^1.10.0" } }, "node_modules/@erc725/smart-contracts": { @@ -632,10 +568,26 @@ "solidity-bytes-utils": "0.8.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", - "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "cpu": [ "arm" ], @@ -649,9 +601,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", - "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "cpu": [ "arm64" ], @@ -665,9 +617,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", - "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "cpu": [ "x64" ], @@ -681,9 +633,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", - "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", "cpu": [ "arm64" ], @@ -697,9 +649,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", - "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "cpu": [ "x64" ], @@ -713,9 +665,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", - "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", "cpu": [ "arm64" ], @@ -729,9 +681,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", - "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", "cpu": [ "x64" ], @@ -745,9 +697,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", - "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", "cpu": [ "arm" ], @@ -761,9 +713,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", - "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", "cpu": [ "arm64" ], @@ -777,9 +729,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", - "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", "cpu": [ "ia32" ], @@ -793,9 +745,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", - "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "cpu": [ "loong64" ], @@ -809,9 +761,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", - "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", "cpu": [ "mips64el" ], @@ -825,9 +777,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", - "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", "cpu": [ "ppc64" ], @@ -841,9 +793,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", - "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", "cpu": [ "riscv64" ], @@ -857,9 +809,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", - "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", "cpu": [ "s390x" ], @@ -873,9 +825,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", - "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "cpu": [ "x64" ], @@ -889,9 +841,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", - "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", "cpu": [ "x64" ], @@ -905,9 +857,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", - "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", "cpu": [ "x64" ], @@ -921,9 +873,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", - "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", "cpu": [ "x64" ], @@ -937,9 +889,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", - "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", "cpu": [ "arm64" ], @@ -953,9 +905,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", - "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", "cpu": [ "ia32" ], @@ -969,9 +921,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", - "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "cpu": [ "x64" ], @@ -988,7 +940,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -999,78 +950,89 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true, + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "peer": true, + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dependencies": { "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "peer": true, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "sprintf-js": "~1.0.2" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", - "dev": true, - "peer": true, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "*" } }, + "node_modules/@eslint/eslintrc/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, "node_modules/@ethereumjs/common": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", @@ -1080,6 +1042,18 @@ "ethereumjs-util": "^7.1.5" } }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@ethereumjs/tx": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", @@ -1089,11 +1063,60 @@ "ethereumjs-util": "^7.1.5" } }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dev": true, + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.3" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", + "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", + "dev": true, + "dependencies": { + "@noble/curves": "1.3.0", + "@noble/hashes": "1.3.3", + "@scure/bip32": "1.3.3", + "@scure/bip39": "1.2.2" + } + }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, "funding": [ { "type": "individual", @@ -1120,7 +1143,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "dev": true, "funding": [ { "type": "individual", @@ -1145,7 +1167,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1168,7 +1189,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "dev": true, "funding": [ { "type": "individual", @@ -1191,7 +1211,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1230,7 +1249,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "dev": true, "funding": [ { "type": "individual", @@ -1251,7 +1269,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "dev": true, "funding": [ { "type": "individual", @@ -1270,7 +1287,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "dev": true, "funding": [ { "type": "individual", @@ -1317,7 +1333,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "dev": true, "funding": [ { "type": "individual", @@ -1401,11 +1416,16 @@ "scrypt-js": "3.0.1" } }, + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true + }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "dev": true, "funding": [ { "type": "individual", @@ -1425,7 +1445,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "dev": true, "funding": [ { "type": "individual", @@ -1441,7 +1460,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1480,7 +1498,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "dev": true, "funding": [ { "type": "individual", @@ -1533,6 +1550,27 @@ "ws": "7.4.6" } }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@ethersproject/random": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", @@ -1557,7 +1595,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "dev": true, "funding": [ { "type": "individual", @@ -1598,7 +1635,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "dev": true, "funding": [ { "type": "individual", @@ -1646,7 +1682,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "dev": true, "funding": [ { "type": "individual", @@ -1667,7 +1702,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1748,7 +1782,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "dev": true, "funding": [ { "type": "individual", @@ -1790,59 +1823,70 @@ "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", "dev": true, - "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.22" + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": "*" } }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true, - "peer": true + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "peer": true, + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } @@ -1851,15 +1895,14 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "peer": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", @@ -1882,47 +1925,93 @@ "web3-utils": "^1.7.5" } }, - "node_modules/@lukso/eip191-signer.js/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } + "node_modules/@lukso/lsp-smart-contracts": { + "resolved": "packages/lsp-smart-contracts", + "link": true }, - "node_modules/@lukso/eip191-signer.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/@lukso/lsp0-contracts": { + "resolved": "packages/lsp0-contracts", + "link": true }, - "node_modules/@lukso/eip191-signer.js/node_modules/ethereumjs-account": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz", - "integrity": "sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==", - "deprecated": "Please use Util.Account class found on package ethereumjs-util@^7.0.6 https://github.com/ethereumjs/ethereumjs-util/releases/tag/v7.0.6", - "dev": true, - "dependencies": { - "ethereumjs-util": "^6.0.0", - "rlp": "^2.2.1", - "safe-buffer": "^5.1.1" - } + "node_modules/@lukso/lsp1-contracts": { + "resolved": "packages/lsp1-contracts", + "link": true }, - "node_modules/@lukso/eip191-signer.js/node_modules/ethereumjs-account/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } + "node_modules/@lukso/lsp10-contracts": { + "resolved": "packages/lsp10-contracts", + "link": true + }, + "node_modules/@lukso/lsp12-contracts": { + "resolved": "packages/lsp12-contracts", + "link": true + }, + "node_modules/@lukso/lsp14-contracts": { + "resolved": "packages/lsp14-contracts", + "link": true + }, + "node_modules/@lukso/lsp16-contracts": { + "resolved": "packages/lsp16-contracts", + "link": true + }, + "node_modules/@lukso/lsp17-contracts": { + "resolved": "packages/lsp17-contracts", + "link": true + }, + "node_modules/@lukso/lsp17contractextension-contracts": { + "resolved": "packages/lsp17contractextension-contracts", + "link": true + }, + "node_modules/@lukso/lsp1delegate-contracts": { + "resolved": "packages/lsp1delegate-contracts", + "link": true + }, + "node_modules/@lukso/lsp2-contracts": { + "resolved": "packages/lsp2-contracts", + "link": true + }, + "node_modules/@lukso/lsp20-contracts": { + "resolved": "packages/lsp20-contracts", + "link": true + }, + "node_modules/@lukso/lsp23-contracts": { + "resolved": "packages/lsp23-contracts", + "link": true + }, + "node_modules/@lukso/lsp25-contracts": { + "resolved": "packages/lsp25-contracts", + "link": true + }, + "node_modules/@lukso/lsp3-contracts": { + "resolved": "packages/lsp3-contracts", + "link": true + }, + "node_modules/@lukso/lsp4-contracts": { + "resolved": "packages/lsp4-contracts", + "link": true + }, + "node_modules/@lukso/lsp5-contracts": { + "resolved": "packages/lsp5-contracts", + "link": true + }, + "node_modules/@lukso/lsp6-contracts": { + "resolved": "packages/lsp6-contracts", + "link": true + }, + "node_modules/@lukso/lsp7-contracts": { + "resolved": "packages/lsp7-contracts", + "link": true + }, + "node_modules/@lukso/lsp8-contracts": { + "resolved": "packages/lsp8-contracts", + "link": true + }, + "node_modules/@lukso/lsp9-contracts": { + "resolved": "packages/lsp9-contracts", + "link": true + }, + "node_modules/@lukso/universalprofile-contracts": { + "resolved": "packages/universalprofile-contracts", + "link": true }, "node_modules/@metamask/eth-sig-util": { "version": "4.0.1", @@ -1971,16 +2060,29 @@ "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==" }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/@noble/secp256k1": { "version": "1.6.3", @@ -1997,7 +2099,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2010,7 +2111,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -2019,7 +2119,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2029,212 +2128,259 @@ } }, "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz", - "integrity": "sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz", + "integrity": "sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-tx": "4.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz", - "integrity": "sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-ethash": "2.0.5", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "abstract-level": "^1.0.3", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz", + "integrity": "sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-ethash": "3.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" + "lru-cache": "^10.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz", - "integrity": "sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-util": "8.0.6", - "crc-32": "^1.2.0" + "@nomicfoundation/ethereumjs-util": "9.0.4" } }, "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz", - "integrity": "sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz", + "integrity": "sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "bigint-crypto-utils": "^3.2.2", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz", - "integrity": "sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz", + "integrity": "sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@types/debug": "^4.1.9", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "rustbn-wasm": "^0.2.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz", - "integrity": "sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", "dev": true, "bin": { - "rlp": "bin/rlp" + "rlp": "bin/rlp.cjs" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz", - "integrity": "sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz", + "integrity": "sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-util": "8.0.6", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1" - } - }, + "js-sdsl": "^4.1.4", + "lru-cache": "^10.0.0" + }, + "peerDependencies": { + "@nomicfoundation/ethereumjs-verkle": "0.0.2" + }, + "peerDependenciesMeta": { + "@nomicfoundation/ethereumjs-verkle": { + "optional": true + } + } + }, "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz", - "integrity": "sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz", + "integrity": "sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@types/readable-stream": "^2.3.13", "ethereum-cryptography": "0.1.3", + "lru-cache": "^10.0.0", "readable-stream": "^3.6.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz", - "integrity": "sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", + "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } } }, "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz", - "integrity": "sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", + "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } + } + }, + "node_modules/@nomicfoundation/ethereumjs-verkle": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz", + "integrity": "sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "lru-cache": "^10.0.0", + "rust-verkle-wasm": "^0.0.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz", - "integrity": "sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-blockchain": "6.2.2", - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-evm": "1.3.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-statemanager": "1.0.5", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-tx": "4.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz", + "integrity": "sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-evm": "2.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", - "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.6.tgz", + "integrity": "sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ==", "dev": true, "peer": true, "dependencies": { - "@ethersproject/abi": "^5.1.2", "@types/chai-as-promised": "^7.1.3", "chai-as-promised": "^7.1.1", "deep-eql": "^4.0.1", "ordinal": "^1.0.3" }, "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", "chai": "^4.2.0", - "ethers": "^5.0.0", + "ethers": "^6.1.0", "hardhat": "^2.9.4" } }, + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.5.tgz", + "integrity": "sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.1.0", + "hardhat": "^2.0.0" + } + }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", - "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz", + "integrity": "sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==", "dev": true, "peer": true, "dependencies": { @@ -2245,32 +2391,51 @@ } }, "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", - "integrity": "sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz", + "integrity": "sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==", "dev": true, "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.0.0", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "9.1.0", "@types/chai": "^4.2.0", "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", + "@types/node": ">=16.0.0", "chai": "^4.2.0", - "ethers": "^5.4.7", + "ethers": "^6.4.0", "hardhat": "^2.11.0", "hardhat-gas-reporter": "^1.0.8", "solidity-coverage": "^0.8.1", "ts-node": ">=8.0.0", - "typechain": "^8.1.0", + "typechain": "^8.3.0", "typescript": ">=4.5.0" } }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.4.tgz", + "integrity": "sha512-B8ZjhOrmbbRWqJi65jvQblzjsfYktjqj2vmOm+oc2Vu8drZbT2cjeSCRHZKbS7lOtfW78aJZSFvw+zRLCiABJA==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", @@ -2452,49 +2617,6 @@ "node": ">= 10" } }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", - "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", - "dev": true, - "peer": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", - "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@nomiclabs/hardhat-web3": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", @@ -2509,123 +2631,190 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", - "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", + "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" }, "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz", - "integrity": "sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A==" - }, - "node_modules/@remix-project/remixd": { - "version": "0.6.13", - "resolved": "https://registry.npmjs.org/@remix-project/remixd/-/remixd-0.6.13.tgz", - "integrity": "sha512-hx8AhsjEf5CJh1q44DAW/z/U29R00wj0cpq0026+rO16PuWuc0coXp+YYXxPCXlf3C73E8UuVmmjXpUy9xb7hw==", - "dev": true, - "dependencies": { - "@remixproject/plugin": "0.3.33", - "@remixproject/plugin-api": "0.3.33", - "@remixproject/plugin-utils": "0.3.33", - "@remixproject/plugin-ws": "0.3.33", - "axios": "1.1.2", - "chokidar": "^2.1.8", - "commander": "^9.4.1", - "fs-extra": "^3.0.1", - "isbinaryfile": "^3.0.2", - "latest-version": "^5.1.0", - "semver": "^6.3.0", - "ws": "^7.3.0" - }, - "bin": { - "remixd": "src/bin/remixd.js" - } + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.5.tgz", + "integrity": "sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg==" }, - "node_modules/@remix-project/remixd/node_modules/fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "node_modules/@rollup/plugin-alias": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.0.tgz", + "integrity": "sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@remix-project/remixd/node_modules/jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "node_modules/@rollup/plugin-alias/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@remix-project/remixd/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.7", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", + "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@remixproject/plugin": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.33.tgz", - "integrity": "sha512-ia6LevsWYPkcRwOBl3umA2fPCgYt2TmB437Pafs9BE6fD9judEvlvEqXjBy9GLBsZzZWSiyYenOnW8HIiwqfMA==", + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { - "@remixproject/plugin-api": "0.3.33", - "@remixproject/plugin-utils": "0.3.33", - "events": "3.2.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@remixproject/plugin-api": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.33.tgz", - "integrity": "sha512-fBEbRr6/mgQdfNdRqYQL3yewsPfTxV41F509CngbD6YdY5YKBihJhfGFHbd2rKSyXOgBiHIbe0SsV3OXpFdWnw==", + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "@remixproject/plugin-utils": "0.3.33" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@remixproject/plugin-utils": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.33.tgz", - "integrity": "sha512-cAo21ot4/G5BkN8ypDwg8MMCrEmLdXwMd3lQZUeB5enPC3KxmzQz71+OgEYl718Hwy+GtHaLq17FEXCHC5YV9w==", + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", "dev": true, "dependencies": { - "tslib": "2.0.1" + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@remixproject/plugin-ws": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.33.tgz", - "integrity": "sha512-Zkp8MK8jxnNm3uruu0dF8vqeh90JsLXttJP4LZF0HaStRRK4d2XG6CgE5mBiC2J4uTEwGP26H/vmqi+POBPTEg==", + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", "dev": true, "dependencies": { - "@remixproject/plugin": "0.3.33", - "@remixproject/plugin-api": "0.3.33", - "@remixproject/plugin-utils": "0.3.33" + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "ws": "^7.3.1" + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@remixproject/plugin/node_modules/events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", + "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, "engines": { - "node": ">=0.8.x" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -2636,7 +2825,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -2644,46 +2833,245 @@ } } }, - "node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@scure/bip32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", - "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" ], - "dependencies": { - "@noble/hashes": "~1.1.1", - "@noble/secp256k1": "~1.6.0", - "@scure/base": "~1.1.0" - } + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true }, - "node_modules/@scure/bip39": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", - "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" ], + "peer": true + }, + "node_modules/@scure/base": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", + "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", + "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", + "dev": true, "dependencies": { - "@noble/hashes": "~1.1.1", - "@scure/base": "~1.1.0" + "@noble/curves": "~1.3.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.3" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", + "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", + "dev": true, + "dependencies": { + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@sentry/core": { @@ -2825,1952 +3213,2018 @@ "dev": true }, "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@solidity-parser/parser": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.3.tgz", - "integrity": "sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } }, "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dependencies": { - "defer-to-connect": "^1.0.1" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=14.16" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, + "node_modules/@truffle/hdwallet": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@truffle/hdwallet/-/hdwallet-0.1.4.tgz", + "integrity": "sha512-D3SN0iw3sMWUXjWAedP6RJtopo9qQXYi80inzbtcsoso4VhxFxCwFvCErCl4b27AEJ9pkAtgnxEFRaSKdMmi1Q==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "ethereum-cryptography": "1.1.2", + "keccak": "3.0.2", + "secp256k1": "4.0.3" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" } }, "node_modules/@truffle/hdwallet-provider": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-2.0.13.tgz", - "integrity": "sha512-5sGsi9sScB4VkKEuD6itqkrvtpJUNVv0NhI07Nn1JAMDvkJmAAuh2GtoBElDq54y+0JCD8SI0T9BLVZ9IWj6AQ==", + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-2.1.15.tgz", + "integrity": "sha512-I5cSS+5LygA3WFzru9aC5+yDXVowEEbLCx0ckl/RqJ2/SCiYXkzYlR5/DjjDJuCtYhivhrn2RP9AheeFlRF+qw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "@ethereumjs/common": "^2.4.0", "@ethereumjs/tx": "^3.3.0", "@metamask/eth-sig-util": "4.0.1", + "@truffle/hdwallet": "^0.1.4", + "@types/ethereum-protocol": "^1.0.0", + "@types/web3": "1.0.20", + "@types/web3-provider-engine": "^14.0.0", "ethereum-cryptography": "1.1.2", "ethereum-protocol": "^1.0.1", "ethereumjs-util": "^7.1.5", - "ethereumjs-wallet": "^1.0.2", + "web3": "1.10.0", "web3-provider-engine": "16.0.3" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@truffle/hdwallet-provider/node_modules/ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", + "node_modules/@truffle/hdwallet-provider/node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", "dependencies": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@typechain/ethers-v5": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", - "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" } }, - "node_modules/@typechain/hardhat": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.2.tgz", - "integrity": "sha512-k4Ea3pVITKB2DH8p1a5U38cyy7KZPD04Spo4q5b4wO+n2mT+uAz5dxckPtbczn/Kk5wiFq+ZkuOtw5ZKFhL/+w==", - "dev": true, - "dependencies": { - "fs-extra": "^9.1.0", - "lodash": "^4.17.15" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^10.1.0", - "ethers": "^5.4.7", - "hardhat": "^2.9.9", - "typechain": "^8.1.0" - } + "node_modules/@truffle/hdwallet-provider/node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, - "node_modules/@typechain/hardhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/@scure/bip32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", + "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@noble/hashes": "~1.1.1", + "@noble/secp256k1": "~1.6.0", + "@scure/base": "~1.1.0" } }, - "node_modules/@typechain/hardhat/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/@scure/bip39": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", + "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" + "@noble/hashes": "~1.1.1", + "@scure/base": "~1.1.0" } }, - "node_modules/@types/async-eventemitter": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true + "node_modules/@truffle/hdwallet-provider/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, - "node_modules/@types/bignumber.js": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", - "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", - "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dependencies": { - "bignumber.js": "*" + "node-fetch": "^2.6.12" } }, - "node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "node_modules/@truffle/hdwallet-provider/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dependencies": { - "@types/node": "*" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@truffle/hdwallet-provider/node_modules/ethereum-cryptography": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", + "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.6.3", + "@scure/bip32": "1.1.0", + "@scure/bip39": "1.1.0" } }, - "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true, - "peer": true + "node_modules/@truffle/hdwallet-provider/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", - "dev": true, - "peer": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", + "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", + "hasInstallScript": true, "dependencies": { - "@types/chai": "*" + "web3-bzz": "1.10.0", + "web3-core": "1.10.0", + "web3-eth": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-shh": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-bzz": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", + "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", + "hasInstallScript": true, "dependencies": { - "@types/node": "*" + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", + "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", "dependencies": { - "@types/node": "*" + "@types/bn.js": "^5.1.1", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-requestmanager": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "peer": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-core-helpers": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", + "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "web3-eth-iban": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "node_modules/@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-core-method": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", + "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", "dependencies": { - "@types/node": "*" + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "peer": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true, - "peer": true - }, - "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "node_modules/@truffle/hdwallet-provider/node_modules/web3-core-promievent": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", + "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", "dependencies": { - "@types/node": "*" + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", - "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-core-requestmanager": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", + "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", "dependencies": { - "@types/node": "*" + "util": "^0.12.5", + "web3-core-helpers": "1.10.0", + "web3-providers-http": "1.10.0", + "web3-providers-ipc": "1.10.0", + "web3-providers-ws": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "node_modules/@truffle/hdwallet-provider/node_modules/web3-core-subscriptions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", + "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", "dependencies": { - "@types/node": "*" + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true + "node_modules/@truffle/hdwallet-provider/node_modules/web3-eth": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", + "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-accounts": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-eth-ens": "1.10.0", + "web3-eth-iban": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", - "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-eth-abi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", + "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.10.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", - "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", - "dev": true, - "peer": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-eth-accounts": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", + "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", "dependencies": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", - "debug": "^4.3.4" + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.1.5", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-eth-contract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", + "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", - "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-eth-ens": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", + "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-utils": "1.10.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-eth-iban": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", + "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "bn.js": "^5.2.1", + "web3-utils": "1.10.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-eth-personal": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", + "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@types/node": "^12.12.6", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", - "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-net": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", + "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-providers-http": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", + "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-providers-ipc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", + "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.10.0" + }, "engines": { - "node": ">=4.0" + "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-providers-ws": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", + "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", "dependencies": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0", + "websocket": "^1.0.32" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8.0.0" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true, - "peer": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-shh": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", + "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", + "hasInstallScript": true, "dependencies": { - "event-target-shim": "^5.0.0" + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-net": "1.10.0" }, "engines": { - "node": ">=6.5" + "node": ">=8.0.0" } }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", - "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", - "dev": true - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, + "node_modules/@truffle/hdwallet-provider/node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" }, "engines": { - "node": ">=12" + "node": ">=8.0.0" } }, - "node_modules/abstract-level/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, + "node_modules/@truffle/hdwallet/node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@truffle/hdwallet/node_modules/@scure/bip32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", + "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", + "funding": [ { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://paulmillr.com/funding/" } ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@noble/hashes": "~1.1.1", + "@noble/secp256k1": "~1.6.0", + "@scure/base": "~1.1.0" } }, - "node_modules/abstract-level/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, + "node_modules/@truffle/hdwallet/node_modules/@scure/bip39": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", + "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://paulmillr.com/funding/" } ], - "engines": { - "node": ">=4" + "dependencies": { + "@noble/hashes": "~1.1.1", + "@scure/base": "~1.1.0" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, + "node_modules/@truffle/hdwallet/node_modules/ethereum-cryptography": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", + "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.6.3", + "@scure/bip32": "1.1.0", + "@scure/bip39": "1.1.0" + } + }, + "node_modules/@truffle/hdwallet/node_modules/keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10.0.0" } }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">=10.13.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true, - "engines": { - "node": ">=0.3.0" - } + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@turbo/gen": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/@turbo/gen/-/gen-1.12.4.tgz", + "integrity": "sha512-3Z8KZ6Vnc2x6rr8sNJ4QNYpkAttLBfb91uPzDlFDY7vgJg+vfXT8YWyZznVL+19ZixF2C/F4Ucp4/YjG2e1drg==", "dev": true, "dependencies": { - "debug": "4" + "@turbo/workspaces": "1.12.4", + "chalk": "2.4.2", + "commander": "^10.0.0", + "fs-extra": "^10.1.0", + "inquirer": "^8.2.4", + "minimatch": "^9.0.0", + "node-plop": "^0.26.3", + "proxy-agent": "^6.2.2", + "ts-node": "^10.9.1", + "update-check": "^1.5.4", + "validate-npm-package-name": "^5.0.0" }, - "engines": { - "node": ">= 6.0.0" + "bin": { + "gen": "dist/cli.js" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@turbo/workspaces": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/@turbo/workspaces/-/workspaces-1.12.4.tgz", + "integrity": "sha512-a1hF8Nr6MOeCpvlLR569dGTlzgRLj2Rxo6dTb4jtL+jhHwCb94A9kDPgcRnYGFr45mgulICarVaNZxDjw4/riQ==", "dev": true, "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "chalk": "2.4.2", + "commander": "^10.0.0", + "execa": "5.1.1", + "fast-glob": "^3.2.12", + "fs-extra": "^10.1.0", + "gradient-string": "^2.0.0", + "inquirer": "^8.0.0", + "js-yaml": "^4.1.0", + "ora": "4.1.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "update-check": "^1.5.4" }, - "engines": { - "node": ">=8" + "bin": { + "workspaces": "dist/cli.js" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@turbo/workspaces/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "yallist": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=10" } }, - "node_modules/all-contributors-cli": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.24.0.tgz", - "integrity": "sha512-7oSKr2PnqxsOotuSwciltcFTS1eVRdjR0cn99hbElfff7gRQBShVhsf/XBprY41sLcgqTk0l0MKgKv6QNgZdMg==", + "node_modules/@turbo/workspaces/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { - "@babel/runtime": "^7.7.6", - "async": "^3.1.0", - "chalk": "^4.0.0", - "didyoumean": "^1.2.1", - "inquirer": "^7.3.3", - "json-fixer": "^1.6.8", - "lodash": "^4.11.2", - "node-fetch": "^2.6.0", - "pify": "^5.0.0", - "yargs": "^15.0.1" + "lru-cache": "^6.0.0" }, "bin": { - "all-contributors": "dist/cli.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/all-contributors-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@turbo/workspaces/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", + "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.2", + "typescript": ">=4.7.0" } }, - "node_modules/all-contributors-cli/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/all-contributors-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@typechain/hardhat": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", + "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "fs-extra": "^9.1.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@typechain/ethers-v6": "^0.5.1", + "ethers": "^6.1.0", + "hardhat": "^2.9.9", + "typechain": "^8.3.2" } }, - "node_modules/all-contributors-cli/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/all-contributors-cli/node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "node_modules/@types/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", "dev": true, - "engines": { - "node": ">= 10" + "dependencies": { + "bignumber.js": "*" } }, - "node_modules/all-contributors-cli/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "@types/node": "*" } }, - "node_modules/all-contributors-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" } }, - "node_modules/all-contributors-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@types/chai": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", + "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==", + "dev": true, + "peer": true }, - "node_modules/all-contributors-cli/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/@types/chai-as-promised": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", "dev": true, + "peer": true, "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/chai": "*" } }, - "node_modules/all-contributors-cli/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/all-contributors-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "@types/ms": "*" } }, - "node_modules/all-contributors-cli/node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/ethereum-protocol": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/ethereum-protocol/-/ethereum-protocol-1.0.5.tgz", + "integrity": "sha512-4wr+t2rYbwMmDrT447SGzE/43Z0EN++zyHCBoruIx32fzXQDxVa1rnQbYwPO8sLP2OugE/L8KaAIJC5kieUuBg==", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, + "bignumber.js": "7.2.1" + } + }, + "node_modules/@types/ethereum-protocol/node_modules/bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", "engines": { - "node": ">=8.0.0" + "node": "*" } }, - "node_modules/all-contributors-cli/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/all-contributors-cli/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/all-contributors-cli/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" }, - "node_modules/all-contributors-cli/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/@types/inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/through": "*", + "rxjs": "^6.4.0" } }, - "node_modules/all-contributors-cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@types/inquirer/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "tslib": "^1.9.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "npm": ">=2.0.0" } }, - "node_modules/all-contributors-cli/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/@types/inquirer/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/all-contributors-cli/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "dev": true }, - "node_modules/all-contributors-cli/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true }, - "node_modules/all-contributors-cli/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "node_modules/@types/mocha": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "peer": true }, - "node_modules/all-contributors-cli/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.21.tgz", + "integrity": "sha512-/ySDLGscFPNasfqStUuWWPfL78jompfIoVzLJPVVAHBh6rpG68+pI2Gk+fNLeI8/f1yPYL4s46EleVIc20F1Ow==", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" + "undici-types": "~5.26.4" } }, - "node_modules/all-contributors-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/all-contributors-cli/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "dev": true + }, + "node_modules/@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "@types/node": "*", + "safe-buffer": "~5.1.1" } }, - "node_modules/all-contributors-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "node_modules/all-contributors-cli/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/all-contributors-cli/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "@types/node": "*" } }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + }, + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.2" + "dependencies": { + "@types/node": "*" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/@types/tinycolor2": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", + "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", + "dev": true + }, + "node_modules/@types/underscore": { + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.15.tgz", + "integrity": "sha512-HP38xE+GuWGlbSRq9WrZkousaQ7dragtZCruBVMi0oX1migFZavZ3OROKHSkNp/9ouq82zrWtZpg18jFnVN96g==" + }, + "node_modules/@types/web3": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@types/web3/-/web3-1.0.20.tgz", + "integrity": "sha512-KTDlFuYjzCUlBDGt35Ir5QRtyV9klF84MMKUsEJK10sTWga/71V+8VYLT7yysjuBjaOx2uFYtIWNGoz3yrNDlg==", + "dependencies": { + "@types/bn.js": "*", + "@types/underscore": "*" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, + "node_modules/@types/web3-provider-engine": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@types/web3-provider-engine/-/web3-provider-engine-14.0.4.tgz", + "integrity": "sha512-59wFvtceRmWXfQFoH8qtFIQZf6B7PqBwgBBmZLu4SjRK6pycnjV8K+jihbaGOFwHjTPcPFm15m+CS6I0BBm4lw==", "dependencies": { - "type-fest": "^0.21.3" + "@types/ethereum-protocol": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=8" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "color-convert": "^1.9.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/antlr4": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.1.tgz", - "integrity": "sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==", - "dev": true, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=16" + "node": ">=10" } }, - "node_modules/antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dependencies": { - "remove-trailing-separator": "^1.0.1" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { - "node": ">=0.10.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "engines": { - "node": ">=0.10.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 0.4" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "safer-buffer": "~2.1.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">=0.8" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "peer": true, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "peer": true }, - "node_modules/ast-parents": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", - "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", - "dev": true - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", "dependencies": { - "lodash": "^4.17.14" + "xtend": "~4.0.0" } }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "async": "^2.4.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/async-mutex": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", - "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", - "dependencies": { - "tslib": "^2.0.0" + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">=0.4.0" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "node_modules/add": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/add/-/add-2.0.6.tgz", + "integrity": "sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q==", + "dev": true + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true, - "bin": { - "atob": "bin/atob.js" - }, "engines": { - "node": ">= 4.5.0" + "node": ">=0.3.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { - "node": "*" + "node": ">= 6.0.0" } }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/axios": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", - "integrity": "sha512-bznQyETwElsXl2RK7HLLwb5GPpOLlycxHCtrpDR/4RqqBzjARaOTo3jz4IgtntWUYee7Ne4S8UHd92VCuzPaWA==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", - "semver": "^6.1.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/all-contributors-cli": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.26.1.tgz", + "integrity": "sha512-Ymgo3FJACRBEd1eE653FD1J/+uD0kqpUNYfr9zNC1Qby0LgbhDBzB3EF6uvkAbYpycStkk41J+0oo37Lc02yEw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.6", + "async": "^3.1.0", + "chalk": "^4.0.0", + "didyoumean": "^1.2.1", + "inquirer": "^7.3.3", + "json-fixer": "^1.6.8", + "lodash": "^4.11.2", + "node-fetch": "^2.6.0", + "pify": "^5.0.0", + "yargs": "^15.0.1" + }, "bin": { - "semver": "bin/semver.js" + "all-contributors": "dist/cli.js" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "prettier": "^2" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "node_modules/all-contributors-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "color-convert": "^2.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "node_modules/all-contributors-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "node_modules/all-contributors-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "precond": "0.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.6" + "node": ">=7.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/all-contributors-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/all-contributors-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "node_modules/all-contributors-cli/node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, "dependencies": { - "safe-buffer": "^5.0.1" + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "node_modules/all-contributors-cli/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "tslib": "^1.9.0" }, "engines": { - "node": ">=0.10.0" + "npm": ">=2.0.0" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/all-contributors-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "tweetnacl": "^0.14.3" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "node_modules/all-contributors-cli/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/bigint-crypto-utils": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", - "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, - "dependencies": { - "bigint-mod-arith": "^3.1.0" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=10.4.0" + "node": ">=0.4.2" } }, - "node_modules/bigint-mod-arith": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", - "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "engines": { - "node": ">=10.4.0" + "node": ">=6" } }, - "node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "file-uri-to-path": "1.0.0" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + "node_modules/antlr4": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.1.tgz", + "integrity": "sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==", + "dev": true, + "engines": { + "node": ">=16" + } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", "dev": true }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 8" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" } }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "safer-buffer": "~2.1.0" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" } }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "peer": true, + "engines": { + "node": "*" } }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "node_modules/ast-parents": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", + "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", + "dev": true + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "async": "^2.4.0" } }, - "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "node_modules/async-eventemitter/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/async-mutex": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", + "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "dev": true, "funding": [ { "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" }, "bin": { - "browserslist": "cli.js" + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dependencies": { - "base-x": "^3.0.2" + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "follow-redirects": "^1.14.0" } }, - "node_modules/btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "bin": { - "btoa": "bin/btoa.js" + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.5.0", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "dependencies": { + "precond": "0.2" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.6" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -4784,3113 +5238,3003 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } + ] }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } }, - "node_modules/buffer-reverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==", - "dev": true + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/bufferutil": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "node_modules/bigint-crypto-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", + "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, "engines": { - "node": ">=6.14.2" + "node": ">=14.0.0" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, - "dependencies": { - "streamsearch": "^1.1.0" - }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "engines": { - "node": ">=10.16.0" + "node": "*" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ms": "2.0.0" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { + "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "peer": true, "dependencies": { - "nofilter": "^3.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12.19" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "peer": true, - "dependencies": { - "check-error": "^1.0.2" + "node": ">=10" }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==", + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "functional-red-black-tree": "^1.0.1" + "balanced-match": "^1.0.0" } }, - "node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "fill-range": "^7.0.1" }, - "optionalDependencies": { - "fsevents": "^1.2.7" + "engines": { + "node": ">=8" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" + "base-x": "^3.0.2" } }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.14.2" } }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "semver": "^7.0.0" } }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "node_modules/builtins/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/builtins/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/class-utils/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, + "node_modules/builtins/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/classic-level": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", - "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", "engines": { - "node": ">=12" + "node": ">=10.6.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "dev": true, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { - "string-width": "^4.2.0" + "pump": "^3.0.0" }, "engines": { - "node": "10.* || >= 12.*" + "node": ">=8" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { - "node": ">=0.8" + "node": ">=6" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } + "node_modules/caniuse-lite": { + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, + "peer": true, + "dependencies": { + "nofilter": "^3.1.0" + }, "engines": { - "node": ">=0.1.90" + "node": ">=12.19" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "peer": true, "dependencies": { - "delayed-stream": "~1.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, + "peer": true, "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" + "check-error": "^1.0.2" }, - "engines": { - "node": ">=4.0.0" + "peerDependencies": { + "chai": ">= 2.1.2 < 5" } }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/change-case": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", + "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", + "dev": true, + "dependencies": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" } }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "peer": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { - "node": "^12.20.0 || >=14" + "node": "*" } }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "node_modules/checkpoint-store": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", + "integrity": "sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==", + "dependencies": { + "functional-red-black-tree": "^1.0.1" + } }, - "node_modules/compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "dependencies": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 12" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/compress-brotli/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "safe-buffer": "5.2.1" + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" }, "engines": { - "node": ">= 0.6" + "node": ">=4.0.0", + "npm": ">=3.0.0" } }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dev": true, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" + "buffer": "^5.6.0", + "varint": "^5.0.0" } }, - "node_modules/content-type": { + "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "peer": true, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.1" + "consola": "^3.2.3" } }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", - "dependencies": { - "browserslist": "^4.21.3", - "semver": "7.0.0" + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/cosmiconfig": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", - "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, "engines": { - "node": ">=14" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "string-width": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "10.* || >= 12.*" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/cosmiconfig/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" + "node": ">= 10" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/cross-fetch": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", - "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "dependencies": { - "node-fetch": "^2.6.7", - "whatwg-fetch": "^2.0.4" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "mimic-response": "^1.0.0" }, - "engines": { - "node": ">=4.8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, "engines": { - "node": "*" + "node": ">=0.1.90" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "delayed-stream": "~1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", "dev": true }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" }, "engines": { - "node": ">=0.10" + "node": ">=8.0.0" } }, - "node_modules/death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "peer": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { + "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "engines": { - "node": ">=0.10" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" - }, + "safe-buffer": "~5.1.0" + } + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, "engines": { - "node": ">=4" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "node_modules/constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", "dev": true, - "peer": true, "dependencies": { - "type-detect": "^4.0.0" + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dependencies": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { - "node": ">=4.0.0" + "node": ">= 0.6" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, - "peer": true + "engines": { + "node": ">= 0.6" + } }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, + "node_modules/core-js-compat": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "browserslist": "^4.22.3" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "node_modules/core-js-pure": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz", + "integrity": "sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==", "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/del/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "bin": { - "rimraf": "bin.js" + "crc32": "bin/crc32.njs" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=0.8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dependencies": { + "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, - "peer": true, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" + "node_modules/cross-fetch": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", + "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", + "dependencies": { + "node-fetch": "^2.6.7", + "whatwg-fetch": "^2.0.4" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, - "peer": true, - "dependencies": { - "heap": ">= 0.2.0" - }, "engines": { "node": "*" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/css-declaration-sorter": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.1.1.tgz", + "integrity": "sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==", "dev": true, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, - "peer": true, "dependencies": { - "esutils": "^2.0.2" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, "engines": { - "node": ">=12" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/dts-bundle-generator": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-8.0.0.tgz", - "integrity": "sha512-9Du4uQLRs/doabHzVDFIKsbUA9KHdPkfd0YRgsJ7rXtVSKCfuW0EsM/d2AoXw2fNgxcSfJ01/8szOy4u6ze/2g==", + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "dependencies": { - "typescript": ">=5.0.2", - "yargs": "^17.6.0" + "engines": { + "node": ">= 6" }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { - "dts-bundle-generator": "dist/bin/dts-bundle-generator.js" + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=14.0.0" + "node": ">=4" } }, - "node_modules/dts-bundle-generator/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/cssnano": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.5.tgz", + "integrity": "sha512-tpTp/ukgrElwu3ESFY4IvWnGn8eTt8cJhC2aAbtA3lvUlxp6t6UPv8YCLjNnEGiFreT1O0LiOM1U3QyTBVFl2A==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "cssnano-preset-default": "^6.0.5", + "lilconfig": "^3.1.1" }, "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/dts-bundle-generator/node_modules/typescript": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", - "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/cssnano-preset-default": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.5.tgz", + "integrity": "sha512-M+qRDEr5QZrfNl0B2ySdbTLGyNb8kBcSjuwR7WBamYBOEREH9t2efnB/nblekqhdGLZdkf4oZNetykG2JWRdZQ==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^7.1.1", + "cssnano-utils": "^4.0.1", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.0.3", + "postcss-convert-values": "^6.0.4", + "postcss-discard-comments": "^6.0.1", + "postcss-discard-duplicates": "^6.0.2", + "postcss-discard-empty": "^6.0.2", + "postcss-discard-overridden": "^6.0.1", + "postcss-merge-longhand": "^6.0.3", + "postcss-merge-rules": "^6.0.4", + "postcss-minify-font-values": "^6.0.2", + "postcss-minify-gradients": "^6.0.2", + "postcss-minify-params": "^6.0.3", + "postcss-minify-selectors": "^6.0.2", + "postcss-normalize-charset": "^6.0.1", + "postcss-normalize-display-values": "^6.0.1", + "postcss-normalize-positions": "^6.0.1", + "postcss-normalize-repeat-style": "^6.0.1", + "postcss-normalize-string": "^6.0.1", + "postcss-normalize-timing-functions": "^6.0.1", + "postcss-normalize-unicode": "^6.0.3", + "postcss-normalize-url": "^6.0.1", + "postcss-normalize-whitespace": "^6.0.1", + "postcss-ordered-values": "^6.0.1", + "postcss-reduce-initial": "^6.0.3", + "postcss-reduce-transforms": "^6.0.1", + "postcss-svgo": "^6.0.2", + "postcss-unique-selectors": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.1.tgz", + "integrity": "sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ==", + "dev": true, "engines": { - "node": ">=12.20" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/dts-bundle-generator/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=12" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/dts-bundle-generator/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, "engines": { - "node": ">=12" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">= 14" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", "dev": true, - "dependencies": { - "once": "^1.4.0" - } + "peer": true }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ansi-colors": "^4.1.1" + "ms": "2.1.2" }, "engines": { - "node": ">=8.6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "engines": { - "node": ">=6" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" + "node": ">=0.10.0" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" } }, - "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "dev": true, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", - "dev": true - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, - "hasInstallScript": true, + "peer": true, "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=6" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "engines": { + "node": ">=4.0.0" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/esbuild": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", - "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" + "dependencies": { + "clone": "^1.0.2" }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.15", - "@esbuild/android-arm64": "0.17.15", - "@esbuild/android-x64": "0.17.15", - "@esbuild/darwin-arm64": "0.17.15", - "@esbuild/darwin-x64": "0.17.15", - "@esbuild/freebsd-arm64": "0.17.15", - "@esbuild/freebsd-x64": "0.17.15", - "@esbuild/linux-arm": "0.17.15", - "@esbuild/linux-arm64": "0.17.15", - "@esbuild/linux-ia32": "0.17.15", - "@esbuild/linux-loong64": "0.17.15", - "@esbuild/linux-mips64el": "0.17.15", - "@esbuild/linux-ppc64": "0.17.15", - "@esbuild/linux-riscv64": "0.17.15", - "@esbuild/linux-s390x": "0.17.15", - "@esbuild/linux-x64": "0.17.15", - "@esbuild/netbsd-x64": "0.17.15", - "@esbuild/openbsd-x64": "0.17.15", - "@esbuild/sunos-x64": "0.17.15", - "@esbuild/win32-arm64": "0.17.15", - "@esbuild/win32-ia32": "0.17.15", - "@esbuild/win32-x64": "0.17.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "node_modules/deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dependencies": { + "abstract-leveldown": "~2.6.0" + } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "peer": true, "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=0.12.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "source-map": "~0.2.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, - "peer": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", "dev": true, - "peer": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/del/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "peer": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "peer": true, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">= 0.8.0" + "node": ">=0.4.0" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8" } }, - "node_modules/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "node": ">=0.3.1" } }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, "peer": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "heap": ">= 0.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "*" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dependencies": { - "color-convert": "^2.0.1" + "path-type": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6.0.0" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "peer": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "peer": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" + "node": ">= 4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "peer": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", "dev": true, - "peer": true, "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "no-case": "^2.2.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "url": "https://dotenvx.com" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "peer": true, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.684", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.684.tgz", + "integrity": "sha512-MoDE0pUsIzTewI96Vbv84sTkER9Nbp58pa1K7Ub03s6+2HvuJ+jbnxcLJm22mpomJe+5PWtiPXqhbU5ZkyHU5A==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dependencies": { - "yocto-queue": "^0.1.0" - }, + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { - "p-limit": "^3.0.2" + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6" } }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/eslint/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "peer": true, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dependencies": { - "shebang-regex": "^3.0.0" + "prr": "~1.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "errno": "cli.js" } }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dependencies": { - "has-flag": "^4.0.0" + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "peer": true, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "peer": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" } }, - "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "peer": true, "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "peer": true, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dependencies": { - "estraverse": "^5.2.0" + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=4.0" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { - "node": ">=4.0" + "node": ">=6" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "peer": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=4.0" } }, - "node_modules/eth-block-tracker": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz", - "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==", + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dependencies": { - "@babel/plugin-transform-runtime": "^7.5.5", - "@babel/runtime": "^7.5.5", - "eth-query": "^2.1.0", - "json-rpc-random-id": "^1.0.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eth-create2-calculator": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/eth-create2-calculator/-/eth-create2-calculator-1.1.5.tgz", - "integrity": "sha512-nFXjUR4psWYStCK4PYC5cChmcU960FxbaH919XRsLhgvqW5sRZt4xClaxW04hqyAZ0+riIYzRam6W9OstbHzeA==", - "dev": true, - "dependencies": { - "ethers": "^5.0.19" + "node_modules/eslint-config-custom": { + "resolved": "config/eslint-config-custom", + "link": true + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "dev": true, + "node_modules/eslint-config-turbo": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.12.4.tgz", + "integrity": "sha512-5hqEaV6PNmAYLL4RTmq74OcCt8pgzOLnfDVPG/7PUXpQ0Mpz0gr926oCSFukywKKXjdum3VHD84S7Z9A/DqTAw==", "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" + "eslint-plugin-turbo": "1.12.4" + }, + "peerDependencies": { + "eslint": ">6.6.0" } }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "node_modules/eth-gas-reporter": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", - "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", - "dev": true, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dependencies": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.14.0", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" }, "peerDependencies": { - "@codechecks/client": "^0.1.0" + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" }, "peerDependenciesMeta": { - "@codechecks/client": { + "eslint-config-prettier": { "optional": true } } }, - "node_modules/eth-gas-reporter/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/eslint-plugin-turbo": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.12.4.tgz", + "integrity": "sha512-3AGmXvH7E4i/XTWqBrcgu+G7YKZJV/8FrEn79kTd50ilNsv+U3nS2IlcCrQB6Xm2m9avGD9cadLzKDR1/UF2+g==", + "dependencies": { + "dotenv": "16.0.3" + }, + "peerDependencies": { + "eslint": ">6.6.0" } }, - "node_modules/eth-gas-reporter/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, + "node_modules/eslint-plugin-turbo/node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/eth-gas-reporter/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">= 8" + "node": ">=8.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eth-gas-reporter/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, + "eslint-visitor-keys": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/eth-gas-reporter/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" + "node": ">=10" } }, - "node_modules/eth-gas-reporter/node_modules/cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" }, - "optionalDependencies": { - "colors": "^1.1.2" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eth-gas-reporter/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/eth-gas-reporter/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eth-gas-reporter/node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" + "node": ">=10" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eth-gas-reporter/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, + "color-name": "~1.1.4" + }, "engines": { - "node": ">=0.3.1" + "node": ">=7.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/eth-gas-reporter/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", - "dev": true, - "dependencies": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/eth-gas-reporter/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eth-gas-reporter/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "node_modules/eslint/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "to-regex-range": "^5.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/eth-gas-reporter/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "locate-path": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/eth-gas-reporter/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, + "node_modules/eslint/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { - "is-buffer": "~2.0.3" + "lru-cache": "^6.0.0" }, "bin": { - "flat": "cli.js" - } - }, - "node_modules/eth-gas-reporter/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "semver": "bin/semver.js" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=10" } }, - "node_modules/eth-gas-reporter/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, + "node_modules/eslint/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/eth-gas-reporter/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/eslint/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", "dependencies": { - "is-glob": "^4.0.1" + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" }, "engines": { - "node": ">= 6" + "node": ">=0.10" } }, - "node_modules/eth-gas-reporter/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } + "node_modules/esniff/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, - "node_modules/eth-gas-reporter/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dependencies": { - "binary-extensions": "^2.0.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, "engines": { - "node": ">=8" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "engines": { "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "estraverse": "^5.1.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=0.10" } }, - "node_modules/eth-gas-reporter/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { - "node": ">=6" + "node": ">=4.0" } }, - "node_modules/eth-gas-reporter/node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dependencies": { - "chalk": "^2.4.2" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/eth-gas-reporter/node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { - "node": "*" + "node": ">=4.0" } }, - "node_modules/eth-gas-reporter/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" } }, - "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/eth-gas-reporter/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/eth-gas-reporter/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/eth-gas-reporter/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, + "node_modules/eth-block-tracker": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz", + "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==", "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" + "@babel/plugin-transform-runtime": "^7.5.5", + "@babel/runtime": "^7.5.5", + "eth-query": "^2.1.0", + "json-rpc-random-id": "^1.0.1", + "pify": "^3.0.0", + "safe-event-emitter": "^1.0.1" } }, - "node_modules/eth-gas-reporter/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, + "node_modules/eth-block-tracker/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "node_modules/eth-create2-calculator": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/eth-create2-calculator/-/eth-create2-calculator-1.1.5.tgz", + "integrity": "sha512-nFXjUR4psWYStCK4PYC5cChmcU960FxbaH919XRsLhgvqW5sRZt4xClaxW04hqyAZ0+riIYzRam6W9OstbHzeA==", "dev": true, "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "ethers": "^5.0.19" } }, - "node_modules/eth-gas-reporter/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/eth-create2-calculator/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" + "@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" } }, - "node_modules/eth-gas-reporter/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" } }, - "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, - "node_modules/eth-gas-reporter/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "node_modules/eth-gas-reporter": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", + "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@solidity-parser/parser": "^0.14.0", + "axios": "^1.5.1", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^5.7.2", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^10.2.0", + "req-cwd": "^2.0.0", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } } }, - "node_modules/eth-gas-reporter/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, - "node_modules/eth-gas-reporter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true + "node_modules/eth-gas-reporter/node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, - "node_modules/eth-gas-reporter/node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "string-width": "^1.0.2 || 2" + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" } }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/eth-gas-reporter/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/eth-gas-reporter/node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/eth-gas-reporter/node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "object-assign": "^4.1.0", + "string-width": "^2.1.1" }, "engines": { "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" } }, - "node_modules/eth-gas-reporter/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/eth-gas-reporter/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" + "@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" } }, - "node_modules/eth-gas-reporter/node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/eth-gas-reporter/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/eth-gas-reporter/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/eth-json-rpc-filters": { @@ -7906,21 +8250,11 @@ "pify": "^5.0.0" } }, - "node_modules/eth-json-rpc-filters/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eth-json-rpc-infura": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz", "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "eth-json-rpc-middleware": "^6.0.0", "eth-rpc-errors": "^3.0.0", @@ -7960,6 +8294,14 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/eth-json-rpc-middleware/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", @@ -7983,11 +8325,18 @@ "safe-event-emitter": "^1.0.1" } }, + "node_modules/eth-json-rpc-middleware/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, "node_modules/eth-lib": { "version": "0.1.29", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "dev": true, "dependencies": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -8000,25 +8349,7 @@ "node_modules/eth-lib/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/eth-lib/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/eth-lib/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/eth-query": { "version": "2.1.2", @@ -8070,7 +8401,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, "dependencies": { "js-sha3": "^0.8.0" } @@ -8144,32 +8474,45 @@ } }, "node_modules/ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz", + "integrity": "sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==", + "deprecated": "Please use Util.Account class found on package ethereumjs-util@^7.0.6 https://github.com/ethereumjs/ethereumjs-util/releases/tag/v7.0.6", + "dev": true, "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", + "ethereumjs-util": "^6.0.0", + "rlp": "^2.2.1", "safe-buffer": "^5.1.1" } }, + "node_modules/ethereumjs-account/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/ethereumjs-account/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/ethereumjs-account/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, "dependencies": { + "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", "create-hash": "^1.1.2", "elliptic": "^6.5.2", "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, "node_modules/ethereumjs-block": { @@ -8185,12 +8528,12 @@ "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/ethereumjs-block/node_modules/abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "node_modules/ethereumjs-block/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dependencies": { - "xtend": "~4.0.0" + "lodash": "^4.17.14" } }, "node_modules/ethereumjs-block/node_modules/bn.js": { @@ -8198,14 +8541,6 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/ethereumjs-block/node_modules/deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, "node_modules/ethereumjs-block/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", @@ -8220,231 +8555,50 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/ethereumjs-block/node_modules/level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + "node_modules/ethereumjs-common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", + "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", + "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." }, - "node_modules/ethereumjs-block/node_modules/level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "node_modules/ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", "dependencies": { - "errno": "~0.1.1" + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } + "node_modules/ethereumjs-tx/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "node_modules/ethereumjs-tx/node_modules/ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/ethereumjs-tx/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ethereumjs-block/node_modules/levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/ethereumjs-block/node_modules/memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - } - }, - "node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "node_modules/ethereumjs-block/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "node_modules/ethereumjs-block/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ethereumjs-block/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/ethereumjs-block/node_modules/semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ethereumjs-block/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ethereumjs-common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", - "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", - "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." - }, - "node_modules/ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "node_modules/ethereumjs-tx/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/ethereumjs-tx/node_modules/ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" - }, - "node_modules/ethereumjs-tx/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -8483,12 +8637,12 @@ "@types/node": "*" } }, - "node_modules/ethereumjs-vm/node_modules/abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "node_modules/ethereumjs-vm/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dependencies": { - "xtend": "~4.0.0" + "lodash": "^4.17.14" } }, "node_modules/ethereumjs-vm/node_modules/bn.js": { @@ -8496,12 +8650,28 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/ethereumjs-vm/node_modules/deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "node_modules/ethereumjs-vm/node_modules/ethereumjs-account": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", + "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", "dependencies": { - "abstract-leveldown": "~2.6.0" + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/ethereumjs-vm/node_modules/ethereumjs-account/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, "node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { @@ -8555,288 +8725,78 @@ "rlp": "^2.2.3" } }, - "node_modules/ethereumjs-vm/node_modules/level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "node_modules/ethers": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.11.1.tgz", + "integrity": "sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "errno": "~0.1.1" + "@adraffy/ens-normalize": "1.10.1", + "@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" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ethereumjs-vm/node_modules/levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/ethereumjs-vm/node_modules/memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "node_modules/ethereumjs-vm/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/ethereumjs-vm/node_modules/semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ethereumjs-vm/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ethereumjs-wallet": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", - "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", - "dependencies": { - "aes-js": "^3.1.2", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.1.2", - "randombytes": "^2.1.0", - "scrypt-js": "^3.0.1", - "utf8": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "node_modules/ethereumjs-wallet/node_modules/aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "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" - } - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" }, "node_modules/ethjs-util": { "version": "0.1.6", @@ -8851,20 +8811,19 @@ "npm": ">=3" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" } }, "node_modules/eventemitter3": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "node_modules/events": { "version": "3.3.0", @@ -8883,107 +8842,37 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dev": true, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -9002,7 +8891,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -9017,11 +8906,33 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -9030,7 +8941,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -9038,14 +8948,12 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -9056,38 +8964,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "dev": true, + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dependencies": { - "type": "^2.5.0" + "type": "^2.7.2" } }, "node_modules/ext/node_modules/type": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -9102,37 +9010,6 @@ "node": ">=4" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -9155,16 +9032,14 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -9176,76 +9051,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-glob/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/fast-glob/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -9254,9 +9059,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "peer": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", @@ -9264,20 +9067,32 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "peer": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -9285,33 +9100,21 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -9329,7 +9132,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -9337,8 +9139,7 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-replace": { "version": "3.0.0", @@ -9374,41 +9175,22 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "peer": true, + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true, - "peer": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/fmix": { "version": "0.1.0", @@ -9420,9 +9202,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "dev": true, "funding": [ { @@ -9443,20 +9225,10 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -9482,14 +9254,12 @@ "node_modules/form-data-encoder": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", - "dev": true + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -9500,46 +9270,45 @@ "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", "dev": true }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=12" } }, "node_modules/fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, "dependencies": { "minipass": "^2.6.0" } @@ -9553,44 +9322,40 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, "engines": { - "node": ">= 4.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -9617,7 +9382,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -9632,9 +9396,9 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "peer": true, "engines": { @@ -9642,14 +9406,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9665,25 +9433,25 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -9692,13 +9460,33 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, "node_modules/getpass": { @@ -9727,7 +9515,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9744,25 +9531,34 @@ } }, "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "is-extglob": "^2.1.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, "node_modules/global": { @@ -9802,23 +9598,46 @@ "node": ">=6" } }, - "node_modules/global-prefix/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "peer": true, + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/globby": { @@ -9826,7 +9645,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, - "peer": true, "dependencies": { "@types/glob": "^7.1.1", "array-union": "^2.1.0", @@ -9841,64 +9659,159 @@ "node": ">=8" } }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/globrex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/gradient-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz", + "integrity": "sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "tinygradient": "^1.1.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gradient-string/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/gradient-string/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/gradient-string/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/gradient-string/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "node_modules/gradient-string/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gradient-string/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=4.x" + "node": ">=8" } }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, - "peer": true, "dependencies": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, @@ -9912,16 +9825,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -9943,43 +9846,33 @@ "node": ">=6" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.1.tgz", + "integrity": "sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-evm": "2.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/ethereumjs-verkle": "0.0.2", + "@nomicfoundation/ethereumjs-vm": "7.0.4", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", "chalk": "^2.4.2", "chokidar": "^3.4.0", "ci-info": "^2.0.0", @@ -9999,7 +9892,6 @@ "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", - "qs": "^6.7.0", "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", @@ -10014,9 +9906,6 @@ "bin": { "hardhat": "internal/cli/bootstrap.js" }, - "engines": { - "node": ">=14.0.0" - }, "peerDependencies": { "ts-node": "*", "typescript": "*" @@ -10031,9 +9920,9 @@ } }, "node_modules/hardhat-contract-sizer": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.8.0.tgz", - "integrity": "sha512-jXt2Si3uIDx5z99J+gvKa0yvIw156pE4dpH9X/PvTQv652BUd+qGj7WT93PXnHXGh5qhQLkjDYeZMYNOThfjFg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz", + "integrity": "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -10115,34 +10004,46 @@ } }, "node_modules/hardhat-deploy": { - "version": "0.11.25", - "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.25.tgz", - "integrity": "sha512-ppSgrVE9A13YgTmf2PQGoyIs9o/jgJOMORrUP/rblU5K8mQ2YHWlPvkzZmP4h+SBW+tNmlnvSrf5K5DmMmExhw==", + "version": "0.11.45", + "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.45.tgz", + "integrity": "sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w==", "dev": true, "dependencies": { + "@ethersproject/abi": "^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/contracts": "^5.7.0", + "@ethersproject/providers": "^5.7.2", + "@ethersproject/solidity": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wallet": "^5.7.0", "@types/qs": "^6.9.7", "axios": "^0.21.1", "chalk": "^4.1.2", "chokidar": "^3.5.2", "debug": "^4.3.2", "enquirer": "^2.3.6", - "ethers": "^5.5.3", + "ethers": "^5.7.0", "form-data": "^4.0.0", "fs-extra": "^10.0.0", "match-all": "^1.2.6", "murmur-128": "^0.2.1", "qs": "^6.9.4", - "zksync-web3": "^0.8.1" + "zksync-web3": "^0.14.3" } }, "node_modules/hardhat-deploy-ethers": { - "version": "0.3.0-beta.13", - "resolved": "https://registry.npmjs.org/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz", - "integrity": "sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.4.1.tgz", + "integrity": "sha512-RM6JUcD0dOCjemxnKLtK7XQQI7NWn+LxF5qicGYax0PtWayEUXAewOb4WIHZ/yearhj+s2t6dL0MnHyLTENwJg==", "dev": true, "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" + "@nomicfoundation/hardhat-ethers": "^3.0.2", + "hardhat": "^2.16.0", + "hardhat-deploy": "^0.11.34" } }, "node_modules/hardhat-deploy/node_modules/ansi-styles": { @@ -10160,49 +10061,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/hardhat-deploy/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/hardhat-deploy/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/hardhat-deploy/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat-deploy/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/hardhat-deploy/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -10219,33 +10077,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/hardhat-deploy/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/hardhat-deploy/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10264,56 +10095,52 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/hardhat-deploy/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat-deploy/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/hardhat-deploy/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/hardhat-deploy/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/hardhat-deploy/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@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" } }, "node_modules/hardhat-deploy/node_modules/has-flag": { @@ -10325,51 +10152,6 @@ "node": ">=8" } }, - "node_modules/hardhat-deploy/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat-deploy/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/hardhat-deploy/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/hardhat-deploy/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/hardhat-deploy/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10382,31 +10164,20 @@ "node": ">=8" } }, - "node_modules/hardhat-deploy/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/hardhat-deploy/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/hardhat-deploy/node_modules/zksync-web3": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.14.4.tgz", + "integrity": "sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg==", + "deprecated": "This package has been deprecated in favor of zksync-ethers@5.0.0", "dev": true, - "engines": { - "node": ">= 10.0.0" + "peerDependencies": { + "ethers": "^5.7.0" } }, "node_modules/hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz", + "integrity": "sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==", "dev": true, "dependencies": { "array-uniq": "1.0.3", @@ -10423,229 +10194,139 @@ "integrity": "sha512-6ZX+IMcO6i7Vf5gFrKtq+SwSi6AcLcqSVnX59gzhXGqR+sLL6J1C8EDFS8NCSYwmJkpCD0bb7QbNOd46JZxSGg==", "dev": true, "dependencies": { - "@typechain/hardhat": "^6.0.0", + "@typechain/hardhat": "9.1.0", "fs-extra": "^10.0.1", "hardhat": "^2.9.2", "tempy": "1.0.1", "typechain": "^8.0.0" }, "peerDependencies": { - "@typechain/hardhat": "6.x", + "@typechain/hardhat": "9.1.0", "hardhat": "2.x", "lodash": "4.x", "typechain": "8.x" } }, - "node_modules/hardhat-packager/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, - "node_modules/hardhat-packager/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/hardhat/node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, - "node_modules/hardhat-packager/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "dev": true, - "engines": { - "node": ">= 10.0.0" + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" } }, - "node_modules/hardhat/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/hardhat/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, "dependencies": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/hardhat/node_modules/fill-range": { + "node_modules/hardhat/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/hardhat/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">= 6" + "node": ">=6 <7 || >=8" } }, - "node_modules/hardhat/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/hardhat/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/hardhat/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { - "node": ">=0.12.0" + "node": ">= 4.0.0" } }, - "node_modules/hardhat/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/hardhat/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/hardhat/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/hardhat/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" + "node": ">=8.3.0" }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" }, - "engines": { - "node": ">= 0.4.0" + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/has-bigints": { @@ -10666,31 +10347,31 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -10698,25 +10379,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "dependencies": { - "has-symbol-support-x": "^1.4.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -10725,45 +10393,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -10786,6 +10415,17 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -10795,6 +10435,16 @@ "he": "bin/he" } }, + "node_modules/header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, "node_modules/heap": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", @@ -10812,6 +10462,12 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -10833,79 +10489,56 @@ "node": ">=6.0.0" } }, - "node_modules/http-basic/node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, - "engines": [ - "node >= 0.8" - ], "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/http-basic/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/http-basic/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/http-basic/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.8" + "node": ">= 14" } }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", - "dev": true - }, "node_modules/http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -10936,10 +10569,9 @@ } }, "node_modules/http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", - "dev": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -10948,18 +10580,6 @@ "node": ">=10.19.0" } }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -10973,11 +10593,19 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -10989,7 +10617,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dev": true, "dependencies": { "punycode": "2.1.0" }, @@ -11001,7 +10628,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "dev": true, "engines": { "node": ">=6" } @@ -11010,7 +10636,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -11027,10 +10652,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "engines": { "node": ">= 4" } @@ -11041,16 +10665,15 @@ "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" }, "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -11062,15 +10685,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/imul": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", @@ -11084,8 +10698,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "peer": true, "engines": { "node": ">=0.8.19" } @@ -11103,7 +10715,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -11120,14 +10731,147 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -11153,41 +10897,31 @@ "fp-ts": "^1.0.0" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11199,6 +10933,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -11218,15 +10968,15 @@ } }, "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-boolean-object": { @@ -11245,17 +10995,25 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, @@ -11264,45 +11022,24 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -11311,43 +11048,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -11364,7 +11068,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -11378,7 +11081,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11393,7 +11095,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -11410,10 +11111,34 @@ "npm": ">=3" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -11423,15 +11148,11 @@ } }, "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, "node_modules/is-number-object": { @@ -11449,15 +11170,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -11477,24 +11189,21 @@ } }, "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "@types/estree": "*" } }, "node_modules/is-regex": { @@ -11513,22 +11222,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11577,16 +11280,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", - "dev": true, + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -11612,6 +11310,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "dev": true, + "dependencies": { + "upper-case": "^1.1.0" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -11624,63 +11331,40 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, - "dependencies": { - "buffer-alloc": "^1.2.0" - }, "engines": { - "node": ">=0.6.0" + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, - "node_modules/isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, - "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - }, - "engines": { - "node": ">= 4" + "bin": { + "jiti": "bin/jiti.js" } }, "node_modules/joycon": { @@ -11693,11 +11377,10 @@ } }, "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", "dev": true, - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -11706,8 +11389,7 @@ "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -11727,15 +11409,15 @@ } }, "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "peer": true, "bin": { "jsesc": "bin/jsesc" }, @@ -11744,10 +11426,9 @@ } }, "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-fixer": { "version": "1.6.15", @@ -11881,19 +11562,26 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", "dependencies": { - "jsonify": "~0.0.0" + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -11901,10 +11589,9 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "peer": true, + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -11913,26 +11600,29 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==", - "engines": { - "node": "*" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/jsonschema": { @@ -11960,9 +11650,9 @@ } }, "node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "hasInstallScript": true, "dependencies": { "node-addon-api": "^2.0.0", @@ -11973,58 +11663,20 @@ "node": ">=10.0.0" } }, - "node_modules/keccak256": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", - "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.0", - "buffer": "^6.0.3", - "keccak": "^3.0.2" - } - }, - "node_modules/keccak256/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dependencies": { - "json-buffer": "3.0.0" + "json-buffer": "3.0.1" } }, "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12038,87 +11690,123 @@ "graceful-fs": "^4.1.9" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, + "node_modules/level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + }, + "node_modules/level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" + "errno": "~0.1.1" } }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, + "node_modules/level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" } }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true, - "engines": { - "node": ">=12" - } + "node_modules/level-iterator-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, + "node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/level-iterator-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", + "dependencies": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + } + }, + "node_modules/level-ws/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/level-ws/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + }, + "node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/level-ws/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" + "object-keys": "~0.4.0" }, "engines": { - "node": ">=12" + "node": ">=0.4" } }, - "node_modules/level-transcoder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } + }, + "node_modules/levelup/node_modules/semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "bin": { + "semver": "bin/semver" } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -12127,6 +11815,18 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -12148,6 +11848,15 @@ "node": ">=4" } }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -12172,29 +11881,41 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "peer": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true + "dev": true, + "peer": true }, - "node_modules/lodash.isequalwith": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isequalwith/-/lodash.isequalwith-4.4.0.tgz", - "integrity": "sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==", + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.pick": { "version": "4.4.0", @@ -12205,7 +11926,12 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "node_modules/log-symbols": { @@ -12295,22 +12021,39 @@ } }, "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "peer": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", "dev": true, + "dependencies": { + "lower-case": "^1.1.2" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lru_map": { @@ -12320,12 +12063,12 @@ "dev": true }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, - "dependencies": { - "yallist": "^3.0.2" + "engines": { + "node": "14 || >=16.14" } }, "node_modules/ltgt": { @@ -12333,46 +12076,29 @@ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" }, + "node_modules/magic-string": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", + "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true }, "node_modules/markdown-table-ts": { "version": "1.0.3", @@ -12386,15 +12112,6 @@ "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", "dev": true }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -12405,29 +12122,46 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, + "node_modules/memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", "dependencies": { - "abstract-level": "^1.0.0", + "abstract-leveldown": "~2.7.1", "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, + "node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dependencies": { + "xtend": "~4.0.0" + } + }, + "node_modules/memdown/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -12437,592 +12171,751 @@ "node": ">= 0.10.0" } }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" } }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, + "node_modules/merkle-patricia-tree/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/merkle-patricia-tree/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/merkle-patricia-tree/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/meow/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/merkle-patricia-tree/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/merkle-patricia-tree/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "safe-buffer": "~5.1.0" } }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "p-try": "^2.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6" } }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/meow/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/meow/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/meow/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "optional": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "optional": true, - "peer": true + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "minipass": "^2.9.0" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { - "semver": "bin/semver" + "mkdirp": "bin/cmd.js" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8" + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "dependencies": { + "mkdirp": "*" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mkdist": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mkdist/-/mkdist-1.4.0.tgz", + "integrity": "sha512-LzzdzWDx6cWWPd8saIoO+kT5jnbijfeDaE6jZfmCYEi3YL2aJSyF23/tCFee/mDuh/ek1UQeSYdLeSa6oesdiw==", + "dev": true, + "dependencies": { + "autoprefixer": "^10.4.14", + "citty": "^0.1.5", + "cssnano": "^6.0.1", + "defu": "^6.1.3", + "esbuild": "^0.19.7", + "fs-extra": "^11.1.1", + "globby": "^13.2.2", + "jiti": "^1.21.0", + "mlly": "^1.4.2", + "mri": "^1.2.0", + "pathe": "^1.1.1", + "postcss": "^8.4.26", + "postcss-nested": "^6.0.1" + }, + "bin": { + "mkdist": "dist/cli.cjs" + }, + "peerDependencies": { + "sass": "^1.69.5", + "typescript": ">=5.3.2" + }, + "peerDependenciesMeta": { + "sass": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/mkdist/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], "dev": true, "optional": true, - "peer": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/meow/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/mkdist/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], "dev": true, "optional": true, - "peer": true - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/mkdist/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/merkletreejs": { - "version": "0.2.32", - "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz", - "integrity": "sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ==", + "node_modules/mkdist/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "bignumber.js": "^9.0.1", - "buffer-reverse": "^1.0.1", - "crypto-js": "^3.1.9-1", - "treeify": "^1.1.0", - "web3-utils": "^1.3.4" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 7.6.0" + "node": ">=12" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/mkdist/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, + "node_modules/mkdist/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "node_modules/mkdist/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/micromatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "node_modules/mkdist/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/micromatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/mkdist/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/mkdist/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/mkdist/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/mkdist/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], "dev": true, - "bin": { - "mime": "cli.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/mkdist/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, + "node_modules/mkdist/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "node_modules/mkdist/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dependencies": { - "dom-walk": "^0.1.0" + "node_modules/mkdist/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "node_modules/mkdist/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], "dev": true, "optional": true, - "peer": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/mkdist/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/mkdist/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], "dev": true, "optional": true, - "peer": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, + "os": [ + "sunos" + ], "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/minimist-options/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/mkdist/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], "dev": true, "optional": true, - "peer": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "node_modules/mkdist/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "node_modules/mkdist/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "minipass": "^2.9.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "node_modules/mkdist/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/mkdist/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=14.14" } }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "node_modules/mkdist/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/mkdist/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, - "dependencies": { - "minimist": "^1.2.6" + "engines": { + "node": ">= 4" + } + }, + "node_modules/mkdist/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" }, - "bin": { - "mkdirp": "bin/cmd.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "node_modules/mlly": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", + "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", "dev": true, "dependencies": { - "mkdirp": "*" + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "node_modules/mlly/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, "node_modules/mnemonist": { @@ -13035,12 +12928,11 @@ } }, "node_modules/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -13048,13 +12940,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -13069,10 +12960,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/ansi-colors": { @@ -13084,49 +12971,6 @@ "node": ">=6" } }, - "node_modules/mocha/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mocha/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -13154,6 +12998,17 @@ "fsevents": "~2.3.2" } }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/mocha/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -13166,18 +13021,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -13194,30 +13037,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/mocha/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mocha/node_modules/has-flag": { @@ -13229,27 +13065,6 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/mocha/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -13322,22 +13137,10 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" @@ -13349,31 +13152,45 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/mocha/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/mocha/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8.0" + "node": ">=10" } }, "node_modules/mock-fs": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", - "dev": true + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4" } }, "node_modules/ms": { @@ -13386,7 +13203,6 @@ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", "deprecated": "This module has been superseded by the multiformats module", - "dev": true, "dependencies": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -13397,7 +13213,6 @@ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", "deprecated": "This module has been superseded by the multiformats module", - "dev": true, "dependencies": { "varint": "^5.0.0" } @@ -13406,7 +13221,6 @@ "version": "0.4.21", "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "multibase": "^0.7.0", @@ -13418,7 +13232,6 @@ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", "deprecated": "This module has been superseded by the multiformats module", - "dev": true, "dependencies": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -13435,24 +13248,28 @@ "imul": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "dev": true, - "optional": true + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true }, "node_modules/nano-json-stream-parser": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==", - "dev": true + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13460,86 +13277,15 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "peer": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -13548,14 +13294,21 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, - "peer": true + "engines": { + "node": ">= 0.4.0" + } }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node_modules/nice-try": { "version": "1.0.5", @@ -13563,6 +13316,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -13578,29 +13340,10 @@ "lodash": "^4.17.21" } }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -13617,19 +13360,153 @@ } }, "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-plop": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.26.3.tgz", + "integrity": "sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==", + "dev": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.9.2", + "@types/inquirer": "^6.5.0", + "change-case": "^3.1.0", + "del": "^5.1.0", + "globby": "^10.0.1", + "handlebars": "^4.4.3", + "inquirer": "^7.1.0", + "isbinaryfile": "^4.0.2", + "lodash.get": "^4.4.2", + "mkdirp": "^0.5.1", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=8.9.4" + } + }, + "node_modules/node-plop/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/node-plop/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/node-plop/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/node-plop/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/node-plop/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-plop/node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/node-plop/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/node-plop/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-plop/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nofilter": { "version": "3.1.0", @@ -13667,9 +13544,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -13684,13 +13561,24 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-run-all": { @@ -13718,142 +13606,157 @@ "node": ">= 4" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, "engines": { - "node": ">=8" + "node": ">=4.8" } }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": "*" } }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "engines": { - "node": ">=0.10.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "which": "bin/which" } }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "path-key": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13862,31 +13765,18 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -13897,36 +13787,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", - "dev": true, - "dependencies": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/obliterator": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", @@ -13937,7 +13797,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, "dependencies": { "http-https": "^1.0.0" } @@ -13946,7 +13805,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, "dependencies": { "ee-first": "1.1.1" }, @@ -13958,114 +13816,267 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "peer": true, "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true, - "peer": true - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "p-try": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/ora/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "chalk": "^2.4.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", + "node_modules/ora/node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/ora/node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true, + "peer": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "dependencies": { - "p-finally": "^1.0.0" + "p-limit": "^1.1.0" }, "engines": { "node": ">=4" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -14075,62 +14086,81 @@ "node": ">=4" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", "dev": true, "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { - "callsites": "^3.0.0" + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": ">=6" + "node": ">= 14" } }, - "node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, "engines": { - "node": ">=6" + "node": ">= 14" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", "dev": true, "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/parse-cache-control": { @@ -14161,25 +14191,28 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, "engines": { "node": ">= 0.8" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "node_modules/pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" } }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true + "node_modules/path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } }, "node_modules/path-exists": { "version": "3.0.0", @@ -14194,18 +14227,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-parse": { @@ -14216,21 +14247,22 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { - "node": ">=4" + "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -14282,7 +14314,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -14303,11 +14334,25 @@ } }, "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" } }, "node_modules/pluralize": { @@ -14319,19 +14364,18 @@ "node": ">=4" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -14341,10 +14385,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -14352,1364 +14400,1358 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" } }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "node_modules/postcss-colormin": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.3.tgz", + "integrity": "sha512-ECpkS+UZRyAtu/kjive2/1mihP+GNtgC8kcdU8ueWZi1ZVxMNnRziCLdhrWECJhEtSWijfX2Cl9XTTCK/hjGaA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/postcss-convert-values": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.4.tgz", + "integrity": "sha512-YT2yrGzPXoQD3YeA2kBo/696qNwn7vI+15AOS2puXWEvSWqdCqlOyDWRy5GNnOc9ACRGOkuQ4ESQEqPJBWt/GA==", "dev": true, - "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.8.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "node_modules/postcss-discard-comments": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.1.tgz", + "integrity": "sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==", "dev": true, "engines": { - "node": ">=4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "node_modules/postcss-discard-duplicates": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.2.tgz", + "integrity": "sha512-U2rsj4w6pAGROCCcD13LP2eBIi1whUsXs4kgE6xkIuGfkbxCBSKhkCTWyowFd66WdVlLv0uM1euJKIgmdmZObg==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/postcss-discard-empty": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.2.tgz", + "integrity": "sha512-rj6pVC2dVCJrP0Y2RkYTQEbYaCf4HEm+R/2StQgJqGHxAa3+KcYslNQhcRqjLHtl/4wpzipJluaJLqBj6d5eDQ==", "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" + "engines": { + "node": "^14 || ^16 || >=18.0" }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.1.tgz", + "integrity": "sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA==", + "dev": true, "engines": { - "node": ">=6.0.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prettier-plugin-solidity": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", - "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", + "node_modules/postcss-merge-longhand": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.3.tgz", + "integrity": "sha512-kF/y3DU8CRt+SX3tP/aG+2gkZI2Z7OXDsPU7FgxIJmuyhQQ1EHceIYcsp/alvzCm2P4c37Sfdu8nNrHc+YeyLg==", "dev": true, "dependencies": { - "@solidity-parser/parser": "^0.16.0", - "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.0.3" }, "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "prettier": ">=2.3.0 || >=3.0.0-alpha.0" + "postcss": "^8.4.31" } }, - "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz", - "integrity": "sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==", + "node_modules/postcss-merge-rules": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.4.tgz", + "integrity": "sha512-97iF3UJ5v8N1BWy38y+0l+Z8o5/9uGlEgtWic2PJPzoRrLB6Gxg8TVG93O0EK52jcLeMsywre26AUlX1YAYeHA==", "dev": true, "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.1", + "postcss-selector-parser": "^6.0.15" + }, "engines": { - "node": ">= 0.6.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "node_modules/postcss-minify-font-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.2.tgz", + "integrity": "sha512-IedzbVMoX0a7VZWjSYr5qJ6C37rws8kl8diPBeMZLJfWKkgXuMFY5R/OxPegn/q9tK9ztd0XRH3aR0u2t+A7uQ==", "dev": true, "dependencies": { - "asap": "~2.0.6" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", + "node_modules/postcss-minify-gradients": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.2.tgz", + "integrity": "sha512-vP5mF7iI6/5fcpv+rSfwWQekOE+8I1i7/7RjZPGuIjj6eUaZVeG4XZYZrroFuw1WQd51u2V32wyQFZ+oYdE7CA==", + "dev": true, "dependencies": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" + "colord": "^2.9.3", + "cssnano-utils": "^4.0.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/postcss-minify-params": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.3.tgz", + "integrity": "sha512-j4S74d3AAeCK5eGdQndXSrkxusV2ekOxbXGnlnZthMyZBBvSDiU34CihTASbJxuVB3bugudmwolS7+Dgs5OyOQ==", "dev": true, "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.10" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "node_modules/postcss-minify-selectors": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.2.tgz", + "integrity": "sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==", "dev": true, "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "postcss-selector-parser": "^6.0.15" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/postcss-normalize-charset": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.1.tgz", + "integrity": "sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg==", + "dev": true, "engines": { - "node": ">=6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/postcss-normalize-display-values": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.1.tgz", + "integrity": "sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=0.6" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "node_modules/postcss-normalize-positions": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.1.tgz", + "integrity": "sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg==", "dev": true, "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.1.tgz", + "integrity": "sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ==", "dev": true, - "optional": true, - "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/postcss-normalize-string": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.1.tgz", + "integrity": "sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg==", + "dev": true, "dependencies": { - "safe-buffer": "^5.1.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.1.tgz", + "integrity": "sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g==", "dev": true, "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/postcss-normalize-unicode": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.3.tgz", + "integrity": "sha512-T2Bb3gXz0ASgc3ori2dzjv6j/P2IantreaC6fT8tWjqYUiqMAh5jGIkdPwEV2FaucjQlCLeFJDJh2BeSugE1ig==", "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "node_modules/postcss-normalize-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.1.tgz", + "integrity": "sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.1.tgz", + "integrity": "sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==", "dev": true, "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "postcss-value-parser": "^4.2.0" }, - "bin": { - "rc": "cli.js" + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/postcss-ordered-values": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.1.tgz", + "integrity": "sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA==", "dev": true, + "dependencies": { + "cssnano-utils": "^4.0.1", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "node_modules/postcss-reduce-initial": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.3.tgz", + "integrity": "sha512-w4QIR9pEa1N4xMx3k30T1vLZl6udVK2RmNqrDXhBXX9L0mBj2a8ADs8zkbaEH7eUy1m30Wyr5EBgHN31Yq1JvA==", "dev": true, "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node": "^14 || ^16 || >=18.0" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "node_modules/postcss-reduce-transforms": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.1.tgz", + "integrity": "sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=0.10" - } - }, - "node_modules/readdirp/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/readdirp/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", "dev": true, - "peer": true, "dependencies": { - "resolve": "^1.1.6" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "node_modules/postcss-svgo": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.2.tgz", + "integrity": "sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ==", "dev": true, - "peer": true, "dependencies": { - "minimatch": "^3.0.5" + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" }, "engines": { - "node": ">=6.0.0" + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/postcss-unique-selectors": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.2.tgz", + "integrity": "sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "postcss-selector-parser": "^6.0.15" }, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dependencies": { - "is-plain-object": "^2.0.4" + "fast-diff": "^1.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/prettier-plugin-solidity": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz", + "integrity": "sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "@solidity-parser/parser": "^0.17.0", + "semver": "^7.5.4", + "solidity-comments-extractor": "^0.0.8" }, "engines": { - "node": ">= 0.4" + "node": ">=16" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "prettier": ">=2.3.0" } }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.17.0.tgz", + "integrity": "sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==", + "dev": true + }, + "node_modules/prettier-plugin-solidity/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "rc": "1.2.8" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "node_modules/prettier-plugin-solidity/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { - "rc": "^1.2.8" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "node_modules/prettier-plugin-solidity/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { - "node": ">=0.10" + "node": ">= 0.6.0" } }, - "node_modules/req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "dependencies": { - "req-from": "^2.0.0" + "asap": "~2.0.6" + } + }, + "node_modules/promise-to-callback": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", + "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", + "dependencies": { + "is-fn": "^1.0.0", + "set-immediate-shim": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", - "dev": true, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "resolve-from": "^3.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=4" + "node": ">= 0.10" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { - "lodash": "^4.17.19" + "debug": "^4.3.4" }, "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": ">= 14" } }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": ">= 14" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "engines": { - "node": ">= 0.12" + "node": ">=12" } }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dependencies": { - "path-parse": "^1.0.6" + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } }, - "node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "dependencies": { - "lowercase-keys": "^1.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, "engines": { - "node": ">=0.12" + "node": ">=0.10.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "pify": "^3.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=4" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "bn.js": "^5.2.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "bin": { - "rlp": "bin/rlp" + "engines": { + "node": ">= 6" } }, - "node_modules/rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" + "dependencies": { + "picomatch": "^2.2.1" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8.10.0" } }, - "node_modules/rollup-plugin-esbuild": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-5.0.0.tgz", - "integrity": "sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg==", + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, + "peer": true, "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "debug": "^4.3.4", - "es-module-lexer": "^1.0.5", - "joycon": "^3.1.1", - "jsonc-parser": "^3.2.0" + "resolve": "^1.1.6" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.10.1", - "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" + "node": ">= 0.10" } }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "peer": true, + "dependencies": { + "minimatch": "^3.0.5" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=6.0.0" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "engines": { - "node": ">=0.12.0" + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "peer": true, "dependencies": { - "queue-microtask": "^1.2.2" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "engines": { + "node": ">=6" } }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "tslib": "^1.9.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { - "npm": ">=2.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "deprecated": "Renamed to @metamask/safe-event-emitter", - "dependencies": { - "events": "^3.0.0" + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "dependencies": { - "ret": "~0.1.10" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", "dev": true, - "peer": true, "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "rc": "^1.0.1" }, - "bin": { - "istanbul": "lib/cli.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/sc-istanbul/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "dev": true, - "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/sc-istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true, - "peer": true - }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "dev": true, - "peer": true, "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "resolve-from": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/sc-istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "node_modules/req-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 6" } }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=4" + "node": ">= 0.12" } }, - "node_modules/sc-istanbul/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true, - "peer": true + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } }, - "node_modules/sc-istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^1.0.0" - }, "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "path-parse": "^1.0.6" }, - "engines": { - "node": ">=10.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "lowercase-keys": "^2.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "glob": "^7.1.3" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dependencies": { - "ms": "2.0.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/rollup-plugin-dts": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.0.tgz", + "integrity": "sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "magic-string": "^0.30.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.22.13" + }, + "peerDependencies": { + "rollup": "^3.29.4 || ^4", + "typescript": "^4.5 || ^5.0" } }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "node_modules/rollup-plugin-dts/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, + "optional": true, "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "node_modules/rollup-plugin-esbuild": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-5.0.0.tgz", + "integrity": "sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg==", "dev": true, "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "@rollup/pluginutils": "^5.0.1", + "debug": "^4.3.4", + "es-module-lexer": "^1.0.5", + "joycon": "^3.1.1", + "jsonc-parser": "^3.2.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "node": ">=14.18.0", + "npm": ">=8.0.0" }, - "bin": { - "sha.js": "bin.js" + "peerDependencies": { + "esbuild": ">=0.10.1", + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" } }, - "node_modules/sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, - "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - }, "engines": { - "node": "*" + "node": ">=0.12.0" } }, - "node_modules/shebang-command": { + "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/rust-verkle-wasm": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz", + "integrity": "sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==", + "dev": true + }, + "node_modules/rustbn-wasm": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz", + "integrity": "sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@scure/base": "^1.1.1" } }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "peer": true, "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" + "tslib": "^2.1.0" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -15725,1219 +15767,1142 @@ } ] }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/safe-event-emitter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", + "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", + "deprecated": "Renamed to @metamask/safe-event-emitter", + "dependencies": { + "events": "^3.0.0" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "bin": { + "istanbul": "lib/cli.js" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/sc-istanbul/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "node_modules/sc-istanbul/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } + "peer": true }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "peer": true, "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "node_modules/sc-istanbul/node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, + "peer": true, "dependencies": { - "is-descriptor": "^1.0.0" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/sc-istanbul/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, - "dependencies": { - "kind-of": "^3.2.0" + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/sc-istanbul/node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, + "peer": true, "dependencies": { - "is-descriptor": "^0.1.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "dependencies": { - "kind-of": "^3.0.2" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/snapdragon/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/sc-istanbul/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8.0.0" + "node": "*" } }, - "node_modules/solc/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "node_modules/sc-istanbul/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "node_modules/sc-istanbul/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "peer": true, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", "dev": true, - "bin": { - "semver": "bin/semver" - } + "peer": true }, - "node_modules/solhint": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.6.2.tgz", - "integrity": "sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==", + "node_modules/sc-istanbul/node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@solidity-parser/parser": "^0.16.0", - "ajv": "^6.12.6", - "antlr4": "^4.11.0", - "ast-parents": "^0.0.1", - "chalk": "^4.1.2", - "commander": "^10.0.0", - "cosmiconfig": "^8.0.0", - "fast-diff": "^1.2.0", - "glob": "^8.0.3", - "ignore": "^5.2.4", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "semver": "^7.5.2", - "strip-ansi": "^6.0.1", - "table": "^6.8.1", - "text-table": "^0.2.0" - }, - "bin": { - "solhint": "solhint.js" + "amdefine": ">=0.0.4" }, - "optionalDependencies": { - "prettier": "^2.8.3" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/solhint/node_modules/@solidity-parser/parser": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", - "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", + "node_modules/sc-istanbul/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } + "peer": true }, - "node_modules/solhint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "has-flag": "^1.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/solhint/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "node": ">=0.8.0" } }, - "node_modules/solhint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/sc-istanbul/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 0.8.0" } }, - "node_modules/solhint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { - "color-name": "~1.1.4" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=7.0.0" + "bin": { + "which": "bin/which" } }, - "node_modules/solhint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, - "node_modules/solhint/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true }, - "node_modules/solhint/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10.0.0" } }, - "node_modules/solhint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/semaphore": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/solhint/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/solhint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { - "has-flag": "^4.0.0" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/solidity-bytes-utils": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/solidity-bytes-utils/-/solidity-bytes-utils-0.8.0.tgz", - "integrity": "sha512-r109ZHEf7zTMm1ENW6/IJFDWilFR/v0BZnGuFgDHJUV80ByobnV2k3txvwQaJ9ApL+6XAfwqsw5VFzjALbQPCw==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "@truffle/hdwallet-provider": "latest" + "ms": "2.0.0" } }, - "node_modules/solidity-comments-extractor": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", - "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", - "dev": true + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/solidity-coverage": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", - "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", "dev": true, - "peer": true, "dependencies": { - "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.14.1", - "chalk": "^2.4.2", - "death": "^1.1.0", - "detect-port": "^1.3.0", - "difflib": "^0.2.4", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.15", - "mocha": "7.1.2", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.6" - }, - "bin": { - "solidity-coverage": "plugins/bin.js" - }, - "peerDependencies": { - "hardhat": "^2.11.0" + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" } }, - "node_modules/solidity-coverage/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/solidity-coverage/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "peer": true, + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "dependencies": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "peer": true, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" } }, - "node_modules/solidity-coverage/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/solidity-coverage/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "peer": true, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/solidity-coverage/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "peer": true, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dependencies": { - "fill-range": "^7.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/solidity-coverage/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, - "peer": true, "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" + "node": "*" } }, - "node_modules/solidity-coverage/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/solidity-coverage/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "peer": true, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "peer": true, - "dependencies": { - "ms": "^2.1.1" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.3.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, "peer": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "shjs": "bin/shjs" }, "engines": { "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "peer": true, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dependencies": { - "to-regex-range": "^5.0.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/solidity-coverage/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^3.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "peer": true, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/solidity-coverage/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "peer": true, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "mimic-response": "^1.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "peer": true, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "peer": true, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "is-glob": "^4.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "peer": true, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "binary-extensions": "^2.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/solidity-coverage/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "engines": { - "node": ">=4" - } + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "peer": true, "engines": { - "node": ">=4" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/solidity-coverage/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.12.0" + "dependencies": { + "no-case": "^2.2.0" } }, - "node_modules/solidity-coverage/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", "dev": true, - "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/solidity-coverage/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", "dev": true, - "peer": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" }, "engines": { - "node": ">=6" + "node": ">= 14" } }, - "node_modules/solidity-coverage/node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, - "peer": true, "dependencies": { - "chalk": "^2.4.2" + "debug": "^4.3.4" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "peer": true, + "node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solcjs" }, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/solidity-coverage/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/solc/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dev": true, - "peer": true, "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "node_modules/solidity-coverage/node_modules/mocha": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", - "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "peer": true, "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" + "glob": "^7.1.3" }, "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "rimraf": "bin.js" } }, - "node_modules/solidity-coverage/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "peer": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" + "bin": { + "semver": "bin/semver" } }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/solhint": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.6.2.tgz", + "integrity": "sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==", "dev": true, - "peer": true, "dependencies": { - "p-try": "^2.0.0" + "@solidity-parser/parser": "^0.16.0", + "ajv": "^6.12.6", + "antlr4": "^4.11.0", + "ast-parents": "^0.0.1", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "cosmiconfig": "^8.0.0", + "fast-diff": "^1.2.0", + "glob": "^8.0.3", + "ignore": "^5.2.4", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "semver": "^7.5.2", + "strip-ansi": "^6.0.1", + "table": "^6.8.1", + "text-table": "^0.2.0" }, - "engines": { - "node": ">=6" + "bin": { + "solhint": "solhint.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "prettier": "^2.8.3" } }, - "node_modules/solidity-coverage/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/solhint/node_modules/@solidity-parser/parser": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", + "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", "dev": true, - "peer": true, "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" + "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/solidity-coverage/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/solhint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/solhint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "node_modules/solhint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "peer": true, "dependencies": { - "picomatch": "^2.0.4" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 8" + "node": ">=7.0.0" } }, - "node_modules/solidity-coverage/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/solhint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/solhint/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, - "peer": true, "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/solidity-coverage/node_modules/strip-ansi": { + "node_modules/solhint/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/solhint/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/solidity-coverage/node_modules/supports-color": { + "node_modules/solhint/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/solhint/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "peer": true, "dependencies": { - "is-number": "^7.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8.0" - } - }, - "node_modules/solidity-coverage/node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/solhint/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/solhint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "peer": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/solhint/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/solidity-bytes-utils": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/solidity-bytes-utils/-/solidity-bytes-utils-0.8.0.tgz", + "integrity": "sha512-r109ZHEf7zTMm1ENW6/IJFDWilFR/v0BZnGuFgDHJUV80ByobnV2k3txvwQaJ9ApL+6XAfwqsw5VFzjALbQPCw==", + "dependencies": { + "@truffle/hdwallet-provider": "latest" + } + }, + "node_modules/solidity-comments-extractor": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz", + "integrity": "sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==", + "dev": true + }, + "node_modules/solidity-coverage": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.9.tgz", + "integrity": "sha512-ZhPsxlsLkYyzgwoVGh8RBN2ju7JVahvMkk+8RBVc0vP/3UNq88GzvL8kvbuY48lVIRL8eQjJ+0X8al2Bu9/2iQ==", "dev": true, "peer": true, "dependencies": { - "ansi-regex": "^4.1.0" + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.18.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "^10.2.0", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" }, - "engines": { - "node": ">=6" + "bin": { + "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" } }, - "node_modules/solidity-coverage/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", + "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", "dev": true, "peer": true }, - "node_modules/solidity-coverage/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "peer": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/solidity-coverage/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/solidity-coverage/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/solidity-coverage/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "node_modules/solidity-coverage/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "peer": true, "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/solidity-coverage/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "peer": true, "engines": { "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/solidity-coverage/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "peer": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, "engines": { - "node": ">=6" + "node": ">= 4.0.0" } }, + "node_modules/solidity-coverage/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "peer": true + }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16952,20 +16917,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -16976,26 +16927,10 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -17003,9 +16938,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -17019,52 +16954,15 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true }, "node_modules/squirrelly": { @@ -17080,9 +16978,9 @@ } }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -17103,6 +17001,11 @@ "node": ">=0.10.0" } }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, "node_modules/sshpk/node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -17129,110 +17032,18 @@ "node": ">=8" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, "engines": { "node": ">= 0.8" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17255,7 +17066,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17265,21 +17075,32 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", + "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -17289,28 +17110,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17320,7 +17141,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -17337,6 +17157,15 @@ "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -17349,25 +17178,10 @@ "npm": ">=3" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -17375,6 +17189,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylehacks": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.3.tgz", + "integrity": "sha512-KzBqjnqktc8/I0ERCb+lGq06giF/JxDbw2r9kEVhen9noHeIDRtMWUp9r62sOk+/2bbX6sFG1GhsS7ToXG0PEg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.15" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -17398,17 +17228,60 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "node_modules/svgo": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", + "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", "dev": true, + "dependencies": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "node_modules/swarm-js": { + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "dependencies": { "bluebird": "^3.5.0", "buffer": "^5.0.5", "eth-lib": "^0.1.26", "fs-extra": "^4.0.2", - "got": "^7.1.0", + "got": "^11.8.5", "mime-types": "^2.1.16", "mkdirp-promise": "^5.0.1", "mock-fs": "^4.1.0", @@ -17417,88 +17290,101 @@ "xhr-request": "^1.0.1" } }, + "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swarm-js/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, "node_modules/swarm-js/node_modules/fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, - "node_modules/swarm-js/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, + "node_modules/swarm-js/node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "node_modules/swarm-js/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=10.19.0" } }, - "node_modules/swarm-js/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/swarm-js/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/swarm-js/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true, + "node_modules/swarm-js/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/swarm-js/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, + "node_modules/swarm-js/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/swarm-js/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, + "node_modules/swarm-js/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.0" } }, "node_modules/sync-request": { @@ -17528,7 +17414,6 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -17574,10 +17459,9 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -17592,14 +17476,12 @@ "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, "dependencies": { "chownr": "^1.1.4", "fs-minipass": "^1.2.7", @@ -17641,6 +17523,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tempy/node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", @@ -17656,8 +17589,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/then-request": { "version": "6.0.2", @@ -17687,21 +17619,6 @@ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true }, - "node_modules/then-request/node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/then-request/node_modules/form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -17716,36 +17633,6 @@ "node": ">= 0.12" } }, - "node_modules/then-request/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/then-request/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/then-request/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -17756,17 +17643,42 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "dev": true }, + "node_modules/tinygradient": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz", + "integrity": "sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==", + "dev": true, + "dependencies": { + "@types/tinycolor2": "^1.4.0", + "tinycolor2": "^1.0.0" + } + }, + "node_modules/title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -17787,130 +17699,57 @@ "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { - "kind-of": "^3.0.2" + "is-number": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { - "node": ">=6" + "node": ">=0.6" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8" + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" } }, "node_modules/ts-command-line-args": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz", - "integrity": "sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -18002,9 +17841,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -18044,6 +17883,18 @@ } } }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -18054,18 +17905,18 @@ } }, "node_modules/tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.2.tgz", + "integrity": "sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==", "dev": true, "bin": { "tsconfck": "bin/tsconfck.js" }, "engines": { - "node": "^14.13.1 || ^16 || >=18" + "node": "^18 || >=20" }, "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" + "typescript": "^5.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -18073,10 +17924,14 @@ } } }, + "node_modules/tsconfig": { + "resolved": "config/tsconfig", + "link": true + }, "node_modules/tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsort": { "version": "0.0.1", @@ -18084,27 +17939,6 @@ "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", "dev": true }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -18116,6 +17950,101 @@ "node": "*" } }, + "node_modules/turbo": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.12.4.tgz", + "integrity": "sha512-yUJ7elEUSToiGwFZogXpYKJpQ0BvaMbkEuQECIWtkBLcmWzlMOt6bActsIm29oN83mRU0WbzGt4e8H1KHWedhg==", + "dev": true, + "bin": { + "turbo": "bin/turbo" + }, + "optionalDependencies": { + "turbo-darwin-64": "1.12.4", + "turbo-darwin-arm64": "1.12.4", + "turbo-linux-64": "1.12.4", + "turbo-linux-arm64": "1.12.4", + "turbo-windows-64": "1.12.4", + "turbo-windows-arm64": "1.12.4" + } + }, + "node_modules/turbo-darwin-64": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.12.4.tgz", + "integrity": "sha512-dBwFxhp9isTa9RS/fz2gDVk5wWhKQsPQMozYhjM7TT4jTrnYn0ZJMzr7V3B/M/T8QF65TbniW7w1gtgxQgX5Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-darwin-arm64": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.12.4.tgz", + "integrity": "sha512-1Uo5iI6xsJ1j9ObsqxYRsa3W26mEbUe6fnj4rQYV6kDaqYD54oAMJ6hM53q9rB8JvFxwdrUXGp3PwTw9A0qqkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-linux-64": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.12.4.tgz", + "integrity": "sha512-ONg2aSqKP7LAQOg7ysmU5WpEQp4DGNxSlAiR7um+LKtbmC/UxogbR5+T+Uuq6zGuQ5kJyKjWJ4NhtvUswOqBsA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-linux-arm64": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.12.4.tgz", + "integrity": "sha512-9FPufkwdgfIKg/9jj87Cdtftw8o36y27/S2vLN7FTR2pp9c0MQiTBOLVYadUr1FlShupddmaMbTkXEhyt9SdrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-windows-64": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.12.4.tgz", + "integrity": "sha512-2mOtxHW5Vjh/5rDVu/aFwsMzI+chs8XcEuJHlY1sYOpEymYTz+u6AXbnzRvwZFMrLKr7J7fQOGl+v96sLKbNdA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/turbo-windows-arm64": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.12.4.tgz", + "integrity": "sha512-nOY5wae9qnxPOpT1fRuYO0ks6dTwpKMPV6++VkDkamFDLFHUDVM/9kmD2UTeh1yyrKnrZksbb9zmShhmfj1wog==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -18129,15 +18058,12 @@ "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -18156,10 +18082,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { "node": ">=10" }, @@ -18171,7 +18096,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -18181,9 +18105,9 @@ } }, "node_modules/typechain": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz", - "integrity": "sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", "dev": true, "dependencies": { "@types/prettier": "^2.1.1", @@ -18204,6 +18128,30 @@ "typescript": ">=4.3.0" } }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -18224,6 +18172,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -18236,6 +18205,88 @@ "node": ">=10" } }, + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -18246,22 +18297,20 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/typical": { @@ -18273,13 +18322,18 @@ "node": ">=8" } }, + "node_modules/ufo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "dev": true + }, "node_modules/uglify-js": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", - "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, - "peer": true, "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -18290,8 +18344,7 @@ "node_modules/ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "node_modules/unbox-primitive": { "version": "1.0.2", @@ -18308,17387 +18361,2812 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dev": true, - "dependencies": { - "busboy": "^1.6.0" + "node_modules/unbuild": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unbuild/-/unbuild-2.0.0.tgz", + "integrity": "sha512-JWCUYx3Oxdzvw2J9kTAp+DKE8df/BnH/JTSj6JyA4SH40ECdFu7FoJJcrm8G92B7TjofQ6GZGjJs50TRxoH6Wg==", + "dev": true, + "dependencies": { + "@rollup/plugin-alias": "^5.0.0", + "@rollup/plugin-commonjs": "^25.0.4", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.2.1", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/pluginutils": "^5.0.3", + "chalk": "^5.3.0", + "citty": "^0.1.2", + "consola": "^3.2.3", + "defu": "^6.1.2", + "esbuild": "^0.19.2", + "globby": "^13.2.2", + "hookable": "^5.5.3", + "jiti": "^1.19.3", + "magic-string": "^0.30.3", + "mkdist": "^1.3.0", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "pretty-bytes": "^6.1.1", + "rollup": "^3.28.1", + "rollup-plugin-dts": "^6.0.0", + "scule": "^1.0.0", + "untyped": "^1.4.0" }, - "engines": { - "node": ">=12.18" + "bin": { + "unbuild": "dist/cli.mjs" + }, + "peerDependencies": { + "typescript": "^5.1.6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "node_modules/unbuild/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "node_modules/unbuild/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/unbuild/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 4.0.0" + "node": ">=12" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/unbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "node_modules/unbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "node_modules/unbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "node_modules/unbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "node_modules/unbuild/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "node_modules/unbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4", - "yarn": "*" + "node": ">=12" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } + "node_modules/unbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "node_modules/unbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", - "dev": true - }, - "node_modules/url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", + "node_modules/unbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4" + "node": ">=12" } }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "node_modules/unbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/utf-8-validate": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", - "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "node_modules/unbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.14.2" + "node": ">=12" } }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "node_modules/unbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/unbuild/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/unbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "node_modules/unbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/unbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "dev": true + "node_modules/unbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/unbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" + "node_modules/unbuild/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vite": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", - "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", + "node_modules/unbuild/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.18.0" + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/unbuild/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, "bin": { - "vite": "bin/vite.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=12" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/unbuild/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-checker": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.5.6.tgz", - "integrity": "sha512-ftRyON0gORUHDxcDt2BErmsikKSkfvl1i2DoP6Jt2zDO9InfvM6tqO1RkXhSjkaXEhKPea6YOnhFaZxW3BzudQ==", + "node_modules/unbuild/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "ansi-escapes": "^4.3.0", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "commander": "^8.0.0", - "fast-glob": "^3.2.7", - "fs-extra": "^11.1.0", - "lodash.debounce": "^4.0.8", - "lodash.pick": "^4.4.0", - "npm-run-path": "^4.0.1", - "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", - "vscode-languageclient": "^7.0.0", - "vscode-languageserver": "^7.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^3.0.2" - }, "engines": { - "node": ">=14.16" - }, - "peerDependencies": { - "eslint": ">=7", - "meow": "^9.0.0", - "optionator": "^0.9.1", - "stylelint": ">=13", - "typescript": "*", - "vite": ">=2.0.0", - "vls": "*", - "vti": "*", - "vue-tsc": "*" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "meow": { - "optional": true - }, - "optionator": { - "optional": true - }, - "stylelint": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vls": { - "optional": true - }, - "vti": { - "optional": true - }, - "vue-tsc": { - "optional": true - } + "node": ">= 4" } }, - "node_modules/vite-plugin-checker/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/unbuild/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-checker/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/undici": { + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dev": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@fastify/busboy": "^2.0.0" }, "engines": { - "node": ">= 8" + "node": ">=14.0" } }, - "node_modules/vite-plugin-checker/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "node_modules/vite-plugin-checker/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "crypto-random-string": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/vite-plugin-checker/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 10.0.0" } }, - "node_modules/vite-plugin-checker/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untyped": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.4.2.tgz", + "integrity": "sha512-nC5q0DnPEPVURPhfPQLahhSTnemVtPzdx7ofiRxXpOB2SYnb3MfdU3DVGyJdS8Lx+tBWeAePO8BfU/3EgksM7Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/standalone": "^7.23.8", + "@babel/types": "^7.23.6", + "defu": "^6.1.4", + "jiti": "^1.21.0", + "mri": "^1.2.0", + "scule": "^1.2.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "engines": { - "node": ">= 8.10.0" + "bin": { + "update-browserslist-db": "cli.js" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/vite-plugin-checker/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" } }, - "node_modules/vite-plugin-checker/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", "dev": true }, - "node_modules/vite-plugin-checker/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/vite-plugin-checker/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "upper-case": "^1.1.1" } }, - "node_modules/vite-plugin-checker/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" + "punycode": "^2.1.0" } }, - "node_modules/vite-plugin-checker/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "node_modules/url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" }, - "node_modules/vite-plugin-checker/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, "dependencies": { - "is-glob": "^4.0.1" + "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">= 6" + "node": ">=6.14.2" } }, - "node_modules/vite-plugin-checker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" }, - "node_modules/vite-plugin-checker/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/vite-plugin-checker/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { - "node": ">=0.12.0" + "node": ">= 0.4.0" } }, - "node_modules/vite-plugin-checker/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/vite-plugin-checker/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==" }, - "node_modules/vite-plugin-checker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vite-plugin-checker/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "builtins": "^5.0.0" }, "engines": { - "node": ">=8.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/vite-plugin-checker/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } + "node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" }, - "node_modules/vite-tsconfig-paths": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.0.8.tgz", - "integrity": "sha512-p04zH+Ey+NT78571x0pdX7nVRIJSlmKVvYryFglSWOK3Hc72eDL0+JJfbyQiugaIBApJkaEqbBQvqpsFZOSVGg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/vite/node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/vite": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", "dev": true, + "peer": true, "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" }, "bin": { - "resolve": "bin/resolve" + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", - "dev": true, - "engines": { - "node": ">=8.0.0 || >=10.0.0" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/vscode-languageclient": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", - "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "node_modules/vite-plugin-checker": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.5.6.tgz", + "integrity": "sha512-ftRyON0gORUHDxcDt2BErmsikKSkfvl1i2DoP6Jt2zDO9InfvM6tqO1RkXhSjkaXEhKPea6YOnhFaZxW3BzudQ==", "dev": true, "dependencies": { - "minimatch": "^3.0.4", - "semver": "^7.3.4", - "vscode-languageserver-protocol": "3.16.0" + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", + "lodash.debounce": "^4.0.8", + "lodash.pick": "^4.4.0", + "npm-run-path": "^4.0.1", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" }, "engines": { - "vscode": "^1.52.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "dev": true, - "dependencies": { - "vscode-languageserver-protocol": "3.16.0" + "node": ">=14.16" }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "dev": true, - "dependencies": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": "*" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } } }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", - "dev": true - }, - "node_modules/vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", - "dev": true - }, - "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, - "node_modules/web3": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", - "integrity": "sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==", + "node_modules/vite-plugin-checker/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, - "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.7.5", - "web3-core": "1.7.5", - "web3-eth": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-shh": "1.7.5", - "web3-utils": "1.7.5" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=6.9.0" } }, - "node_modules/web3-bzz": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.5.tgz", - "integrity": "sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==", + "node_modules/vite-plugin-checker/node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-bzz/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "node_modules/vite-plugin-checker/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/web3-bzz/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/vite-plugin-checker/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "defer-to-connect": "^2.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14.16" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/web3-bzz/node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "node_modules/vite-plugin-checker/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/web3-bzz/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/vite-plugin-checker/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "pump": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "node_modules/web3-bzz/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/vite-plugin-checker/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/vite-plugin-checker/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 12" } }, - "node_modules/web3-bzz/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/vite-plugin-checker/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { - "mimic-response": "^3.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.14" } }, - "node_modules/web3-bzz/node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/vite-plugin-checker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/web3-bzz/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web3-bzz/node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "node_modules/vite-tsconfig-paths": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz", + "integrity": "sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==", "dev": true, "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.1" }, - "engines": { - "node": ">=14.16" + "peerDependencies": { + "vite": "*" }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/web3-bzz/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/web3-bzz/node_modules/keyv": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.3.tgz", - "integrity": "sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==", - "dev": true, - "dependencies": { - "compress-brotli": "^1.3.8", - "json-buffer": "3.0.1" + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, - "node_modules/web3-bzz/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/web3-bzz/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/web3-bzz/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/web3-bzz/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">=12.20" + "node": ">=12" } }, - "node_modules/web3-bzz/node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/web3-bzz/node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/web3-core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.5.tgz", - "integrity": "sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-requestmanager": "1.7.5", - "web3-utils": "1.7.5" - }, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-core-helpers": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz", - "integrity": "sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "web3-eth-iban": "1.7.5", - "web3-utils": "1.7.5" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-core-method": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.5.tgz", - "integrity": "sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==", + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-utils": "1.7.5" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-core-promievent": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz", - "integrity": "sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-core-requestmanager": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz", - "integrity": "sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.5", - "web3-providers-http": "1.7.5", - "web3-providers-ipc": "1.7.5", - "web3-providers-ws": "1.7.5" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-core-subscriptions": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz", - "integrity": "sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/web3-eth": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.5.tgz", - "integrity": "sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-accounts": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-eth-ens": "1.7.5", - "web3-eth-iban": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-eth-abi": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz", - "integrity": "sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.5" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-eth-accounts": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz", - "integrity": "sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-eth-accounts/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } }, - "node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "uuid": "bin/uuid" + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/web3-eth-contract": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz", - "integrity": "sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-utils": "1.7.5" - }, + "optional": true, + "os": [ + "sunos" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-eth-ens": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz", - "integrity": "sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-utils": "1.7.5" - }, + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/web3-eth-iban": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz", - "integrity": "sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", "dev": true, + "peer": true, "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.5" + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=8.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "fsevents": "~2.3.2" } }, - "node_modules/web3-eth-personal": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz", - "integrity": "sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==", + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true, + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", "dev": true, "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" }, "engines": { - "node": ">=8.0.0" + "vscode": "^1.52.0" } }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true + "node_modules/vscode-languageclient/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/web3-net": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.5.tgz", - "integrity": "sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==", + "node_modules/vscode-languageclient/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "node_modules/web3-provider-engine": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.3.tgz", - "integrity": "sha512-Q3bKhGqLfMTdLvkd4TtkGYJHcoVQ82D1l8jTIwwuJp/sAp7VHnRYb9YJ14SW/69VMWoOhSpPLZV2tWb9V0WJoA==", + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { - "@ethereumjs/tx": "^3.3.0", - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^4.4.2", - "eth-json-rpc-filters": "^4.2.1", - "eth-json-rpc-infura": "^5.1.0", - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.85.0", - "semaphore": "^1.0.3", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12.0.0" + "node": "*" } }, - "node_modules/web3-provider-engine/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/web3-provider-engine/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/vscode-languageclient/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/web3-provider-engine/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/vscode-languageclient/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/web3-provider-engine/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/web3-provider-engine/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" } }, - "node_modules/web3-provider-engine/node_modules/ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, "dependencies": { - "async-limiter": "~1.0.0" + "defaults": "^1.0.3" } }, - "node_modules/web3-providers-http": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.5.tgz", - "integrity": "sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==", + "node_modules/web3": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.4.tgz", + "integrity": "sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==", "dev": true, + "hasInstallScript": true, "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.7.5" + "web3-bzz": "1.10.4", + "web3-core": "1.10.4", + "web3-eth": "1.10.4", + "web3-eth-personal": "1.10.4", + "web3-net": "1.10.4", + "web3-shh": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-providers-http/node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/web3-bzz": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.4.tgz", + "integrity": "sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==", "dev": true, + "hasInstallScript": true, "dependencies": { - "node-fetch": "2.6.7" + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/web3-providers-ipc": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz", - "integrity": "sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==", + "node_modules/web3-bzz/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/web3-core": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.4.tgz", + "integrity": "sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==", "dev": true, "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.5" + "@types/bn.js": "^5.1.1", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-requestmanager": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-providers-ws": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz", - "integrity": "sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==", + "node_modules/web3-core-helpers": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz", + "integrity": "sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==", "dev": true, "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5", - "websocket": "^1.0.32" + "web3-eth-iban": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-shh": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.5.tgz", - "integrity": "sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==", + "node_modules/web3-core-method": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.4.tgz", + "integrity": "sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==", "dev": true, - "hasInstallScript": true, "dependencies": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-net": "1.7.5" + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-utils": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.5.tgz", - "integrity": "sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==", + "node_modules/web3-core-promievent": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz", + "integrity": "sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==", "dev": true, "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" + "eventemitter3": "4.0.4" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "node_modules/web3-core-requestmanager": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz", + "integrity": "sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==", "dev": true, "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" + "util": "^0.12.5", + "web3-core-helpers": "1.10.4", + "web3-providers-http": "1.10.4", + "web3-providers-ipc": "1.10.4", + "web3-providers-ws": "1.10.4" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.0.0" } }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/web3-core-subscriptions": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz", + "integrity": "sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==", "dev": true, "dependencies": { - "ms": "2.0.0" + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/web3-core/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, - "node_modules/whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/web3-eth": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.4.tgz", + "integrity": "sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==", + "dev": true, "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-eth-accounts": "1.10.4", + "web3-eth-contract": "1.10.4", + "web3-eth-ens": "1.10.4", + "web3-eth-iban": "1.10.4", + "web3-eth-personal": "1.10.4", + "web3-net": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/web3-eth-abi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz", + "integrity": "sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.10.4" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/web3-eth-accounts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.4.tgz", + "integrity": "sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==", "dev": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "@ethereumjs/common": "2.6.5", + "@ethereumjs/tx": "3.5.2", + "@ethereumjs/util": "^8.1.0", + "eth-lib": "0.2.8", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-utils": "1.10.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "node_modules/web3-eth-accounts/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "peer": true - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "node_modules/web3-eth-contract": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.4.tgz", + "integrity": "sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==", "dev": true, "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "node_modules/web3-eth-ens": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.4.tgz", + "integrity": "sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==", "dev": true, + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-eth-contract": "1.10.4", + "web3-utils": "1.10.4" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/web3-eth-iban": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz", + "integrity": "sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "bn.js": "^5.2.1", + "web3-utils": "1.10.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8.0.0" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/web3-eth-personal": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.4.tgz", + "integrity": "sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@types/node": "^12.12.6", + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-net": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=8.0.0" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/web3-eth-personal/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/web3-net": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.4.tgz", + "integrity": "sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "web3-core": "1.10.4", + "web3-core-method": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { - "node": ">=7.0.0" + "node": ">=8.0.0" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/web3-provider-engine": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.3.tgz", + "integrity": "sha512-Q3bKhGqLfMTdLvkd4TtkGYJHcoVQ82D1l8jTIwwuJp/sAp7VHnRYb9YJ14SW/69VMWoOhSpPLZV2tWb9V0WJoA==", + "dependencies": { + "@ethereumjs/tx": "^3.3.0", + "async": "^2.5.0", + "backoff": "^2.5.0", + "clone": "^2.0.0", + "cross-fetch": "^2.1.0", + "eth-block-tracker": "^4.4.2", + "eth-json-rpc-filters": "^4.2.1", + "eth-json-rpc-infura": "^5.1.0", + "eth-json-rpc-middleware": "^6.0.0", + "eth-rpc-errors": "^3.0.0", + "eth-sig-util": "^1.4.2", + "ethereumjs-block": "^1.2.2", + "ethereumjs-util": "^5.1.5", + "ethereumjs-vm": "^2.3.4", + "json-stable-stringify": "^1.0.1", + "promise-to-callback": "^1.0.0", + "readable-stream": "^2.2.9", + "request": "^2.85.0", + "semaphore": "^1.0.3", + "ws": "^5.1.1", + "xhr": "^2.2.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=12.0.0" + } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "node_modules/web3-provider-engine/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, + "node_modules/web3-provider-engine/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/web3-provider-engine/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=0.8" } }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "node_modules/web3-provider-engine/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, + "node_modules/web3-provider-engine/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/web3-provider-engine/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "dev": true, + "node_modules/web3-provider-engine/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/web3-provider-engine/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "xhr-request": "^1.1.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/xhr-request/node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dev": true, + "node_modules/web3-provider-engine/node_modules/ws": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", + "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "async-limiter": "~1.0.0" } }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "node_modules/web3-providers-http": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.4.tgz", + "integrity": "sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==", "dev": true, + "dependencies": { + "abortcontroller-polyfill": "^1.7.5", + "cross-fetch": "^4.0.0", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.10.4" + }, "engines": { - "node": ">=0.4.0" + "node": ">=8.0.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" + "node_modules/web3-providers-http/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/web3-providers-ipc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz", + "integrity": "sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==", "dev": true, + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.10.4" + }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "node_modules/web3-providers-ws": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz", + "integrity": "sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==", "dev": true, + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.4", + "websocket": "^1.0.32" + }, "engines": { - "node": ">=0.10.32" + "node": ">=8.0.0" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/web3-shh": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.4.tgz", + "integrity": "sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==", "dev": true, + "hasInstallScript": true, "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "web3-core": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-net": "1.10.4" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "node_modules/web3-utils": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", "dev": true, "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "@ethereumjs/util": "^8.1.0", + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereum-cryptography": "^2.1.2", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/web3-utils/node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "@noble/hashes": "1.3.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/web3-utils/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", "dev": true, "engines": { - "node": ">=10" + "node": ">= 16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", + "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "@noble/curves": "1.3.0", + "@noble/hashes": "1.3.3", + "@scure/bip32": "1.3.3", + "@scure/bip39": "1.2.2" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zksync-web3": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.8.1.tgz", - "integrity": "sha512-1A4aHPQ3MyuGjpv5X/8pVEN+MdZqMjfVmiweQSRjOlklXYu65wT9BGEOtCmMs5d3gIvLp4ssfTeuR5OCKOD2kw==", - "dev": true, - "peerDependencies": { - "ethers": "~5.7.0" - } - } - }, - "dependencies": { - "@account-abstraction/contracts": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@account-abstraction/contracts/-/contracts-0.6.0.tgz", - "integrity": "sha512-8ooRJuR7XzohMDM4MV34I12Ci2bmxfE9+cixakRL7lA4BAwJKQ3ahvd8FbJa9kiwkUPCUNtj+/zxDQWYYalLMQ==" - }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "engines": { + "node": ">=4.0.0" } }, - "@b00ste/hardhat-dodoc": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@b00ste/hardhat-dodoc/-/hardhat-dodoc-0.3.15.tgz", - "integrity": "sha512-3aGhCRr09oe0meHxoE1xxk0aXbTe0XHcTbyeNEuaNBgCvN+ESAtsi/VUCL3IG9kWEgOgeXeEfHlPTGRjNx2dmg==", - "dev": true, - "requires": { - "squirrelly": "^8.0.8" + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" + "node_modules/whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "peer": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - } + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "peer": true, - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "peer": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "isexe": "^2.0.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "bin": { + "node-which": "bin/node-which" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "engines": { + "node": ">= 8" } }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "peer": true - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "peer": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "peer": true, - "requires": { - "@babel/types": "^7.18.6" - } + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "peer": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==" - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "peer": true, - "requires": { - "@babel/types": "^7.18.6" + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "peer": true, - "requires": { - "@babel/types": "^7.18.6" + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } }, - "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "peer": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "engines": { + "node": ">=8" } }, - "@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "peer": true + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true }, - "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "requires": { - "regenerator-runtime": "^0.13.4" + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "peer": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "peer": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@defi-wonderland/smock": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@defi-wonderland/smock/-/smock-2.3.4.tgz", - "integrity": "sha512-VYJbsoCOdFRyGkAwvaQhQRrU6V8AjK3five8xdbo41DEE9n3qXzUNBUxyD9HhXB/dWWPFWT21IGw5Ztl6Qw3Ew==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", - "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", - "diff": "^5.0.0", - "lodash.isequal": "^4.5.0", - "lodash.isequalwith": "^4.4.0", - "rxjs": "^7.2.0", - "semver": "^7.3.5" - }, - "dependencies": { - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } - } - }, - "@erc725/erc725.js": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@erc725/erc725.js/-/erc725.js-0.17.2.tgz", - "integrity": "sha512-PwlTnSY0VhhcovRsne4vDevYYEeiGxwRhueR9C457u9d9Cg7evPkoFb+hmCUrT5xuOdjAbqeAaV1V8QXAfhTuA==", - "dev": true, - "requires": { - "ethereumjs-util": "^7.1.5", - "web3-eth-abi": "^1.8.2", - "web3-providers-http": "^1.8.0", - "web3-utils": "^1.8.2" - }, - "dependencies": { - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - }, - "web3-core-helpers": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.9.0.tgz", - "integrity": "sha512-NeJzylAp9Yj9xAt2uTT+kyug3X0DLnfBdnAcGZuY6HhoNPDIfQRA9CkJjLngVRlGTLZGjNp9x9eR+RyZQgUlXg==", - "dev": true, - "requires": { - "web3-eth-iban": "1.9.0", - "web3-utils": "1.9.0" - } - }, - "web3-eth-abi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.9.0.tgz", - "integrity": "sha512-0BLQ3FKMrzJkA930jOX3fMaybAyubk06HChclLpiR0NWmgWXm1tmBrJdkyRy2ZTZpmfuZc9xTFRfl0yZID1voA==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.9.0" - } - }, - "web3-eth-iban": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.9.0.tgz", - "integrity": "sha512-jPAm77PuEs1kE/UrrBFJdPD2PN42pwfXA0gFuuw35bZezhskYML9W4QCxcqnUtceyEA4FUn7K2qTMuCk+23fog==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.9.0" - } - }, - "web3-providers-http": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.9.0.tgz", - "integrity": "sha512-5+dMNDAE0rRFz6SJpfnBqlVi2J5bB/Ivr2SanMt2YUrkxW5t8betZbzVwRkTbwtUvkqgj3xeUQzqpOttiv+IqQ==", - "dev": true, - "requires": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.9.0" - } - }, - "web3-utils": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.9.0.tgz", - "integrity": "sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "@erc725/smart-contracts": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@erc725/smart-contracts/-/smart-contracts-7.0.0.tgz", - "integrity": "sha512-O/Ki+0JqRStPUHXjdU4JhDUzncLdC33c0xjTRiwWwBYbxL77LlWaPfG96fWp2hF2kdR0zNYvcsnZZds+uj2QMg==", - "requires": { - "@openzeppelin/contracts": "^4.9.3", - "@openzeppelin/contracts-upgradeable": "^4.9.3", - "solidity-bytes-utils": "0.8.0" - } - }, - "@esbuild/android-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", - "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", - "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", - "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", - "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", - "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", - "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", - "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", - "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", - "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", - "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", - "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", - "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", - "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", - "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", - "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", - "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", - "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", - "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", - "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", - "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", - "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", - "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "peer": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "peer": true - } - } - }, - "@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", - "dev": true, - "peer": true - }, - "@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "requires": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, - "requires": { - "@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" - } - }, - "@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "dev": true, - "requires": { - "@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/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "dev": true, - "requires": { - "@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/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "dev": true, - "requires": { - "@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" - } - }, - "@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "dev": true, - "requires": { - "@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" - } - }, - "@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "dev": true, - "requires": { - "@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" - } - }, - "@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "dev": true, - "requires": { - "@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" - } - }, - "@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "dev": true - }, - "@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "dev": true, - "requires": { - "@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.0", - "@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.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "dev": true, - "requires": { - "@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" - } - }, - "@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "dev": true, - "requires": { - "@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/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "dev": true, - "requires": { - "@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" - } - }, - "@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "dev": true, - "requires": { - "@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" - } - }, - "@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "dev": true, - "requires": { - "@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/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "dev": true, - "requires": { - "@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" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "peer": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "peer": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true, - "peer": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "peer": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "peer": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@lukso/eip191-signer.js": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@lukso/eip191-signer.js/-/eip191-signer.js-0.2.2.tgz", - "integrity": "sha512-FA7CVUyp8GwLmmoCxZ441HHSizCEKcKFDf2awLC/E9ckVbM5R3fcipj9RjafHpTS/YubZggJxKJZl6E8c9iJxw==", - "dev": true, - "requires": { - "eth-lib": "^0.1.29", - "ethereumjs-account": "^3.0.0", - "ethereumjs-util": "^7.1.5", - "web3-utils": "^1.7.5" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "ethereumjs-account": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz", - "integrity": "sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==", - "dev": true, - "requires": { - "ethereumjs-util": "^6.0.0", - "rlp": "^2.2.1", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - } - } - }, - "@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "requires": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "@metamask/safe-event-emitter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", - "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==" - }, - "@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" - }, - "@noble/secp256k1": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", - "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nomicfoundation/ethereumjs-block": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz", - "integrity": "sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-tx": "4.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-blockchain": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz", - "integrity": "sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-ethash": "2.0.5", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - } - }, - "@nomicfoundation/ethereumjs-common": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz", - "integrity": "sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-util": "8.0.6", - "crc-32": "^1.2.0" - } - }, - "@nomicfoundation/ethereumjs-ethash": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz", - "integrity": "sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-evm": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz", - "integrity": "sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - } - }, - "@nomicfoundation/ethereumjs-rlp": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz", - "integrity": "sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==", - "dev": true - }, - "@nomicfoundation/ethereumjs-statemanager": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz", - "integrity": "sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1" - } - }, - "@nomicfoundation/ethereumjs-trie": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz", - "integrity": "sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - } - }, - "@nomicfoundation/ethereumjs-tx": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz", - "integrity": "sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-util": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz", - "integrity": "sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-vm": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz", - "integrity": "sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-blockchain": "6.2.2", - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-evm": "1.3.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-statemanager": "1.0.5", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-tx": "4.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - } - }, - "@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", - "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", - "dev": true, - "peer": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" - } - }, - "@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", - "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", - "dev": true, - "peer": true, - "requires": { - "ethereumjs-util": "^7.1.4" - } - }, - "@nomicfoundation/hardhat-toolbox": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", - "integrity": "sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==", - "dev": true, - "requires": {} - }, - "@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "dev": true, - "requires": { - "@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" - } - }, - "@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "dev": true, - "optional": true - }, - "@nomiclabs/hardhat-ethers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", - "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", - "dev": true, - "peer": true, - "requires": {} - }, - "@nomiclabs/hardhat-etherscan": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", - "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", - "dev": true, - "peer": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "peer": true - } - } - }, - "@nomiclabs/hardhat-web3": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", - "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", - "dev": true, - "requires": { - "@types/bignumber.js": "^5.0.0" - } - }, - "@openzeppelin/contracts": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", - "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" - }, - "@openzeppelin/contracts-upgradeable": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz", - "integrity": "sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A==" - }, - "@remix-project/remixd": { - "version": "0.6.13", - "resolved": "https://registry.npmjs.org/@remix-project/remixd/-/remixd-0.6.13.tgz", - "integrity": "sha512-hx8AhsjEf5CJh1q44DAW/z/U29R00wj0cpq0026+rO16PuWuc0coXp+YYXxPCXlf3C73E8UuVmmjXpUy9xb7hw==", - "dev": true, - "requires": { - "@remixproject/plugin": "0.3.33", - "@remixproject/plugin-api": "0.3.33", - "@remixproject/plugin-utils": "0.3.33", - "@remixproject/plugin-ws": "0.3.33", - "axios": "1.1.2", - "chokidar": "^2.1.8", - "commander": "^9.4.1", - "fs-extra": "^3.0.1", - "isbinaryfile": "^3.0.2", - "latest-version": "^5.1.0", - "semver": "^6.3.0", - "ws": "^7.3.0" - }, - "dependencies": { - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@remixproject/plugin": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.33.tgz", - "integrity": "sha512-ia6LevsWYPkcRwOBl3umA2fPCgYt2TmB437Pafs9BE6fD9judEvlvEqXjBy9GLBsZzZWSiyYenOnW8HIiwqfMA==", - "dev": true, - "requires": { - "@remixproject/plugin-api": "0.3.33", - "@remixproject/plugin-utils": "0.3.33", - "events": "3.2.0" - }, - "dependencies": { - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - } - } - }, - "@remixproject/plugin-api": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.33.tgz", - "integrity": "sha512-fBEbRr6/mgQdfNdRqYQL3yewsPfTxV41F509CngbD6YdY5YKBihJhfGFHbd2rKSyXOgBiHIbe0SsV3OXpFdWnw==", - "dev": true, - "requires": { - "@remixproject/plugin-utils": "0.3.33" - } - }, - "@remixproject/plugin-utils": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.33.tgz", - "integrity": "sha512-cAo21ot4/G5BkN8ypDwg8MMCrEmLdXwMd3lQZUeB5enPC3KxmzQz71+OgEYl718Hwy+GtHaLq17FEXCHC5YV9w==", - "dev": true, - "requires": { - "tslib": "2.0.1" - } - }, - "@remixproject/plugin-ws": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.33.tgz", - "integrity": "sha512-Zkp8MK8jxnNm3uruu0dF8vqeh90JsLXttJP4LZF0HaStRRK4d2XG6CgE5mBiC2J4uTEwGP26H/vmqi+POBPTEg==", - "dev": true, - "requires": { - "@remixproject/plugin": "0.3.33", - "@remixproject/plugin-api": "0.3.33", - "@remixproject/plugin-utils": "0.3.33" - } - }, - "@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - } - }, - "@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==" - }, - "@scure/bip32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", - "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", - "requires": { - "@noble/hashes": "~1.1.1", - "@noble/secp256k1": "~1.6.0", - "@scure/base": "~1.1.0" - } - }, - "@scure/bip39": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", - "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", - "requires": { - "@noble/hashes": "~1.1.1", - "@scure/base": "~1.1.0" - } - }, - "@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dev": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, - "requires": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dev": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, - "requires": { - "@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.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true - }, - "@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, - "requires": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@solidity-parser/parser": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.3.tgz", - "integrity": "sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw==", - "dev": true, - "requires": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@truffle/hdwallet-provider": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-2.0.13.tgz", - "integrity": "sha512-5sGsi9sScB4VkKEuD6itqkrvtpJUNVv0NhI07Nn1JAMDvkJmAAuh2GtoBElDq54y+0JCD8SI0T9BLVZ9IWj6AQ==", - "requires": { - "@ethereumjs/common": "^2.4.0", - "@ethereumjs/tx": "^3.3.0", - "@metamask/eth-sig-util": "4.0.1", - "ethereum-cryptography": "1.1.2", - "ethereum-protocol": "^1.0.1", - "ethereumjs-util": "^7.1.5", - "ethereumjs-wallet": "^1.0.2", - "web3-provider-engine": "16.0.3" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", - "requires": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - } - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@typechain/ethers-v5": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", - "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", - "dev": true, - "requires": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - } - }, - "@typechain/hardhat": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.2.tgz", - "integrity": "sha512-k4Ea3pVITKB2DH8p1a5U38cyy7KZPD04Spo4q5b4wO+n2mT+uAz5dxckPtbczn/Kk5wiFq+ZkuOtw5ZKFhL/+w==", - "dev": true, - "requires": { - "fs-extra": "^9.1.0", - "lodash": "^4.17.15" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@types/async-eventemitter": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true - }, - "@types/bignumber.js": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", - "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", - "dev": true, - "requires": { - "bignumber.js": "*" - } - }, - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "requires": { - "@types/node": "*" - } - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true, - "peer": true - }, - "@types/chai-as-promised": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", - "dev": true, - "peer": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "peer": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "peer": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true, - "optional": true, - "peer": true - }, - "@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true, - "peer": true - }, - "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true, - "optional": true, - "peer": true - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", - "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "requires": { - "@types/node": "*" - } - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", - "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", - "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", - "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - } - } - }, - "@typescript-eslint/utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", - "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true, - "peer": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "abortcontroller-polyfill": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", - "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", - "dev": true - }, - "abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - } - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "peer": true - }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "all-contributors-cli": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.24.0.tgz", - "integrity": "sha512-7oSKr2PnqxsOotuSwciltcFTS1eVRdjR0cn99hbElfff7gRQBShVhsf/XBprY41sLcgqTk0l0MKgKv6QNgZdMg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.6", - "async": "^3.1.0", - "chalk": "^4.0.0", - "didyoumean": "^1.2.1", - "inquirer": "^7.3.3", - "json-fixer": "^1.6.8", - "lodash": "^4.11.2", - "node-fetch": "^2.6.0", - "pify": "^5.0.0", - "yargs": "^15.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "optional": true, - "peer": true - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "antlr4": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.1.tgz", - "integrity": "sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==", - "dev": true - }, - "antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true - }, - "array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "optional": true, - "peer": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "peer": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, - "ast-parents": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", - "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "async-mutex": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", - "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", - "requires": { - "tslib": "^2.0.0" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "axios": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", - "integrity": "sha512-bznQyETwElsXl2RK7HLLwb5GPpOLlycxHCtrpDR/4RqqBzjARaOTo3jz4IgtntWUYee7Ne4S8UHd92VCuzPaWA==", - "dev": true, - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2" - } - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - } - } - }, - "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true - }, - "bigint-crypto-utils": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", - "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", - "dev": true, - "requires": { - "bigint-mod-arith": "^3.1.0" - } - }, - "bigint-mod-arith": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", - "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "buffer-reverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==", - "dev": true - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "bufferutil": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", - "dev": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true - }, - "cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "dev": true, - "peer": true, - "requires": { - "nofilter": "^3.1.0" - } - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "peer": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "peer": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "peer": true - }, - "checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==", - "requires": { - "functional-red-black-tree": "^1.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "dependencies": { - "multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "dev": true, - "requires": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "classic-level": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", - "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", - "dev": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, - "command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "requires": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "dependencies": { - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dev": true, - "requires": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "peer": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true - } - } - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, - "core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", - "requires": { - "browserslist": "^4.21.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", - "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", - "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", - "requires": { - "node-fetch": "^2.6.7", - "whatwg-fetch": "^2.0.4" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", - "dev": true - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", - "dev": true, - "peer": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "peer": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "peer": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, - "peer": true, - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", - "dev": true, - "peer": true, - "requires": { - "heap": ">= 0.2.0" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "peer": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "dev": true - }, - "dts-bundle-generator": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-8.0.0.tgz", - "integrity": "sha512-9Du4uQLRs/doabHzVDFIKsbUA9KHdPkfd0YRgsJ7rXtVSKCfuW0EsM/d2AoXw2fNgxcSfJ01/8szOy4u6ze/2g==", - "dev": true, - "requires": { - "typescript": ">=5.0.2", - "yargs": "^17.6.0" - }, - "dependencies": { - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "typescript": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", - "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", - "dev": true - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==" - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", - "dev": true - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "dev": true, - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "esbuild": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", - "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.15", - "@esbuild/android-arm64": "0.17.15", - "@esbuild/android-x64": "0.17.15", - "@esbuild/darwin-arm64": "0.17.15", - "@esbuild/darwin-x64": "0.17.15", - "@esbuild/freebsd-arm64": "0.17.15", - "@esbuild/freebsd-x64": "0.17.15", - "@esbuild/linux-arm": "0.17.15", - "@esbuild/linux-arm64": "0.17.15", - "@esbuild/linux-ia32": "0.17.15", - "@esbuild/linux-loong64": "0.17.15", - "@esbuild/linux-mips64el": "0.17.15", - "@esbuild/linux-ppc64": "0.17.15", - "@esbuild/linux-riscv64": "0.17.15", - "@esbuild/linux-s390x": "0.17.15", - "@esbuild/linux-x64": "0.17.15", - "@esbuild/netbsd-x64": "0.17.15", - "@esbuild/openbsd-x64": "0.17.15", - "@esbuild/sunos-x64": "0.17.15", - "@esbuild/win32-arm64": "0.17.15", - "@esbuild/win32-ia32": "0.17.15", - "@esbuild/win32-x64": "0.17.15" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", - "dev": true, - "peer": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", - "dev": true, - "peer": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "peer": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "peer": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "peer": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "peer": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", - "dev": true, - "peer": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "peer": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "peer": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "peer": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "peer": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "peer": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "peer": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "peer": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "peer": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "peer": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "peer": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, - "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "peer": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "peer": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "peer": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "peer": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eth-block-tracker": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz", - "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==", - "requires": { - "@babel/plugin-transform-runtime": "^7.5.5", - "@babel/runtime": "^7.5.5", - "eth-query": "^2.1.0", - "json-rpc-random-id": "^1.0.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "eth-create2-calculator": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/eth-create2-calculator/-/eth-create2-calculator-1.1.5.tgz", - "integrity": "sha512-nFXjUR4psWYStCK4PYC5cChmcU960FxbaH919XRsLhgvqW5sRZt4xClaxW04hqyAZ0+riIYzRam6W9OstbHzeA==", - "dev": true, - "requires": { - "ethers": "^5.0.19" - } - }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "dev": true, - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - } - } - }, - "eth-gas-reporter": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", - "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.14.0", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", - "dev": true, - "requires": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - }, - "ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - } - }, - "markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - } - } - }, - "eth-json-rpc-filters": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz", - "integrity": "sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==", - "requires": { - "@metamask/safe-event-emitter": "^2.0.0", - "async-mutex": "^0.2.6", - "eth-json-rpc-middleware": "^6.0.0", - "eth-query": "^2.1.2", - "json-rpc-engine": "^6.1.0", - "pify": "^5.0.0" - }, - "dependencies": { - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==" - } - } - }, - "eth-json-rpc-infura": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz", - "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==", - "requires": { - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "json-rpc-engine": "^5.3.0", - "node-fetch": "^2.6.0" - }, - "dependencies": { - "json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", - "requires": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - } - } - }, - "eth-json-rpc-middleware": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz", - "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==", - "requires": { - "btoa": "^1.2.1", - "clone": "^2.1.1", - "eth-query": "^2.1.2", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-util": "^5.1.2", - "json-rpc-engine": "^5.3.0", - "json-stable-stringify": "^1.0.1", - "node-fetch": "^2.6.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", - "requires": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - } - } - }, - "eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } - } - }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-rpc-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz", - "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==", - "requires": { - "fast-safe-stringify": "^2.0.6" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, - "requires": { - "js-sha3": "^0.8.0" - } - }, - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethereum-protocol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz", - "integrity": "sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg==" - }, - "ethereumjs-abi": { - "version": "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", - "from": "ethereumjs-abi@^0.6.8", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "requires": { - "xtend": "~4.0.0" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - } - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - } - } - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ethereumjs-common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", - "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==" - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "requires": { - "xtend": "~4.0.0" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - } - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ethereumjs-wallet": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", - "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", - "requires": { - "aes-js": "^3.1.2", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.1.2", - "randombytes": "^2.1.0", - "scrypt-js": "^3.0.1", - "utf8": "^3.0.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - } - } - }, - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "requires": { - "@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" - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.10.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "dev": true, - "requires": { - "type": "^2.5.0" - }, - "dependencies": { - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==", - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "peer": true - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "peer": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "requires": { - "array-back": "^3.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "peer": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true, - "peer": true - }, - "fmix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", - "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", - "dev": true, - "requires": { - "imul": "^1.0.0" - } - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "peer": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "peer": true - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "peer": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "peer": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "peer": true - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "peer": true - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "peer": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "optional": true, - "peer": true - }, - "hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", - "dev": true, - "requires": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "hardhat-contract-sizer": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.8.0.tgz", - "integrity": "sha512-jXt2Si3uIDx5z99J+gvKa0yvIw156pE4dpH9X/PvTQv652BUd+qGj7WT93PXnHXGh5qhQLkjDYeZMYNOThfjFg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "cli-table3": "^0.6.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "hardhat-deploy": { - "version": "0.11.25", - "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.25.tgz", - "integrity": "sha512-ppSgrVE9A13YgTmf2PQGoyIs9o/jgJOMORrUP/rblU5K8mQ2YHWlPvkzZmP4h+SBW+tNmlnvSrf5K5DmMmExhw==", - "dev": true, - "requires": { - "@types/qs": "^6.9.7", - "axios": "^0.21.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "ethers": "^5.5.3", - "form-data": "^4.0.0", - "fs-extra": "^10.0.0", - "match-all": "^1.2.6", - "murmur-128": "^0.2.1", - "qs": "^6.9.4", - "zksync-web3": "^0.8.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "hardhat-deploy-ethers": { - "version": "0.3.0-beta.13", - "resolved": "https://registry.npmjs.org/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz", - "integrity": "sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw==", - "dev": true, - "requires": {} - }, - "hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", - "dev": true, - "requires": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" - } - }, - "hardhat-packager": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/hardhat-packager/-/hardhat-packager-1.4.2.tgz", - "integrity": "sha512-6ZX+IMcO6i7Vf5gFrKtq+SwSi6AcLcqSVnX59gzhXGqR+sLL6J1C8EDFS8NCSYwmJkpCD0bb7QbNOd46JZxSGg==", - "dev": true, - "requires": { - "@typechain/hardhat": "^6.0.0", - "fs-extra": "^10.0.1", - "hardhat": "^2.9.2", - "tempy": "1.0.1", - "typechain": "^8.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true, - "peer": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dev": true, - "requires": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", - "dev": true - }, - "http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dev": true, - "requires": { - "@types/node": "^10.0.3" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "dependencies": { - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - } - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dev": true, - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "dev": true - } - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "imul": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", - "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "peer": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "peer": true - }, - "io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dev": true, - "requires": { - "fp-ts": "^1.0.0" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true - }, - "js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true, - "peer": true - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "peer": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "json-fixer": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/json-fixer/-/json-fixer-1.6.15.tgz", - "integrity": "sha512-TuDuZ5KrgyjoCIppdPXBMqiGfota55+odM+j2cQ5rt/XKyKmqGB3Whz1F8SN8+60yYGy/Nu5lbRZ+rx8kBIvBw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.9", - "chalk": "^4.1.2", - "pegjs": "^0.10.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-rpc-engine": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", - "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", - "requires": { - "@metamask/safe-event-emitter": "^2.0.0", - "eth-rpc-errors": "^4.0.2" - }, - "dependencies": { - "eth-rpc-errors": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", - "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", - "requires": { - "fast-safe-stringify": "^2.0.6" - } - } - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "peer": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==" - }, - "jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true, - "peer": true - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - } - }, - "keccak256": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", - "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", - "dev": true, - "requires": { - "bn.js": "^5.2.0", - "buffer": "^6.0.3", - "keccak": "^3.0.2" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, - "requires": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - } - }, - "level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true - }, - "level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "peer": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "lodash.isequalwith": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isequalwith/-/lodash.isequalwith-4.4.0.tgz", - "integrity": "sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "peer": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "optional": true, - "peer": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-table-ts": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/markdown-table-ts/-/markdown-table-ts-1.0.3.tgz", - "integrity": "sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==", - "dev": true - }, - "match-all": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", - "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", - "dev": true - }, - "mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, - "requires": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "optional": true, - "peer": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "optional": true, - "peer": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "optional": true, - "peer": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true, - "peer": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "optional": true, - "peer": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "merkletreejs": { - "version": "0.2.32", - "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz", - "integrity": "sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.1", - "buffer-reverse": "^1.0.1", - "crypto-js": "^3.1.9-1", - "treeify": "^1.1.0", - "web3-utils": "^1.3.4" - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "optional": true, - "peer": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "dev": true, - "requires": { - "mkdirp": "*" - } - }, - "mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dev": true, - "requires": { - "obliterator": "^2.0.0" - } - }, - "mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", - "dev": true - }, - "module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "dev": true, - "requires": { - "varint": "^5.0.0" - } - }, - "multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - }, - "dependencies": { - "multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - } - } - }, - "murmur-128": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", - "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", - "dev": true, - "requires": { - "encode-utf8": "^1.0.2", - "fmix": "^0.1.0", - "imul": "^1.0.0" - } - }, - "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "dev": true, - "optional": true - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "peer": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "peer": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - }, - "nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "dev": true, - "peer": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "peer": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - }, - "dependencies": { - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - } - } - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", - "dev": true, - "requires": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "peer": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true, - "peer": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true - }, - "parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "peer": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pegjs": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true - }, - "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "dependencies": { - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - } - } - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "peer": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "prettier-plugin-solidity": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", - "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", - "dev": true, - "requires": { - "@solidity-parser/parser": "^0.16.0", - "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7" - }, - "dependencies": { - "@solidity-parser/parser": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz", - "integrity": "sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==", - "dev": true, - "requires": { - "antlr4ts": "^0.5.0-alpha.4" - } - } - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "dev": true, - "requires": { - "asap": "~2.0.6" - } - }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "optional": true, - "peer": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "peer": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^3.0.5" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", - "dev": true, - "requires": { - "req-from": "^2.0.0" - } - }, - "req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "requires": { - "bn.js": "^5.2.0" - } - }, - "rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - }, - "dependencies": { - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - } - } - }, - "rollup-plugin-esbuild": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-5.0.0.tgz", - "integrity": "sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^5.0.1", - "debug": "^4.3.4", - "es-module-lexer": "^1.0.5", - "joycon": "^3.1.1", - "jsonc-parser": "^3.2.0" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "requires": { - "events": "^3.0.0" - } - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", - "dev": true, - "peer": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true, - "peer": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "peer": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true, - "peer": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true - } - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dev": true, - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", - "dev": true, - "requires": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "solhint": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.6.2.tgz", - "integrity": "sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==", - "dev": true, - "requires": { - "@solidity-parser/parser": "^0.16.0", - "ajv": "^6.12.6", - "antlr4": "^4.11.0", - "ast-parents": "^0.0.1", - "chalk": "^4.1.2", - "commander": "^10.0.0", - "cosmiconfig": "^8.0.0", - "fast-diff": "^1.2.0", - "glob": "^8.0.3", - "ignore": "^5.2.4", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "prettier": "^2.8.3", - "semver": "^7.5.2", - "strip-ansi": "^6.0.1", - "table": "^6.8.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "@solidity-parser/parser": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", - "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", - "dev": true, - "requires": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "solidity-bytes-utils": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/solidity-bytes-utils/-/solidity-bytes-utils-0.8.0.tgz", - "integrity": "sha512-r109ZHEf7zTMm1ENW6/IJFDWilFR/v0BZnGuFgDHJUV80ByobnV2k3txvwQaJ9ApL+6XAfwqsw5VFzjALbQPCw==", - "requires": { - "@truffle/hdwallet-provider": "latest" - } - }, - "solidity-comments-extractor": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", - "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", - "dev": true - }, - "solidity-coverage": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", - "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", - "dev": true, - "peer": true, - "requires": { - "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.14.1", - "chalk": "^2.4.2", - "death": "^1.1.0", - "detect-port": "^1.3.0", - "difflib": "^0.2.4", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.15", - "mocha": "7.1.2", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.6" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "peer": true - }, - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "peer": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "peer": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "peer": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "peer": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "peer": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "peer": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "peer": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "peer": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "peer": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "peer": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "peer": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "peer": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true, - "peer": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "peer": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "peer": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "peer": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "peer": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "peer": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "peer": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^2.4.2" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", - "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", - "dev": true, - "peer": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "peer": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "peer": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "peer": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "peer": true - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "peer": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "peer": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "peer": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "peer": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "peer": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "peer": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "peer": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "peer": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "peer": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "peer": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "squirrelly": { - "version": "8.0.8", - "resolved": "https://registry.npmjs.org/squirrelly/-/squirrelly-8.0.8.tgz", - "integrity": "sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - } - } - }, - "stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, - "requires": { - "type-fest": "^0.7.1" - }, - "dependencies": { - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "dev": true - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dev": true, - "requires": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - } - }, - "sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dev": true, - "requires": { - "get-port": "^3.1.0" - } - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - } - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, - "requires": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dev": true, - "requires": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "dev": true - }, - "tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "optional": true, - "peer": true - }, - "ts-command-line-args": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz", - "integrity": "sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "requires": {} - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "requires": {} - }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - }, - "tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "peer": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typechain": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz", - "integrity": "sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==", - "dev": true, - "requires": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true - }, - "uglify-js": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", - "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", - "dev": true, - "optional": true, - "peer": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dev": true, - "requires": { - "busboy": "^1.6.0" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", - "dev": true - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "utf-8-validate": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", - "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", - "dev": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vite": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", - "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", - "dev": true, - "requires": { - "esbuild": "^0.17.5", - "fsevents": "~2.3.2", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.18.0" - }, - "dependencies": { - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "vite-plugin-checker": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.5.6.tgz", - "integrity": "sha512-ftRyON0gORUHDxcDt2BErmsikKSkfvl1i2DoP6Jt2zDO9InfvM6tqO1RkXhSjkaXEhKPea6YOnhFaZxW3BzudQ==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "ansi-escapes": "^4.3.0", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "commander": "^8.0.0", - "fast-glob": "^3.2.7", - "fs-extra": "^11.1.0", - "lodash.debounce": "^4.0.8", - "lodash.pick": "^4.4.0", - "npm-run-path": "^4.0.1", - "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", - "vscode-languageclient": "^7.0.0", - "vscode-languageserver": "^7.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^3.0.2" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "vite-tsconfig-paths": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.0.8.tgz", - "integrity": "sha512-p04zH+Ey+NT78571x0pdX7nVRIJSlmKVvYryFglSWOK3Hc72eDL0+JJfbyQiugaIBApJkaEqbBQvqpsFZOSVGg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - } - }, - "vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", - "dev": true - }, - "vscode-languageclient": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", - "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", - "dev": true, - "requires": { - "minimatch": "^3.0.4", - "semver": "^7.3.4", - "vscode-languageserver-protocol": "3.16.0" - } - }, - "vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "dev": true, - "requires": { - "vscode-languageserver-protocol": "3.16.0" - } - }, - "vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "dev": true, - "requires": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", - "dev": true - }, - "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "web3": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", - "integrity": "sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==", - "dev": true, - "requires": { - "web3-bzz": "1.7.5", - "web3-core": "1.7.5", - "web3-eth": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-shh": "1.7.5", - "web3-utils": "1.7.5" - } - }, - "web3-bzz": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.5.tgz", - "integrity": "sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "keyv": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.3.tgz", - "integrity": "sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==", - "dev": true, - "requires": { - "compress-brotli": "^1.3.8", - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - } - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "web3-core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.5.tgz", - "integrity": "sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-requestmanager": "1.7.5", - "web3-utils": "1.7.5" - }, + "node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - } + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, - "web3-core-helpers": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz", - "integrity": "sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.7.5", - "web3-utils": "1.7.5" - } + "node_modules/ws/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "web3-core-method": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.5.tgz", - "integrity": "sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-utils": "1.7.5" + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" } }, - "web3-core-promievent": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz", - "integrity": "sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" + "node_modules/xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dependencies": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" } }, - "web3-core-requestmanager": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz", - "integrity": "sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==", - "dev": true, - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.5", - "web3-providers-http": "1.7.5", - "web3-providers-ipc": "1.7.5", - "web3-providers-ws": "1.7.5" + "node_modules/xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dependencies": { + "xhr-request": "^1.1.0" } }, - "web3-core-subscriptions": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz", - "integrity": "sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5" + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" } }, - "web3-eth": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.5.tgz", - "integrity": "sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==", - "dev": true, - "requires": { - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-accounts": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-eth-ens": "1.7.5", - "web3-eth-iban": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" - } - }, - "web3-eth-abi": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz", - "integrity": "sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.5" - } + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, - "web3-eth-accounts": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz", - "integrity": "sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" } }, - "web3-eth-contract": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz", - "integrity": "sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-utils": "1.7.5" - } + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, - "web3-eth-ens": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz", - "integrity": "sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==", + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-utils": "1.7.5" + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, - "web3-eth-iban": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz", - "integrity": "sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==", + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.5" + "engines": { + "node": ">=10" } }, - "web3-eth-personal": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz", - "integrity": "sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==", + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" - }, "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - } - } - }, - "web3-net": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.5.tgz", - "integrity": "sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==", - "dev": true, - "requires": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" - } - }, - "web3-provider-engine": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.3.tgz", - "integrity": "sha512-Q3bKhGqLfMTdLvkd4TtkGYJHcoVQ82D1l8jTIwwuJp/sAp7VHnRYb9YJ14SW/69VMWoOhSpPLZV2tWb9V0WJoA==", - "requires": { - "@ethereumjs/tx": "^3.3.0", - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^4.4.2", - "eth-json-rpc-filters": "^4.2.1", - "eth-json-rpc-infura": "^5.1.0", - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.85.0", - "semaphore": "^1.0.3", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", - "requires": { - "async-limiter": "~1.0.0" - } - } + "engines": { + "node": ">=10" } }, - "web3-providers-http": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.5.tgz", - "integrity": "sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==", + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, - "requires": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.7.5" + "engines": { + "node": ">=10" }, - "dependencies": { - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - } - } - }, - "web3-providers-ipc": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz", - "integrity": "sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.5" - } - }, - "web3-providers-ws": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz", - "integrity": "sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5", - "websocket": "^1.0.32" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "web3-shh": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.5.tgz", - "integrity": "sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==", + "node_modules/yargs/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "requires": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-net": "1.7.5" + "engines": { + "node": ">=6" } }, - "web3-utils": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.5.tgz", - "integrity": "sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==", + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { - "isexe": "^2.0.0" + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/yargs/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "engines": { + "node": ">=6" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "node_modules/yargs/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "engines": { + "node": ">=8" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "peer": true + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "peer": true + "engines": { + "node": ">=6" + } }, - "wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/lsp-smart-contracts": { + "name": "@lukso/lsp-smart-contracts", + "version": "0.12.1", + "license": "Apache-2.0", "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } + "@lukso/lsp0-contracts": "*", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp10-contracts": "*", + "@lukso/lsp12-contracts": "*", + "@lukso/lsp14-contracts": "*", + "@lukso/lsp16-contracts": "*", + "@lukso/lsp17-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp1delegate-contracts": "*", + "@lukso/lsp2-contracts": "*", + "@lukso/lsp20-contracts": "*", + "@lukso/lsp23-contracts": "*", + "@lukso/lsp25-contracts": "*", + "@lukso/lsp3-contracts": "*", + "@lukso/lsp4-contracts": "*", + "@lukso/lsp5-contracts": "*", + "@lukso/lsp6-contracts": "*", + "@lukso/lsp7-contracts": "*", + "@lukso/lsp8-contracts": "*", + "@lukso/lsp9-contracts": "*", + "@lukso/universalprofile-contracts": "*" + } + }, + "packages/lsp0-contracts": { + "name": "@lukso/lsp0-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp14-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp2-contracts": "*", + "@lukso/lsp20-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" } }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "packages/lsp1-contracts": { + "name": "@lukso/lsp1-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@lukso/lsp2-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" + } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "packages/lsp10-contracts": { + "name": "@lukso/lsp10-contracts", + "version": "0.12.1", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "@erc725/smart-contracts": "^6.0.0", + "@lukso/lsp2-contracts": "*" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "packages/lsp10-contracts/node_modules/@erc725/smart-contracts": { + "version": "6.0.0", + "license": "Apache-2.0", + "dependencies": { + "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.3", + "solidity-bytes-utils": "0.8.0" + } }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "requires": {} + "packages/lsp12-contracts": { + "name": "@lukso/lsp12-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@lukso/lsp2-contracts": "*" + } }, - "xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "requires": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "packages/lsp14-contracts": { + "name": "@lukso/lsp14-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp1-contracts": "*" } }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - }, + "packages/lsp16-contracts": { + "name": "@lukso/lsp16-contracts", + "version": "0.12.1", + "license": "Apache-2.0", "dependencies": { - "simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dev": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - } + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.2", + "@openzeppelin/contracts-upgradeable": "^4.9.2" } }, - "xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "dev": true, - "requires": { - "xhr-request": "^1.1.0" + "packages/lsp17-contracts": { + "name": "@lukso/lsp17-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@account-abstraction/contracts": "^0.6.0", + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp14-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp20-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" } }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true + "packages/lsp17contractextension-contracts": { + "name": "@lukso/lsp17contractextension-contracts", + "version": "0.14.0", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3" + } }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "packages/lsp1delegate-contracts": { + "name": "@lukso/lsp1delegate-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp10-contracts": "*", + "@lukso/lsp5-contracts": "*", + "@lukso/lsp7-contracts": "*", + "@lukso/lsp8-contracts": "*", + "@lukso/lsp9-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" + } + }, + "packages/lsp2-contracts": { + "name": "@lukso/lsp2-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3" + } }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "packages/lsp20-contracts": { + "name": "@lukso/lsp20-contracts", + "version": "0.12.1", + "license": "Apache-2.0" }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "dev": true + "packages/lsp23-contracts": { + "name": "@lukso/lsp23-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/universalprofile-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" + } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "packages/lsp25-contracts": { + "name": "@lukso/lsp25-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@openzeppelin/contracts": "^4.9.3" + } }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "packages/lsp3-contracts": { + "name": "@lukso/lsp3-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@lukso/lsp2-contracts": "*" } }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true + "packages/lsp4-contracts": { + "name": "@lukso/lsp4-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp2-contracts": "*" + } }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, + "packages/lsp5-contracts": { + "name": "@lukso/lsp5-contracts", + "version": "0.12.1", + "license": "Apache-2.0", "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp2-contracts": "*" } }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "packages/lsp6-contracts": { + "name": "@lukso/lsp6-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp14-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp2-contracts": "*", + "@lukso/lsp20-contracts": "*", + "@lukso/lsp25-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" + } + }, + "packages/lsp7-contracts": { + "name": "@lukso/lsp7-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" + } }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "packages/lsp8-contracts": { + "name": "@lukso/lsp8-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp2-contracts": "*", + "@lukso/lsp4-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" + } }, - "zksync-web3": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.8.1.tgz", - "integrity": "sha512-1A4aHPQ3MyuGjpv5X/8pVEN+MdZqMjfVmiweQSRjOlklXYu65wT9BGEOtCmMs5d3gIvLp4ssfTeuR5OCKOD2kw==", - "dev": true, - "requires": {} + "packages/lsp9-contracts": { + "name": "@lukso/lsp9-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp6-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" + } + }, + "packages/universalprofile-contracts": { + "name": "@lukso/universalprofile-contracts", + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp0-contracts": "*", + "@lukso/lsp3-contracts": "*", + "@openzeppelin/contracts": "^4.9.3" + } } } } diff --git a/package.json b/package.json index 9a31ae226..3ffb7bbdc 100644 --- a/package.json +++ b/package.json @@ -1,139 +1,88 @@ { - "name": "@lukso/lsp-smart-contracts", - "version": "0.14.0", - "description": "The reference implementation for universal profiles smart contracts", - "directories": { - "test": "test" - }, - "files": [ - "contracts/**/*.sol", - "!contracts/Mocks/**/*.sol", - "artifacts/*.json", - "userdocs/*.json", - "devdocs/*.json", - "dist", - "./README.md", - "./CONTRIBUTING.md", - "./LICENSE" - ], - "main": "./dist/constants.cjs.js", - "module": "./dist/constants.es.js", - "typings": "./dist/constants.d.ts", - "exports": { - ".": { - "require": "./dist/constants.cjs.js", - "import": "./dist/constants.es.js", - "types": "./dist/constants.d.ts" - }, - "./constants.js": { - "require": "./dist/constants.cjs.js", - "import": "./dist/constants.es.js", - "types": "./dist/constants.d.ts" - }, - "./constants": { - "require": "./dist/constants.cjs.js", - "import": "./dist/constants.es.js", - "types": "./dist/constants.d.ts" - }, - "./userdocs/*": "./userdocs", - "./devdocs/*": "./devdocs/*", - "./artifacts/*": "./artifacts/*", - "./dist/*": "./dist/*", - "./package.json": "./package.json" - }, - "scripts": { - "test": "hardhat test", - "test:benchmark": "hardhat test --no-compile tests/Benchmark.test.ts", - "test:coverage": "hardhat coverage", - "test:parallel": "run-p test:mocks test:up test:lsp1 test:lsp2 test:lsp4 test:lsp6 test:lsp7 test:lsp8 test:lsp9 test:lsp11 test:universalfactory", - "test:mocks": "hardhat test --no-compile tests/Mocks/*.test.ts ", - "test:up": "hardhat test --no-compile tests/UniversalProfile.test.ts", - "test:upinit": "hardhat test --no-compile tests/UniversalProfileInit.test.ts", - "test:lsp1": "hardhat test --no-compile tests/LSP1UniversalReceiver/*.test.ts", - "test:lsp2": "hardhat test --no-compile tests/LSP2ERC725YJSONSchema/LSP2UtilsLibrary.test.ts", - "test:lsp6": "hardhat test --no-compile tests/LSP6KeyManager/LSP6KeyManager.test.ts", - "test:lsp6init": "hardhat test --no-compile tests/LSP6KeyManager/LSP6KeyManagerInit.test.ts", - "test:lsp7": "hardhat test --no-compile tests/LSP7DigitalAsset/standard/*.test.ts", - "test:lsp7init": "hardhat test --no-compile tests/LSP7DigitalAsset/proxy/*.test.ts", - "test:lsp8": "hardhat test --no-compile tests/LSP8IdentifiableDigitalAsset/standard/*.test.ts", - "test:lsp8init": "hardhat test --no-compile tests/LSP8IdentifiableDigitalAsset/proxy/*.test.ts", - "test:lsp9": "hardhat test --no-compile tests/LSP9Vault/LSP9Vault.test.ts", - "test:lsp9init": "hardhat test --no-compile tests/LSP9Vault/LSP9VaultInit.test.ts", - "test:lsp11": "hardhat test --no-compile tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts", - "test:lsp11init": "hardhat test --no-compile tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts", - "test:lsp17": "hardhat test --no-compile tests/LSP17ContractExtension/LSP17Extendable.test.ts", - "test:lsp17extensions": "hardhat test --no-compile tests/LSP17Extensions/**/*.test.ts", - "test:lsp20": "hardhat test --no-compile tests/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts", - "test:lsp20init": "hardhat test --no-compile tests/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts", - "test:lsp23": "hardhat test --no-compile tests/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts", - "test:lsp25": "hardhat test --no-compile tests/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.test.ts", - "test:universalfactory": "hardhat test --no-compile tests/LSP16UniversalFactory/LSP16UniversalFactory.test.ts", - "test:reentrancy": "hardhat test --no-compile tests/Reentrancy/Reentrancy.test.ts", - "test:reentrancyinit": "hardhat test --no-compile tests/Reentrancy/ReentrancyInit.test.ts", - "test:foundry": "forge test --no-match-test Skip -vvv --gas-report > gasreport.ansi", - "test:importRequire": "npm run build:js && ./tests/importRequire.sh", - "clean": "hardhat clean && rm -rf module common", - "build": "hardhat compile", - "build:docs": "hardhat dodoc && ts-node scripts/interfaceIds.ts && prettier -w ./docs", - "build:js": "vite build && dts-bundle-generator --config dtsconfig.json", - "package": "hardhat prepare-package", - "remixd": "remixd -s . --remix-ide", - "lint": "eslint . --ext .ts,.js", - "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'", - "format": "prettier --write ." + "name": "@lukso/lsp-smart-contracts-monorepo", + "description": "The reference smart contract implementation for the LUKSO LSP standards", + "version": "0.12.1", + "private": true, + "npmClient": "npm", + "author": "", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/lukso-network/lsp-smart-contracts/issues" }, + "homepage": "https://github.com/lukso-network/lsp-smart-contracts#readme", "repository": { "type": "git", "url": "git+https://github.com/lukso-network/lsp-smart-contracts.git" }, "keywords": [ + "Blockchain", + "Ethereum", + "EVM", + "LUKSO", "LSP", - "smart contracts", - "solidity", - "universalprofiles", - "lukso", - "ethereum" + "Smart Contracts", + "Standards", + "Solidity", + "Universal Profiles" ], - "author": "", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/lukso-network/lsp-smart-contracts/issues" - }, - "homepage": "https://github.com/lukso-network/lsp-smart-contracts#readme", - "dependencies": { - "@account-abstraction/contracts": "^0.6.0", - "@erc725/smart-contracts": "^7.0.0", - "@openzeppelin/contracts": "^4.9.2", - "@openzeppelin/contracts-upgradeable": "^4.9.2", - "solidity-bytes-utils": "0.8.0" + "scripts": { + "preinstall": "npx --yes force-resolutions", + "build": "turbo build", + "build:foundry": "turbo build:foundry", + "build:js": "turbo build:js", + "clean": "turbo clean", + "format": "prettier --write .", + "lint": "turbo lint", + "lint:solidity": "turbo lint:solidity", + "package": "turbo package", + "test": "turbo test", + "test:foundry": "turbo test:foundry --scope='!@lukso/lsp16-contracts'", + "test:coverage": "turbo test:coverage", + "test:mocks": "hardhat test --no-compile packages/lsp-smart-contracts/tests/Mocks/*.test.ts", + "test:up": "hardhat test --no-compile packages/lsp-smart-contracts/tests/UniversalProfile.test.ts", + "test:upinit": "hardhat test --no-compile packages/lsp-smart-contracts/tests/UniversalProfileInit.test.ts", + "test:lsp1": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/*.test.ts", + "test:lsp6": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManager.test.ts", + "test:lsp6init": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManagerInit.test.ts", + "test:lsp7": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/*.test.ts", + "test:lsp7init": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/*.test.ts", + "test:lsp8": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/*.test.ts", + "test:lsp8init": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/*.test.ts", + "test:lsp9": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP9Vault/LSP9Vault.test.ts", + "test:lsp9init": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP9Vault/LSP9VaultInit.test.ts", + "test:lsp11": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts", + "test:lsp11init": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts", + "test:lsp17": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17Extendable.test.ts", + "test:lsp17extensions": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP17Extensions/**/*.test.ts", + "test:lsp20": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts", + "test:lsp20init": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts", + "test:lsp23": "hardhat test --no-compile packages/lsp-smart-contracts/tests/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts", + "test:reentrancy": "hardhat test --no-compile packages/lsp-smart-contracts/tests/Reentrancy/Reentrancy.test.ts", + "test:reentrancyinit": "hardhat test --no-compile packages/lsp-smart-contracts/tests/Reentrancy/ReentrancyInit.test.ts" }, "devDependencies": { - "@b00ste/hardhat-dodoc": "^0.3.15", - "@defi-wonderland/smock": "^2.3.4", - "@erc725/erc725.js": "0.17.2", + "@b00ste/hardhat-dodoc": "^0.3.16", + "@erc725/erc725.js": "0.23.0", "@lukso/eip191-signer.js": "^0.2.2", - "@nomicfoundation/hardhat-toolbox": "^2.0.2", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", "@nomiclabs/hardhat-web3": "^2.0.0", - "@remix-project/remixd": "^0.6.12", - "@typechain/ethers-v5": "^10.2.0", - "@typescript-eslint/eslint-plugin": "^5.60.0", - "all-contributors-cli": "^6.24.0", + "@turbo/gen": "^1.12.3", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "9.1.0", + "all-contributors-cli": "^6.26.1", "dotenv": "^16.0.3", - "dts-bundle-generator": "^8.0.0", "esbuild": "^0.17.15", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint": "^7.32.0", + "eslint-config-custom": "*", "eth-create2-calculator": "^1.1.5", - "ethers": "^5.7.2", - "hardhat": "^2.13.0", + "ethers": "^6.11.0", + "hardhat": "^2.20.1", "hardhat-contract-sizer": "^2.8.0", "hardhat-deploy": "^0.11.25", - "hardhat-deploy-ethers": "^0.3.0-beta.13", + "hardhat-deploy-ethers": "^0.4.1", "hardhat-gas-reporter": "^1.0.9", "hardhat-packager": "^1.4.2", - "keccak256": "1.0.6", "markdown-table-ts": "^1.0.3", - "merkletreejs": "0.2.32", "npm-run-all": "^4.1.5", "pluralize": "^8.0.0", "prettier": "^2.8.8", @@ -141,11 +90,19 @@ "rollup-plugin-esbuild": "^5.0.0", "solhint": "^3.6.2", "ts-node": "^10.2.0", - "typechain": "^8.0.0", - "typescript": "^4.9.5", - "vite": "^4.2.1", + "turbo": "latest", + "typechain": "^8.3.2", + "typescript": "^5.3.3", + "unbuild": "^2.0.0", "vite-plugin-checker": "^0.5.6", "vite-tsconfig-paths": "^4.0.7", "web3": "^1.5.2" + }, + "workspaces": [ + "config/*", + "packages/*" + ], + "resolutions": { + "@typechain/hardhat": "9.1.0" } } diff --git a/packages/lsp-smart-contracts/.eslintrc.js b/packages/lsp-smart-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp-smart-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp-smart-contracts/.solcover.js b/packages/lsp-smart-contracts/.solcover.js new file mode 100644 index 000000000..5fd4c89db --- /dev/null +++ b/packages/lsp-smart-contracts/.solcover.js @@ -0,0 +1,3 @@ +module.exports = { + skipFiles: ['Mocks'], +}; diff --git a/packages/lsp-smart-contracts/.solhint.json b/packages/lsp-smart-contracts/.solhint.json new file mode 100644 index 000000000..e8a54f742 --- /dev/null +++ b/packages/lsp-smart-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "off", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/CHANGELOG.md b/packages/lsp-smart-contracts/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/lsp-smart-contracts/CHANGELOG.md diff --git a/packages/lsp-smart-contracts/README.md b/packages/lsp-smart-contracts/README.md new file mode 100644 index 000000000..644976a06 --- /dev/null +++ b/packages/lsp-smart-contracts/README.md @@ -0,0 +1,3 @@ +# `@lukso/lsp-smart-contracts` + +Package for the LSP Smart Contracts. diff --git a/packages/lsp-smart-contracts/build.config.ts b/packages/lsp-smart-contracts/build.config.ts new file mode 100644 index 000000000..71798d1ff --- /dev/null +++ b/packages/lsp-smart-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./constants'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp-smart-contracts/constants.ts b/packages/lsp-smart-contracts/constants.ts new file mode 100644 index 000000000..b52770160 --- /dev/null +++ b/packages/lsp-smart-contracts/constants.ts @@ -0,0 +1,105 @@ +/** + * Set of constants values as defined in each LUKSO Standards Proposals (LSPs). + * @see https://github.com/lukso-network/LIPs/tree/main/LSPs + */ +// export * from './contracts'; + +import { INTERFACE_ID_LSP0ERC725Account, LSP0_TYPE_IDS } from '@lukso/lsp0-contracts'; +import { INTERFACE_ID_LSP1, LSP1DataKeys } from '@lukso/lsp1-contracts'; +import { INTERFACE_ID_LSP1DELEGATE } from '@lukso/lsp1delegate-contracts'; +import { LSP3DataKeys } from '@lukso/lsp3-contracts'; +import { LSP4DataKeys } from '@lukso/lsp4-contracts'; +import { LSP5DataKeys } from '@lukso/lsp5-contracts'; +import { INTERFACE_ID_LSP6KEYMANAGER, LSP6DataKeys } from '@lukso/lsp6-contracts'; +import { INTERFACE_ID_LSP7, LSP7_TYPE_IDS } from '@lukso/lsp7-contracts'; +import { INTERFACE_ID_LSP8, LSP8DataKeys, LSP8_TYPE_IDS } from '@lukso/lsp8-contracts'; +import { INTERFACE_ID_LSP9, LSP9DataKeys, LSP9_TYPE_IDS } from '@lukso/lsp9-contracts'; +import { LSP10DataKeys } from '@lukso/lsp10-contracts'; +import { LSP12DataKeys } from '@lukso/lsp12-contracts'; +import { INTERFACE_ID_LSP14, LSP14_TYPE_IDS } from '@lukso/lsp14-contracts'; +import { + INTERFACE_ID_LSP17Extendable, + INTERFACE_ID_LSP17Extension, + LSP17DataKeys, +} from '@lukso/lsp17contractextension-contracts'; +import { + INTERFACE_ID_LSP20CallVerification, + INTERFACE_ID_LSP20CallVerifier, +} from '@lukso/lsp20-contracts'; +import { INTERFACE_ID_LSP25 } from '@lukso/lsp25-contracts'; + +import { LSP3SupportedStandard } from '@lukso/lsp3-contracts'; +import { LSP4SupportedStandard } from '@lukso/lsp4-contracts'; +import { LSP9SupportedStandard } from '@lukso/lsp9-contracts'; + +export const SupportedStandards = { + LSP3Profile: LSP3SupportedStandard as LSPSupportedStandard, + LSP4DigitalAsset: LSP4SupportedStandard as LSPSupportedStandard, + LSP9Vault: LSP9SupportedStandard as LSPSupportedStandard, +}; + +// ERC165 +// --------- + +/** + * @dev ERC165 interface IDs for the LSP interface standards + some backward compatible ERC token standards. + * These `bytes4` values can be used to detect if a contract implements a specific interface + * with `supportsInterface(interfaceId)`. + */ +export const INTERFACE_IDS = { + ERC165: '0x01ffc9a7', + ERC1271: '0x1626ba7e', + ERC20: '0x36372b07', + ERC20Metadata: '0xa219a025', + ERC223: '0x87d43052', + ERC721: '0x80ac58cd', + ERC721Metadata: '0x5b5e139f', + ERC777: '0xe58e113c', + ERC1155: '0xd9b67a26', + ERC725X: '0x7545acac', + ERC725Y: '0x629aa694', + LSP0ERC725Account: INTERFACE_ID_LSP0ERC725Account, + LSP1UniversalReceiver: INTERFACE_ID_LSP1, + LSP1UniversalReceiverDelegate: INTERFACE_ID_LSP1DELEGATE, + LSP6KeyManager: INTERFACE_ID_LSP6KEYMANAGER, + LSP7DigitalAsset: INTERFACE_ID_LSP7, + LSP8IdentifiableDigitalAsset: INTERFACE_ID_LSP8, + LSP9Vault: INTERFACE_ID_LSP9, + LSP14Ownable2Step: INTERFACE_ID_LSP14, + LSP17Extendable: INTERFACE_ID_LSP17Extendable, + LSP17Extension: INTERFACE_ID_LSP17Extension, + LSP20CallVerification: INTERFACE_ID_LSP20CallVerification, + LSP20CallVerifier: INTERFACE_ID_LSP20CallVerifier, + LSP11BasicSocialRecovery: '0x049a28f1', + LSP25ExecuteRelayCall: INTERFACE_ID_LSP25, +}; + +// ERC725Y +// ---------- + +export type LSPSupportedStandard = { key: string; value: string }; + +/** + * @dev list of ERC725Y Metadata keys from the LSP standards. + * @see https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-2-ERC725YJSONSchema.md + */ +export const ERC725YDataKeys = { + LSP1: { ...LSP1DataKeys }, + LSP3: { ...LSP3DataKeys }, + LSP4: { ...LSP4DataKeys }, + LSP5: { ...LSP5DataKeys }, + LSP6: { ...LSP6DataKeys }, + LSP8: { ...LSP8DataKeys }, + LSP9: { ...LSP9DataKeys }, + LSP10: { ...LSP10DataKeys }, + LSP12: { ...LSP12DataKeys }, + LSP17: { ...LSP17DataKeys }, +}; + +export const LSP1_TYPE_IDS = { + ...LSP0_TYPE_IDS, + ...LSP7_TYPE_IDS, + ...LSP8_TYPE_IDS, + ...LSP9_TYPE_IDS, + ...LSP14_TYPE_IDS, +}; diff --git a/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/ILSP0ERC725Account.sol b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/ILSP0ERC725Account.sol new file mode 100644 index 000000000..39d368c70 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/ILSP0ERC725Account.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp0-contracts/contracts/ILSP0ERC725Account.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0Constants.sol b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0Constants.sol new file mode 100644 index 000000000..5cabb1423 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp0-contracts/contracts/LSP0Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725Account.sol b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725Account.sol new file mode 100644 index 000000000..e0e066a85 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725Account.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountCore.sol b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountCore.sol new file mode 100644 index 000000000..6cdd0ed4a --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountCore.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp0-contracts/contracts/LSP0ERC725AccountCore.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol new file mode 100644 index 000000000..384a09e77 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp0-contracts/contracts/LSP0ERC725AccountInit.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountInitAbstract.sol new file mode 100644 index 000000000..a6aad9e29 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP0ERC725Account/LSP0ERC725AccountInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp0-contracts/contracts/LSP0ERC725AccountInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP10ReceivedVaults/LSP10Constants.sol b/packages/lsp-smart-contracts/contracts/LSP10ReceivedVaults/LSP10Constants.sol new file mode 100644 index 000000000..25ded8e48 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP10ReceivedVaults/LSP10Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp10-contracts/contracts/LSP10Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP10ReceivedVaults/LSP10Utils.sol b/packages/lsp-smart-contracts/contracts/LSP10ReceivedVaults/LSP10Utils.sol new file mode 100644 index 000000000..ad8ba98f4 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP10ReceivedVaults/LSP10Utils.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp10-contracts/contracts/LSP10Utils.sol"; diff --git a/contracts/LSP11BasicSocialRecovery/ILSP11BasicSocialRecovery.sol b/packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/ILSP11BasicSocialRecovery.sol similarity index 100% rename from contracts/LSP11BasicSocialRecovery/ILSP11BasicSocialRecovery.sol rename to packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/ILSP11BasicSocialRecovery.sol diff --git a/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol b/packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol similarity index 100% rename from contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol rename to packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol diff --git a/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryCore.sol b/packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryCore.sol similarity index 98% rename from contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryCore.sol rename to packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryCore.sol index 0ce82e03c..225c213e0 100644 --- a/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryCore.sol +++ b/packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryCore.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.4; import {ILSP11BasicSocialRecovery} from "./ILSP11BasicSocialRecovery.sol"; // libraries -import {LSP6Utils} from "../LSP6KeyManager/LSP6Utils.sol"; +import {LSP6Utils} from "@lukso/lsp6-contracts/contracts/LSP6Utils.sol"; // modules import {ERC725} from "@erc725/smart-contracts/contracts/ERC725.sol"; @@ -18,7 +18,9 @@ import { } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; // constants -import {ALL_REGULAR_PERMISSIONS} from "../LSP6KeyManager/LSP6Constants.sol"; +import { + ALL_REGULAR_PERMISSIONS +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; import {_INTERFACEID_LSP11} from "./LSP11Constants.sol"; import { CallerIsNotGuardian, diff --git a/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.sol b/packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.sol similarity index 100% rename from contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.sol rename to packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.sol diff --git a/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInitAbstract.sol similarity index 100% rename from contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInitAbstract.sol rename to packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInitAbstract.sol diff --git a/contracts/LSP11BasicSocialRecovery/LSP11Constants.sol b/packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11Constants.sol similarity index 100% rename from contracts/LSP11BasicSocialRecovery/LSP11Constants.sol rename to packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11Constants.sol diff --git a/contracts/LSP11BasicSocialRecovery/LSP11Errors.sol b/packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11Errors.sol similarity index 100% rename from contracts/LSP11BasicSocialRecovery/LSP11Errors.sol rename to packages/lsp-smart-contracts/contracts/LSP11BasicSocialRecovery/LSP11Errors.sol diff --git a/packages/lsp-smart-contracts/contracts/LSP12IssuedAssets/LSP12Constants.sol b/packages/lsp-smart-contracts/contracts/LSP12IssuedAssets/LSP12Constants.sol new file mode 100644 index 000000000..12f76b536 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP12IssuedAssets/LSP12Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp12-contracts/contracts/LSP12Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/ILSP14Ownable2Step.sol b/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/ILSP14Ownable2Step.sol new file mode 100644 index 000000000..ecd0cf5f9 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/ILSP14Ownable2Step.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Constants.sol b/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Constants.sol new file mode 100644 index 000000000..6155d1249 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp14-contracts/contracts/LSP14Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Errors.sol b/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Errors.sol new file mode 100644 index 000000000..f2181e6ff --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp14-contracts/contracts/LSP14Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol b/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol new file mode 100644 index 000000000..f0cb16816 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol b/packages/lsp-smart-contracts/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol new file mode 100644 index 000000000..0693d5e67 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp16-contracts/contracts/LSP16UniversalFactory.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Constants.sol b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Constants.sol new file mode 100644 index 000000000..9d7da33a9 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Errors.sol b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Errors.sol new file mode 100644 index 000000000..a84a4b87b --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp17contractextension-contracts/contracts/LSP17Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Extendable.sol b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Extendable.sol new file mode 100644 index 000000000..a322d8fea --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Extendable.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Extension.sol b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Extension.sol new file mode 100644 index 000000000..b856ae93a --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Extension.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Utils.sol b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Utils.sol new file mode 100644 index 000000000..ef3f287f9 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP17ContractExtension/LSP17Utils.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp17contractextension-contracts/contracts/LSP17Utils.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP17Extensions/Extension4337.sol b/packages/lsp-smart-contracts/contracts/LSP17Extensions/Extension4337.sol new file mode 100644 index 000000000..51815c2c5 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP17Extensions/Extension4337.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp17-contracts/contracts/Extension4337.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol b/packages/lsp-smart-contracts/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol new file mode 100644 index 000000000..0c3c2cf2a --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp17-contracts/contracts/OnERC721ReceivedExtension.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiver.sol b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiver.sol new file mode 100644 index 000000000..a5da4d4ca --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiver.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol new file mode 100644 index 000000000..eef9463a9 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Constants.sol b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Constants.sol new file mode 100644 index 000000000..7b7e45b39 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Errors.sol b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Errors.sol new file mode 100644 index 000000000..e60bb80f7 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp1delegate-contracts/contracts/LSP1Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol new file mode 100644 index 000000000..ce57e7b80 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol new file mode 100644 index 000000000..c6910b037 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Utils.sol b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Utils.sol new file mode 100644 index 000000000..b699543ba --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP1UniversalReceiver/LSP1Utils.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp1-contracts/contracts/LSP1Utils.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP20CallVerification/ILSP20CallVerifier.sol b/packages/lsp-smart-contracts/contracts/LSP20CallVerification/ILSP20CallVerifier.sol new file mode 100644 index 000000000..5231c8715 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP20CallVerification/ILSP20CallVerifier.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp20-contracts/contracts/ILSP20CallVerifier.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20CallVerification.sol b/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20CallVerification.sol new file mode 100644 index 000000000..c659b4cdc --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20CallVerification.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp20-contracts/contracts/LSP20CallVerification.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20Constants.sol b/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20Constants.sol new file mode 100644 index 000000000..b0cbaa677 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp20-contracts/contracts/LSP20Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20Errors.sol b/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20Errors.sol new file mode 100644 index 000000000..40a513afa --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP20CallVerification/LSP20Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp20-contracts/contracts/LSP20Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/ILSP23LinkedContractsFactory.sol b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/ILSP23LinkedContractsFactory.sol new file mode 100644 index 000000000..eadc44d56 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/ILSP23LinkedContractsFactory.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp23-contracts/contracts/ILSP23LinkedContractsFactory.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol new file mode 100644 index 000000000..280808e51 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp23-contracts/contracts/IPostDeploymentModule.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/LSP23Errors.sol b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/LSP23Errors.sol new file mode 100644 index 000000000..7a1a33628 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/LSP23Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp23-contracts/contracts/LSP23Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol new file mode 100644 index 000000000..e498c7946 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol"; diff --git a/contracts/LSP23LinkedContractsFactory/modules/README.md b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/README.md similarity index 100% rename from contracts/LSP23LinkedContractsFactory/modules/README.md rename to packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/README.md diff --git a/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/UniversalProfileInitPostDeploymentModule.sol b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/UniversalProfileInitPostDeploymentModule.sol new file mode 100644 index 000000000..336f3645e --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/UniversalProfileInitPostDeploymentModule.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp23-contracts/contracts/modules/UniversalProfileInitPostDeploymentModule.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/UniversalProfilePostDeploymentModule.sol b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/UniversalProfilePostDeploymentModule.sol new file mode 100644 index 000000000..eacb0ba87 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/UniversalProfilePostDeploymentModule.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp23-contracts/contracts/modules/UniversalProfilePostDeploymentModule.sol"; diff --git a/contracts/LSP23LinkedContractsFactory/modules/deployment-UP-init-module.md b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/deployment-UP-init-module.md similarity index 100% rename from contracts/LSP23LinkedContractsFactory/modules/deployment-UP-init-module.md rename to packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/deployment-UP-init-module.md diff --git a/contracts/LSP23LinkedContractsFactory/modules/deployment-UP-module.md b/packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/deployment-UP-module.md similarity index 100% rename from contracts/LSP23LinkedContractsFactory/modules/deployment-UP-module.md rename to packages/lsp-smart-contracts/contracts/LSP23LinkedContractsFactory/modules/deployment-UP-module.md diff --git a/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol b/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol new file mode 100644 index 000000000..96b6b4fc6 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache 2.0 +pragma solidity ^0.8.0; + +import "@lukso/lsp25-contracts/contracts/ILSP25ExecuteRelayCall.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25Constants.sol b/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25Constants.sol new file mode 100644 index 000000000..660defe76 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp25-contracts/contracts/LSP25Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25Errors.sol b/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25Errors.sol new file mode 100644 index 000000000..98f2ee9f7 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp25-contracts/contracts/LSP25Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol b/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol new file mode 100644 index 000000000..6f77c265e --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp25-contracts/contracts/LSP25MultiChannelNonce.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol b/packages/lsp-smart-contracts/contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol new file mode 100644 index 000000000..7cfd5e777 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP3ProfileMetadata/LSP3Constants.sol b/packages/lsp-smart-contracts/contracts/LSP3ProfileMetadata/LSP3Constants.sol new file mode 100644 index 000000000..44f8afdfd --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP3ProfileMetadata/LSP3Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp3-contracts/contracts/LSP3Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4Constants.sol b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4Constants.sol new file mode 100644 index 000000000..2cf9cf500 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp4-contracts/contracts/LSP4Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol new file mode 100644 index 000000000..12f6b47a5 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol new file mode 100644 index 000000000..f10ae841f --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadataCore.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol new file mode 100644 index 000000000..4040975a0 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadataInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4Errors.sol b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4Errors.sol new file mode 100644 index 000000000..9e09cda39 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP4DigitalAssetMetadata/LSP4Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp4-contracts/contracts/LSP4Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP5ReceivedAssets/LSP5Constants.sol b/packages/lsp-smart-contracts/contracts/LSP5ReceivedAssets/LSP5Constants.sol new file mode 100644 index 000000000..f72e21d65 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP5ReceivedAssets/LSP5Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp5-contracts/contracts/LSP5Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP5ReceivedAssets/LSP5Utils.sol b/packages/lsp-smart-contracts/contracts/LSP5ReceivedAssets/LSP5Utils.sol new file mode 100644 index 000000000..e6a2a4962 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP5ReceivedAssets/LSP5Utils.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp5-contracts/contracts/LSP5Utils.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/ILSP6KeyManager.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/ILSP6KeyManager.sol new file mode 100644 index 000000000..92ba02e8e --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/ILSP6KeyManager.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp6-contracts/contracts/ILSP6KeyManager.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Constants.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Constants.sol new file mode 100644 index 000000000..ae7cea264 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Errors.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Errors.sol new file mode 100644 index 000000000..81976ef36 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp6-contracts/contracts/LSP6Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManager.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManager.sol new file mode 100644 index 000000000..68d156bef --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManager.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +import "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerCore.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerCore.sol new file mode 100644 index 000000000..827d7d211 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerCore.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +import "@lukso/lsp6-contracts/contracts/LSP6KeyManagerCore.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerInit.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerInit.sol new file mode 100644 index 000000000..014ca1844 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerInit.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +import "@lukso/lsp6-contracts/contracts/LSP6KeyManagerInit.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerInitAbstract.sol new file mode 100644 index 000000000..4cc758c98 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6KeyManagerInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +import "@lukso/lsp6-contracts/contracts/LSP6KeyManagerInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteModule.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteModule.sol new file mode 100644 index 000000000..a7136791d --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteModule.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +import "@lukso/lsp6-contracts/contracts/LSP6Modules/LSP6ExecuteModule.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteRelayCallModule.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteRelayCallModule.sol new file mode 100644 index 000000000..816d696d5 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteRelayCallModule.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +import "@lukso/lsp6-contracts/contracts/LSP6Modules/LSP6ExecuteRelayCallModule.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6OwnershipModule.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6OwnershipModule.sol new file mode 100644 index 000000000..2a6b0b44f --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6OwnershipModule.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +import "@lukso/lsp6-contracts/contracts/LSP6Modules/LSP6OwnershipModule.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6SetDataModule.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6SetDataModule.sol new file mode 100644 index 000000000..329c25b86 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Modules/LSP6SetDataModule.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +import "@lukso/lsp6-contracts/contracts/LSP6Modules/LSP6SetDataModule.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Utils.sol b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Utils.sol new file mode 100644 index 000000000..1b6bbd0fe --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP6KeyManager/LSP6Utils.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp6-contracts/contracts/LSP6Utils.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol new file mode 100644 index 000000000..1ccad2701 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/ILSP7DigitalAsset.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7Constants.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7Constants.sol new file mode 100644 index 000000000..9ebc74a5c --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/LSP7Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol new file mode 100644 index 000000000..a8c32db1f --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol new file mode 100644 index 000000000..8a888e9ea --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/LSP7DigitalAssetCore.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol new file mode 100644 index 000000000..e8e32e8da --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/LSP7DigitalAssetInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7Errors.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7Errors.sol new file mode 100644 index 000000000..ee111d7e5 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/LSP7Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/LSP7Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol new file mode 100644 index 000000000..e63ba46c3 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7BurnableInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7BurnableInitAbstract.sol new file mode 100644 index 000000000..e9fa18b3b --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7BurnableInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/extensions/LSP7BurnableInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol new file mode 100644 index 000000000..7514dc4cf --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupplyInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupplyInitAbstract.sol new file mode 100644 index 000000000..9bfe846f9 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupplyInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupplyInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/ILSP7Mintable.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/ILSP7Mintable.sol new file mode 100644 index 000000000..7510435be --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/ILSP7Mintable.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/presets/ILSP7Mintable.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol new file mode 100644 index 000000000..1082b0cda --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7MintableInit.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7MintableInit.sol new file mode 100644 index 000000000..2ec70c86c --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7MintableInit.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/presets/LSP7MintableInit.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7MintableInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7MintableInitAbstract.sol new file mode 100644 index 000000000..63ff5f63a --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP7DigitalAsset/presets/LSP7MintableInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp7-contracts/contracts/presets/LSP7MintableInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/ILSP8IdentifiableDigitalAsset.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/ILSP8IdentifiableDigitalAsset.sol new file mode 100644 index 000000000..b7b3c68f5 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/ILSP8IdentifiableDigitalAsset.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp8-contracts/contracts/ILSP8IdentifiableDigitalAsset.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol new file mode 100644 index 000000000..383060c98 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp8-contracts/contracts/LSP8Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol new file mode 100644 index 000000000..5305923ed --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp8-contracts/contracts/LSP8Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol new file mode 100644 index 000000000..cababdd31 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol new file mode 100644 index 000000000..41b3df98e --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetCore.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol new file mode 100644 index 000000000..87de808ab --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol new file mode 100644 index 000000000..147948911 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8BurnableInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8BurnableInitAbstract.sol new file mode 100644 index 000000000..8c1d6733d --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8BurnableInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/extensions/LSP8BurnableInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol new file mode 100644 index 000000000..02cf69e4f --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol new file mode 100644 index 000000000..d9fa08771 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupplyInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol new file mode 100644 index 000000000..21049f210 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol new file mode 100644 index 000000000..c1b915ad9 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/extensions/LSP8EnumerableInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/ILSP8Mintable.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/ILSP8Mintable.sol new file mode 100644 index 000000000..1c63371ab --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/ILSP8Mintable.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp8-contracts/contracts/presets/ILSP8Mintable.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol new file mode 100644 index 000000000..8fcf6a3ae --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInit.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInit.sol new file mode 100644 index 000000000..cdde50dad --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInit.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/presets/LSP8MintableInit.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInitAbstract.sol new file mode 100644 index 000000000..33d02bef2 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.12; + +import "@lukso/lsp8-contracts/contracts/presets/LSP8MintableInitAbstract.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP9Vault/ILSP9Vault.sol b/packages/lsp-smart-contracts/contracts/LSP9Vault/ILSP9Vault.sol new file mode 100644 index 000000000..fd5bd5506 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP9Vault/ILSP9Vault.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp9-contracts/contracts/ILSP9Vault.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Constants.sol b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Constants.sol new file mode 100644 index 000000000..a2054a219 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Constants.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp9-contracts/contracts/LSP9Constants.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Errors.sol b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Errors.sol new file mode 100644 index 000000000..a1b452f25 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Errors.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp9-contracts/contracts/LSP9Errors.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Vault.sol b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Vault.sol new file mode 100644 index 000000000..aeef2dd13 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9Vault.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp9-contracts/contracts/LSP9Vault.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultCore.sol b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultCore.sol new file mode 100644 index 000000000..7e6c3a360 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultCore.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp9-contracts/contracts/LSP9VaultCore.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultInit.sol b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultInit.sol new file mode 100644 index 000000000..7402b06bc --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultInit.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp9-contracts/contracts/LSP9VaultInit.sol"; diff --git a/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultInitAbstract.sol b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultInitAbstract.sol new file mode 100644 index 000000000..9f4ded8c3 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/LSP9Vault/LSP9VaultInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/lsp9-contracts/contracts/LSP9VaultInitAbstract.sol"; diff --git a/contracts/Mocks/ABIEncoder.sol b/packages/lsp-smart-contracts/contracts/Mocks/ABIEncoder.sol similarity index 100% rename from contracts/Mocks/ABIEncoder.sol rename to packages/lsp-smart-contracts/contracts/Mocks/ABIEncoder.sol diff --git a/contracts/Mocks/ERC165Interfaces.sol b/packages/lsp-smart-contracts/contracts/Mocks/ERC165Interfaces.sol similarity index 85% rename from contracts/Mocks/ERC165Interfaces.sol rename to packages/lsp-smart-contracts/contracts/Mocks/ERC165Interfaces.sol index 9d84fb9d9..9ef3ba1af 100644 --- a/contracts/Mocks/ERC165Interfaces.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/ERC165Interfaces.sol @@ -28,62 +28,80 @@ import {IERC223} from "./Tokens/IERC223.sol"; // LSPs interfaces -import {ILSP0ERC725Account} from "../LSP0ERC725Account/ILSP0ERC725Account.sol"; +import { + ILSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/ILSP0ERC725Account.sol"; import { ILSP1UniversalReceiver as ILSP1 -} from "../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; import { ILSP1UniversalReceiverDelegate as ILSP1Delegate -} from "../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; -import {ILSP6KeyManager as ILSP6} from "../LSP6KeyManager/ILSP6KeyManager.sol"; +import { + ILSP6KeyManager as ILSP6 +} from "@lukso/lsp6-contracts/contracts/ILSP6KeyManager.sol"; import { ILSP7DigitalAsset as ILSP7 -} from "../LSP7DigitalAsset/ILSP7DigitalAsset.sol"; +} from "@lukso/lsp7-contracts/contracts/ILSP7DigitalAsset.sol"; import { ILSP8IdentifiableDigitalAsset as ILSP8 -} from "../LSP8IdentifiableDigitalAsset/ILSP8IdentifiableDigitalAsset.sol"; +} from "@lukso/lsp8-contracts/contracts/ILSP8IdentifiableDigitalAsset.sol"; -import {ILSP9Vault as ILSP9} from "../LSP9Vault/ILSP9Vault.sol"; +import { + ILSP9Vault as ILSP9 +} from "@lukso/lsp9-contracts/contracts/ILSP9Vault.sol"; import { ILSP11BasicSocialRecovery as ILSP11 } from "../LSP11BasicSocialRecovery/ILSP11BasicSocialRecovery.sol"; import { ILSP14Ownable2Step as ILSP14 -} from "../LSP14Ownable2Step/ILSP14Ownable2Step.sol"; +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; import { ILSP20CallVerifier as ILSP20 -} from "../LSP20CallVerification/ILSP20CallVerifier.sol"; +} from "@lukso/lsp20-contracts/contracts/ILSP20CallVerifier.sol"; import { ILSP25ExecuteRelayCall as ILSP25 -} from "../LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol"; +} from "@lukso/lsp25-contracts/contracts/ILSP25ExecuteRelayCall.sol"; // constants -import {_INTERFACEID_LSP0} from "../LSP0ERC725Account/LSP0Constants.sol"; +import { + _INTERFACEID_LSP0 +} from "@lukso/lsp0-contracts/contracts/LSP0Constants.sol"; import { _INTERFACEID_LSP1, _INTERFACEID_LSP1_DELEGATE -} from "../LSP1UniversalReceiver/LSP1Constants.sol"; -import {_INTERFACEID_LSP6} from "../LSP6KeyManager/LSP6Constants.sol"; -import {_INTERFACEID_LSP7} from "../LSP7DigitalAsset/LSP7Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; +import { + _INTERFACEID_LSP6 +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; +import { + _INTERFACEID_LSP7 +} from "@lukso/lsp7-contracts/contracts/LSP7Constants.sol"; import { _INTERFACEID_LSP8 -} from "../LSP8IdentifiableDigitalAsset/LSP8Constants.sol"; -import {_INTERFACEID_LSP9} from "../LSP9Vault/LSP9Constants.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8Constants.sol"; +import { + _INTERFACEID_LSP9 +} from "@lukso/lsp9-contracts/contracts/LSP9Constants.sol"; import { _INTERFACEID_LSP11 } from "../LSP11BasicSocialRecovery/LSP11Constants.sol"; -import {_INTERFACEID_LSP14} from "../LSP14Ownable2Step/LSP14Constants.sol"; +import { + _INTERFACEID_LSP14 +} from "@lukso/lsp14-contracts/contracts/LSP14Constants.sol"; import { _INTERFACEID_LSP17_EXTENDABLE, _INTERFACEID_LSP17_EXTENSION -} from "../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; import { _INTERFACEID_LSP20_CALL_VERIFICATION, _INTERFACEID_LSP20_CALL_VERIFIER -} from "../LSP20CallVerification/LSP20Constants.sol"; -import {_INTERFACEID_LSP25} from "../LSP25ExecuteRelayCall/LSP25Constants.sol"; +} from "@lukso/lsp20-contracts/contracts/LSP20Constants.sol"; +import { + _INTERFACEID_LSP25 +} from "@lukso/lsp25-contracts/contracts/LSP25Constants.sol"; // libraries import { diff --git a/contracts/Mocks/Executor.sol b/packages/lsp-smart-contracts/contracts/Mocks/Executor.sol similarity index 95% rename from contracts/Mocks/Executor.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Executor.sol index 4f8704b6b..9adf9e969 100644 --- a/contracts/Mocks/Executor.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Executor.sol @@ -8,11 +8,17 @@ import { import { IERC725Y } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; -import {ILSP6KeyManager} from "../LSP6KeyManager/ILSP6KeyManager.sol"; +import { + ILSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/ILSP6KeyManager.sol"; // modules -import {UniversalProfile} from "../UniversalProfile.sol"; -import {LSP6KeyManager} from "../LSP6KeyManager/LSP6KeyManager.sol"; +import { + UniversalProfile +} from "@lukso/universalprofile-contracts/contracts/UniversalProfile.sol"; +import { + LSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; // constants import { diff --git a/contracts/Mocks/ExecutorLSP20.sol b/packages/lsp-smart-contracts/contracts/Mocks/ExecutorLSP20.sol similarity index 97% rename from contracts/Mocks/ExecutorLSP20.sol rename to packages/lsp-smart-contracts/contracts/Mocks/ExecutorLSP20.sol index ac7a57617..77d7c6366 100644 --- a/contracts/Mocks/ExecutorLSP20.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/ExecutorLSP20.sol @@ -10,7 +10,9 @@ import { } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; // modules -import {UniversalProfile} from "../UniversalProfile.sol"; +import { + UniversalProfile +} from "@lukso/universalprofile-contracts/contracts/UniversalProfile.sol"; // constants import { diff --git a/packages/lsp-smart-contracts/contracts/Mocks/FallbackContract.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackContract.sol new file mode 100644 index 000000000..ef9ed20d7 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/FallbackContract.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @dev sample contract used for testing + */ +contract FallbackContract { + fallback() external payable {} +} diff --git a/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/AgeExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/AgeExtension.sol new file mode 100644 index 000000000..816687486 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/AgeExtension.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @dev This contract is used only for testing purposes + */ +contract AgeExtension { + function age() public view virtual returns (uint256) { + return 20; + } +} diff --git a/contracts/Mocks/FallbackExtensions/Buy.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/Buy.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/Buy.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/Buy.sol diff --git a/contracts/Mocks/FallbackExtensions/CheckerExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/CheckerExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/CheckerExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/CheckerExtension.sol diff --git a/contracts/Mocks/FallbackExtensions/ERC165Extension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/ERC165Extension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/ERC165Extension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/ERC165Extension.sol diff --git a/contracts/Mocks/FallbackExtensions/EmitEventExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/EmitEventExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/EmitEventExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/EmitEventExtension.sol diff --git a/contracts/Mocks/FallbackExtensions/GraffitiEventExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/GraffitiEventExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/GraffitiEventExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/GraffitiEventExtension.sol diff --git a/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/NameExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/NameExtension.sol new file mode 100644 index 000000000..460a6ee79 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/NameExtension.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @dev This contract is used only for testing purposes + */ +contract NameExtension { + function name() public view virtual returns (string memory) { + return "LUKSO"; + } +} diff --git a/contracts/Mocks/FallbackExtensions/ReenterAccountExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/ReenterAccountExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/ReenterAccountExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/ReenterAccountExtension.sol diff --git a/contracts/Mocks/FallbackExtensions/RevertCustomExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/RevertCustomExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/RevertCustomExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/RevertCustomExtension.sol diff --git a/contracts/Mocks/FallbackExtensions/RevertErrorsTestExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/RevertErrorsTestExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/RevertErrorsTestExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/RevertErrorsTestExtension.sol diff --git a/contracts/Mocks/FallbackExtensions/RevertFallbackExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/RevertFallbackExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/RevertFallbackExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/RevertFallbackExtension.sol diff --git a/contracts/Mocks/FallbackExtensions/RevertStringExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/RevertStringExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/RevertStringExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/RevertStringExtension.sol diff --git a/contracts/Mocks/FallbackExtensions/TransferExtension.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/TransferExtension.sol similarity index 100% rename from contracts/Mocks/FallbackExtensions/TransferExtension.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackExtensions/TransferExtension.sol diff --git a/contracts/Mocks/FallbackInitializer.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackInitializer.sol similarity index 100% rename from contracts/Mocks/FallbackInitializer.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackInitializer.sol diff --git a/contracts/Mocks/FallbackRevert.sol b/packages/lsp-smart-contracts/contracts/Mocks/FallbackRevert.sol similarity index 100% rename from contracts/Mocks/FallbackRevert.sol rename to packages/lsp-smart-contracts/contracts/Mocks/FallbackRevert.sol diff --git a/contracts/Mocks/GenericExecutor.sol b/packages/lsp-smart-contracts/contracts/Mocks/GenericExecutor.sol similarity index 100% rename from contracts/Mocks/GenericExecutor.sol rename to packages/lsp-smart-contracts/contracts/Mocks/GenericExecutor.sol diff --git a/contracts/Mocks/GenericExecutorWithBalanceOfFunction.sol b/packages/lsp-smart-contracts/contracts/Mocks/GenericExecutorWithBalanceOfFunction.sol similarity index 100% rename from contracts/Mocks/GenericExecutorWithBalanceOfFunction.sol rename to packages/lsp-smart-contracts/contracts/Mocks/GenericExecutorWithBalanceOfFunction.sol diff --git a/contracts/Mocks/ImplementationTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/ImplementationTester.sol similarity index 100% rename from contracts/Mocks/ImplementationTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/ImplementationTester.sol diff --git a/contracts/Mocks/KeyManager/ERC725YDelegateCall.sol b/packages/lsp-smart-contracts/contracts/Mocks/KeyManager/ERC725YDelegateCall.sol similarity index 100% rename from contracts/Mocks/KeyManager/ERC725YDelegateCall.sol rename to packages/lsp-smart-contracts/contracts/Mocks/KeyManager/ERC725YDelegateCall.sol diff --git a/packages/lsp-smart-contracts/contracts/Mocks/KeyManager/KeyManagerInternalsTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/KeyManager/KeyManagerInternalsTester.sol new file mode 100644 index 000000000..61bdcf657 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/KeyManager/KeyManagerInternalsTester.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +// libraries +import {LSP6Utils} from "@lukso/lsp6-contracts/contracts/LSP6Utils.sol"; + +// modules +import {ERC725Y} from "@erc725/smart-contracts/contracts/ERC725Y.sol"; +import { + LSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; + +/** + * Helper contract to test internal functions of the KeyManager + */ +contract KeyManagerInternalTester is LSP6KeyManager { + using LSP6Utils for *; + + constructor(address _account) LSP6KeyManager(_account) {} + + function getPermissionsFor(address _address) public view returns (bytes32) { + return ERC725Y(_target).getPermissionsFor(_address); + } + + function getAllowedCallsFor( + address _address + ) public view returns (bytes memory) { + return ERC725Y(_target).getAllowedCallsFor(_address); + } + + function getAllowedERC725YDataKeysFor( + address _address + ) public view returns (bytes memory) { + return ERC725Y(_target).getAllowedERC725YDataKeysFor(_address); + } + + function verifyAllowedCall( + address controller, + uint256 operationType, + address to, + uint256 value, + bytes memory data + ) public view { + super._verifyAllowedCall( + _target, + controller, + operationType, + to, + value, + data + ); + } + + function isCompactBytesArrayOfAllowedCalls( + bytes memory allowedCallsCompacted + ) public pure returns (bool) { + return allowedCallsCompacted.isCompactBytesArrayOfAllowedCalls(); + } + + function isCompactBytesArrayOfAllowedERC725YDataKeys( + bytes memory allowedERC725YDataKeysCompacted + ) public pure returns (bool) { + return + allowedERC725YDataKeysCompacted + .isCompactBytesArrayOfAllowedERC725YDataKeys(); + } + + function verifyCanSetData( + address controller, + bytes32 permissions, + bytes32[] memory inputDataKeys, + bytes[] memory inputDataValues + ) public view { + super._verifyCanSetData( + _target, + controller, + permissions, + inputDataKeys, + inputDataValues + ); + } + + function verifyAllowedERC725YSingleKey( + address from, + bytes32 inputKey, + bytes memory allowedERC725YDataKeysFor + ) public pure { + super._verifyAllowedERC725YSingleKey( + from, + inputKey, + allowedERC725YDataKeysFor + ); + } + + function verifyAllowedERC725YDataKeys( + address from, + bytes32[] memory inputKeys, + bytes memory allowedERC725YDataKeysCompacted, + bool[] memory validatedInputKeys, + uint256 allowedDataKeysFound + ) public pure { + super._verifyAllowedERC725YDataKeys( + from, + inputKeys, + allowedERC725YDataKeysCompacted, + validatedInputKeys, + allowedDataKeysFound + ); + } + + function hasPermission( + bytes32 _addressPermission, + bytes32 _permissions + ) public pure returns (bool) { + return _addressPermission.hasPermission(_permissions); + } + + function verifyPermissions(address from, bytes calldata payload) public { + super._verifyPermissions(_target, from, false, payload); + + // This event is emitted just for a sake of not marking this function as `view`, + // as Hardhat has a bug that does not catch error that occured from failed `abi.decode` + // inside view functions. + // See these issues in the Github repository of Hardhat: + // - https://github.com/NomicFoundation/hardhat/issues/3084 + // - https://github.com/NomicFoundation/hardhat/issues/3475 + emit PermissionsVerified(from, 0, bytes4(payload)); + } +} diff --git a/contracts/Mocks/KeyManager/TargetPayableContract.sol b/packages/lsp-smart-contracts/contracts/Mocks/KeyManager/TargetPayableContract.sol similarity index 100% rename from contracts/Mocks/KeyManager/TargetPayableContract.sol rename to packages/lsp-smart-contracts/contracts/Mocks/KeyManager/TargetPayableContract.sol diff --git a/contracts/Mocks/KeyManagerInitWithExtraParams.sol b/packages/lsp-smart-contracts/contracts/Mocks/KeyManagerInitWithExtraParams.sol similarity index 82% rename from contracts/Mocks/KeyManagerInitWithExtraParams.sol rename to packages/lsp-smart-contracts/contracts/Mocks/KeyManagerInitWithExtraParams.sol index af9631860..36ee8f964 100644 --- a/contracts/Mocks/KeyManagerInitWithExtraParams.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/KeyManagerInitWithExtraParams.sol @@ -1,7 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.4; -import {LSP6KeyManagerInit} from "../LSP6KeyManager/LSP6KeyManagerInit.sol"; +import { + LSP6KeyManagerInit +} from "@lukso/lsp6-contracts/contracts/LSP6KeyManagerInit.sol"; contract KeyManagerInitWithExtraParams is LSP6KeyManagerInit { address public firstParam; diff --git a/contracts/Mocks/KeyManagerWithExtraParams.sol b/packages/lsp-smart-contracts/contracts/Mocks/KeyManagerWithExtraParams.sol similarity index 82% rename from contracts/Mocks/KeyManagerWithExtraParams.sol rename to packages/lsp-smart-contracts/contracts/Mocks/KeyManagerWithExtraParams.sol index be27c4ffd..f115074d4 100644 --- a/contracts/Mocks/KeyManagerWithExtraParams.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/KeyManagerWithExtraParams.sol @@ -1,7 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.4; -import {LSP6KeyManager} from "../LSP6KeyManager/LSP6KeyManager.sol"; +import { + LSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; contract KeyManagerWithExtraParams is LSP6KeyManager { address public immutable FIRST_PARAM; diff --git a/contracts/Mocks/LSP17ExtendableTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP17ExtendableTester.sol similarity index 95% rename from contracts/Mocks/LSP17ExtendableTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/LSP17ExtendableTester.sol index 74fcd2720..4590283df 100644 --- a/contracts/Mocks/LSP17ExtendableTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP17ExtendableTester.sol @@ -1,7 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.4; -import {LSP17Extendable} from "../LSP17ContractExtension/LSP17Extendable.sol"; +import { + LSP17Extendable +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/LSP1TypeIDsTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP1TypeIDsTester.sol similarity index 92% rename from contracts/Mocks/LSP1TypeIDsTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/LSP1TypeIDsTester.sol index ac9615aba..ac2dc7156 100644 --- a/contracts/Mocks/LSP1TypeIDsTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP1TypeIDsTester.sol @@ -6,28 +6,28 @@ import { _TYPEID_LSP0_OwnershipTransferStarted, _TYPEID_LSP0_OwnershipTransferred_SenderNotification, _TYPEID_LSP0_OwnershipTransferred_RecipientNotification -} from "../LSP0ERC725Account/LSP0Constants.sol"; +} from "@lukso/lsp0-contracts/contracts/LSP0Constants.sol"; import { _TYPEID_LSP7_TOKENSSENDER, _TYPEID_LSP7_TOKENSRECIPIENT, _TYPEID_LSP7_TOKENOPERATOR -} from "../LSP7DigitalAsset/LSP7Constants.sol"; +} from "@lukso/lsp7-contracts/contracts/LSP7Constants.sol"; import { _TYPEID_LSP8_TOKENSSENDER, _TYPEID_LSP8_TOKENSRECIPIENT, _TYPEID_LSP8_TOKENOPERATOR -} from "../LSP8IdentifiableDigitalAsset/LSP8Constants.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8Constants.sol"; import { _TYPEID_LSP9_VALUE_RECEIVED, _TYPEID_LSP9_OwnershipTransferStarted, _TYPEID_LSP9_OwnershipTransferred_SenderNotification, _TYPEID_LSP9_OwnershipTransferred_RecipientNotification -} from "../LSP9Vault/LSP9Constants.sol"; +} from "@lukso/lsp9-contracts/contracts/LSP9Constants.sol"; import { _TYPEID_LSP14_OwnershipTransferStarted, _TYPEID_LSP14_OwnershipTransferred_SenderNotification, _TYPEID_LSP14_OwnershipTransferred_RecipientNotification -} from "../LSP14Ownable2Step/LSP14Constants.sol"; +} from "@lukso/lsp14-contracts/contracts/LSP14Constants.sol"; error LSP1TypeIdHashIsWrong(bytes32 typeIdHash, string typeIdname); diff --git a/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/BothCallReturnMagicValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/BothCallReturnMagicValue.sol new file mode 100644 index 000000000..93abb971e --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/BothCallReturnMagicValue.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @title sample contract used for testing + */ +contract BothCallReturnMagicValue { + function lsp20VerifyCall( + address /*caller*/, + uint256 /*value*/, + bytes memory /*data*/ + ) external pure returns (bytes4 magicValue) { + return + bytes4( + abi.encodePacked( + bytes3(BothCallReturnMagicValue.lsp20VerifyCall.selector), + hex"01" + ) + ); + } + + function lsp20VerifyCallResult( + bytes32 /*callHash*/, + bytes memory /*result*/ + ) external pure returns (bytes4) { + return BothCallReturnMagicValue.lsp20VerifyCallResult.selector; + } +} diff --git a/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/BothCallReturnSuccessValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/BothCallReturnSuccessValue.sol new file mode 100644 index 000000000..edc863e4e --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/BothCallReturnSuccessValue.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @title sample contract used for testing + */ +contract BothCallReturnSuccessValue { + function lsp20VerifyCall( + address /* requestor */, + address /* targetContract */, + address /* caller */, + uint256 /* value */, + bytes memory /* data */ + ) external pure returns (bytes4 magicValue) { + return + bytes4( + abi.encodePacked( + bytes3(BothCallReturnSuccessValue.lsp20VerifyCall.selector), + hex"01" + ) + ); + } + + function lsp20VerifyCallResult( + bytes32 /*callHash*/, + bytes memory /*result*/ + ) external pure returns (bytes4) { + return BothCallReturnSuccessValue.lsp20VerifyCallResult.selector; + } +} diff --git a/contracts/Mocks/LSP20Owners/FallbackReturnMagicValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FallbackReturnSuccessValue.sol similarity index 87% rename from contracts/Mocks/LSP20Owners/FallbackReturnMagicValue.sol rename to packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FallbackReturnSuccessValue.sol index 40b829104..afa13e7e0 100644 --- a/contracts/Mocks/LSP20Owners/FallbackReturnMagicValue.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FallbackReturnSuccessValue.sol @@ -3,10 +3,10 @@ pragma solidity ^0.8.4; import { ILSP20CallVerifier -} from "../../LSP20CallVerification/ILSP20CallVerifier.sol"; +} from "@lukso/lsp20-contracts/contracts/ILSP20CallVerifier.sol"; import { ILSP14Ownable2Step -} from "../../LSP14Ownable2Step/ILSP14Ownable2Step.sol"; +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; /** * @title sample contract used for testing diff --git a/contracts/Mocks/LSP20Owners/FirstCallReturnExpandedInvalidValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnExpandedInvalidValue.sol similarity index 88% rename from contracts/Mocks/LSP20Owners/FirstCallReturnExpandedInvalidValue.sol rename to packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnExpandedInvalidValue.sol index 320c08f45..acc23e015 100644 --- a/contracts/Mocks/LSP20Owners/FirstCallReturnExpandedInvalidValue.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnExpandedInvalidValue.sol @@ -3,12 +3,12 @@ pragma solidity ^0.8.4; import { ILSP14Ownable2Step -} from "../../LSP14Ownable2Step/ILSP14Ownable2Step.sol"; +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; /** * @title sample contract used for testing */ -contract FirstCallReturnExpandedFailValue { +contract FirstCallReturnExpandedInvalidValue { event CallVerified(); address public target; diff --git a/contracts/Mocks/LSP20Owners/FirstCallReturnInvalidMagicValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnInvalidValue.sol similarity index 69% rename from contracts/Mocks/LSP20Owners/FirstCallReturnInvalidMagicValue.sol rename to packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnInvalidValue.sol index c9e6b60a2..a9cfa4d29 100644 --- a/contracts/Mocks/LSP20Owners/FirstCallReturnInvalidMagicValue.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnInvalidValue.sol @@ -2,22 +2,22 @@ pragma solidity ^0.8.4; import { ILSP14Ownable2Step -} from "../../LSP14Ownable2Step/ILSP14Ownable2Step.sol"; +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; /** * @title sample contract used for testing */ -contract FirstCallReturnFailValue { +contract FirstCallReturnInvalidValue { event CallVerified(); address public target; function lsp20VerifyCall( - address, - address, - address, - uint256, - bytes memory + address /* requestor */, + address /* targetContract */, + address /* caller */, + uint256 /* value */, + bytes memory /* data */ ) external returns (bytes4) { emit CallVerified(); diff --git a/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnMagicValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnMagicValue.sol new file mode 100644 index 000000000..fcdf2beb2 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnMagicValue.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @title sample contract used for testing + */ +contract FirstCallReturnMagicValue { + function lsp20VerifyCall( + address /*caller*/, + uint256 /*value*/, + bytes memory /*data*/ + ) external pure returns (bytes4 magicValue) { + return + bytes4( + abi.encodePacked( + bytes3(FirstCallReturnMagicValue.lsp20VerifyCall.selector), + hex"00" + ) + ); + } + + /** + * @dev should not be called + */ + function lsp20VerifyCallResult( + bytes32 /*callHash*/, + bytes memory /*result*/ + ) external pure returns (bytes4) { + revert("This revert will not be triggered"); + } +} diff --git a/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnSuccessValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnSuccessValue.sol new file mode 100644 index 000000000..b86849c24 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/FirstCallReturnSuccessValue.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @title sample contract used for testing + */ +contract FirstCallReturnSuccessValue { + function lsp20VerifyCall( + address /* requestor */, + address /* targetContract */, + address /* caller */, + uint256 /* value */, + bytes memory /* data */ + ) external pure returns (bytes4 magicValue) { + return + bytes4( + abi.encodePacked( + bytes3( + FirstCallReturnSuccessValue.lsp20VerifyCall.selector + ), + hex"00" + ) + ); + } + + /** + * @dev should not be called + */ + function lsp20VerifyCallResult( + bytes32 /*callHash*/, + bytes memory /*result*/ + ) external pure returns (bytes4) { + revert("This revert will not be triggered"); + } +} diff --git a/contracts/Mocks/LSP20Owners/ImplementingFallback.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/ImplementingFallback.sol similarity index 90% rename from contracts/Mocks/LSP20Owners/ImplementingFallback.sol rename to packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/ImplementingFallback.sol index df6d4f7f5..a32ecb39e 100644 --- a/contracts/Mocks/LSP20Owners/ImplementingFallback.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/ImplementingFallback.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.4; import { ILSP14Ownable2Step -} from "../../LSP14Ownable2Step/ILSP14Ownable2Step.sol"; +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; /** * @title sample contract used for testing diff --git a/contracts/Mocks/LSP20Owners/NotImplementingVerifyCall.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/NotImplementingVerifyCall.sol similarity index 88% rename from contracts/Mocks/LSP20Owners/NotImplementingVerifyCall.sol rename to packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/NotImplementingVerifyCall.sol index a6010ed3e..97f1123aa 100644 --- a/contracts/Mocks/LSP20Owners/NotImplementingVerifyCall.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/NotImplementingVerifyCall.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.4; import { ILSP14Ownable2Step -} from "../../LSP14Ownable2Step/ILSP14Ownable2Step.sol"; +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; /** * @title sample contract used for testing diff --git a/contracts/Mocks/LSP20Owners/OwnerWIthURD.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/OwnerWIthURD.sol similarity index 86% rename from contracts/Mocks/LSP20Owners/OwnerWIthURD.sol rename to packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/OwnerWIthURD.sol index f95800550..cc783ca7f 100644 --- a/contracts/Mocks/LSP20Owners/OwnerWIthURD.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/OwnerWIthURD.sol @@ -3,19 +3,19 @@ pragma solidity ^0.8.4; import { ILSP1UniversalReceiver -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; import { ILSP14Ownable2Step -} from "../../LSP14Ownable2Step/ILSP14Ownable2Step.sol"; +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; import { ILSP20CallVerifier -} from "../../LSP20CallVerification/ILSP20CallVerifier.sol"; +} from "@lukso/lsp20-contracts/contracts/ILSP20CallVerifier.sol"; import { _LSP20_VERIFY_CALL_SUCCESS_VALUE_WITH_POST_VERIFICATION, _LSP20_VERIFY_CALL_RESULT_SUCCESS_VALUE -} from "../../LSP20CallVerification/LSP20Constants.sol"; +} from "@lukso/lsp20-contracts/contracts/LSP20Constants.sol"; contract OwnerWithURD is ILSP20CallVerifier, ILSP1UniversalReceiver { address private immutable _OWNED_CONTRACT; diff --git a/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnExpandedSuccessValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnExpandedSuccessValue.sol new file mode 100644 index 000000000..59bb3bcac --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnExpandedSuccessValue.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @title sample contract used for testing + */ +contract SecondCallReturnExpandedSuccessValue { + function lsp20VerifyCall( + address /* requestor */, + address /* targetContract */, + address /* caller */, + uint256 /* value */, + bytes memory /* data */ + ) external pure returns (bytes4 magicValue) { + return + bytes4( + abi.encodePacked( + bytes3( + SecondCallReturnExpandedSuccessValue + .lsp20VerifyCall + .selector + ), + hex"01" + ) + ); + } + + function lsp20VerifyCallResult( + bytes32 /*callHash*/, + bytes memory /*result*/ + ) external pure returns (bytes32) { + return + bytes32( + bytes.concat( + bytes4( + SecondCallReturnExpandedSuccessValue + .lsp20VerifyCallResult + .selector + ) + ) + ); + } +} diff --git a/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnExpandedValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnExpandedValue.sol new file mode 100644 index 000000000..301368254 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnExpandedValue.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @title sample contract used for testing + */ +contract SecondCallReturnExpandedValue { + function lsp20VerifyCall( + address /*caller*/, + uint256 /*value*/, + bytes memory /*data*/ + ) external pure returns (bytes4 magicValue) { + return + bytes4( + abi.encodePacked( + bytes3( + SecondCallReturnExpandedValue.lsp20VerifyCall.selector + ), + hex"01" + ) + ); + } + + function lsp20VerifyCallResult( + bytes32 /*callHash*/, + bytes memory /*result*/ + ) external pure returns (bytes32) { + return + bytes32( + bytes.concat( + bytes4( + SecondCallReturnExpandedValue + .lsp20VerifyCallResult + .selector + ) + ) + ); + } +} diff --git a/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnFailureValue.sol b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnFailureValue.sol new file mode 100644 index 000000000..935a1e71b --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/Mocks/LSP20Owners/SecondCallReturnFailureValue.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @title sample contract used for testing + */ +contract SecondCallReturnFailureValue { + function lsp20VerifyCall( + address /* requestor */, + address /* targetContract */, + address /* caller */, + uint256 /* value */, + bytes memory /* data */ + ) external pure returns (bytes4 magicValue) { + return + bytes4( + abi.encodePacked( + bytes3( + SecondCallReturnFailureValue.lsp20VerifyCall.selector + ), + hex"01" + ) + ); + } + + function lsp20VerifyCallResult( + bytes32 /*callHash*/, + bytes memory /*result*/ + ) external pure returns (bytes4) { + return bytes4(0); + } +} diff --git a/contracts/Mocks/MaliciousERC1271Wallet.sol b/packages/lsp-smart-contracts/contracts/Mocks/MaliciousERC1271Wallet.sol similarity index 100% rename from contracts/Mocks/MaliciousERC1271Wallet.sol rename to packages/lsp-smart-contracts/contracts/Mocks/MaliciousERC1271Wallet.sol diff --git a/contracts/Mocks/NonPayableFallback.sol b/packages/lsp-smart-contracts/contracts/Mocks/NonPayableFallback.sol similarity index 100% rename from contracts/Mocks/NonPayableFallback.sol rename to packages/lsp-smart-contracts/contracts/Mocks/NonPayableFallback.sol diff --git a/contracts/Mocks/PayableContract.sol b/packages/lsp-smart-contracts/contracts/Mocks/PayableContract.sol similarity index 100% rename from contracts/Mocks/PayableContract.sol rename to packages/lsp-smart-contracts/contracts/Mocks/PayableContract.sol diff --git a/contracts/Mocks/Reentrancy/BatchReentrancyRelayer.sol b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/BatchReentrancyRelayer.sol similarity index 94% rename from contracts/Mocks/Reentrancy/BatchReentrancyRelayer.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/BatchReentrancyRelayer.sol index 4c6385f9e..cde63ca0b 100644 --- a/contracts/Mocks/Reentrancy/BatchReentrancyRelayer.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/BatchReentrancyRelayer.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.4; // interfaces import { ILSP25ExecuteRelayCall -} from "../../LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol"; +} from "@lukso/lsp25-contracts/contracts/ILSP25ExecuteRelayCall.sol"; contract BatchReentrancyRelayer { bytes[] private _signatures; diff --git a/contracts/Mocks/Reentrancy/LSP20ReentrantContract.sol b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/LSP20ReentrantContract.sol similarity index 96% rename from contracts/Mocks/Reentrancy/LSP20ReentrantContract.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/LSP20ReentrantContract.sol index e5e7e5586..922a69165 100644 --- a/contracts/Mocks/Reentrancy/LSP20ReentrantContract.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/LSP20ReentrantContract.sol @@ -12,12 +12,12 @@ import { // constants import { _LSP1_UNIVERSAL_RECEIVER_DELEGATE_PREFIX -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, ALL_REGULAR_PERMISSIONS -} from "../../LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; contract LSP20ReentrantContract { event ValueReceived(uint256); diff --git a/contracts/Mocks/Reentrancy/LSP20ReentrantContractBatch.sol b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/LSP20ReentrantContractBatch.sol similarity index 97% rename from contracts/Mocks/Reentrancy/LSP20ReentrantContractBatch.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/LSP20ReentrantContractBatch.sol index 4fa61ef5f..25ce40e76 100644 --- a/contracts/Mocks/Reentrancy/LSP20ReentrantContractBatch.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/LSP20ReentrantContractBatch.sol @@ -12,12 +12,12 @@ import { // constants import { _LSP1_UNIVERSAL_RECEIVER_DELEGATE_PREFIX -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, ALL_REGULAR_PERMISSIONS -} from "../../LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; contract LSP20ReentrantContractBatch { event ValueReceived(uint256); diff --git a/contracts/Mocks/Reentrancy/ReentrantContract.sol b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/ReentrantContract.sol similarity index 92% rename from contracts/Mocks/Reentrancy/ReentrantContract.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/ReentrantContract.sol index b916e98c9..3822c8db6 100644 --- a/contracts/Mocks/Reentrancy/ReentrantContract.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/ReentrantContract.sol @@ -2,16 +2,18 @@ pragma solidity ^0.8.4; // interfaces -import {ILSP6KeyManager} from "../../LSP6KeyManager/ILSP6KeyManager.sol"; +import { + ILSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/ILSP6KeyManager.sol"; // constants import { _LSP1_UNIVERSAL_RECEIVER_DELEGATE_PREFIX -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX -} from "../../LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; contract ReentrantContract { event ValueReceived(uint256); diff --git a/contracts/Mocks/Reentrancy/SingleReentrancyRelayer.sol b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/SingleReentrancyRelayer.sol similarity index 93% rename from contracts/Mocks/Reentrancy/SingleReentrancyRelayer.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/SingleReentrancyRelayer.sol index 0e24078de..ee5cdad70 100644 --- a/contracts/Mocks/Reentrancy/SingleReentrancyRelayer.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/SingleReentrancyRelayer.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.4; // interfaces import { ILSP25ExecuteRelayCall -} from "../../LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol"; +} from "@lukso/lsp25-contracts/contracts/ILSP25ExecuteRelayCall.sol"; contract SingleReentrancyRelayer { bytes private _signature; diff --git a/contracts/Mocks/Reentrancy/ThreeReentrancy.sol b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/ThreeReentrancy.sol similarity index 96% rename from contracts/Mocks/Reentrancy/ThreeReentrancy.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/ThreeReentrancy.sol index d93f422de..268403e53 100644 --- a/contracts/Mocks/Reentrancy/ThreeReentrancy.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Reentrancy/ThreeReentrancy.sol @@ -8,7 +8,9 @@ import { import { IERC725X } from "@erc725/smart-contracts/contracts/interfaces/IERC725X.sol"; -import {ILSP6KeyManager} from "../../LSP6KeyManager/ILSP6KeyManager.sol"; +import { + ILSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/ILSP6KeyManager.sol"; /** * The purpose of these contracts is to perform tests on chained reentrancy scenarios diff --git a/contracts/Mocks/Security/Reentrancy.sol b/packages/lsp-smart-contracts/contracts/Mocks/Security/Reentrancy.sol similarity index 100% rename from contracts/Mocks/Security/Reentrancy.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Security/Reentrancy.sol diff --git a/contracts/Mocks/SignatureValidatorContract.sol b/packages/lsp-smart-contracts/contracts/Mocks/SignatureValidatorContract.sol similarity index 100% rename from contracts/Mocks/SignatureValidatorContract.sol rename to packages/lsp-smart-contracts/contracts/Mocks/SignatureValidatorContract.sol diff --git a/contracts/Mocks/TargetContract.sol b/packages/lsp-smart-contracts/contracts/Mocks/TargetContract.sol similarity index 100% rename from contracts/Mocks/TargetContract.sol rename to packages/lsp-smart-contracts/contracts/Mocks/TargetContract.sol diff --git a/contracts/Mocks/Tokens/IERC223.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/IERC223.sol similarity index 100% rename from contracts/Mocks/Tokens/IERC223.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/IERC223.sol diff --git a/contracts/Mocks/Tokens/LSP7CappedSupplyInitTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7CappedSupplyInitTester.sol similarity index 85% rename from contracts/Mocks/Tokens/LSP7CappedSupplyInitTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7CappedSupplyInitTester.sol index 0e9c44e1b..e41ecbd79 100644 --- a/contracts/Mocks/Tokens/LSP7CappedSupplyInitTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7CappedSupplyInitTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP7DigitalAssetInitAbstract -} from "../../LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol"; +} from "@lukso/lsp7-contracts/contracts/LSP7DigitalAssetInitAbstract.sol"; import { LSP7CappedSupplyInitAbstract -} from "../../LSP7DigitalAsset/extensions/LSP7CappedSupplyInitAbstract.sol"; +} from "@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupplyInitAbstract.sol"; contract LSP7CappedSupplyInitTester is LSP7CappedSupplyInitAbstract { function initialize( diff --git a/contracts/Mocks/Tokens/LSP7CappedSupplyTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7CappedSupplyTester.sol similarity index 81% rename from contracts/Mocks/Tokens/LSP7CappedSupplyTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7CappedSupplyTester.sol index de76f80d2..2693adb3e 100644 --- a/contracts/Mocks/Tokens/LSP7CappedSupplyTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7CappedSupplyTester.sol @@ -3,10 +3,12 @@ pragma solidity ^0.8.4; // modules -import {LSP7DigitalAsset} from "../../LSP7DigitalAsset/LSP7DigitalAsset.sol"; +import { + LSP7DigitalAsset +} from "@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol"; import { LSP7CappedSupply -} from "../../LSP7DigitalAsset/extensions/LSP7CappedSupply.sol"; +} from "@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol"; contract LSP7CappedSupplyTester is LSP7CappedSupply { constructor( diff --git a/contracts/Mocks/Tokens/LSP7InitTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7InitTester.sol similarity index 84% rename from contracts/Mocks/Tokens/LSP7InitTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7InitTester.sol index 731591bd1..198e32c36 100644 --- a/contracts/Mocks/Tokens/LSP7InitTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7InitTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP7DigitalAssetInitAbstract -} from "../../LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol"; +} from "@lukso/lsp7-contracts/contracts/LSP7DigitalAssetInitAbstract.sol"; import { LSP7BurnableInitAbstract -} from "../../LSP7DigitalAsset/extensions/LSP7BurnableInitAbstract.sol"; +} from "@lukso/lsp7-contracts/contracts/extensions/LSP7BurnableInitAbstract.sol"; contract LSP7InitTester is LSP7DigitalAssetInitAbstract, diff --git a/contracts/Mocks/Tokens/LSP7MintWhenDeployed.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7MintWhenDeployed.sol similarity index 80% rename from contracts/Mocks/Tokens/LSP7MintWhenDeployed.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7MintWhenDeployed.sol index f90f5daf8..762919487 100644 --- a/contracts/Mocks/Tokens/LSP7MintWhenDeployed.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7MintWhenDeployed.sol @@ -1,7 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.4; -import {LSP7DigitalAsset} from "../../LSP7DigitalAsset/LSP7DigitalAsset.sol"; +import { + LSP7DigitalAsset +} from "@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol"; contract LSP7MintWhenDeployed is LSP7DigitalAsset { constructor( diff --git a/contracts/Mocks/Tokens/LSP7Tester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7Tester.sol similarity index 73% rename from contracts/Mocks/Tokens/LSP7Tester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7Tester.sol index 76a1a4404..cf7b7a374 100644 --- a/contracts/Mocks/Tokens/LSP7Tester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP7Tester.sol @@ -2,8 +2,12 @@ pragma solidity ^0.8.4; // modules -import {LSP7DigitalAsset} from "../../LSP7DigitalAsset/LSP7DigitalAsset.sol"; -import {LSP7Burnable} from "../../LSP7DigitalAsset/extensions/LSP7Burnable.sol"; +import { + LSP7DigitalAsset +} from "@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol"; +import { + LSP7Burnable +} from "@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol"; contract LSP7Tester is LSP7DigitalAsset, LSP7Burnable { constructor( diff --git a/contracts/Mocks/Tokens/LSP8BurnableInitTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8BurnableInitTester.sol similarity index 78% rename from contracts/Mocks/Tokens/LSP8BurnableInitTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8BurnableInitTester.sol index 413f518dd..9b6118748 100644 --- a/contracts/Mocks/Tokens/LSP8BurnableInitTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8BurnableInitTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAssetInitAbstract -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol"; import { LSP8BurnableInitAbstract -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8BurnableInitAbstract.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8BurnableInitAbstract.sol"; contract LSP8BurnableInitTester is LSP8BurnableInitAbstract { function initialize( diff --git a/contracts/Mocks/Tokens/LSP8BurnableTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8BurnableTester.sol similarity index 78% rename from contracts/Mocks/Tokens/LSP8BurnableTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8BurnableTester.sol index e239d12cd..e95c17805 100644 --- a/contracts/Mocks/Tokens/LSP8BurnableTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8BurnableTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAsset -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol"; import { LSP8Burnable -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol"; contract LSP8BurnableTester is LSP8Burnable { constructor( diff --git a/contracts/Mocks/Tokens/LSP8CappedSupplyInitTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8CappedSupplyInitTester.sol similarity index 84% rename from contracts/Mocks/Tokens/LSP8CappedSupplyInitTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8CappedSupplyInitTester.sol index 155b524e7..47e28b3a2 100644 --- a/contracts/Mocks/Tokens/LSP8CappedSupplyInitTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8CappedSupplyInitTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAssetInitAbstract -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol"; import { LSP8CappedSupplyInitAbstract -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupplyInitAbstract.sol"; contract LSP8CappedSupplyInitTester is LSP8CappedSupplyInitAbstract { function initialize( diff --git a/contracts/Mocks/Tokens/LSP8CappedSupplyTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8CappedSupplyTester.sol similarity index 84% rename from contracts/Mocks/Tokens/LSP8CappedSupplyTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8CappedSupplyTester.sol index a64aabc5a..c35a441e0 100644 --- a/contracts/Mocks/Tokens/LSP8CappedSupplyTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8CappedSupplyTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAsset -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol"; import { LSP8CappedSupply -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol"; contract LSP8CappedSupplyTester is LSP8CappedSupply { constructor( diff --git a/contracts/Mocks/Tokens/LSP8EnumerableInitTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8EnumerableInitTester.sol similarity index 83% rename from contracts/Mocks/Tokens/LSP8EnumerableInitTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8EnumerableInitTester.sol index cb54b5454..b74eb78b2 100644 --- a/contracts/Mocks/Tokens/LSP8EnumerableInitTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8EnumerableInitTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAssetInitAbstract -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol"; import { LSP8EnumerableInitAbstract -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8EnumerableInitAbstract.sol"; contract LSP8EnumerableInitTester is LSP8EnumerableInitAbstract { function initialize( diff --git a/contracts/Mocks/Tokens/LSP8EnumerableTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8EnumerableTester.sol similarity index 83% rename from contracts/Mocks/Tokens/LSP8EnumerableTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8EnumerableTester.sol index 64605675b..584f62482 100644 --- a/contracts/Mocks/Tokens/LSP8EnumerableTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8EnumerableTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAsset -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol"; import { LSP8Enumerable -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol"; contract LSP8EnumerableTester is LSP8Enumerable { constructor( diff --git a/contracts/Mocks/Tokens/LSP8InitTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8InitTester.sol similarity index 83% rename from contracts/Mocks/Tokens/LSP8InitTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8InitTester.sol index f18e37b66..ff2079a5c 100644 --- a/contracts/Mocks/Tokens/LSP8InitTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8InitTester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAssetInitAbstract -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol"; import { LSP8BurnableInitAbstract -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8BurnableInitAbstract.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8BurnableInitAbstract.sol"; contract LSP8InitTester is LSP8IdentifiableDigitalAssetInitAbstract, diff --git a/contracts/Mocks/Tokens/LSP8Tester.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8Tester.sol similarity index 83% rename from contracts/Mocks/Tokens/LSP8Tester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8Tester.sol index 6d35de1d9..c93f3b817 100644 --- a/contracts/Mocks/Tokens/LSP8Tester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8Tester.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAsset -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol"; import { LSP8Burnable -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol"; contract LSP8Tester is LSP8IdentifiableDigitalAsset, LSP8Burnable { constructor( diff --git a/contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol similarity index 88% rename from contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol index 3f595f65a..2ca23554a 100644 --- a/contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/LSP8TransferOwnerChange.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.4; // modules import { LSP8IdentifiableDigitalAsset -} from "../../LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol"; import { LSP8Burnable -} from "../../LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol"; +} from "@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol"; contract LSP8TransferOwnerChange is LSP8IdentifiableDigitalAsset, LSP8Burnable { // solhint-disable-next-line no-empty-blocks diff --git a/contracts/Mocks/Tokens/RequireCallbackToken.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/RequireCallbackToken.sol similarity index 90% rename from contracts/Mocks/Tokens/RequireCallbackToken.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/RequireCallbackToken.sol index e2d7dfaaa..755f8be98 100644 --- a/contracts/Mocks/Tokens/RequireCallbackToken.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/RequireCallbackToken.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.4; import { OnERC721ReceivedExtension -} from "../../LSP17Extensions/OnERC721ReceivedExtension.sol"; +} from "@lukso/lsp17-contracts/contracts/OnERC721ReceivedExtension.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/Tokens/TokenReceiverWithLSP1.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1.sol similarity index 82% rename from contracts/Mocks/Tokens/TokenReceiverWithLSP1.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1.sol index e826e30d0..eb076ddbe 100644 --- a/contracts/Mocks/Tokens/TokenReceiverWithLSP1.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.4; // interfaces import { ILSP1UniversalReceiver -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; // modules import { @@ -12,7 +12,9 @@ import { } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; // constants -import {_INTERFACEID_LSP1} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +import { + _INTERFACEID_LSP1 +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; contract TokenReceiverWithLSP1 is ERC165Storage, ILSP1UniversalReceiver { constructor() { diff --git a/contracts/Mocks/Tokens/TokenReceiverWithLSP1Revert.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1Revert.sol similarity index 78% rename from contracts/Mocks/Tokens/TokenReceiverWithLSP1Revert.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1Revert.sol index d0e35a7bb..fc177ad4c 100644 --- a/contracts/Mocks/Tokens/TokenReceiverWithLSP1Revert.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1Revert.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.4; // interfaces import { ILSP1UniversalReceiver -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; // modules import { @@ -12,7 +12,9 @@ import { } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; // constants -import {_INTERFACEID_LSP1} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +import { + _INTERFACEID_LSP1 +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; contract TokenReceiverWithLSP1Revert is ERC165Storage, ILSP1UniversalReceiver { function addLSP1Support() public { diff --git a/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721Received.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721Received.sol similarity index 85% rename from contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721Received.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721Received.sol index 638dab782..ccd690d47 100644 --- a/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721Received.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721Received.sol @@ -7,7 +7,7 @@ import { } from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import { ILSP1UniversalReceiver -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; // modules import { @@ -15,7 +15,9 @@ import { } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; // constants -import {_INTERFACEID_LSP1} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +import { + _INTERFACEID_LSP1 +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; contract TokenReceiverWithLSP1WithERC721Received is ERC165Storage, diff --git a/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedInvalid.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedInvalid.sol similarity index 87% rename from contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedInvalid.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedInvalid.sol index e48e62c83..1b670f5e1 100644 --- a/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedInvalid.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedInvalid.sol @@ -7,7 +7,7 @@ import { } from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import { ILSP1UniversalReceiver -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; // modules import { @@ -15,7 +15,9 @@ import { } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; // constants -import {_INTERFACEID_LSP1} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +import { + _INTERFACEID_LSP1 +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; contract TokenReceiverWithLSP1WithERC721ReceivedInvalid is ERC165Storage, diff --git a/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedRevert.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedRevert.sol similarity index 88% rename from contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedRevert.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedRevert.sol index e00c9f1f6..6659bd891 100644 --- a/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedRevert.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithLSP1WithERC721ReceivedRevert.sol @@ -7,7 +7,7 @@ import { } from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import { ILSP1UniversalReceiver -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; // modules import { @@ -15,7 +15,9 @@ import { } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; // constants -import {_INTERFACEID_LSP1} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +import { + _INTERFACEID_LSP1 +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; contract TokenReceiverWithLSP1WithERC721ReceivedRevert is ERC165Storage, diff --git a/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1.sol similarity index 100% rename from contracts/Mocks/Tokens/TokenReceiverWithoutLSP1.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1.sol diff --git a/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721Received.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721Received.sol similarity index 100% rename from contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721Received.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721Received.sol diff --git a/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedInvalid.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedInvalid.sol similarity index 100% rename from contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedInvalid.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedInvalid.sol diff --git a/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedRevert.sol b/packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedRevert.sol similarity index 100% rename from contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedRevert.sol rename to packages/lsp-smart-contracts/contracts/Mocks/Tokens/TokenReceiverWithoutLSP1WithERC721ReceivedRevert.sol diff --git a/contracts/Mocks/UPWithInstantAcceptOwnership.sol b/packages/lsp-smart-contracts/contracts/Mocks/UPWithInstantAcceptOwnership.sol similarity index 77% rename from contracts/Mocks/UPWithInstantAcceptOwnership.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UPWithInstantAcceptOwnership.sol index a6854b70a..9a644c4db 100644 --- a/contracts/Mocks/UPWithInstantAcceptOwnership.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UPWithInstantAcceptOwnership.sol @@ -4,22 +4,24 @@ pragma solidity ^0.8.4; // modules import { LSP0ERC725AccountCore -} from "../LSP0ERC725Account/LSP0ERC725AccountCore.sol"; +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725AccountCore.sol"; import { OwnableUnset } from "@erc725/smart-contracts/contracts/custom/OwnableUnset.sol"; -import {LSP14Ownable2Step} from "../LSP14Ownable2Step/LSP14Ownable2Step.sol"; +import { + LSP14Ownable2Step +} from "@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol"; // constants import { _TYPEID_LSP0_OwnershipTransferStarted -} from "../LSP0ERC725Account/LSP0Constants.sol"; +} from "@lukso/lsp0-contracts/contracts/LSP0Constants.sol"; import { _TYPEID_LSP9_OwnershipTransferStarted -} from "../LSP9Vault/LSP9Constants.sol"; +} from "@lukso/lsp9-contracts/contracts/LSP9Constants.sol"; import { _TYPEID_LSP14_OwnershipTransferStarted -} from "../LSP14Ownable2Step/LSP14Constants.sol"; +} from "@lukso/lsp14-contracts/contracts/LSP14Constants.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataLYX.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataLYX.sol similarity index 76% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataLYX.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataLYX.sol index 4ce711d94..a9f6b8ebb 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataLYX.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataLYX.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.4; import { ILSP1UniversalReceiverDelegate -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; // modules import { @@ -16,13 +16,15 @@ import { import { _TYPEID_LSP0_VALUE_RECEIVED -} from "../../LSP0ERC725Account/LSP0Constants.sol"; +} from "@lukso/lsp0-contracts/contracts/LSP0Constants.sol"; import { _INTERFACEID_LSP1_DELEGATE -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; -import {_TYPEID_LSP9_VALUE_RECEIVED} from "../../LSP9Vault/LSP9Constants.sol"; +import { + _TYPEID_LSP9_VALUE_RECEIVED +} from "@lukso/lsp9-contracts/contracts/LSP9Constants.sol"; contract UniversalReceiverDelegateDataLYX is ERC165Storage, diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataUpdater.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataUpdater.sol similarity index 75% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataUpdater.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataUpdater.sol index e3dbe3634..af86f22d5 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataUpdater.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateDataUpdater.sol @@ -2,12 +2,16 @@ pragma solidity ^0.8.4; // interfaces -import {ILSP6KeyManager} from "../../LSP6KeyManager/ILSP6KeyManager.sol"; -import {LSP14Ownable2Step} from "../../LSP14Ownable2Step/LSP14Ownable2Step.sol"; +import { + ILSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/ILSP6KeyManager.sol"; +import { + LSP14Ownable2Step +} from "@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol"; import { ILSP1UniversalReceiverDelegate -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; // modules import { @@ -17,11 +21,11 @@ import { // constants import { _TYPEID_LSP7_TOKENSSENDER -} from "../../LSP7DigitalAsset/LSP7Constants.sol"; +} from "@lukso/lsp7-contracts/contracts/LSP7Constants.sol"; import { _INTERFACEID_LSP1_DELEGATE -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; contract UniversalReceiverDelegateDataUpdater is ERC165Storage, diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateGasConsumer.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateGasConsumer.sol similarity index 90% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateGasConsumer.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateGasConsumer.sol index 56727ea6b..76516085a 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateGasConsumer.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateGasConsumer.sol @@ -4,11 +4,11 @@ pragma solidity ^0.8.4; // interfaces import { ILSP1UniversalReceiverDelegate -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import { _INTERFACEID_LSP1_DELEGATE -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateRevert.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateRevert.sol similarity index 89% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateRevert.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateRevert.sol index e461d9acf..97b1a1f1a 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateRevert.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateRevert.sol @@ -4,11 +4,11 @@ pragma solidity ^0.8.4; // interfaces import { ILSP1UniversalReceiverDelegate -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import { _INTERFACEID_LSP1_DELEGATE -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateTokenReentrant.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateTokenReentrant.sol similarity index 84% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateTokenReentrant.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateTokenReentrant.sol index a6124762f..3ba6da97d 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateTokenReentrant.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateTokenReentrant.sol @@ -5,11 +5,13 @@ pragma solidity ^0.8.4; import { IERC725X } from "@erc725/smart-contracts/contracts/interfaces/IERC725X.sol"; -import {ILSP6KeyManager} from "../../LSP6KeyManager/ILSP6KeyManager.sol"; +import { + ILSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/ILSP6KeyManager.sol"; import { ILSP1UniversalReceiverDelegate -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; // modules import {ERC725Y} from "@erc725/smart-contracts/contracts/ERC725Y.sol"; @@ -20,15 +22,15 @@ import { // constants import { _TYPEID_LSP7_TOKENSRECIPIENT -} from "../../LSP7DigitalAsset/LSP7Constants.sol"; +} from "@lukso/lsp7-contracts/contracts/LSP7Constants.sol"; import { _TYPEID_LSP8_TOKENSRECIPIENT -} from "../../LSP8IdentifiableDigitalAsset/LSP8Constants.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8Constants.sol"; import { _INTERFACEID_LSP1_DELEGATE -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultMalicious.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultMalicious.sol similarity index 94% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultMalicious.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultMalicious.sol index 5d943463e..8ecb0556e 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultMalicious.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultMalicious.sol @@ -11,7 +11,7 @@ import { import { ILSP1UniversalReceiverDelegate -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; // modules import { @@ -23,14 +23,14 @@ import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import { _INTERFACEID_LSP1_DELEGATE, _LSP1_UNIVERSAL_RECEIVER_DELEGATE_PREFIX -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PREFIX -} from "../../LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; import { _LSP17_EXTENSION_PREFIX -} from "../../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; /** * @dev This contract is used only for testing diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantA.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantA.sol similarity index 88% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantA.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantA.sol index 4e468f9c5..b2edd5b43 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantA.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantA.sol @@ -7,7 +7,7 @@ import { } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; import { ILSP1UniversalReceiverDelegate -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; // modules import { @@ -17,7 +17,7 @@ import { // constants import { _INTERFACEID_LSP1_DELEGATE -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantB.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantB.sol similarity index 88% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantB.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantB.sol index 114806f0b..b2c72e19b 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantB.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultReentrantB.sol @@ -7,7 +7,7 @@ import { } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; import { ILSP1UniversalReceiverDelegate -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; // modules import { @@ -17,7 +17,7 @@ import { // constants import { _INTERFACEID_LSP1_DELEGATE -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultSetter.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultSetter.sol similarity index 93% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultSetter.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultSetter.sol index b2f134c70..1ff98862f 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultSetter.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverDelegateVaultSetter.sol @@ -14,7 +14,7 @@ import { // constants import { _INTERFACEID_LSP1_DELEGATE -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; /** * @dev This contract is used only for testing purposes diff --git a/contracts/Mocks/UniversalReceivers/UniversalReceiverTester.sol b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverTester.sol similarity index 94% rename from contracts/Mocks/UniversalReceivers/UniversalReceiverTester.sol rename to packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverTester.sol index 0d2880b76..96ddd08d0 100644 --- a/contracts/Mocks/UniversalReceivers/UniversalReceiverTester.sol +++ b/packages/lsp-smart-contracts/contracts/Mocks/UniversalReceivers/UniversalReceiverTester.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.4; // interfaces import { ILSP1UniversalReceiver -} from "../../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; /** * @dev This contract is used only for testing purposes diff --git a/packages/lsp-smart-contracts/contracts/UniversalProfile.sol b/packages/lsp-smart-contracts/contracts/UniversalProfile.sol new file mode 100644 index 000000000..07e4e7598 --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/UniversalProfile.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/universalprofile-contracts/contracts/UniversalProfile.sol"; diff --git a/packages/lsp-smart-contracts/contracts/UniversalProfileInit.sol b/packages/lsp-smart-contracts/contracts/UniversalProfileInit.sol new file mode 100644 index 000000000..88085216d --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/UniversalProfileInit.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/universalprofile-contracts/contracts/UniversalProfileInit.sol"; diff --git a/packages/lsp-smart-contracts/contracts/UniversalProfileInitAbstract.sol b/packages/lsp-smart-contracts/contracts/UniversalProfileInitAbstract.sol new file mode 100644 index 000000000..0d21a346a --- /dev/null +++ b/packages/lsp-smart-contracts/contracts/UniversalProfileInitAbstract.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@lukso/universalprofile-contracts/contracts/UniversalProfileInitAbstract.sol"; diff --git a/dodoc/config.ts b/packages/lsp-smart-contracts/dodoc/config.ts similarity index 60% rename from dodoc/config.ts rename to packages/lsp-smart-contracts/dodoc/config.ts index 65662a652..0d0bec201 100644 --- a/dodoc/config.ts +++ b/packages/lsp-smart-contracts/dodoc/config.ts @@ -1,57 +1,57 @@ -import { ethers } from 'ethers'; +import { keccak256, toUtf8Bytes } from 'ethers'; import { HelperContent } from 'squirrelly/dist/types/containers'; export const dodocConfig = { runOnCompile: false, include: [ - 'contracts/UniversalProfile.sol', - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol', - 'contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol', - 'contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol', - 'contracts/LSP6KeyManager/LSP6KeyManager.sol', - 'contracts/LSP9Vault/LSP9Vault.sol', + '@lukso/universalprofile-contracts/contracts/UniversalProfile.sol', + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol', + '@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol', + '@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol', + '@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol', + '@lukso/lsp9-contracts/contracts/LSP9Vault.sol', 'contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol', - 'contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol', - 'contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol', - 'contracts/LSP17ContractExtension/LSP17Extendable.sol', - 'contracts/LSP17ContractExtension/LSP17Extension.sol', - 'contracts/LSP17Extensions/Extension4337.sol', - 'contracts/LSP17Extensions/OnERC721ReceivedExtension.sol', - 'contracts/LSP20CallVerification/LSP20CallVerification.sol', - 'contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol', - 'contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol', - 'contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol', + '@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol', + '@lukso/lsp16-contracts/contracts/LSP16UniversalFactory.sol', + '@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol', + '@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.sol', + '@lukso/lsp17-contracts/Extension4337.sol', + '@lukso/lsp17-contracts/OnERC721ReceivedExtension.sol', + '@lukso/lsp20-contracts/contracts/LSP20CallVerification.sol', + '@lukso/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol', + '@lukso/lsp23-contracts/contracts/IPostDeploymentModule.sol', + '@lukso/lsp25-contracts/contracts/LSP25MultiChannelNonce.sol', // tokens - 'contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol', - 'contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol', - 'contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol', - 'contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol', - 'contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol', - 'contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol', - 'contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol', - 'contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol', - 'contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol', - 'contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol', + '@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol', + '@lukso/lsp7-contracts/contracts/LSP7DigitalAsset.sol', + '@lukso/lsp7-contracts/contracts/extensions/LSP7Burnable.sol', + '@lukso/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol', + '@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol', + '@lukso/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol', + '@lukso/lsp8-contracts/contracts/extensions/LSP8Burnable.sol', + '@lukso/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol', + '@lukso/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol', + '@lukso/lsp8-contracts/contracts/presets/LSP8Mintable.sol', // libraries -------------------- - 'contracts/LSP1UniversalReceiver/LSP1Utils.sol', - 'contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol', - 'contracts/LSP5ReceivedAssets/LSP5Utils.sol', - 'contracts/LSP6KeyManager/LSP6Utils.sol', - 'contracts/LSP10ReceivedVaults/LSP10Utils.sol', - 'contracts/LSP17ContractExtension/LSP17Utils.sol', + '@lukso/lsp1-contracts/contracts/LSP1Utils.sol', + '@lukso/lsp2-contracts/contracts/LSP2Utils.sol', + '@lukso/lsp5-contracts/contracts/LSP5Utils.sol', + '@lukso/lsp6-contracts/contracts/LSP6Utils.sol', + '@lukso/lsp10-contracts/contracts/LSP10Utils.sol', + '@lukso/lsp17contractextension-contracts/contracts/LSP17Utils.sol', // external -------------------- '@erc725/smart-contracts/contracts/ERC725.sol', ], libraries: [ - 'contracts/LSP1UniversalReceiver/LSP1Utils.sol', - 'contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol', - 'contracts/LSP5ReceivedAssets/LSP5Utils.sol', - 'contracts/LSP6KeyManager/LSP6Utils.sol', - 'contracts/LSP10ReceivedVaults/LSP10Utils.sol', - 'contracts/LSP17ContractExtension/LSP17Utils.sol', + '@lukso/lsp1-contracts/contracts/LSP1Utils.sol', + '@lukso/lsp2-contracts/contracts/LSP2Utils.sol', + '@lukso/lsp5-contracts/contracts/LSP5Utils.sol', + '@lukso/lsp6-contracts/contracts/LSP6Utils.sol', + '@lukso/lsp10-contracts/contracts/LSP10Utils.sol', + '@lukso/lsp17contractextension-contracts/contracts/LSP17Utils.sol', ], templatePath: './dodoc/template.sqrl', helpers: [ @@ -135,6 +135,81 @@ export const dodocConfig = { }; const linkBase = 'https://github.com/lukso-network/'; +const SPECS_BASE_URI = 'https://github.com/lukso-network/LIPs/blob/main/LSPs'; +const specs = { + ERC725: { + specsName: 'ERC-725', + specsLink: 'https://github.com/ethereum/EIPs/blob/master/EIPS/eip-725.md', + }, + UniversalProfile: { + specsName: 'UniversalProfile', + specsLink: `${SPECS_BASE_URI}/LSP-3-UniversalProfile-Metadata.md`, + }, + LSP0ERC725Account: { + specsName: 'LSP-0-ERC725Account', + specsLink: `${SPECS_BASE_URI}/LSP-0-ERC725Account.md`, + }, + LSP1UniversalReceiver: { + specsName: 'LSP-1-UniversalReceiver', + specsLink: `${SPECS_BASE_URI}/LSP-1-UniversalReceiver.md`, + }, + LSP2ERC725YJSONSchema: { + specsName: 'LSP-2-ERC725YJSONSchema', + specsLink: `${SPECS_BASE_URI}/LSP-2-ERC725YJSONSchema.md`, + }, + LSP4DigitalAssetMetadata: { + specsName: 'LSP-4-DigitalAsset-Metadata', + specsLink: `${SPECS_BASE_URI}/LSP-4-DigitalAsset-Metadata.md`, + }, + LSP5ReceivedAssets: { + specsName: 'LSP-5-ReceivedAssets', + specsLink: `${SPECS_BASE_URI}/LSP-5-ReceivedAssets.md`, + }, + LSP6KeyManager: { + specsName: 'LSP-6-KeyManager', + specsLink: `${SPECS_BASE_URI}/LSP-6-KeyManager.md`, + }, + LSP7DigitalAsset: { + specsName: 'LSP-7-DigitalAsset', + specsLink: `${SPECS_BASE_URI}/LSP-7-DigitalAsset.md`, + }, + LSP8IdentifiableDigitalAsset: { + specsName: 'LSP-8-IdentifiableDigitalAsset', + specsLink: `${SPECS_BASE_URI}/LSP-8-IdentifiableDigitalAsset.md`, + }, + LSP9Vault: { + specsName: 'LSP-9-Vault', + specsLink: `${SPECS_BASE_URI}/LSP-9-Vault.md`, + }, + LSP10ReceivedVaults: { + specsName: 'LSP-10-ReceivedVaults', + specsLink: `${SPECS_BASE_URI}/LSP-10-ReceivedVaults.md`, + }, + LSP11BasicSocialRecovery: { + specsName: 'LSP-11-BasicSocialRecovery', + specsLink: `${SPECS_BASE_URI}/LSP-11-BasicSocialRecovery.md`, + }, + LSP14Ownable2Step: { + specsName: 'LSP-14-Ownable2Step', + specsLink: `${SPECS_BASE_URI}/LSP-14-Ownable2Step.md`, + }, + LSP17ContractExtension: { + specsName: 'LSP-17-ContractExtension', + specsLink: `${SPECS_BASE_URI}/LSP-17-ContractExtension.md`, + }, + LSP20CallVerification: { + specsName: 'LSP-20-CallVerification', + specsLink: `${SPECS_BASE_URI}/LSP-20-CallVerification.md`, + }, + LSP23LinkedContractsFactory: { + specsName: 'LSP-23-LinkedContractsFactory', + specsLink: `${SPECS_BASE_URI}/LSP-23-LinkedContractsFactory.md`, + }, + LSP25ExecuteRelayCall: { + specsName: 'LSP-25-ExecuteRelayCall', + specsLink: `${SPECS_BASE_URI}/LSP-25-ExecuteRelayCall.md`, + }, +}; const createLocalLinks = (textToFormat: string) => { let formatedText = textToFormat; @@ -256,9 +331,7 @@ const generateAdditionalMethodInfo = (contract: string, code: string) => { ) { infoBlock += `- Function signature: \`${formatedCode}\`\n` + - `- Function selector: \`${ethers.utils - .keccak256(ethers.utils.toUtf8Bytes(formatedCode)) - .substring(0, 10)}\``; + `- Function selector: \`${keccak256(toUtf8Bytes(formatedCode)).substring(0, 10)}\``; } return infoBlock; @@ -275,7 +348,7 @@ const generateAdditionalEventInfo = (contract: string, code: string) => { .toLowerCase()})\n` + `- Solidity implementation: [\`${contract}.sol\`](${contractLink})\n` + `- Event signature: \`${formatedCode}\`\n` + - `- Event topic hash: \`${ethers.utils.keccak256(ethers.utils.toUtf8Bytes(formatedCode))}\`` + `- Event topic hash: \`${keccak256(toUtf8Bytes(formatedCode))}\`` ); }; @@ -290,9 +363,7 @@ const generateAdditionalErrorInfo = (contract: string, code: string) => { .toLowerCase()})\n` + `- Solidity implementation: [\`${contract}.sol\`](${contractLink})\n` + `- Error signature: \`${formatedCode}\`\n` + - `- Error hash: \`${ethers.utils - .keccak256(ethers.utils.toUtf8Bytes(formatedCode)) - .substring(0, 10)}\`` + `- Error hash: \`${keccak256(toUtf8Bytes(formatedCode)).substring(0, 10)}\`` ); }; @@ -313,33 +384,35 @@ const generateContractLink = (contractName: string) => { }; const generateContractSpecsDetails = (contractName: string) => { - if (contractName === 'UniversalProfile') { - return { - specsName: `${contractName}`, - specsLink: `${linkBase}lips/tree/main/LSPs/LSP-3-UniversalProfile-Metadata.md`, - }; + const lspN = contractName.match(/LSP\d+/); + + if (specs[contractName]) { + return specs[contractName]; + } else if (lspN && lspN[0] === 'LSP1') { + return specs['LSP1UniversalReceiver']; + } else if (lspN && lspN[0] === 'LSP2') { + return specs['LSP2ERC725YJSONSchema']; + } else if (lspN && lspN[0] === 'LSP5') { + return specs['LSP5ReceivedAssets']; + } else if (lspN && lspN[0] === 'LSP6') { + return specs['LSP6KeyManager']; + } else if (lspN && lspN[0] === 'LSP7') { + return specs['LSP7DigitalAsset']; + } else if (lspN && lspN[0] === 'LSP8') { + return specs['LSP8IdentifiableDigitalAsset']; + } else if (lspN && lspN[0] === 'LSP10') { + return specs['LSP10ReceivedVaults']; + } else if (lspN && lspN[0] === 'LSP17') { + return specs['LSP17ContractExtension']; + } else if (lspN && lspN[0] === 'LSP23') { + return specs['LSP23LinkedContractsFactory']; + } else if (lspN && lspN[0] === 'LSP25') { + return specs['LSP25ExecuteRelayCall']; + } else if (contractName === 'IPostDeploymentModule') { + return specs['LSP23LinkedContractsFactory']; + } else { + console.error(`Specs for '${contractName}' not found.`); } - - if (contractName === 'ERC725') { - return { - specsName: 'ERC-725', - specsLink: 'https://github.com/ethereum/EIPs/blob/master/EIPS/eip-725.md', - }; - } - - const contractPath = dodocConfig.include.filter((value) => { - if (value.endsWith(`${contractName}.sol`)) return value; - })[0]; - - const specs = contractPath.split('/')[1]; - - const specsName = `LSP-${specs.match(/\d+/)[0]}-${specs.split(/LSP\d+/)[1]}`; - - const specsLink = `${linkBase}lips/tree/main/LSPs/LSP-${specs.match(/\d+/)[0]}-${ - specs.split(/LSP\d+/)[1] - }.md`; - - return { specsName, specsLink }; }; const formatDisplayedCode = (textToFormat: string) => { diff --git a/dodoc/template.sqrl b/packages/lsp-smart-contracts/dodoc/template.sqrl similarity index 100% rename from dodoc/template.sqrl rename to packages/lsp-smart-contracts/dodoc/template.sqrl diff --git a/packages/lsp-smart-contracts/gas_benchmark_result.json b/packages/lsp-smart-contracts/gas_benchmark_result.json new file mode 100644 index 000000000..e21f05d3e --- /dev/null +++ b/packages/lsp-smart-contracts/gas_benchmark_result.json @@ -0,0 +1,204 @@ +{ + "deployment_costs": { + "UniversalProfile": "", + "KeyManager": "", + "LSP1DelegateUP": "", + "LSP7Mintable": "", + "LSP8Mintable": "" + }, + "runtime_costs": { + "EOA_owner": { + "execute": { + "case_1": { + "description": "Transfer 1 LYX to an EOA without data", + "gas_cost": "" + }, + "case_2": { + "description": "Transfer 1 LYX to a UP without data", + "gas_cost": "" + }, + "case_3": { + "description": "Transfer 1 LYX to an EOA with 256 bytes of data", + "gas_cost": "" + }, + "case_4": { + "description": "Transfer 1 LYX to a UP with 256 bytes of data", + "gas_cost": "" + }, + "case_5": { + "description": "Transfer 0.1 LYX to 3x EOA without data", + "gas_cost": "" + }, + "case_6": { + "description": "Transfer 0.1 LYX to 3x UP without data", + "gas_cost": "" + }, + "case_7": { + "description": "Transfer 0.1 LYX to 3x EOA with 256 bytes of data", + "gas_cost": "" + }, + "case_8": { + "description": "Transfer 0.1 LYX to 3x UPs with 256 bytes of data", + "gas_cost": "" + } + }, + "setData": { + "case_1": { + "description": "Set a 20 bytes long value", + "gas_cost": "" + }, + "case_2": { + "description": "Set a 60 bytes long value", + "gas_cost": "" + }, + "case_3": { + "description": "Set a 160 bytes long value", + "gas_cost": "" + }, + "case_4": { + "description": "Set a 300 bytes long value", + "gas_cost": "" + }, + "case_5": { + "description": "Set a 600 bytes long value", + "gas_cost": "" + }, + "case_6": { + "description": "Change the value of a data key already set", + "gas_cost": "" + }, + "case_7": { + "description": "Remove the value of a data key already set", + "gas_cost": "" + }, + "case_8": { + "description": "Set 2 data keys of 20 bytes long value", + "gas_cost": "" + }, + "case_9": { + "description": "Set 2 data keys of 100 bytes long value", + "gas_cost": "" + }, + "case_10": { + "description": "Set 3 data keys of 20 bytes long value", + "gas_cost": "" + }, + "case_11": { + "description": "Change the value of three data keys already set of 20 bytes long value", + "gas_cost": "" + }, + "case_12": { + "description": "Remove the value of three data keys already set", + "gas_cost": "" + } + }, + "tokens": { + "case_1": { + "description": "Minting a LSP7Token to a UP (No Delegate) from an EOA", + "gas_cost": "" + }, + "case_2": { + "description": "Minting a LSP7Token to an EOA from an EOA", + "gas_cost": "" + }, + "case_3": { + "description": "Transferring an LSP7Token from a UP to another UP (No Delegate)", + "gas_cost": "" + }, + "case_4": { + "description": "Minting a LSP8Token to a UP (No Delegate) from an EOA ", + "gas_cost": "" + }, + "case_5": { + "description": "Minting a LSP8Token to an EOA from an EOA ", + "gas_cost": "" + }, + "case_6": { + "description": "Transferring an LSP8Token from a UP to another UP (No Delegate)", + "gas_cost": "" + } + } + }, + "KeyManager_owner": { + "execute": { + "case_1": { + "description": "LYX transfer --> to an EOA", + "main_controller": "", + "restricted_controller": "" + }, + "case_2": { + "description": "LYX transfer --> to a UP", + "main_controller": "", + "restricted_controller": "" + }, + "case_3": { + "description": "LSP7 token transfer --> to an EOA", + "main_controller": "", + "restricted_controller": "" + }, + "case_4": { + "description": "LSP7 token transfer --> to a UP", + "main_controller": "", + "restricted_controller": "" + }, + "case_5": { + "description": "LSP8 NFT transfer --> to an EOA", + "main_controller": "", + "restricted_controller": "" + }, + "case_6": { + "description": "LSP8 NFT transfer --> to a UP", + "main_controller": "", + "restricted_controller": "" + } + }, + "setData": { + "case_1": { + "description": "Update Profile details (LSP3Profile Metadata)", + "main_controller": "", + "restricted_controller": "" + }, + "case_2": { + "description": "Add a new controller with permission to `SET_DATA` + 3x allowed data keys:
`AddressPermissions[]`
+ `AddressPermissions[index]`
+ `AddressPermissions:Permissions:`
+ `AddressPermissions:AllowedERC725YDataKeys: 1. decrease `AddressPermissions[]` Array length
2. remove the controller address at `AddressPermissions[index]`
3. set \"0x\" for the controller permissions under AddressPermissions:Permissions:", + "main_controller": "", + "restricted_controller": "" + }, + "case_5": { + "description": "Write 5x new LSP12 Issued Assets", + "main_controller": "", + "restricted_controller": "" + }, + "case_6": { + "description": "Update 3x data keys (first 3)", + "main_controller": "", + "restricted_controller": "" + }, + "case_7": { + "description": "Update 3x data keys (middle 3)", + "main_controller": "", + "restricted_controller": "" + }, + "case_8": { + "description": "Update 3x data keys (last 3)", + "main_controller": "", + "restricted_controller": "" + }, + "case_9": { + "description": "Set 2 x new data keys + add 3x new controllers", + "main_controller": "", + "restricted_controller": "" + } + } + } + } +} \ No newline at end of file diff --git a/hardhat.config.ts b/packages/lsp-smart-contracts/hardhat.config.ts similarity index 96% rename from hardhat.config.ts rename to packages/lsp-smart-contracts/hardhat.config.ts index 1533e65c3..1a29755de 100644 --- a/hardhat.config.ts +++ b/packages/lsp-smart-contracts/hardhat.config.ts @@ -175,18 +175,13 @@ const config: HardhatUserConfig = { 'LSP8MintableInit', 'LSP9VaultInit', 'LSP11BasicSocialRecoveryInit', - // Legacy L14 - // ------------------ - 'UniversalReceiverAddressStore', // Tools // ------------------ - 'Create2Factory', - 'LSP16UniversalFactory', 'LSP23LinkedContractsFactory', ], // Whether to include the TypeChain factories or not. // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. - includeFactories: true, + // includeFactories: true, }, paths: { artifacts: 'artifacts', @@ -194,7 +189,7 @@ const config: HardhatUserConfig = { }, typechain: { outDir: 'types', - target: 'ethers-v5', + target: 'ethers-v6', }, dodoc: dodocConfig, }; diff --git a/packages/lsp-smart-contracts/index.ts b/packages/lsp-smart-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp-smart-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp-smart-contracts/package.json b/packages/lsp-smart-contracts/package.json new file mode 100644 index 000000000..5a341aa4a --- /dev/null +++ b/packages/lsp-smart-contracts/package.json @@ -0,0 +1,93 @@ +{ + "name": "@lukso/lsp-smart-contracts", + "version": "0.12.1", + "description": "The reference smart contract implementation for the LUKSO LSP standards", + "license": "Apache-2.0", + "author": "", + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "directories": { + "test": "tests" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md", + "./CONTRIBUTING.md", + "./LICENSE" + ], + "main": "./dist/constants.cjs", + "module": "./dist/constants.mjs", + "typings": "./dist/constants.d.ts", + "exports": { + ".": { + "require": "./dist/constants.cjs", + "import": "./dist/constants.mjs", + "types": "./dist/constants.d.ts" + }, + "./constants.js": { + "require": "./dist/constants.cjs", + "import": "./dist/constants.mjs", + "types": "./dist/constants.d.ts" + }, + "./constants": { + "require": "./dist/constants.cjs", + "import": "./dist/constants.mjs", + "types": "./dist/constants.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./dist/*": "./dist/*", + "./package.json": "./package.json" + }, + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:foundry": "forge build", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "build:docs": "hardhat dodoc && prettier -w ./docs", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'", + "package": "hardhat prepare-package", + "test": "hardhat test --no-compile tests/**/*.test.ts", + "test:foundry": "FOUNDRY_PROFILE=lsp_smart_contracts forge test --no-match-test Skip -vvv", + "test:coverage": "hardhat coverage", + "test:benchmark": "hardhat test --no-compile tests/Benchmark.test.ts" + }, + "dependencies": { + "@lukso/lsp0-contracts": "*", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp10-contracts": "*", + "@lukso/lsp12-contracts": "*", + "@lukso/lsp14-contracts": "*", + "@lukso/lsp16-contracts": "*", + "@lukso/lsp17-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp1delegate-contracts": "*", + "@lukso/lsp2-contracts": "*", + "@lukso/lsp20-contracts": "*", + "@lukso/lsp23-contracts": "*", + "@lukso/lsp25-contracts": "*", + "@lukso/lsp3-contracts": "*", + "@lukso/lsp4-contracts": "*", + "@lukso/lsp5-contracts": "*", + "@lukso/lsp6-contracts": "*", + "@lukso/lsp7-contracts": "*", + "@lukso/lsp8-contracts": "*", + "@lukso/lsp9-contracts": "*", + "@lukso/universalprofile-contracts": "*" + } +} diff --git a/scripts/ci/README.md b/packages/lsp-smart-contracts/scripts/ci/README.md similarity index 100% rename from scripts/ci/README.md rename to packages/lsp-smart-contracts/scripts/ci/README.md diff --git a/scripts/ci/check-deployer-balance.ts b/packages/lsp-smart-contracts/scripts/ci/check-deployer-balance.ts similarity index 83% rename from scripts/ci/check-deployer-balance.ts rename to packages/lsp-smart-contracts/scripts/ci/check-deployer-balance.ts index 930a90dbe..19d62ab9a 100644 --- a/scripts/ci/check-deployer-balance.ts +++ b/packages/lsp-smart-contracts/scripts/ci/check-deployer-balance.ts @@ -20,7 +20,7 @@ task( // the CI deploys all the contracts, so we need to make sure that the deployer has enough balance // each contract to deploy costs around 0.02 - 0.03 LYXe - const MINIMUM_DEPLOYER_BALANCE = ethers.utils.parseUnits('0.1', 'ether'); + const MINIMUM_DEPLOYER_BALANCE = ethers.parseUnits('0.1', 'ether'); const deployerAddress = wallet.address; @@ -28,9 +28,9 @@ task( // via `npx hardhat verify-balance --network ` const deployerBalance = await hre.ethers.provider.getBalance(deployerAddress); - if (deployerBalance.lt(MINIMUM_DEPLOYER_BALANCE)) { + if (deployerBalance < MINIMUM_DEPLOYER_BALANCE) { throw new Error( - `❌ Deployer balance is too low: ${ethers.utils.formatEther( + `❌ Deployer balance is too low: ${ethers.formatEther( deployerBalance, )} LYXe left. Please fund the deployer address ${deployerAddress} on LUKSO Testnet.`, ); @@ -38,7 +38,7 @@ task( console.log( `✅ Deployer balance sufficient to deploy + verify contracts on LUKSO Testnet. Deployer address: ${deployerAddress} - Balance: ${ethers.utils.formatEther(deployerBalance)} LYXe`, + Balance: ${ethers.formatEther(deployerBalance)} LYXe`, ); } }); diff --git a/scripts/ci/docs-generate.ts b/packages/lsp-smart-contracts/scripts/ci/docs-generate.ts similarity index 98% rename from scripts/ci/docs-generate.ts rename to packages/lsp-smart-contracts/scripts/ci/docs-generate.ts index da9dafee3..f736a607e 100644 --- a/scripts/ci/docs-generate.ts +++ b/packages/lsp-smart-contracts/scripts/ci/docs-generate.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import path from 'path'; import { task } from 'hardhat/config'; import { TASK_COMPILE } from 'hardhat/builtin-tasks/task-names'; -import { ethers } from 'ethers'; +import { keccak256, toUtf8Bytes } from 'ethers'; import pluralize from 'pluralize'; import { mkdir, rm, stat, writeFile } from 'fs/promises'; import { CompilerOutputContract } from 'hardhat/types'; @@ -239,7 +239,7 @@ task('ts-gen', 'Generate NatSpec documentation automatically on compilation') } = allMembers; for (const [sig, member] of Object.entries(allMembers)) { - const hash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(sig)); + const hash = keccak256(toUtf8Bytes(sig)); member.hash = member.type === 'event' ? hash : hash.slice(0, 10); } diff --git a/scripts/ci/gas_benchmark.ts b/packages/lsp-smart-contracts/scripts/ci/gas_benchmark.ts similarity index 100% rename from scripts/ci/gas_benchmark.ts rename to packages/lsp-smart-contracts/scripts/ci/gas_benchmark.ts diff --git a/scripts/ci/gas_benchmark_template.json b/packages/lsp-smart-contracts/scripts/ci/gas_benchmark_template.json similarity index 100% rename from scripts/ci/gas_benchmark_template.json rename to packages/lsp-smart-contracts/scripts/ci/gas_benchmark_template.json diff --git a/scripts/ci/verify-all-contracts.ts b/packages/lsp-smart-contracts/scripts/ci/verify-all-contracts.ts similarity index 100% rename from scripts/ci/verify-all-contracts.ts rename to packages/lsp-smart-contracts/scripts/ci/verify-all-contracts.ts diff --git a/scripts/fix_flattener.js b/packages/lsp-smart-contracts/scripts/fix_flattener.js similarity index 100% rename from scripts/fix_flattener.js rename to packages/lsp-smart-contracts/scripts/fix_flattener.js diff --git a/scripts/interfaceIds.ts b/packages/lsp-smart-contracts/scripts/interfaceIds.ts similarity index 71% rename from scripts/interfaceIds.ts rename to packages/lsp-smart-contracts/scripts/interfaceIds.ts index fb6c79a1a..f528ce104 100644 --- a/scripts/interfaceIds.ts +++ b/packages/lsp-smart-contracts/scripts/interfaceIds.ts @@ -59,8 +59,8 @@ async function main() { folder = contract; } - const source = `contracts/${folder}/${lspInterface}.sol:${lspInterface}`; - const build = await hre.artifacts.getBuildInfo(source); + let source = `contracts/${folder}/${lspInterface}.sol:${lspInterface}`; + let build = await hre.artifacts.getBuildInfo(source); const [path] = source.split(':'); @@ -68,15 +68,29 @@ async function main() { if (!devdoc) { // search in the first implementation contract - const source = `contracts/${folder}/${contract}.sol:${contract}`; - const build = await hre.artifacts.getBuildInfo(source); + source = `contracts/${folder}/${contract}.sol:${contract}`; + build = await hre.artifacts.getBuildInfo(source); - const [path] = source.split(':'); + let contractDevDoc; - const contractDevDoc = build?.output?.contracts?.[path]?.[contract]['devdoc']; + // otherwise search in the `lsp` package + if (build == undefined) { + const lspNumber = lspInterface.match(/\d+/); + + if (lspNumber != null) { + source = `lsp${lspNumber}/contracts/${lspInterface}.sol:${lspInterface}`; + build = await hre.artifacts.getBuildInfo(source); + const [path] = source.split(':'); + contractDevDoc = build?.output?.contracts?.[path]?.[lspInterface]['devdoc']; + } + } else { + const [path] = source.split(':'); + + contractDevDoc = build?.output?.contracts?.[path]?.[contract]['devdoc']; + } if (contractDevDoc == undefined) { - throw new Error(`No devdoc for ${contract}`); + throw new Error(`No devdoc for ${contract} at path ${path}`); } if (contractDevDoc.hasOwnProperty('title')) { diff --git a/packages/lsp-smart-contracts/scripts/typesTs.sh b/packages/lsp-smart-contracts/scripts/typesTs.sh new file mode 100755 index 000000000..6b80df7c7 --- /dev/null +++ b/packages/lsp-smart-contracts/scripts/typesTs.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash + +# This script will gather `types/` files from all pkgs & aggregate them into 1 `types/index.ts` file +# This script runs automatically after each `npm run build` + +# output file +outputFileType="./types/index.ts" + +# create file if not exists +if [ ! -f "$outputFileType" ]; then + mkdir ./types + echo "" >> $outputFileType +fi + +# file headers +echo -e "/* File generated by scripts/typesTs.sh. Do not edit manually. */\n/* tslint:disable */\n/* eslint-disable */\n" > $outputFileType + +# Helper function to loop through a directory and add each ts file in the outputFileType +# Parameter: +# 1) path to directory +# 2) type of path (contract or factory) +# 3) depth to search in the directory +# Return: +# nothing, output is in the outputFileType +loop_through () { + local searchPath="$1" + local exportType="$2" + local noDepth="$3" + # Check if the given path is a directory + if [ -d "$searchPath" ]; then + # wether to just search in the given directory ... + if [ "$noDepth" = "true" ]; then + cmd=$(find "$searchPath" -type f -regex ".*ts$" ! -regex ".*index\.ts" ! -regex ".*common\.ts" ! -regex ".*hardhat\.d\.ts" -maxdepth 1) + # ... or in all subdirectories + else + cmd=$(find "$searchPath" -type f -regex ".*ts$" ! -regex ".*index\.ts" ! -regex ".*common\.ts" ! -regex ".*hardhat\.d\.ts") + fi + # Loop through all .ts files in the directory & sub-directories + for tsFile in $cmd; do + # replace ./ by ../ + itemPath=${tsFile/.\//../} + # remove .ts extention + pathNoExt=${itemPath/.ts/} + # module name only + moduleName=$(basename $pathNoExt) + echo "🔁 Processing '${pathNoExt}'" + if [ "$exportType" = "factory" ]; then + echo -e "export { ${moduleName} } from \"${pathNoExt}\";" >> $outputFileType + else + echo -e "export type { ${moduleName} } from \"${pathNoExt}\";" >> $outputFileType + fi + done + fi +} + +# integration-tests folder +testFolder="./integration-tests" +if [[ -d "${testFolder}/types/contracts" && -d "${testFolder}/types/factories/contracts" ]]; then + loop_through "$testFolder/types/contracts" "contract" "false" + loop_through "$testFolder/types/factories/contracts" "factory" "false" +fi + +# For all folders in packages/ except lsp-utils +for dir in $(find ./packages -type d -maxdepth 1 ! -regex '.*lsp-utils.*'); do + # if 'types' folder doesn't exists, continue + if [ ! -d "${dir}/types" ]; then + echo "📂❌ Directory ${dir} has no types. skipping" + continue + fi + # if 'types/contracts' folder exists, process it + if [ -d "${dir}/types/contracts" ]; then + echo "📂 Processing '${dir}' 📑" + loop_through "$dir/types/contracts" "contract" "false" + # 'types' folder exists, but no 'contracts' folder in it + # process the root folder (depth 1) + else + echo "📂 No 'contracts' directory in ${dir}/types. Processing root." + loop_through "$dir/types" "contract" "true" + fi + + # if 'types/factories/contracts' folder exists, process it + if [ -d "${dir}/types/factories/contracts" ]; then + echo "📂 Processing '${dir}' 🏭" + loop_through "$dir/types/factories/contracts" "factory" "false" + # 'types' folder exists, but no 'contracts' folder in it + # process the root folder (depth 1) + else + echo "📂 No 'contracts' directory in ${dir}/types/factories. Processing root." + loop_through "$dir/types/factories" "contract" "true" + fi +done + diff --git a/tests/Benchmark.test.ts b/packages/lsp-smart-contracts/tests/Benchmark.test.ts similarity index 82% rename from tests/Benchmark.test.ts rename to packages/lsp-smart-contracts/tests/Benchmark.test.ts index 48418fa73..98f4427ed 100644 --- a/tests/Benchmark.test.ts +++ b/packages/lsp-smart-contracts/tests/Benchmark.test.ts @@ -1,29 +1,25 @@ import fs from 'fs'; import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { - LSP1UniversalReceiverDelegateUP, - LSP1UniversalReceiverDelegateUP__factory, - LSP6KeyManager__factory, LSP7Mintable, LSP7Mintable__factory, - LSP8Mintable, - LSP8Mintable__factory, + LSP1UniversalReceiverDelegateUP, + LSP1UniversalReceiverDelegateUP__factory, UniversalProfile, UniversalProfile__factory, + LSP6KeyManager__factory, + LSP8Mintable__factory, + LSP8Mintable, } from '../types'; -import { - ERC725YDataKeys, - INTERFACE_IDS, - OPERATION_TYPES, - PERMISSIONS, - CALLTYPE, - LSP8_TOKEN_ID_FORMAT, - LSP4_TOKEN_TYPES, -} from '../constants'; +import { ERC725YDataKeys, INTERFACE_IDS } from '../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; import { LSP6TestContext } from './utils/context'; import { setupKeyManager, setupProfileWithKeyManagerWithURD } from './utils/fixtures'; import { @@ -32,20 +28,19 @@ import { combinePermissions, encodeCompactBytesArray, } from './utils/helpers'; -import { BigNumber } from 'ethers'; export type UniversalProfileContext = { accounts: SignerWithAddress[]; mainController: SignerWithAddress; universalProfile: UniversalProfile; - initialFunding?: BigNumber; + initialFunding?: bigint; }; function generateRandomData(length) { - return ethers.utils.hexlify(ethers.utils.randomBytes(length)); + return ethers.hexlify(ethers.randomBytes(length)); } -const buildLSP6TestContext = async (initialFunding?: BigNumber): Promise => { +const buildLSP6TestContext = async (initialFunding?: bigint): Promise => { const accounts = await ethers.getSigners(); const mainController = accounts[0]; @@ -56,14 +51,14 @@ const buildLSP6TestContext = async (initialFunding?: BigNumber): Promise => { const accounts = await ethers.getSigners(); const mainController = accounts[0]; @@ -98,31 +93,34 @@ describe('⛽📊 Gas Benchmark', () => { accounts[0].address, ); - const universalProfileDeployTransaction = universalProfile.deployTransaction; + const universalProfileDeployTransaction = universalProfile.deploymentTransaction(); const universalProfileDeploymentReceipt = await universalProfileDeployTransaction.wait(); - gasBenchmark['deployment_costs']['UniversalProfile'] = - universalProfileDeploymentReceipt.gasUsed.toNumber(); + gasBenchmark['deployment_costs']['UniversalProfile'] = ethers.toNumber( + universalProfileDeploymentReceipt.gasUsed, + ); // Key Manager const keyManager = await new LSP6KeyManager__factory(accounts[0]).deploy( - universalProfile.address, + universalProfile.target, ); - const keyManagerDeployTransaction = keyManager.deployTransaction; + const keyManagerDeployTransaction = keyManager.deploymentTransaction(); const keyManagerDeploymentReceipt = await keyManagerDeployTransaction?.wait(); - gasBenchmark['deployment_costs']['KeyManager'] = - keyManagerDeploymentReceipt?.gasUsed.toNumber(); + gasBenchmark['deployment_costs']['KeyManager'] = ethers.toNumber( + keyManagerDeploymentReceipt?.gasUsed, + ); // LSP1 Delegate const lsp1Delegate = await new LSP1UniversalReceiverDelegateUP__factory(accounts[0]).deploy(); - const lsp1DelegateDeployTransaction = lsp1Delegate.deployTransaction; + const lsp1DelegateDeployTransaction = lsp1Delegate.deploymentTransaction(); const lsp1DelegateDeploymentReceipt = await lsp1DelegateDeployTransaction.wait(); - gasBenchmark['deployment_costs']['LSP1DelegateUP'] = - lsp1DelegateDeploymentReceipt.gasUsed.toNumber(); + gasBenchmark['deployment_costs']['LSP1DelegateUP'] = ethers.toNumber( + lsp1DelegateDeploymentReceipt.gasUsed, + ); // LSP7 Token (Mintable preset) const lsp7Mintable = await new LSP7Mintable__factory(accounts[0]).deploy( @@ -133,10 +131,12 @@ describe('⛽📊 Gas Benchmark', () => { false, ); - const lsp7DeployTransaction = lsp7Mintable.deployTransaction; + const lsp7DeployTransaction = lsp7Mintable.deploymentTransaction(); const lsp7DeploymentReceipt = await lsp7DeployTransaction.wait(); - gasBenchmark['deployment_costs']['LSP7Mintable'] = lsp7DeploymentReceipt.gasUsed.toNumber(); + gasBenchmark['deployment_costs']['LSP7Mintable'] = ethers.toNumber( + lsp7DeploymentReceipt.gasUsed, + ); // LSP8 NFT (Mintable preset) const lsp8Mintable = await new LSP8Mintable__factory(accounts[0]).deploy( @@ -147,10 +147,12 @@ describe('⛽📊 Gas Benchmark', () => { LSP8_TOKEN_ID_FORMAT.NUMBER, ); - const lsp8DeployTransaction = lsp8Mintable.deployTransaction; + const lsp8DeployTransaction = lsp8Mintable.deploymentTransaction(); const lsp8DeploymentReceipt = await lsp8DeployTransaction.wait(); - gasBenchmark['deployment_costs']['LSP8Mintable'] = lsp8DeploymentReceipt.gasUsed.toNumber(); + gasBenchmark['deployment_costs']['LSP8Mintable'] = ethers.toNumber( + lsp8DeploymentReceipt.gasUsed, + ); }); }); @@ -160,7 +162,7 @@ describe('⛽📊 Gas Benchmark', () => { describe('execute', () => { describe('execute Single', () => { before(async () => { - context = await buildUniversalProfileContext(ethers.utils.parseEther('50')); + context = await buildUniversalProfileContext(ethers.parseEther('50')); }); it('Transfer 1 LYX to an EOA without data', async () => { @@ -169,14 +171,14 @@ describe('⛽📊 Gas Benchmark', () => { .execute( OPERATION_TYPES.CALL, context.accounts[1].address, - ethers.utils.parseEther('1'), + ethers.parseEther('1'), '0x', ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['execute']['case_1']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Transfer 1 LYX to a UP without data', async () => { @@ -184,15 +186,15 @@ describe('⛽📊 Gas Benchmark', () => { .connect(context.mainController) .execute( OPERATION_TYPES.CALL, - context.universalProfile.address, - ethers.utils.parseEther('1'), + await context.universalProfile.getAddress(), + ethers.parseEther('1'), '0x', ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['execute']['case_2']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Transfer 1 LYX to an EOA with 256 bytes of data', async () => { @@ -201,14 +203,14 @@ describe('⛽📊 Gas Benchmark', () => { .execute( OPERATION_TYPES.CALL, context.accounts[1].address, - ethers.utils.parseEther('1'), + ethers.parseEther('1'), generateRandomData(256), ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['execute']['case_3']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Transfer 1 LYX to a UP with 256 bytes of data', async () => { @@ -216,15 +218,15 @@ describe('⛽📊 Gas Benchmark', () => { .connect(context.mainController) .execute( OPERATION_TYPES.CALL, - context.universalProfile.address, - ethers.utils.parseEther('1'), - ethers.utils.hexConcat(['0x00000000', generateRandomData(252)]), + await context.universalProfile.getAddress(), + ethers.parseEther('1'), + ethers.concat(['0x00000000', generateRandomData(252)]), ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['execute']['case_4']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); }); @@ -232,7 +234,7 @@ describe('⛽📊 Gas Benchmark', () => { let universalProfile1: UniversalProfile, universalProfile2, universalProfile3; before(async () => { - context = await buildUniversalProfileContext(ethers.utils.parseEther('50')); + context = await buildUniversalProfileContext(ethers.parseEther('50')); universalProfile1 = await new UniversalProfile__factory(context.mainController).deploy( context.accounts[2].address, @@ -257,18 +259,14 @@ describe('⛽📊 Gas Benchmark', () => { context.accounts[2].address, context.accounts[3].address, ], - [ - ethers.utils.parseEther('0.1'), - ethers.utils.parseEther('0.1'), - ethers.utils.parseEther('0.1'), - ], + [ethers.parseEther('0.1'), ethers.parseEther('0.1'), ethers.parseEther('0.1')], ['0x', '0x', '0x'], ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['execute']['case_5']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Transfer 0.1 LYX to 3x UP without data', async () => { @@ -276,19 +274,15 @@ describe('⛽📊 Gas Benchmark', () => { .connect(context.mainController) .executeBatch( [OPERATION_TYPES.CALL, OPERATION_TYPES.CALL, OPERATION_TYPES.CALL], - [universalProfile1.address, universalProfile2.address, universalProfile3.address], - [ - ethers.utils.parseEther('0.1'), - ethers.utils.parseEther('0.1'), - ethers.utils.parseEther('0.1'), - ], + [universalProfile1.target, universalProfile2.target, universalProfile3.target], + [ethers.parseEther('0.1'), ethers.parseEther('0.1'), ethers.parseEther('0.1')], ['0x', '0x', '0x'], ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['execute']['case_6']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Transfer 0.1 LYX to 3x EOA with 256 bytes of data', async () => { @@ -301,43 +295,32 @@ describe('⛽📊 Gas Benchmark', () => { context.accounts[2].address, context.accounts[3].address, ], - [ - ethers.utils.parseEther('0.1'), - ethers.utils.parseEther('0.1'), - ethers.utils.parseEther('0.1'), - ], + [ethers.parseEther('0.1'), ethers.parseEther('0.1'), ethers.parseEther('0.1')], [generateRandomData(256), generateRandomData(256), generateRandomData(256)], ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['execute']['case_7']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Transfer 0.1 LYX to 3x UP with 256 bytes of data', async () => { - const random256BytesData = ethers.utils.hexConcat([ - '0x00000000', - generateRandomData(252), - ]); + const random256BytesData = ethers.concat(['0x00000000', generateRandomData(252)]); const tx = await context.universalProfile .connect(context.mainController) .executeBatch( [OPERATION_TYPES.CALL, OPERATION_TYPES.CALL, OPERATION_TYPES.CALL], - [universalProfile1.address, universalProfile2.address, universalProfile3.address], - [ - ethers.utils.parseEther('0.1'), - ethers.utils.parseEther('0.1'), - ethers.utils.parseEther('0.1'), - ], + [universalProfile1.target, universalProfile2.target, universalProfile3.target], + [ethers.parseEther('0.1'), ethers.parseEther('0.1'), ethers.parseEther('0.1')], [random256BytesData, random256BytesData, random256BytesData], ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['execute']['case_8']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); }); }); @@ -345,11 +328,11 @@ describe('⛽📊 Gas Benchmark', () => { describe('setData', () => { describe('setData Single', () => { before(async () => { - context = await buildUniversalProfileContext(ethers.utils.parseEther('50')); + context = await buildUniversalProfileContext(ethers.parseEther('50')); }); it('Set a 20 bytes long value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); const value = generateRandomData(20); const tx = await context.universalProfile.setData(key, value); @@ -357,11 +340,11 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_1']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Set a 60 bytes long value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Other Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Other Key')); const value = generateRandomData(60); const tx = await context.universalProfile.setData(key, value); @@ -369,11 +352,11 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_2']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Set a 160 bytes long value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Third Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Third Key')); const value = generateRandomData(160); const tx = await context.universalProfile.setData(key, value); @@ -381,11 +364,11 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_3']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Set a 300 bytes long value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Fourth Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Fourth Key')); const value = generateRandomData(300); const tx = await context.universalProfile.setData(key, value); @@ -393,11 +376,11 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_4']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Set a 600 bytes long value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Fifth Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Fifth Key')); const value = generateRandomData(600); const tx = await context.universalProfile.setData(key, value); @@ -405,11 +388,11 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_5']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Change the value of a data key already set', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Fifth Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Fifth Key')); const value1 = generateRandomData(20); const value2 = generateRandomData(20); @@ -420,11 +403,11 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_6']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Remove the value of a data key already set', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Fifth Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Fifth Key')); const value = generateRandomData(20); await context.universalProfile.setData(key, value); @@ -434,20 +417,20 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_7']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); }); describe('setData Array', () => { before(async () => { - context = await buildUniversalProfileContext(ethers.utils.parseEther('50')); + context = await buildUniversalProfileContext(ethers.parseEther('50')); }); it('Set 2 data keys of 20 bytes long value', async () => { - const key1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key1')); + const key1 = ethers.keccak256(ethers.toUtf8Bytes('Key1')); const value1 = generateRandomData(20); - const key2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key2')); + const key2 = ethers.keccak256(ethers.toUtf8Bytes('Key2')); const value2 = generateRandomData(20); const tx = await context.universalProfile.setDataBatch([key1, key2], [value1, value2]); @@ -455,14 +438,14 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_8']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Set 2 data keys of 100 bytes long value', async () => { - const key1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key3')); + const key1 = ethers.keccak256(ethers.toUtf8Bytes('Key3')); const value1 = generateRandomData(100); - const key2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key4')); + const key2 = ethers.keccak256(ethers.toUtf8Bytes('Key4')); const value2 = generateRandomData(100); const tx = await context.universalProfile.setDataBatch([key1, key2], [value1, value2]); @@ -470,17 +453,17 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_9']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Set 3 data keys of 20 bytes long value', async () => { - const key1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key5')); + const key1 = ethers.keccak256(ethers.toUtf8Bytes('Key5')); const value1 = generateRandomData(20); - const key2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key6')); + const key2 = ethers.keccak256(ethers.toUtf8Bytes('Key6')); const value2 = generateRandomData(20); - const key3 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key7')); + const key3 = ethers.keccak256(ethers.toUtf8Bytes('Key7')); const value3 = generateRandomData(20); const tx = await context.universalProfile.setDataBatch( @@ -491,17 +474,17 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_10']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Change the value of three data keys already set of 20 bytes long value', async () => { - const key1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key8')); + const key1 = ethers.keccak256(ethers.toUtf8Bytes('Key8')); const value1 = generateRandomData(20); - const key2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key9')); + const key2 = ethers.keccak256(ethers.toUtf8Bytes('Key9')); const value2 = generateRandomData(20); - const key3 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key10')); + const key3 = ethers.keccak256(ethers.toUtf8Bytes('Key10')); const value3 = generateRandomData(20); await context.universalProfile.setDataBatch([key1, key2, key3], [value1, value2, value3]); @@ -514,17 +497,17 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_11']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('Remove the value of three data keys already set', async () => { - const key1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key11')); + const key1 = ethers.keccak256(ethers.toUtf8Bytes('Key11')); const value1 = generateRandomData(20); - const key2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key12')); + const key2 = ethers.keccak256(ethers.toUtf8Bytes('Key12')); const value2 = generateRandomData(20); - const key3 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key13')); + const key3 = ethers.keccak256(ethers.toUtf8Bytes('Key13')); const value3 = generateRandomData(20); await context.universalProfile.setDataBatch([key1, key2, key3], [value1, value2, value3]); @@ -537,7 +520,7 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['setData']['case_12']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); }); }); @@ -548,7 +531,7 @@ describe('⛽📊 Gas Benchmark', () => { let universalProfile1; before(async () => { - context = await buildUniversalProfileContext(ethers.utils.parseEther('50')); + context = await buildUniversalProfileContext(ethers.parseEther('50')); // deploy a LSP7 token lsp7Token = await new LSP7Mintable__factory(context.mainController).deploy( 'Token', @@ -574,12 +557,17 @@ describe('⛽📊 Gas Benchmark', () => { describe('LSP7DigitalAsset', () => { it('when minting LSP7Token to a UP without data', async () => { - const tx = await lsp7Token.mint(context.universalProfile.address, 20, false, '0x'); + const tx = await lsp7Token.mint( + await context.universalProfile.getAddress(), + 20, + false, + '0x', + ); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['tokens']['case_1']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('when minting LSP7Token to a EOA without data', async () => { @@ -588,12 +576,12 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['tokens']['case_2']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('when transferring LSP7Token from a UP to a UP without data', async () => { const lsp7TransferPayload = lsp7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), universalProfile1.address, 5, false, @@ -602,12 +590,12 @@ describe('⛽📊 Gas Benchmark', () => { const tx = await context.universalProfile .connect(context.mainController) - .execute(OPERATION_TYPES.CALL, lsp7Token.address, 0, lsp7TransferPayload); + .execute(OPERATION_TYPES.CALL, lsp7Token.target, 0, lsp7TransferPayload); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['tokens']['case_3']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); }); @@ -621,7 +609,7 @@ describe('⛽📊 Gas Benchmark', () => { it('when minting LSP8Token to a UP without data', async () => { const tx = await lsp8Token.mint( - context.universalProfile.address, + await context.universalProfile.getAddress(), metaNFTList[0], false, '0x', @@ -630,7 +618,7 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['tokens']['case_4']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('when minting LSP8Token to a EOA without data', async () => { @@ -639,12 +627,12 @@ describe('⛽📊 Gas Benchmark', () => { const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['tokens']['case_5']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); it('when transferring LSP8Token from a UP to a UP without data', async () => { const lsp8TransferPayload = lsp8Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), universalProfile1.address, metaNFTList[0], false, @@ -653,12 +641,12 @@ describe('⛽📊 Gas Benchmark', () => { const tx = await context.universalProfile .connect(context.mainController) - .execute(OPERATION_TYPES.CALL, lsp8Token.address, 0, lsp8TransferPayload); + .execute(OPERATION_TYPES.CALL, lsp8Token.target, 0, lsp8TransferPayload); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['EOA_owner']['tokens']['case_6']['gas_cost'] = - receipt.gasUsed.toNumber(); + ethers.toNumber(receipt.gasUsed); }); }); }); @@ -684,7 +672,7 @@ describe('⛽📊 Gas Benchmark', () => { ]; before(async () => { - context = await buildLSP6TestContext(ethers.utils.parseEther('50')); + context = await buildLSP6TestContext(ethers.parseEther('50')); recipientEOA = context.accounts[1]; const deployedContracts = await setupProfileWithKeyManagerWithURD(context.accounts[2]); @@ -700,7 +688,7 @@ describe('⛽📊 Gas Benchmark', () => { await setupKeyManager( context, [ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate], - [lsp1Delegate.address], + [await lsp1Delegate.getAddress()], ); // deploy a LSP7 token @@ -722,16 +710,16 @@ describe('⛽📊 Gas Benchmark', () => { ); // mint some tokens to the UP - await lsp7MetaCoin.mint(context.universalProfile.address, 1000, false, '0x'); + await lsp7MetaCoin.mint(await context.universalProfile.getAddress(), 1000, false, '0x'); // mint some NFTs to the UP nftList.forEach(async (nft) => { - await lsp8MetaNFT.mint(context.universalProfile.address, nft, false, '0x'); + await lsp8MetaNFT.mint(await context.universalProfile.getAddress(), nft, false, '0x'); }); }); it('transfer some LYXes to an EOA', async () => { - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = ethers.parseEther('3'); // prettier-ignore const tx = await context.universalProfile.connect(context.mainController).execute(OPERATION_TYPES.CALL, recipientEOA.address, lyxAmount, "0x"); @@ -739,19 +727,19 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_1'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfers some LYXes to a UP', async () => { - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = ethers.parseEther('3'); // prettier-ignore - const tx = await context.universalProfile.connect(context.mainController).execute(OPERATION_TYPES.CALL, aliceUP.address, lyxAmount, "0x"); + const tx = await context.universalProfile.connect(context.mainController).execute(OPERATION_TYPES.CALL, aliceUP.target, lyxAmount, "0x"); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_2'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfers some tokens (LSP7) to an EOA (no data)', async () => { @@ -760,10 +748,10 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const tx = await context.universalProfile.connect(context.mainController).execute( OPERATION_TYPES.CALL, - lsp7MetaCoin.address, + lsp7MetaCoin.target, 0, lsp7MetaCoin.interface.encodeFunctionData("transfer", [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipientEOA.address, tokenAmount, true, @@ -774,7 +762,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_3'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfer some tokens (LSP7) to a UP (no data)', async () => { @@ -783,11 +771,11 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const tx = await context.universalProfile.connect(context.mainController).execute( OPERATION_TYPES.CALL, - lsp7MetaCoin.address, + lsp7MetaCoin.target, 0, lsp7MetaCoin.interface.encodeFunctionData("transfer", [ - context.universalProfile.address, - aliceUP.address, + await context.universalProfile.getAddress(), + aliceUP.target, tokenAmount, true, "0x", @@ -797,7 +785,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_4'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfer a NFT (LSP8) to a EOA (no data)', async () => { @@ -806,10 +794,10 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const tx = await context.universalProfile.connect(context.mainController).execute( OPERATION_TYPES.CALL, - lsp8MetaNFT.address, + lsp8MetaNFT.target, 0, lsp8MetaNFT.interface.encodeFunctionData("transfer", [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipientEOA.address, nftId, true, @@ -820,7 +808,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_5'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfer a NFT (LSP8) to a UP (no data)', async () => { @@ -829,11 +817,11 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const tx = await context.universalProfile.connect(context.mainController).execute( OPERATION_TYPES.CALL, - lsp8MetaNFT.address, + lsp8MetaNFT.target, 0, lsp8MetaNFT.interface.encodeFunctionData("transfer", [ - context.universalProfile.address, - aliceUP.address, + await context.universalProfile.getAddress(), + aliceUP.target, nftId, false, "0x", @@ -843,7 +831,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_6'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); }); @@ -878,7 +866,7 @@ describe('⛽📊 Gas Benchmark', () => { ]; before(async () => { - context = await buildLSP6TestContext(ethers.utils.parseEther('50')); + context = await buildLSP6TestContext(ethers.parseEther('50')); recipientEOA = context.accounts[1]; @@ -910,7 +898,7 @@ describe('⛽📊 Gas Benchmark', () => { ); [lsp7MetaCoin, lsp7LyxDai].forEach(async (token) => { - await token.mint(context.universalProfile.address, 1000, false, '0x'); + await token.mint(await context.universalProfile.getAddress(), 1000, false, '0x'); }); // LSP8 NFT transfer scenarios @@ -938,7 +926,7 @@ describe('⛽📊 Gas Benchmark', () => { ].forEach(async (nftContract) => { // mint some NFTs to the UP nftContract.tokenIds.forEach(async (nft) => { - await lsp8MetaNFT.mint(context.universalProfile.address, nft, false, '0x'); + await lsp8MetaNFT.mint(await context.universalProfile.getAddress(), nft, false, '0x'); }); }); @@ -959,20 +947,20 @@ describe('⛽📊 Gas Benchmark', () => { ERC725YDataKeys.LSP6["AddressPermissions:AllowedCalls"] + canTransferTwoNFTs.address.substring(2), ], [ - lsp1Delegate.address, + await lsp1Delegate.getAddress(), PERMISSIONS.TRANSFERVALUE, PERMISSIONS.CALL, PERMISSIONS.CALL, - combineAllowedCalls([CALLTYPE.VALUE, CALLTYPE.VALUE], [allowedAddressToTransferValue, aliceUP.address], ["0xffffffff", "0xffffffff"], ["0xffffffff", "0xffffffff"]), + combineAllowedCalls([CALLTYPE.VALUE, CALLTYPE.VALUE], [allowedAddressToTransferValue, await aliceUP.getAddress()], ["0xffffffff", "0xffffffff"], ["0xffffffff", "0xffffffff"]), combineAllowedCalls( [CALLTYPE.CALL, CALLTYPE.CALL], - [lsp7MetaCoin.address, lsp7LyxDai.address], + [await lsp7MetaCoin.getAddress(), await lsp7LyxDai.getAddress()], [INTERFACE_IDS.LSP7DigitalAsset, INTERFACE_IDS.LSP7DigitalAsset], ["0xffffffff", "0xffffffff"] ), combineAllowedCalls( [CALLTYPE.CALL, CALLTYPE.CALL], - [lsp8MetaNFT.address, lsp8LyxPunks.address], + [await lsp8MetaNFT.getAddress(), await lsp8LyxPunks.getAddress()], [INTERFACE_IDS.LSP8IdentifiableDigitalAsset, INTERFACE_IDS.LSP8IdentifiableDigitalAsset], ["0xffffffff", "0xffffffff"] ) @@ -990,7 +978,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_1'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfer some LYXes to a UP - restricted to 2 x allowed address only (an EOA + a UP) (TRANSFERVALUE + 2x AllowedCalls)', async () => { @@ -999,12 +987,12 @@ describe('⛽📊 Gas Benchmark', () => { const tx = await context.universalProfile .connect(canTransferValueToOneAddress) - .execute(OPERATION_TYPES.CALL, aliceUP.address, lyxAmount, '0x'); + .execute(OPERATION_TYPES.CALL, aliceUP.target, lyxAmount, '0x'); const receipt = await tx.wait(); gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_2'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfers some tokens (LSP7) to an EOA - restricted to LSP7 + 2x allowed contracts only (CALL + 2x AllowedCalls) (no data)', async () => { @@ -1013,10 +1001,10 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const tx = await context.universalProfile.connect(canTransferTwoTokens).execute( OPERATION_TYPES.CALL, - lsp7MetaCoin.address, + lsp7MetaCoin.target, 0, lsp7MetaCoin.interface.encodeFunctionData("transfer", [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipientEOA.address, tokenAmount, true, @@ -1027,7 +1015,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_3'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfers some tokens (LSP7) to an other UP - restricted to LSP7 + 2x allowed contracts only (CALL + 2x AllowedCalls) (no data)', async () => { @@ -1036,11 +1024,11 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const tx = await context.universalProfile.connect(canTransferTwoTokens).execute( OPERATION_TYPES.CALL, - lsp7MetaCoin.address, + lsp7MetaCoin.target, 0, lsp7MetaCoin.interface.encodeFunctionData("transfer", [ - context.universalProfile.address, - aliceUP.address, + await context.universalProfile.getAddress(), + aliceUP.target, tokenAmount, true, "0x", @@ -1050,7 +1038,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_4'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfers a NFT (LSP8) to an EOA - restricted to LSP8 + 2x allowed contracts only (CALL + 2x AllowedCalls) (no data)', async () => { @@ -1059,10 +1047,10 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const tx = await context.universalProfile.connect(canTransferTwoNFTs).execute( OPERATION_TYPES.CALL, - lsp8MetaNFT.address, + lsp8MetaNFT.target, 0, lsp8MetaNFT.interface.encodeFunctionData("transfer", [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipientEOA.address, nftId, true, @@ -1073,7 +1061,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_5'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('transfers a NFT (LSP8) to an other UP - restricted to LSP8 + 2x allowed contracts only (CALL + 2x AllowedCalls) (no data)', async () => { @@ -1082,11 +1070,11 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const tx = await context.universalProfile.connect(canTransferTwoNFTs).execute( OPERATION_TYPES.CALL, - lsp8MetaNFT.address, + lsp8MetaNFT.target, 0, lsp8MetaNFT.interface.encodeFunctionData("transfer", [ - context.universalProfile.address, - aliceUP.address, + await context.universalProfile.getAddress(), + aliceUP.target, nftId, false, "0x", @@ -1096,7 +1084,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['execute']['case_6'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); }); }); @@ -1107,23 +1095,23 @@ describe('⛽📊 Gas Benchmark', () => { let controllerToAddEditAndRemove: SignerWithAddress; const allowedERC725YDataKeys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key1')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key2')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key3')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key4')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key5')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key6')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key7')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key8')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key9')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key10')), + ethers.keccak256(ethers.toUtf8Bytes('key1')), + ethers.keccak256(ethers.toUtf8Bytes('key2')), + ethers.keccak256(ethers.toUtf8Bytes('key3')), + ethers.keccak256(ethers.toUtf8Bytes('key4')), + ethers.keccak256(ethers.toUtf8Bytes('key5')), + ethers.keccak256(ethers.toUtf8Bytes('key6')), + ethers.keccak256(ethers.toUtf8Bytes('key7')), + ethers.keccak256(ethers.toUtf8Bytes('key8')), + ethers.keccak256(ethers.toUtf8Bytes('key9')), + ethers.keccak256(ethers.toUtf8Bytes('key10')), ]; // Fictional scenario of a NFT Marketplace dApp const nftMarketplaceDataKeys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NFT Marketplace dApp - settings')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NFT Marketplace dApp - followers')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NFT Marketplace dApp - rewards')), + ethers.keccak256(ethers.toUtf8Bytes('NFT Marketplace dApp - settings')), + ethers.keccak256(ethers.toUtf8Bytes('NFT Marketplace dApp - followers')), + ethers.keccak256(ethers.toUtf8Bytes('NFT Marketplace dApp - rewards')), ]; before(async () => { @@ -1141,7 +1129,7 @@ describe('⛽📊 Gas Benchmark', () => { const permissionValues = [ // Set some JSONURL for LSP3Profile metadata to test gas cost of updating your profile details '0x6f357c6a70546a2accab18748420b63c63b5af4cf710848ae83afc0c51dd8ad17fb5e8b3697066733a2f2f516d65637247656a555156587057347a53393438704e76636e51724a314b69416f4d36626466725663575a736e35', - ethers.utils.hexZeroPad(ethers.BigNumber.from(3).toHexString(), 16), + ethers.zeroPadValue(ethers.toBeHex(3), 16), context.mainController.address, ]; @@ -1163,7 +1151,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_1'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it(`Give permissions to a controller @@ -1181,14 +1169,14 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const dataKeys = [ ERC725YDataKeys.LSP6["AddressPermissions[]"].length, - ERC725YDataKeys.LSP6["AddressPermissions[]"].index + ethers.utils.hexZeroPad(ethers.utils.hexStripZeros(AddressPermissionsArrayLength), 16).substring(2), + ERC725YDataKeys.LSP6["AddressPermissions[]"].index + ethers.zeroPadValue(ethers.stripZerosLeft(AddressPermissionsArrayLength), 16).substring(2), ERC725YDataKeys.LSP6["AddressPermissions:Permissions"] + newController.address.substring(2), ERC725YDataKeys.LSP6["AddressPermissions:AllowedERC725YDataKeys"] + newController.address.substring(2), ]; // prettier-ignore const dataValues = [ - ethers.utils.hexZeroPad(ethers.BigNumber.from(AddressPermissionsArrayLength).add(1).toHexString(), 16), + ethers.zeroPadValue(ethers.toBeHex(ethers.toBigInt(AddressPermissionsArrayLength) + BigInt(1)), 16), newController.address, combinePermissions(PERMISSIONS.SETDATA), encodeCompactBytesArray([ @@ -1208,7 +1196,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_2'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Update permissions of previous controller. Allow it now to `SUPER_SETDATA`', async () => { @@ -1230,7 +1218,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_3'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it(`Remove a controller @@ -1248,14 +1236,14 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const dataKeys = [ ERC725YDataKeys.LSP6["AddressPermissions[]"].length, - ERC725YDataKeys.LSP6["AddressPermissions[]"].index + ethers.utils.hexZeroPad(ethers.utils.hexStripZeros(AddressPermissionsArrayLength), 16).substring(2), + ERC725YDataKeys.LSP6["AddressPermissions[]"].index + ethers.zeroPadValue(ethers.stripZerosLeft(AddressPermissionsArrayLength), 16).substring(2), ERC725YDataKeys.LSP6["AddressPermissions:Permissions"] + newController.address.substring(2), ERC725YDataKeys.LSP6["AddressPermissions:AllowedERC725YDataKeys"] + newController.address.substring(2), ]; // prettier-ignore const dataValues = [ - ethers.utils.hexZeroPad(ethers.BigNumber.from(AddressPermissionsArrayLength).sub(1).toHexString(), 16), + ethers.zeroPadValue(ethers.toBeHex(ethers.toBigInt(AddressPermissionsArrayLength) - BigInt(1)), 16), "0x", "0x", "0x", @@ -1269,7 +1257,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_4'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Write 5x new LSP12 Issued Assets', async () => { @@ -1306,7 +1294,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_5'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Updates 1x data key', async () => { @@ -1321,7 +1309,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_5'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Updates 3x data keys (first x3)', async () => { @@ -1336,7 +1324,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_6'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Update 3x data keys (middle x3)', async () => { @@ -1351,7 +1339,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_7'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Update 3x data keys (last x3)', async () => { @@ -1366,18 +1354,20 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_8'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Set 2x data keys + add 3x new controllers (including setting the array length + indexes under AddressPermissions[index]) - 12 data keys in total', async () => { - const addressPermissionsArrayLength = ethers.BigNumber.from( - await context.universalProfile.getData( - ERC725YDataKeys.LSP6['AddressPermissions[]'].length, + const addressPermissionsArrayLength = ethers.toNumber( + ethers.toBigInt( + await context.universalProfile.getData( + ERC725YDataKeys.LSP6['AddressPermissions[]'].length, + ), ), - ).toNumber(); + ); - const newArrayLengthUint128Hex = ethers.utils.hexZeroPad( - ethers.BigNumber.from(addressPermissionsArrayLength).add(3).toHexString(), + const newArrayLengthUint128Hex = ethers.zeroPadValue( + ethers.toBeHex(ethers.toBigInt(addressPermissionsArrayLength) + BigInt(3)), 16, ); @@ -1414,7 +1404,7 @@ describe('⛽📊 Gas Benchmark', () => { const dataValues = [ // user settings - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some default user settings to start')), + ethers.hexlify(ethers.toUtf8Bytes('Some default user settings to start')), // followers count starts at 0 abiCoder.encode(['uint256'], [0]), newArrayLengthUint128Hex, @@ -1437,7 +1427,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_9'][ 'main_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); }); @@ -1477,7 +1467,7 @@ describe('⛽📊 Gas Benchmark', () => { const permissionValues = [ // Set some JSONURL for LSP3Profile metadata to test gas cost of updating your profile details '0x6f357c6a70546a2accab18748420b63c63b5af4cf710848ae83afc0c51dd8ad17fb5e8b3697066733a2f2f516d65637247656a555156587057347a53393438704e76636e51724a314b69416f4d36626466725663575a736e35', - ethers.utils.hexZeroPad(ethers.BigNumber.from(6).toHexString(), 16), + ethers.zeroPadValue(ethers.toBeHex(6), 16), context.mainController.address, PERMISSIONS.SETDATA, encodeCompactBytesArray([ @@ -1513,7 +1503,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_1'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it(`Give permissions to a controller @@ -1531,14 +1521,14 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const dataKeys = [ ERC725YDataKeys.LSP6["AddressPermissions[]"].length, - ERC725YDataKeys.LSP6["AddressPermissions[]"].index + ethers.utils.hexZeroPad(ethers.utils.hexStripZeros(AddressPermissionsArrayLength), 16).substring(2), + ERC725YDataKeys.LSP6["AddressPermissions[]"].index + ethers.zeroPadValue(ethers.stripZerosLeft(AddressPermissionsArrayLength), 16).substring(2), ERC725YDataKeys.LSP6["AddressPermissions:Permissions"] + newController.address.substring(2), ERC725YDataKeys.LSP6["AddressPermissions:AllowedERC725YDataKeys"] + newController.address.substring(2), ]; // prettier-ignore const dataValues = [ - ethers.utils.hexZeroPad(ethers.BigNumber.from(AddressPermissionsArrayLength).add(1).toHexString(), 16), + ethers.zeroPadValue(ethers.toBeHex(ethers.toBigInt(AddressPermissionsArrayLength) + BigInt(1)), 16), newController.address, combinePermissions(PERMISSIONS.SETDATA), encodeCompactBytesArray([ @@ -1558,7 +1548,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_2'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Update permissions of previous controller. Allow it now to `SUPER_SETDATA`', async () => { @@ -1580,7 +1570,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_3'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it(`Remove a controller @@ -1598,14 +1588,14 @@ describe('⛽📊 Gas Benchmark', () => { // prettier-ignore const dataKeys = [ ERC725YDataKeys.LSP6["AddressPermissions[]"].length, - ERC725YDataKeys.LSP6["AddressPermissions[]"].index + ethers.utils.hexZeroPad(ethers.BigNumber.from(AddressPermissionsArrayLength).sub(1).toHexString(), 16).substring(2), + ERC725YDataKeys.LSP6["AddressPermissions[]"].index + ethers.zeroPadValue(ethers.toBeHex(ethers.toBigInt(AddressPermissionsArrayLength) - BigInt(1)), 16).substring(2), ERC725YDataKeys.LSP6["AddressPermissions:Permissions"] + newController.address.substring(2), ERC725YDataKeys.LSP6["AddressPermissions:AllowedERC725YDataKeys"] + newController.address.substring(2), ]; // prettier-ignore const dataValues = [ - ethers.utils.hexZeroPad(ethers.BigNumber.from(AddressPermissionsArrayLength).sub(1).toHexString(), 16), + ethers.zeroPadValue(ethers.toBeHex(ethers.toBigInt(AddressPermissionsArrayLength) - BigInt(1)), 16), "0x", "0x", "0x", @@ -1619,7 +1609,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_4'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Write 5x new LSP12 Issued Assets', async () => { @@ -1656,7 +1646,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_5'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Updates 1x data key', async () => { @@ -1671,7 +1661,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_5'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Updates 3x data keys (first x3)', async () => { @@ -1686,7 +1676,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_6'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Update 3x data keys (middle x3)', async () => { @@ -1701,7 +1691,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_7'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Update 3x data keys (last x3)', async () => { @@ -1716,18 +1706,20 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_8'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); it('Set 2x data keys + add 3x new controllers (including setting the array length + indexes under AddressPermissions[index]) - 12 data keys in total', async () => { - const addressPermissionsArrayLength = ethers.BigNumber.from( - await context.universalProfile.getData( - ERC725YDataKeys.LSP6['AddressPermissions[]'].length, + const addressPermissionsArrayLength = ethers.toNumber( + ethers.toBigInt( + await context.universalProfile.getData( + ERC725YDataKeys.LSP6['AddressPermissions[]'].length, + ), ), - ).toNumber(); + ); - const newArrayLengthUint128Hex = ethers.utils.hexZeroPad( - ethers.BigNumber.from(addressPermissionsArrayLength).add(3).toHexString(), + const newArrayLengthUint128Hex = ethers.zeroPadValue( + ethers.toBeHex(ethers.toBigInt(addressPermissionsArrayLength) + BigInt(3)), 16, ); @@ -1764,7 +1756,7 @@ describe('⛽📊 Gas Benchmark', () => { const dataValues = [ // user settings - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some default user settings to start')), + ethers.hexlify(ethers.toUtf8Bytes('Some default user settings to start')), // followers count starts at 0 abiCoder.encode(['uint256'], [0]), newArrayLengthUint128Hex, @@ -1787,7 +1779,7 @@ describe('⛽📊 Gas Benchmark', () => { gasBenchmark['runtime_costs']['KeyManager_owner']['setData']['case_9'][ 'restricted_controller' - ] = receipt.gasUsed.toNumber(); + ] = ethers.toNumber(receipt.gasUsed); }); }); }); diff --git a/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.behaviour.ts similarity index 85% rename from tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.behaviour.ts index 674f0b028..a5c3b3edb 100644 --- a/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.behaviour.ts @@ -1,13 +1,14 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import type { TransactionResponse } from '@ethersproject/abstract-provider'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { LSP11BasicSocialRecovery, LSP6KeyManager, UniversalProfile } from '../../types'; -import { ALL_PERMISSIONS, ERC725YDataKeys, INTERFACE_IDS } from '../../constants'; +import { ERC725YDataKeys, INTERFACE_IDS } from '../../constants'; +import { ALL_PERMISSIONS } from '@lukso/lsp6-contracts'; import { callPayload } from '../utils/fixtures'; +import { ContractTransactionResponse } from 'ethers'; export type LSP11TestAccounts = { owner: SignerWithAddress; @@ -72,7 +73,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise { it('Should revert when non-owner calls `setRecoverySecretHash(..)`', async () => { const txParams = { - hash: ethers.utils.solidityKeccak256(['string'], ['LUKSO']), + hash: ethers.solidityPackedKeccak256(['string'], ['LUKSO']), }; await expect( @@ -101,7 +102,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise { const txParams = { - hash: ethers.utils.solidityKeccak256(['string'], ['LUKSO']), + hash: ethers.solidityPackedKeccak256(['string'], ['LUKSO']), }; const payload = context.lsp11BasicSocialRecovery.interface.encodeFunctionData( @@ -124,7 +125,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise { const txParams = { secret: 'NotLUKSO', - newHash: ethers.utils.solidityKeccak256(['string'], ['UniversalProfiles']), + newHash: ethers.solidityPackedKeccak256(['string'], ['UniversalProfiles']), }; await expect( @@ -180,14 +181,15 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise { txParams = { secret: 'LUKSO', - newHash: ethers.utils.solidityKeccak256(['string'], ['UniversalProfiles']), + newHash: ethers.solidityPackedKeccak256(['string'], ['UniversalProfiles']), }; recoveryCounterBeforeRecovery = - await context.lsp11BasicSocialRecovery.callStatic.getRecoveryCounter(); + await context.lsp11BasicSocialRecovery.getRecoveryCounter(); recoveryTx = await context.lsp11BasicSocialRecovery .connect(context.accounts.addressASelected) @@ -200,13 +202,15 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise { const recoveryCounterAfterRecovery = - await context.lsp11BasicSocialRecovery.callStatic.getRecoveryCounter(); + await context.lsp11BasicSocialRecovery.getRecoveryCounter(); - expect(recoveryCounterAfterRecovery).to.equal(recoveryCounterBeforeRecovery.add(1)); + expect(recoveryCounterAfterRecovery).to.equal( + ethers.toNumber(recoveryCounterBeforeRecovery) + 1, + ); }); it('should emit RecoveryProcessSuccessful event', async () => { - const guardians = await context.lsp11BasicSocialRecovery.callStatic.getGuardians(); + const guardians = await context.lsp11BasicSocialRecovery.getGuardians(); expect(recoveryTx) .to.emit(context.lsp11BasicSocialRecovery, 'RecoveryProcessSuccessful') @@ -229,16 +233,14 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise { it('should pass', async () => { const txParams = { - key: ethers.utils.solidityKeccak256(['string'], ['MyKey']), - value: ethers.utils.hexlify(ethers.utils.toUtf8Bytes('I have access')), + key: ethers.solidityPackedKeccak256(['string'], ['MyKey']), + value: ethers.hexlify(ethers.toUtf8Bytes('I have access')), }; const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -261,7 +263,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise Promise Promise Promise Promise Promise { const txParams = { - hash: ethers.utils.solidityKeccak256(['string'], ['LUKSO']), + hash: ethers.solidityPackedKeccak256(['string'], ['LUKSO']), }; await expect( @@ -428,7 +429,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise { const txParams = { - hash: ethers.utils.solidityKeccak256(['string'], ['LUKSO']), + hash: ethers.solidityPackedKeccak256(['string'], ['LUKSO']), }; const payload = context.lsp11BasicSocialRecovery.interface.encodeFunctionData( @@ -442,7 +443,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise Promise Promise Promise Promise { it('should revert with ThresholdCannotBeHigherThanGuardiansNumber error', async () => { - const guardians = await context.lsp11BasicSocialRecovery.callStatic.getGuardians(); + const guardians = await context.lsp11BasicSocialRecovery.getGuardians(); expect(guardians.length).to.equal(1); @@ -551,7 +552,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise { it('should pass', async () => { - const guardians = await context.lsp11BasicSocialRecovery.callStatic.getGuardians(); + const guardians = await context.lsp11BasicSocialRecovery.getGuardians(); expect(guardians.length).to.equal(1); @@ -585,7 +586,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise { it('should pass', async () => { - const guardians = await context.lsp11BasicSocialRecovery.callStatic.getGuardians(); + const guardians = await context.lsp11BasicSocialRecovery.getGuardians(); expect(guardians.length).to.equal(1); @@ -620,7 +620,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise Promise { - guardians = await context.lsp11BasicSocialRecovery.callStatic.getGuardians(); - guardiansThreshold = - await context.lsp11BasicSocialRecovery.callStatic.getGuardiansThreshold(); + guardians = await context.lsp11BasicSocialRecovery.getGuardians(); + guardiansThreshold = await context.lsp11BasicSocialRecovery.getGuardiansThreshold(); expect(guardians.length).to.equal(guardiansThreshold); }); @@ -661,7 +659,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise Promise { before('Checking guardians and add few more', async () => { // Checking that guardian1 address is set - const isAddress1Guardian = await context.lsp11BasicSocialRecovery.callStatic.isGuardian( + const isAddress1Guardian = await context.lsp11BasicSocialRecovery.isGuardian( context.accounts.guardian1.address, ); @@ -736,31 +734,31 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise Promise Promise { // Checks that recoveryCounter equal 0 before recovery - beforeRecoveryCounter = - await context.lsp11BasicSocialRecovery.callStatic.getRecoveryCounter(); + beforeRecoveryCounter = await context.lsp11BasicSocialRecovery.getRecoveryCounter(); expect(beforeRecoveryCounter).to.equal(0); @@ -846,18 +839,17 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise Promise Promise Promise Promise Promise { const txParams = { secret: plainSecret, - newHash: ethers.utils.solidityKeccak256(['string'], ['NotLUKSO']), + newHash: ethers.solidityPackedKeccak256(['string'], ['NotLUKSO']), }; await expect( @@ -975,7 +967,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise { const txParams = { secret: 'NotTheValidPlainSecret', - newHash: ethers.utils.solidityKeccak256(['string'], ['NotLUKSO']), + newHash: ethers.solidityPackedKeccak256(['string'], ['NotLUKSO']), }; await expect( @@ -996,7 +988,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise { newPlainSecret = 'UniversalProfiles'; - newSecretHash = ethers.utils.solidityKeccak256(['string'], [newPlainSecret]); + newSecretHash = ethers.solidityPackedKeccak256(['string'], [newPlainSecret]); const txParams = { secret: plainSecret, @@ -1019,15 +1011,14 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise { - const afterRecoveryCounter = - await context.lsp11BasicSocialRecovery.callStatic.getRecoveryCounter(); + const afterRecoveryCounter = await context.lsp11BasicSocialRecovery.getRecoveryCounter(); - expect(afterRecoveryCounter).to.equal(beforeRecoveryCounter + 1); + expect(afterRecoveryCounter).to.equal(ethers.toNumber(beforeRecoveryCounter) + 1); }); it('should update the recoverySecretHash ', async () => { @@ -1047,16 +1038,14 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise { it('should pass', async () => { const txParams = { - key: ethers.utils.solidityKeccak256(['string'], ['MyKey']), - value: ethers.utils.hexlify(ethers.utils.toUtf8Bytes('I have access')), + key: ethers.solidityPackedKeccak256(['string'], ['MyKey']), + value: ethers.hexlify(ethers.toUtf8Bytes('I have access')), }; const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -1079,7 +1068,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise Promise { it('should be reset', async () => { - const guardian1Choice = await context.lsp11BasicSocialRecovery.callStatic.getGuardianChoice( + const guardian1Choice = await context.lsp11BasicSocialRecovery.getGuardianChoice( context.accounts.guardian1.address, ); - expect(guardian1Choice).to.equal(ethers.constants.AddressZero); + expect(guardian1Choice).to.equal(ethers.ZeroAddress); - const guardian2Choice = await context.lsp11BasicSocialRecovery.callStatic.getGuardianChoice( + const guardian2Choice = await context.lsp11BasicSocialRecovery.getGuardianChoice( context.accounts.guardian2.address, ); - expect(guardian2Choice).to.equal(ethers.constants.AddressZero); + expect(guardian2Choice).to.equal(ethers.ZeroAddress); }); }); }); @@ -1107,7 +1096,7 @@ export const shouldBehaveLikeLSP11 = (buildContext: () => Promise { it('Should have registered the ERC165 interface', async () => { - expect( - await context.lsp11BasicSocialRecovery.callStatic.supportsInterface(INTERFACE_IDS.ERC165), - ).to.be.true; + expect(await context.lsp11BasicSocialRecovery.supportsInterface(INTERFACE_IDS.ERC165)).to.be + .true; }); it('Should have registered the LSP11 interface', async () => { expect( - await context.lsp11BasicSocialRecovery.callStatic.supportsInterface( + await context.lsp11BasicSocialRecovery.supportsInterface( INTERFACE_IDS.LSP11BasicSocialRecovery, ), ).to.be.true; }); it('Should have set the owner', async () => { - const owner = await context.lsp11BasicSocialRecovery.callStatic.owner(); - expect(owner).to.equal(context.deployParams.owner.address); + const owner = await context.lsp11BasicSocialRecovery.owner(); + expect(owner).to.equal(await context.deployParams.owner.getAddress()); }); it('Should have set the linked target', async () => { - const target = await context.lsp11BasicSocialRecovery.callStatic.target(); - expect(target).to.equal(context.deployParams.target.address); + const target = await context.lsp11BasicSocialRecovery['target()'](); + expect(target).to.equal(await context.deployParams.target.getAddress()); }); }); }; diff --git a/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts b/packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts similarity index 91% rename from tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts rename to packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts index bd3b8366a..728d6ede4 100644 --- a/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.test.ts @@ -30,13 +30,13 @@ describe('LSP11BasicSocialRecovery with constructor', () => { const lsp11BasicSocialRecovery = await new LSP11BasicSocialRecovery__factory( accounts.any, - ).deploy(deployParams.owner.address, deployParams.target.address); + ).deploy(await deployParams.owner.getAddress(), await deployParams.target.getAddress()); await grantLSP11PermissionViaKeyManager( accounts.owner, universalProfile, lsp6KeyManager, - lsp11BasicSocialRecovery.address, + await lsp11BasicSocialRecovery.getAddress(), ); return { @@ -59,7 +59,7 @@ describe('LSP11BasicSocialRecovery with constructor', () => { return { lsp11BasicSocialRecovery, deployParams, - initializeTransaction: context.lsp11BasicSocialRecovery.deployTransaction, + initializeTransaction: context.lsp11BasicSocialRecovery.deploymentTransaction(), }; }); }); diff --git a/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts b/packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts similarity index 90% rename from tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts index 944b78b46..686f84632 100644 --- a/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP11BasicSocialRecovery/LSP11BasicSocialRecoveryInit.test.ts @@ -4,6 +4,7 @@ import { LSP6KeyManager, UniversalProfile, LSP11BasicSocialRecoveryInit__factory, + LSP11BasicSocialRecovery, } from '../../types'; import { @@ -38,19 +39,19 @@ describe('LSP11BasicSocialRecoveryInit with proxy', () => { ).deploy(); const lsp11BasicSocialRecoveryProxy = await deployProxy( - lsp11BasicSocialRecoveryInit.address, + await lsp11BasicSocialRecoveryInit.getAddress(), accounts.owner, ); const lsp11BasicSocialRecovery = lsp11BasicSocialRecoveryInit.attach( lsp11BasicSocialRecoveryProxy, - ); + ) as unknown as LSP11BasicSocialRecovery; await grantLSP11PermissionViaKeyManager( accounts.owner, universalProfile, lsp6KeyManager, - lsp11BasicSocialRecovery.address, + await lsp11BasicSocialRecovery.getAddress(), ); return { @@ -64,8 +65,8 @@ describe('LSP11BasicSocialRecoveryInit with proxy', () => { const initializeProxy = async (context: LSP11TestContext) => { return context.lsp11BasicSocialRecovery['initialize(address,address)']( - context.deployParams.owner.address, - context.deployParams.target.address, + await context.deployParams.owner.getAddress(), + await context.deployParams.target.getAddress(), ); }; diff --git a/tests/LSP14Ownable2Step/LSP14Ownable2Step.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP14Ownable2Step/LSP14Ownable2Step.behaviour.ts similarity index 83% rename from tests/LSP14Ownable2Step/LSP14Ownable2Step.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP14Ownable2Step/LSP14Ownable2Step.behaviour.ts index d317c2926..47c2f3fa4 100644 --- a/tests/LSP14Ownable2Step/LSP14Ownable2Step.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP14Ownable2Step/LSP14Ownable2Step.behaviour.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { ethers, network, artifacts } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { LSP9Vault, UPWithInstantAcceptOwnership__factory, @@ -9,11 +9,11 @@ import { } from '../../types'; // constants -import { OPERATION_TYPES } from '../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; // helpers import { provider } from '../utils/helpers'; -import { BigNumber, ContractTransaction } from 'ethers'; +import { ContractTransaction, ContractTransactionResponse } from 'ethers'; export type LSP14TestContext = { accounts: SignerWithAddress[]; @@ -23,13 +23,13 @@ export type LSP14TestContext = { }; export const shouldBehaveLikeLSP14 = ( - buildContext: (initialFunding?: number | BigNumber) => Promise, + buildContext: (initialFunding?: number | bigint) => Promise, ) => { let context: LSP14TestContext; let newOwner: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('50')); + context = await buildContext(ethers.parseEther('50')); newOwner = context.accounts[1]; }); @@ -74,7 +74,7 @@ export const shouldBehaveLikeLSP14 = ( await expect( context.contract .connect(context.deployParams.owner) - .transferOwnership(context.contract.address), + .transferOwnership(await context.contract.getAddress()), ).to.be.revertedWithCustomError(context.contract, 'LSP14CannotTransferOwnershipToSelf'); }); @@ -91,17 +91,17 @@ export const shouldBehaveLikeLSP14 = ( it('execute(...) - LYX transfer', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const recipientBalanceBefore = await provider.getBalance(recipient.address); - const accountBalanceBefore = await provider.getBalance(context.contract.address); + const accountBalanceBefore = await provider.getBalance(await context.contract.getAddress()); await context.contract .connect(context.deployParams.owner) .execute(OPERATION_TYPES.CALL, recipient.address, amount, '0x'); const recipientBalanceAfter = await provider.getBalance(recipient.address); - const accountBalanceAfter = await provider.getBalance(context.contract.address); + const accountBalanceAfter = await provider.getBalance(await context.contract.getAddress()); // recipient balance should have gone up expect(recipientBalanceAfter).to.be.gt(recipientBalanceBefore); @@ -124,7 +124,7 @@ export const shouldBehaveLikeLSP14 = ( await expect( context.contract .connect(context.deployParams.owner) - .transferOwnership(upWithCustomURD.address), + .transferOwnership(await upWithCustomURD.getAddress()), ).to.be.revertedWithCustomError( context.contract, 'LSP14MustAcceptOwnershipInSeparateTransaction', @@ -172,7 +172,7 @@ export const shouldBehaveLikeLSP14 = ( it('should have cleared the pendingOwner after transferring ownership', async () => { const newPendingOwner = await context.contract.pendingOwner(); - expect(newPendingOwner).to.equal(ethers.constants.AddressZero); + expect(newPendingOwner).to.equal(ethers.ZeroAddress); }); it('should have emitted a OwnershipTransferred event', async () => { @@ -202,7 +202,7 @@ export const shouldBehaveLikeLSP14 = ( it('should revert when calling `execute(...)`', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect( context.contract @@ -231,14 +231,14 @@ export const shouldBehaveLikeLSP14 = ( it('execute(...) - LYX transfer', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect(() => context.contract .connect(newOwner) .execute(OPERATION_TYPES.CALL, recipient.address, amount, '0x'), ).to.changeEtherBalances( - [context.contract.address, recipient.address], + [await context.contract.getAddress(), recipient.address], [ `-${amount}`, // account balance should have gone down amount, // recipient balance should have gone up @@ -263,12 +263,12 @@ export const shouldBehaveLikeLSP14 = ( describe('when calling renounceOwnership() the first time', () => { let currentOwner: SignerWithAddress; - let renounceOwnershipTx: ContractTransaction; + let renounceOwnershipTx: ContractTransactionResponse; let anotherOwner: string; before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); currentOwner = context.accounts[0]; @@ -278,7 +278,7 @@ export const shouldBehaveLikeLSP14 = ( await context.contract.connect(currentOwner).transferOwnership(anotherOwner); // mine 1,000 blocks - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(1000)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(1000)]); renounceOwnershipTx = await context.contract.connect(currentOwner).renounceOwnership(); @@ -288,9 +288,9 @@ export const shouldBehaveLikeLSP14 = ( it('should instantiate the renounceOwnership process correctly', async () => { const _renounceOwnershipStartedAtAfterSlotNumber = Number.parseInt( ( - await artifacts.getBuildInfo('contracts/LSP9Vault/LSP9Vault.sol:LSP9Vault') + await artifacts.getBuildInfo('@lukso/lsp9-contracts/contracts/LSP9Vault.sol:LSP9Vault') )?.output.contracts[ - 'contracts/LSP9Vault/LSP9Vault.sol' + '@lukso/lsp9-contracts/contracts/LSP9Vault.sol' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ].LSP9Vault.storageLayout.storage.filter((elem) => { @@ -298,12 +298,12 @@ export const shouldBehaveLikeLSP14 = ( })[0].slot, ); - const _renounceOwnershipStartedAtAfter = await provider.getStorageAt( - context.contract.address, + const _renounceOwnershipStartedAtAfter = await provider.getStorage( + await context.contract.getAddress(), _renounceOwnershipStartedAtAfterSlotNumber, ); - expect(ethers.BigNumber.from(_renounceOwnershipStartedAtAfter).toNumber()).to.equal( + expect(ethers.toBigInt(_renounceOwnershipStartedAtAfter)).to.equal( renounceOwnershipTx.blockNumber, ); }); @@ -317,13 +317,13 @@ export const shouldBehaveLikeLSP14 = ( }); it('should reset the pendingOwner', async () => { - expect(await context.contract.pendingOwner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.pendingOwner()).to.equal(ethers.ZeroAddress); }); describe('currentOwner should still be able to interact with contract before confirming', () => { it('`setData(...)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Random Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Value')); + const key = ethers.keccak256(ethers.toUtf8Bytes('Random Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Random Value')); await context.contract.connect(currentOwner).setData(key, value); @@ -334,21 +334,24 @@ export const shouldBehaveLikeLSP14 = ( it('transfer LYX via `execute(...)`', async () => { const recipient = context.accounts[3].address; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); // verify that balances have been updated await expect(() => context.contract .connect(currentOwner) .execute(OPERATION_TYPES.CALL, recipient, amount, '0x'), - ).to.changeEtherBalances([context.contract.address, recipient], [`-${amount}`, amount]); + ).to.changeEtherBalances( + [await context.contract.getAddress(), recipient], + [`-${amount}`, amount], + ); }); }); }); describe('when calling renounceOwnership() the second time', () => { before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); }); it('should revert if called in the delay period', async () => { @@ -359,7 +362,7 @@ export const shouldBehaveLikeLSP14 = ( const renounceOwnershipOnceReceipt = await renounceOwnershipOnce.wait(); // skip 98 blocks, but not enough to reach the delay period - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(98)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(98)]); await expect(context.contract.connect(context.deployParams.owner).renounceOwnership()) .to.be.revertedWithCustomError(context.contract, 'LSP14NotInRenounceOwnershipInterval') @@ -371,15 +374,15 @@ export const shouldBehaveLikeLSP14 = ( expect(await context.contract.owner()).to.equal(context.deployParams.owner.address); // skip 500 blocks for the next test - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(500)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(500)]); }); it('should initialize again if the confirmation period passed', async () => { const _renounceOwnershipStartedAtAfterSlotNumber = Number.parseInt( ( - await artifacts.getBuildInfo('contracts/LSP9Vault/LSP9Vault.sol:LSP9Vault') + await artifacts.getBuildInfo('@lukso/lsp9-contracts/contracts/LSP9Vault.sol:LSP9Vault') )?.output.contracts[ - 'contracts/LSP9Vault/LSP9Vault.sol' + '@lukso/lsp9-contracts/contracts/LSP9Vault.sol' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ].LSP9Vault.storageLayout.storage.filter((elem) => { @@ -389,33 +392,31 @@ export const shouldBehaveLikeLSP14 = ( await context.contract.connect(context.deployParams.owner).renounceOwnership(); - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(400)]); // skip 400 blocks + await network.provider.send('hardhat_mine', [ethers.toQuantity(400)]); // skip 400 blocks const tx = await context.contract.connect(context.deployParams.owner).renounceOwnership(); await tx.wait(); - const _renounceOwnershipStartedAtAfter = await provider.getStorageAt( - context.contract.address, + const _renounceOwnershipStartedAtAfter = await provider.getStorage( + await context.contract.getAddress(), _renounceOwnershipStartedAtAfterSlotNumber, ); - expect(ethers.BigNumber.from(_renounceOwnershipStartedAtAfter).toNumber()).to.equal( - tx.blockNumber, - ); + expect(ethers.toBigInt(_renounceOwnershipStartedAtAfter)).to.equal(tx.blockNumber); }); describe('when called after the delay and before the confirmation period end', () => { let renounceOwnershipSecondTx: ContractTransaction; before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); // Call renounceOwnership for the first time await context.contract.connect(context.deployParams.owner).renounceOwnership(); // Skip 199 block to reach the time where renouncing ownership can happen - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(199)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(199)]); // Call renounceOwnership for the second time renounceOwnershipSecondTx = await context.contract @@ -426,27 +427,29 @@ export const shouldBehaveLikeLSP14 = ( it('should have emitted a OwnershipTransferred event', async () => { await expect(renounceOwnershipSecondTx) .to.emit(context.contract, 'OwnershipTransferred') - .withArgs(context.deployParams.owner.address, ethers.constants.AddressZero); + .withArgs(context.deployParams.owner.address, ethers.ZeroAddress); - expect(await context.contract.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.owner()).to.equal(ethers.ZeroAddress); }); it('should have emitted a OwnershipRenounced event', async () => { await expect(renounceOwnershipSecondTx).to.emit(context.contract, 'OwnershipRenounced'); - expect(await context.contract.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.owner()).to.equal(ethers.ZeroAddress); }); it('owner should now be address(0)', async () => { - expect(await context.contract.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.owner()).to.equal(ethers.ZeroAddress); }); it('should have reset the `_renounceOwnershipStartedAt` state variable to zero', async () => { const _renounceOwnershipStartedAtAfterSlotNumber = Number.parseInt( ( - await artifacts.getBuildInfo('contracts/LSP9Vault/LSP9Vault.sol:LSP9Vault') + await artifacts.getBuildInfo( + '@lukso/lsp9-contracts/contracts/LSP9Vault.sol:LSP9Vault', + ) )?.output.contracts[ - 'contracts/LSP9Vault/LSP9Vault.sol' + '@lukso/lsp9-contracts/contracts/LSP9Vault.sol' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ].LSP9Vault.storageLayout.storage.filter((elem) => { @@ -454,18 +457,18 @@ export const shouldBehaveLikeLSP14 = ( })[0].slot, ); - const _renounceOwnershipStartedAtAfter = await provider.getStorageAt( - context.contract.address, + const _renounceOwnershipStartedAtAfter = await provider.getStorage( + await context.contract.getAddress(), _renounceOwnershipStartedAtAfterSlotNumber, ); - expect(ethers.BigNumber.from(_renounceOwnershipStartedAtAfter).toNumber()).to.equal(0); + expect(ethers.toBigInt(_renounceOwnershipStartedAtAfter)).to.equal(0); }); describe('currentOwner should not be able to interact with contract anymore after confirming', () => { it('`setData(...)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Random Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Value')); + const key = ethers.keccak256(ethers.toUtf8Bytes('Random Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Random Value')); await expect( context.contract.connect(context.deployParams.owner).setData(key, value), @@ -474,7 +477,7 @@ export const shouldBehaveLikeLSP14 = ( it('transfer LYX via `execute(...)`', async () => { const recipient = context.accounts[3].address; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect( context.contract @@ -489,7 +492,7 @@ export const shouldBehaveLikeLSP14 = ( let newOwner: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); // transferOwnership to a new owner newOwner = context.accounts[3]; @@ -502,14 +505,14 @@ export const shouldBehaveLikeLSP14 = ( await context.contract.connect(context.deployParams.owner).renounceOwnership(); // Skip 199 block to reach the time where renouncing ownership can happen - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(199)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(199)]); // Call renounceOwnership for the second time await context.contract.connect(context.deployParams.owner).renounceOwnership(); }); it('should reset the pendingOwner whenever renounceOwnership(..) is confirmed', async () => { - expect(await context.contract.pendingOwner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.pendingOwner()).to.equal(ethers.ZeroAddress); }); it('previous pendingOwner should not be able to call acceptOwnership(...) anymore', async () => { @@ -527,15 +530,15 @@ export const shouldBehaveLikeLSP14 = ( // Simulate a scenario where we are at just few hundred blocks after the blockchain started // (few hundred blocks after genesis) - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(138)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(138)]); }); it('should instantiate the renounceOwnership process in 2 steps correctly', async () => { const _renounceOwnershipStartedAtAfterSlotNumber = Number.parseInt( ( - await artifacts.getBuildInfo('contracts/LSP9Vault/LSP9Vault.sol:LSP9Vault') + await artifacts.getBuildInfo('@lukso/lsp9-contracts/contracts/LSP9Vault.sol:LSP9Vault') )?.output.contracts[ - 'contracts/LSP9Vault/LSP9Vault.sol' + '@lukso/lsp9-contracts/contracts/LSP9Vault.sol' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ].LSP9Vault.storageLayout.storage.filter((elem) => { @@ -549,12 +552,12 @@ export const shouldBehaveLikeLSP14 = ( await renounceOwnershipTx.wait(); - const _renounceOwnershipStartedAtAfter = await provider.getStorageAt( - context.contract.address, + const _renounceOwnershipStartedAtAfter = await provider.getStorage( + await context.contract.getAddress(), _renounceOwnershipStartedAtAfterSlotNumber, ); - expect(ethers.BigNumber.from(_renounceOwnershipStartedAtAfter)).to.equal( + expect(ethers.toBigInt(_renounceOwnershipStartedAtAfter)).to.equal( renounceOwnershipTx.blockNumber, ); diff --git a/tests/LSP17ContractExtension/LSP17Extendable.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17Extendable.behaviour.ts similarity index 84% rename from tests/LSP17ContractExtension/LSP17Extendable.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17Extendable.behaviour.ts index 184d9dfce..d748737d5 100644 --- a/tests/LSP17ContractExtension/LSP17Extendable.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17Extendable.behaviour.ts @@ -1,9 +1,12 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { FakeContract, smock } from '@defi-wonderland/smock'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { + NameExtension, + NameExtension__factory, + AgeExtension__factory, + AgeExtension, LSP0ERC725Account, LSP9Vault, CheckerExtension__factory, @@ -155,9 +158,9 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), }), - ).to.not.be.reverted.to.not.emit(context.contract, 'UniversalReceiver'); + ).to.not.emit(context.contract, 'UniversalReceiver'); }); }); @@ -167,7 +170,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise Promise { describe('when calling the contract with transferOwnership Signature', () => { it('should pass and set the pending owner', async () => { - const pendingOwnerBefore = await context.contract.callStatic.pendingOwner(); - expect(pendingOwnerBefore).to.equal(ethers.constants.AddressZero); + const pendingOwnerBefore = await context.contract.pendingOwner(); + expect(pendingOwnerBefore).to.equal(ethers.ZeroAddress); const transferOwnershipPayload = context.contract.interface.encodeFunctionData( 'transferOwnership', @@ -216,11 +219,11 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: notExistingFunctionSignature, }), ) @@ -250,7 +253,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise Promise Promise { @@ -338,7 +344,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise Promise Promise { @@ -401,7 +410,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { @@ -427,13 +439,13 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: emitEventFunctionSelector, value: 0, }), @@ -469,7 +481,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { - let nameExtension: FakeContract; + let nameExtension: NameExtension; before(async () => { - nameExtension = await smock.fake([ - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - ]); - nameExtension.name.returns('LUKSO'); + nameExtension = await new NameExtension__factory(context.accounts[0]).deploy(); await context.contract .connect(context.deployParams.owner) - .setData(nameFunctionExtensionHandlerKey, nameExtension.address); + .setData(nameFunctionExtensionHandlerKey, await nameExtension.getAddress()); }); it('should pass and return the name correctly', async () => { const returnValue = await provider.call({ from: context.accounts[0].address, - to: context.contract.address, + to: await context.contract.getAddress(), data: nameFunctionSelector, }); @@ -528,35 +523,20 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { - let ageExtension: FakeContract; + let ageExtension: AgeExtension; before(async () => { - ageExtension = await smock.fake([ - { - inputs: [], - name: 'age', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - ]); - ageExtension.age.returns(20); + ageExtension = await new AgeExtension__factory(context.accounts[0]).deploy(); await context.contract .connect(context.deployParams.owner) - .setData(ageFunctionExtensionHandlerKey, ageExtension.address); + .setData(ageFunctionExtensionHandlerKey, await ageExtension.getAddress()); }); it('should pass and return the age correctly', async () => { const returnValue = await provider.call({ from: context.accounts[0].address, - to: context.contract.address, + to: await context.contract.getAddress(), data: ageFunctionSelector, }); @@ -572,13 +552,11 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { - const balanceBefore = await transferExtension.callStatic.balances( - context.accounts[0].address, - ); + const balanceBefore = await transferExtension.balances(context.accounts[0].address); expect(balanceBefore).to.equal(0); @@ -589,13 +567,11 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { @@ -621,7 +600,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise Promise { const reenterAccountFunctionSignature = @@ -670,7 +652,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { @@ -721,13 +706,16 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: '0x01', }), ).to.not.be.reverted; @@ -742,7 +730,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: '0x00000000', }), ).to.not.be.reverted; @@ -798,12 +783,10 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise Promise { const graffiti = '0x00000000' + - ethers.utils - .hexlify(ethers.utils.toUtf8Bytes('Sending a decentralized message')) + ethers + .hexlify(ethers.toUtf8Bytes('Sending a decentralized message')) .substring(2); await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: graffiti, }), ).to.not.be.reverted; @@ -876,14 +856,17 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { it('should revert', async () => { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: '0x00000000', }), ).to.be.reverted; @@ -894,13 +877,13 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { const graffiti = '0x00000000' + - ethers.utils - .hexlify(ethers.utils.toUtf8Bytes('Sending a decentralized message')) + ethers + .hexlify(ethers.toUtf8Bytes('Sending a decentralized message')) .substring(2); await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: graffiti, }), ).to.be.reverted; @@ -913,8 +896,8 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { describe('when setting less than 20 bytes as data value for the LSP17Extension data key', () => { - const randomSelector = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - const randomBytes10Value = ethers.utils.hexlify(ethers.utils.randomBytes(10)); + const randomSelector = ethers.hexlify(ethers.randomBytes(4)); + const randomBytes10Value = ethers.hexlify(ethers.randomBytes(10)); const lsp17DataKey = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + @@ -930,7 +913,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: randomSelector, }), ) @@ -951,7 +934,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { describe('before setting the onERC721ReceivedExtension', () => { it('should fail since onERC721Received is not implemented', async () => { - await expect(token.mint(context.contract.address)).to.be.reverted; + await expect(token.mint(await context.contract.getAddress())).to.be.reverted; }); }); @@ -967,11 +950,14 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { - await expect(token.mint(context.contract.address)).to.emit(token, 'Minted'); + await expect(token.mint(await context.contract.getAddress())).to.emit( + token, + 'Minted', + ); }); }); }); diff --git a/tests/LSP17ContractExtension/LSP17Extendable.test.ts b/packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17Extendable.test.ts similarity index 81% rename from tests/LSP17ContractExtension/LSP17Extendable.test.ts rename to packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17Extendable.test.ts index 01ecf9a78..d109eeeb6 100644 --- a/tests/LSP17ContractExtension/LSP17Extendable.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17Extendable.test.ts @@ -18,23 +18,23 @@ describe('LSP17Extendable - Basic Implementation', () => { let errorsExtension: RevertErrorsTestExtension; const selectorWithExtensionAndNoTransferValue = - EmitEventExtension__factory.createInterface().getSighash('emitEvent'); + EmitEventExtension__factory.createInterface().getFunction('emitEvent').selector; const selectorWithNoExtension = '0xdeadbeef'; // selectors to test that errors are bubbled up to the contract const revertErrorsExtensionInterface = RevertErrorsTestExtension__factory.createInterface(); const selectorRevertCustomError = - revertErrorsExtensionInterface.getSighash('revertWithCustomError'); + revertErrorsExtensionInterface.getFunction('revertWithCustomError').selector; const selectorRevertErrorString = - revertErrorsExtensionInterface.getSighash('revertWithErrorString'); + revertErrorsExtensionInterface.getFunction('revertWithErrorString').selector; const selectorRevertPanicError = - revertErrorsExtensionInterface.getSighash('revertWithPanicError'); + revertErrorsExtensionInterface.getFunction('revertWithPanicError').selector; const selectorRevertNoErrorData = - revertErrorsExtensionInterface.getSighash('revertWithNoErrorData'); + revertErrorsExtensionInterface.getFunction('revertWithNoErrorData').selector; before('setup', async () => { accounts = await ethers.getSigners(); @@ -45,28 +45,28 @@ describe('LSP17Extendable - Basic Implementation', () => { await lsp17Implementation.setExtension( selectorWithExtensionAndNoTransferValue, - exampleExtension.address, + await exampleExtension.getAddress(), false, ); await lsp17Implementation.setExtension( selectorRevertCustomError, - errorsExtension.address, + await errorsExtension.getAddress(), false, ); await lsp17Implementation.setExtension( selectorRevertErrorString, - errorsExtension.address, + await errorsExtension.getAddress(), false, ); await lsp17Implementation.setExtension( selectorRevertPanicError, - errorsExtension.address, + await errorsExtension.getAddress(), false, ); await lsp17Implementation.setExtension( selectorRevertNoErrorData, - errorsExtension.address, + await errorsExtension.getAddress(), false, ); }); @@ -81,7 +81,7 @@ describe('LSP17Extendable - Basic Implementation', () => { it('should revert with error `NoExtensionFoundForFunctionSelector', async () => { await expect( accounts[0].sendTransaction({ - to: lsp17Implementation.address, + to: await lsp17Implementation.getAddress(), data: selectorWithNoExtension, }), ).to.be.revertedWithCustomError(lsp17Implementation, 'NoExtensionFoundForFunctionSelector'); @@ -93,7 +93,7 @@ describe('LSP17Extendable - Basic Implementation', () => { it('should pass and not revert', async () => { await expect( accounts[0].sendTransaction({ - to: lsp17Implementation.address, + to: await lsp17Implementation.getAddress(), data: selectorWithExtensionAndNoTransferValue, }), ).to.emit(exampleExtension, 'EventEmittedInExtension'); @@ -108,7 +108,7 @@ describe('LSP17Extendable - Basic Implementation', () => { expect(anotherStorageBefore).to.equal('0x'); await accounts[0].sendTransaction({ - to: lsp17Implementation.address, + to: await lsp17Implementation.getAddress(), data: selectorWithExtensionAndNoTransferValue, }); @@ -125,18 +125,18 @@ describe('LSP17Extendable - Basic Implementation', () => { it('should bubble up custom errors', async () => { await expect( accounts[0].sendTransaction({ - to: lsp17Implementation.address, + to: await lsp17Implementation.getAddress(), data: selectorRevertCustomError, }), ) .to.be.revertedWithCustomError(errorsExtension, 'SomeCustomError') - .withArgs(lsp17Implementation.address); + .withArgs(await lsp17Implementation.getAddress()); }); it('should bubble up revert errors string', async () => { await expect( accounts[0].sendTransaction({ - to: lsp17Implementation.address, + to: await lsp17Implementation.getAddress(), data: selectorRevertErrorString, }), ).to.be.revertedWith('some error message'); @@ -145,7 +145,7 @@ describe('LSP17Extendable - Basic Implementation', () => { it('should bubble up Panic type errors with their code', async () => { await expect( accounts[0].sendTransaction({ - to: lsp17Implementation.address, + to: await lsp17Implementation.getAddress(), data: selectorRevertPanicError, }), ).to.be.revertedWithPanic('0x11' || 17); @@ -154,7 +154,7 @@ describe('LSP17Extendable - Basic Implementation', () => { it('should not bubble up anything with empty error data (`revert()`)', async () => { await expect( accounts[0].sendTransaction({ - to: lsp17Implementation.address, + to: await lsp17Implementation.getAddress(), data: selectorRevertNoErrorData, }), ).to.be.reverted; diff --git a/tests/LSP17ContractExtension/LSP17ExtendableTokens.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17ExtendableTokens.behaviour.ts similarity index 85% rename from tests/LSP17ContractExtension/LSP17ExtendableTokens.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17ExtendableTokens.behaviour.ts index e6e20a87d..d5f2511bc 100644 --- a/tests/LSP17ContractExtension/LSP17ExtendableTokens.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP17ContractExtension/LSP17ExtendableTokens.behaviour.ts @@ -1,6 +1,5 @@ import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { FakeContract, smock } from '@defi-wonderland/smock'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { LSP0ERC725Account, @@ -19,6 +18,10 @@ import { ReenterAccountExtension, BuyExtension, BuyExtension__factory, + NameExtension__factory, + NameExtension, + AgeExtension__factory, + AgeExtension, } from '../../types'; // helpers @@ -152,7 +155,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: notExistingFunctionSignature, }), ) @@ -169,7 +172,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise Promise Promise { @@ -257,7 +263,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise Promise Promise { @@ -320,7 +329,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { @@ -346,13 +358,13 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: emitEventFunctionSelector, value: 0, }), @@ -381,35 +393,20 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { - let nameExtension: FakeContract; + let nameExtension: NameExtension; before(async () => { - nameExtension = await smock.fake([ - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - ]); - nameExtension.name.returns('LUKSO'); + nameExtension = await new NameExtension__factory(context.accounts[0]).deploy(); await context.contract .connect(context.deployParams.owner) - .setData(nameFunctionExtensionHandlerKey, nameExtension.address); + .setData(nameFunctionExtensionHandlerKey, nameExtension.target); }); it('should pass and return the name correctly', async () => { const returnValue = await provider.call({ from: context.accounts[0].address, - to: context.contract.address, + to: await context.contract.getAddress(), data: nameFunctionSelector, }); @@ -418,35 +415,20 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { - let ageExtension: FakeContract; + let ageExtension: AgeExtension; before(async () => { - ageExtension = await smock.fake([ - { - inputs: [], - name: 'age', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - ]); - ageExtension.age.returns(20); + ageExtension = await new AgeExtension__factory(context.accounts[0]).deploy(); await context.contract .connect(context.deployParams.owner) - .setData(ageFunctionExtensionHandlerKey, ageExtension.address); + .setData(ageFunctionExtensionHandlerKey, ageExtension.target); }); it('should pass and return the age correctly', async () => { const returnValue = await provider.call({ from: context.accounts[0].address, - to: context.contract.address, + to: await context.contract.getAddress(), data: ageFunctionSelector, }); @@ -462,13 +444,11 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { - const balanceBefore = await transferExtension.callStatic.balances( - context.accounts[0].address, - ); + const balanceBefore = await transferExtension.balances(context.accounts[0].address); expect(balanceBefore).to.equal(0); @@ -479,13 +459,11 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { - const balanceBefore = await provider.getBalance(buyExtension.address); + const balanceBefore = await provider.getBalance(await buyExtension.getAddress()); expect(balanceBefore).to.equal(0); await context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), value: 100, data: buyFunctionSelector, }); - const balanceAfter = await provider.getBalance(buyExtension.address); + const balanceAfter = await provider.getBalance(await buyExtension.getAddress()); expect(balanceAfter).to.equal(100); }); @@ -529,7 +507,10 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { @@ -549,7 +530,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { const reenterAccountFunctionSignature = @@ -574,7 +558,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise Promise { @@ -614,7 +601,7 @@ export const shouldBehaveLikeLSP17 = (buildContext: () => Promise { await expect( context.accounts[0].sendTransaction({ - to: context.contract.address, + to: await context.contract.getAddress(), data: '0x01', }), ).to.be.revertedWithCustomError(context.contract, 'InvalidFunctionSelector'); diff --git a/tests/LSP17Extensions/Extension4337/4337.test.ts b/packages/lsp-smart-contracts/tests/LSP17Extensions/Extension4337/4337.test.ts similarity index 82% rename from tests/LSP17Extensions/Extension4337/4337.test.ts rename to packages/lsp-smart-contracts/tests/LSP17Extensions/Extension4337/4337.test.ts index 3a9f9ff68..b4b5113e9 100644 --- a/tests/LSP17Extensions/Extension4337/4337.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP17Extensions/Extension4337/4337.test.ts @@ -1,28 +1,32 @@ import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { Signer } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { EntryPoint__factory, EntryPoint } from '@account-abstraction/contracts'; -import { BytesLike, parseEther } from 'ethers/lib/utils'; +import { BytesLike, Signer, parseEther } from 'ethers'; import { expect } from 'chai'; import { - Extension4337__factory, LSP6KeyManager, LSP6KeyManager__factory, UniversalProfile, UniversalProfile__factory, + Extension4337__factory, } from '../../../types'; import { deployEntryPoint, getBalance, isDeployed } from '../helpers/utils'; -import { ALL_PERMISSIONS, ERC725YDataKeys, OPERATION_TYPES } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS } from '@lukso/lsp6-contracts'; import { combinePermissions } from '../../utils/helpers'; import { fillAndSign } from '../helpers/UserOp'; -describe('4337', function () { +// Deploying NickFactory currently fails with latest Hardhat version. Commenting out temporarily until resolved +// See following issue: https://github.com/NomicFoundation/hardhat/issues/4939 +describe.skip('4337', function () { let bundler: SignerWithAddress; let deployer: Signer; let universalProfile: UniversalProfile; let universalProfileAddress: string; let keyManager: LSP6KeyManager; + let keyManagerAddress: string; let entryPoint: EntryPoint; let controllerWith4337Permission: SignerWithAddress; let controllerWithout4337Permission: SignerWithAddress; @@ -34,7 +38,7 @@ describe('4337', function () { before('setup', async function () { const provider = ethers.provider; - deployer = provider.getSigner(); + deployer = await provider.getSigner(); const deployerAddress = await deployer.getAddress(); [ @@ -48,12 +52,13 @@ describe('4337', function () { await deployer.getAddress(), { value: parseEther('1') }, ); - universalProfileAddress = universalProfile.address; + universalProfileAddress = await universalProfile.getAddress(); - keyManager = await new LSP6KeyManager__factory(deployer).deploy(universalProfile.address); + keyManager = await new LSP6KeyManager__factory(deployer).deploy(universalProfileAddress); + keyManagerAddress = await keyManager.getAddress(); // transfer ownership to keyManager - await universalProfile.transferOwnership(keyManager.address); + await universalProfile.transferOwnership(keyManagerAddress); const dataKey = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + deployerAddress.slice(2); @@ -62,27 +67,30 @@ describe('4337', function () { const acceptOwnershipBytes = universalProfile.interface.encodeFunctionData('acceptOwnership'); await keyManager.execute(acceptOwnershipBytes); - expect(await universalProfile.owner()).to.eq(keyManager.address); + expect(await universalProfile.owner()).to.eq(keyManagerAddress); // deploy entrypoint entryPoint = await deployEntryPoint(); - expect(await isDeployed(entryPoint.address)).to.eq(true); + expect(await isDeployed(await entryPoint.getAddress())).to.eq(true); // give all permissions to entrypoint const dataKeyEntryPointPermissions = - ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + entryPoint.address.slice(2); + ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + + (await entryPoint.getAddress()).slice(2); await universalProfile.setData(dataKeyEntryPointPermissions, ALL_PERMISSIONS); // deploy extension and attach it to universalProfile - const extension4337 = await new Extension4337__factory(deployer).deploy(entryPoint.address); - const validateUserOpSigHash = extension4337.interface.getSighash('validateUserOp'); + const extension4337 = await new Extension4337__factory(deployer).deploy( + await entryPoint.getAddress(), + ); + const validateUserOpSigHash = extension4337.interface.getFunction('validateUserOp').selector; const extensionDataKey = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + validateUserOpSigHash.slice(2) + '00000000000000000000000000000000'; - await universalProfile.setData(extensionDataKey, extension4337.address); + await universalProfile.setData(extensionDataKey, extension4337.target as string); // give permissions to controllers const dataKeyWithPermission4337 = @@ -107,7 +115,7 @@ describe('4337', function () { // execute calldata transferCallData = universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - ethers.constants.AddressZero, + ethers.ZeroAddress, amountToTransfer, '0x1234', ]); @@ -118,8 +126,7 @@ describe('4337', function () { }); it('should pass', async function () { - const addressZeroBalanceBefore = await getBalance(ethers.constants.AddressZero); - + const addressZeroBalanceBefore = await getBalance(ethers.ZeroAddress); const userOperation = await fillAndSign( { sender: universalProfileAddress, @@ -128,11 +135,8 @@ describe('4337', function () { controllerWith4337Permission, entryPoint, ); - await entryPoint.handleOps([userOperation], bundler.address); - - const addressZeroBalanceAfter = await getBalance(ethers.constants.AddressZero); - + const addressZeroBalanceAfter = await getBalance(ethers.ZeroAddress); expect(addressZeroBalanceAfter - addressZeroBalanceBefore).to.eq(amountToTransfer); }); diff --git a/tests/LSP17Extensions/helpers/Create2Factory.ts b/packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/Create2Factory.ts similarity index 67% rename from tests/LSP17Extensions/helpers/Create2Factory.ts rename to packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/Create2Factory.ts index abf7a43bd..8777ee51d 100644 --- a/tests/LSP17Extensions/helpers/Create2Factory.ts +++ b/packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/Create2Factory.ts @@ -1,7 +1,8 @@ // from: https://github.com/Arachnid/deterministic-deployment-proxy -import { BigNumber, BigNumberish, ethers, Signer } from 'ethers'; -import { arrayify, hexConcat, hexlify, hexZeroPad, keccak256 } from 'ethers/lib/utils'; -import { Provider } from '@ethersproject/providers'; +import { BigNumberish, Signer, ethers, toBeHex } from 'ethers'; +import { ethers as hardhatEthers } from 'hardhat'; +import { getBytes, concat, zeroPadValue, keccak256 } from 'ethers'; + import { TransactionRequest } from '@ethersproject/abstract-provider'; export class Create2Factory { @@ -19,8 +20,8 @@ export class Create2Factory { ).toString(); constructor( - readonly provider: Provider, - readonly signer = (provider as ethers.providers.JsonRpcProvider).getSigner(), + readonly provider: typeof hardhatEthers.provider = hardhatEthers.provider, + readonly signer = hardhatEthers.provider.getSigner().then(), ) {} /** @@ -51,24 +52,25 @@ export class Create2Factory { data: this.getDeployTransactionCallData(initCode, salt), }; if (gasLimit === 'estimate') { - gasLimit = await this.signer.estimateGas(deployTx); + gasLimit = await (await this.signer).estimateGas(deployTx); } if (gasLimit === undefined) { - gasLimit = - arrayify(initCode) + gasLimit = ethers.toBigInt( + getBytes(initCode) .map((x) => (x === 0 ? 4 : 16)) .reduce((sum, x) => sum + x) + - (200 * initCode.length) / 2 + // actual is usually somewhat smaller (only deposited code, not entire constructor) - 6 * Math.ceil(initCode.length / 64) + // hash price. very minor compared to deposit costs - 32000 + - 21000; + (200 * initCode.length) / 2 + // actual is usually somewhat smaller (only deposited code, not entire constructor) + 6 * Math.ceil(initCode.length / 64) + // hash price. very minor compared to deposit costs + 32000 + + 21000, + ); // deployer requires some extra gas - gasLimit = Math.floor((gasLimit * 64) / 63); + gasLimit = ethers.toBigInt(Math.floor((ethers.toNumber(gasLimit) * 64) / 63)); } - const ret = await this.signer.sendTransaction({ ...deployTx, gasLimit }); + const ret = await (await this.signer).sendTransaction({ ...deployTx, gasLimit }); await ret.wait(); if ((await this.provider.getCode(addr).then((code) => code.length)) === 2) { throw new Error('failed to deploy'); @@ -77,8 +79,8 @@ export class Create2Factory { } getDeployTransactionCallData(initCode: string, salt: BigNumberish = 0): string { - const saltBytes32 = hexZeroPad(hexlify(salt), 32); - return hexConcat([saltBytes32, initCode]); + const saltBytes32 = zeroPadValue(toBeHex(salt), 32); + return concat([saltBytes32, initCode]); } /** @@ -88,11 +90,11 @@ export class Create2Factory { * @param salt */ static getDeployedAddress(initCode: string, salt: BigNumberish): string { - const saltBytes32 = hexZeroPad(hexlify(salt), 32); + const saltBytes32 = zeroPadValue(toBeHex(salt), 32); return ( '0x' + keccak256( - hexConcat(['0xff', Create2Factory.contractAddress, saltBytes32, keccak256(initCode)]), + concat(['0xff', Create2Factory.contractAddress, saltBytes32, keccak256(initCode)]), ).slice(-40) ); } @@ -102,11 +104,23 @@ export class Create2Factory { if (await this._isFactoryDeployed()) { return; } - await (signer ?? this.signer).sendTransaction({ + + const currentSigner = (await signer) ?? (await this.signer); + const tx = await currentSigner.sendTransaction({ to: Create2Factory.factoryDeployer, - value: BigNumber.from(Create2Factory.factoryDeploymentFee), + value: BigInt(Create2Factory.factoryDeploymentFee), }); - await this.provider.sendTransaction(Create2Factory.factoryTx); + await tx.wait(); + + // TODO: this transaction keeps failing with the following error, although the deployment transaction + // for the Create2Factory has not changed: + // `Error: VM Exception while processing transaction: invalid opcode` + + await this.provider.send('eth_sendTransaction', [ + { + data: Create2Factory.factoryTx, + }, + ]); if (!(await this._isFactoryDeployed())) { throw new Error('fatal: failed to deploy deterministic deployer'); } diff --git a/tests/LSP17Extensions/helpers/UserOp.ts b/packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/UserOp.ts similarity index 79% rename from tests/LSP17Extensions/helpers/UserOp.ts rename to packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/UserOp.ts index cb8b3141e..428445043 100644 --- a/tests/LSP17Extensions/helpers/UserOp.ts +++ b/packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/UserOp.ts @@ -1,12 +1,22 @@ -import { arrayify, defaultAbiCoder, hexDataSlice, keccak256 } from 'ethers/lib/utils'; -import { BigNumber, Wallet } from 'ethers'; +import { + getBytes, + dataSlice, + keccak256, + BytesLike, + toBigInt, + toBeHex, + hexlify, + toNumber, +} from 'ethers'; +import { Wallet } from 'ethers'; import { AddressZero, callDataCost } from './utils'; import { ecsign, toRpcSig, keccak256 as keccak256_buffer } from 'ethereumjs-util'; import { Create2Factory } from './Create2Factory'; import { EntryPoint } from '@account-abstraction/contracts'; -import { ethers } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { AbiCoder } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import * as typ from './solidityTypes'; +import { ethers as hreEther } from 'hardhat'; export interface UserOperation { sender: typ.address; @@ -25,7 +35,7 @@ export interface UserOperation { export function packUserOp(op: UserOperation, forSignature = true): string { if (forSignature) { // Encoding the UserOperation object fields into a single string for signature - return defaultAbiCoder.encode( + return AbiCoder.defaultAbiCoder().encode( [ 'address', 'uint256', @@ -41,19 +51,19 @@ export function packUserOp(op: UserOperation, forSignature = true): string { [ op.sender, op.nonce, - keccak256(op.initCode), - keccak256(op.callData), + keccak256(op.initCode as BytesLike), + keccak256(op.callData as BytesLike), op.callGasLimit, op.verificationGasLimit, op.preVerificationGas, op.maxFeePerGas, op.maxPriorityFeePerGas, - keccak256(op.paymasterAndData), + keccak256(op.paymasterAndData as BytesLike), ], ); } else { // Encoding the UserOperation object fields into a single string including the signature - return defaultAbiCoder.encode( + return AbiCoder.defaultAbiCoder().encode( [ 'address', 'uint256', @@ -87,7 +97,7 @@ export function packUserOp(op: UserOperation, forSignature = true): string { export function getUserOpHash(op: UserOperation, entryPoint: string, chainId: number): string { const userOpHash = keccak256(packUserOp(op, true)); // Encoding the UserOperation hash, entryPoint address, and chainId for final hash computation - const enc = defaultAbiCoder.encode( + const enc = AbiCoder.defaultAbiCoder().encode( ['bytes32', 'address', 'uint256'], [userOpHash, entryPoint, chainId], ); @@ -117,10 +127,10 @@ export function signUserOp( const message = getUserOpHash(op, entryPoint, chainId); const msg1 = Buffer.concat([ Buffer.from('\x19Ethereum Signed Message:\n32', 'ascii'), - Buffer.from(arrayify(message)), + Buffer.from(getBytes(message)), ]); - const sig = ecsign(keccak256_buffer(msg1), Buffer.from(arrayify(signer.privateKey))); + const sig = ecsign(keccak256_buffer(msg1), Buffer.from(getBytes(signer.privateKey))); // that's equivalent of: await signer.signMessage(message); // (but without "async" const signedMessage1 = toRpcSig(sig.v, sig.r, sig.s); @@ -163,40 +173,38 @@ export async function fillUserOp( entryPoint?: EntryPoint, ): Promise { const op1 = { ...op }; - const provider = entryPoint?.provider; + const provider = hreEther.provider; if (op.initCode != null) { - const initAddr = hexDataSlice(op1.initCode, 0, 20); - const initCallData = hexDataSlice(op1.initCode, 20); + const initAddr = dataSlice(op1.initCode as BytesLike, 0, 20); + const initCallData = dataSlice(op1.initCode as BytesLike, 20); if (op1.nonce == null) op1.nonce = 0; if (op1.sender == null) { if (initAddr.toLowerCase() === Create2Factory.contractAddress.toLowerCase()) { - const ctr = hexDataSlice(initCallData, 32); - const salt = hexDataSlice(initCallData, 0, 32); + const ctr = dataSlice(initCallData, 32); + const salt = dataSlice(initCallData, 0, 32); op1.sender = Create2Factory.getDeployedAddress(ctr, salt); } else { if (provider == null) throw new Error('no entrypoint/provider'); op1.sender = await entryPoint.callStatic - .getSenderAddress(op1.initCode) + .getSenderAddress(op1.initCode as BytesLike) .catch((e) => e.errorArgs.sender); } } if (op1.verificationGasLimit == null) { if (provider == null) throw new Error('no entrypoint/provider'); const initEstimate = await provider.estimateGas({ - from: entryPoint?.address, + from: entryPoint?.target, to: initAddr, data: initCallData, gasLimit: 10e6, }); - op1.verificationGasLimit = BigNumber.from(DefaultsForUserOp.verificationGasLimit).add( - initEstimate, - ); + op1.verificationGasLimit = toBigInt(DefaultsForUserOp.verificationGasLimit) + initEstimate; } } if (op1.nonce == null) { if (provider == null) throw new Error('must have entryPoint to autofill nonce'); - const signerKeyAsUint192 = ethers.BigNumber.from(signer.address).toHexString(); + const signerKeyAsUint192 = toBeHex(toBigInt(signer.address)); try { op1.nonce = await entryPoint.getNonce(op1.sender, signerKeyAsUint192); @@ -207,9 +215,9 @@ export async function fillUserOp( if (op1.callGasLimit == null && op.callData != null) { if (provider == null) throw new Error('must have entryPoint for callGasLimit estimate'); const gasEtimated = await provider.estimateGas({ - from: entryPoint?.address, + from: entryPoint?.target, to: op1.sender, - data: op1.callData, + data: hexlify(op1.callData as BytesLike), }); op1.callGasLimit = gasEtimated; @@ -217,9 +225,9 @@ export async function fillUserOp( if (op1.maxFeePerGas == null) { if (provider == null) throw new Error('must have entryPoint to autofill maxFeePerGas'); const block = await provider.getBlock('latest'); - op1.maxFeePerGas = block.baseFeePerGas.add( - op1.maxPriorityFeePerGas ?? DefaultsForUserOp.maxPriorityFeePerGas, - ); + op1.maxFeePerGas = + block.baseFeePerGas + + BigInt(op1.maxPriorityFeePerGas ?? DefaultsForUserOp.maxPriorityFeePerGas); } if (op1.maxPriorityFeePerGas == null) { @@ -238,11 +246,11 @@ export async function fillAndSign( signer: SignerWithAddress, entryPoint?: EntryPoint, ): Promise { - const provider = entryPoint?.provider; + const provider = hreEther.provider; const op2 = await fillUserOp(op, signer, entryPoint); const chainId = await provider.getNetwork().then((net) => net.chainId); - const message = arrayify(getUserOpHash(op2, entryPoint.address, chainId)); + const message = getBytes(getUserOpHash(op2, entryPoint.target as string, toNumber(chainId))); return { ...op2, diff --git a/tests/LSP17Extensions/helpers/solidityTypes.ts b/packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/solidityTypes.ts similarity index 100% rename from tests/LSP17Extensions/helpers/solidityTypes.ts rename to packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/solidityTypes.ts diff --git a/tests/LSP17Extensions/helpers/utils.ts b/packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/utils.ts similarity index 74% rename from tests/LSP17Extensions/helpers/utils.ts rename to packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/utils.ts index 10c338d83..cedceee39 100644 --- a/tests/LSP17Extensions/helpers/utils.ts +++ b/packages/lsp-smart-contracts/tests/LSP17Extensions/helpers/utils.ts @@ -2,23 +2,23 @@ import { ethers } from 'hardhat'; import { Create2Factory } from './Create2Factory'; import { EntryPoint__factory, EntryPoint } from '@account-abstraction/contracts'; -export const AddressZero = ethers.constants.AddressZero; +export const AddressZero = ethers.ZeroAddress; export function callDataCost(data: string): number { - return ethers.utils - .arrayify(data) + return ethers + .getBytes(data) .map((x) => (x === 0 ? 4 : 16)) .reduce((sum, x) => sum + x); } export async function deployEntryPoint(provider = ethers.provider): Promise { - const create2factory = new Create2Factory(provider); + const create2factory = new Create2Factory(provider as any); const addr = await create2factory.deploy( EntryPoint__factory.bytecode, 0, - process.env.COVERAGE != null ? 20e6 : 8e6, + process.env.COVERAGE != null ? BigInt(20e6) : BigInt(8e6), ); - return EntryPoint__factory.connect(addr, provider.getSigner()); + return EntryPoint__factory.connect(addr, await provider.getSigner()); } export async function getBalance(address: string): Promise { diff --git a/tests/LSP1UniversalReceiver/LSP1UniversalReceiver.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiver.behaviour.ts similarity index 87% rename from tests/LSP1UniversalReceiver/LSP1UniversalReceiver.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiver.behaviour.ts index 2f523a9c4..06a894e93 100644 --- a/tests/LSP1UniversalReceiver/LSP1UniversalReceiver.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiver.behaviour.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { parseEther } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // types import { @@ -27,11 +27,16 @@ export type LSP1TestContext = { export const shouldBehaveLikeLSP1 = (buildContext: () => Promise) => { let context: LSP1TestContext; + let lsp1ImplementationAddress: string; + let lsp1CheckerAddress: string; + describe('when calling the `universalReceiver(...)` function', () => { const valueSent = 0; before(async () => { context = await buildContext(); + lsp1ImplementationAddress = await context.lsp1Implementation.getAddress(); + lsp1CheckerAddress = await context.lsp1Checker.getAddress(); }); describe('from an EOA', () => { @@ -67,14 +72,14 @@ export const shouldBehaveLikeLSP1 = (buildContext: () => Promise { await expect( context.lsp1Checker.checkImplementation( - context.lsp1Implementation.address, + lsp1ImplementationAddress, LSP1_HOOK_PLACEHOLDER, ), ) .to.emit(context.lsp1Implementation, 'UniversalReceiver') .withArgs( // from - context.lsp1Checker.address, + lsp1CheckerAddress, // value valueSent, // typeId @@ -91,14 +96,14 @@ export const shouldBehaveLikeLSP1 = (buildContext: () => Promise { await expect( context.lsp1Checker.checkImplementationLowLevelCall( - context.lsp1Implementation.address, + lsp1ImplementationAddress, LSP1_HOOK_PLACEHOLDER, ), ) .to.emit(context.lsp1Implementation, 'UniversalReceiver') .withArgs( // from - context.lsp1Checker.address, + lsp1CheckerAddress, // value valueSent, // typeId @@ -134,8 +139,8 @@ export const shouldBehaveLikeLSP1 = (buildContext: () => Promise Promise { - const valueSent = ethers.utils.parseEther('3'); + const valueSent = parseEther('3'); before(async () => { context = await buildContext(); + lsp1ImplementationAddress = await context.lsp1Implementation.getAddress(); + lsp1CheckerAddress = await context.lsp1Checker.getAddress(); }); describe('from an EOA', () => { @@ -185,8 +192,8 @@ export const shouldBehaveLikeLSP1 = (buildContext: () => Promise { before(async () => { await context.accounts[0].sendTransaction({ - to: context.lsp1Checker.address, - value: ethers.utils.parseEther('50'), + to: lsp1CheckerAddress, + value: parseEther('50'), }); }); @@ -194,7 +201,7 @@ export const shouldBehaveLikeLSP1 = (buildContext: () => Promise { await expect( context.lsp1Checker.checkImplementation( - context.lsp1Implementation.address, + lsp1ImplementationAddress, LSP1_HOOK_PLACEHOLDER, { value: valueSent }, ), @@ -202,7 +209,7 @@ export const shouldBehaveLikeLSP1 = (buildContext: () => Promise Promise { await expect( context.lsp1Checker.checkImplementationLowLevelCall( - context.lsp1Implementation.address, + lsp1ImplementationAddress, LSP1_HOOK_PLACEHOLDER, { value: valueSent }, ), @@ -227,7 +234,7 @@ export const shouldBehaveLikeLSP1 = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenA.interface.encodeFunctionData('mint', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '10', false, '0x', @@ -342,7 +339,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenA.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenA.getAddress(), abi)); }); it('should register lsp5keys: arrayLength 1, index 0, tokenA address in UP1', async () => { @@ -351,14 +348,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp7TokenA.address); + expect(elementAddress).to.equal(await lsp7TokenA.getAddress()); }); }); describe('when minting 10 tokenB to universalProfile1', () => { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('mint', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '10', false, '0x', @@ -366,7 +363,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenB.getAddress(), abi)); }); it('should register lsp5keys: arrayLength 2, index 1, tokenB address in UP1', async () => { @@ -375,14 +372,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); }); describe('when minting 10 of the same tokenB to universalProfile1', () => { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('mint', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '10', false, '0x', @@ -390,7 +387,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenB.getAddress(), abi)); }); it('should keep the same lsp5keys: arrayLength 2, index 1, tokenB address in UP1', async () => { @@ -399,14 +396,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); }); describe('when minting 10 tokenC to universalProfile1', () => { before(async () => { const abi = lsp7TokenC.interface.encodeFunctionData('mint', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '10', false, '0x', @@ -414,7 +411,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenC.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenC.getAddress(), abi)); }); it('should register lsp5keys: arrayLength 3, index 2, tokenC address in UP1', async () => { const [indexInMap, interfaceId, arrayLength, elementAddress] = @@ -422,7 +419,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(2); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.THREE); - expect(elementAddress).to.equal(lsp7TokenC.address); + expect(elementAddress).to.equal(await lsp7TokenC.getAddress()); }); }); }); @@ -435,7 +432,7 @@ export const shouldBehaveLikeLSP1Delegate = ( ); const abi = lsp7TokenC.interface.encodeFunctionData('burn', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '0', '0x', ]); @@ -443,13 +440,13 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect( context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenA.address, abi)), + .execute(callPayload(context.universalProfile1, await lsp7TokenA.getAddress(), abi)), ) .to.emit(lsp7TokenA, 'Transfer') .withArgs( - context.universalProfile1.address, - context.universalProfile1.address, - ethers.constants.AddressZero, + await context.universalProfile1.getAddress(), + await context.universalProfile1.getAddress(), + ethers.ZeroAddress, '0', false, '0x', @@ -467,20 +464,21 @@ export const shouldBehaveLikeLSP1Delegate = ( describe('when burning 10 tokenC (last token) from universalProfile1', () => { before(async () => { const abi = lsp7TokenC.interface.encodeFunctionData('burn', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '10', '0x', ]); await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenC.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenC.getAddress(), abi)); }); it('should update lsp5keys: arrayLength 2, no map, no tokenC address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenC.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenC.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000002', @@ -495,14 +493,14 @@ export const shouldBehaveLikeLSP1Delegate = ( describe('when burning 10 tokenA (first token) from universalProfile1', () => { before(async () => { const abi = lsp7TokenA.interface.encodeFunctionData('burn', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '10', '0x', ]); await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenA.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenA.getAddress(), abi)); }); it('should pop and swap TokenA with TokenB, lsp5keys (tokenB should become first token) : arrayLength 1, index = 0, tokenB address in UP1', async () => { @@ -511,13 +509,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); it('should update lsp5keys: arrayLength 1, no map, no tokenA address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenA.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenA.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', @@ -532,14 +531,14 @@ export const shouldBehaveLikeLSP1Delegate = ( describe('when burning 10 (half of the amount) tokenB from universalProfile1', () => { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('burn', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '10', '0x', ]); await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenB.getAddress(), abi)); }); it('should keep the same lsp5keys: arrayLength 1, index 0, tokenB address in UP1', async () => { const [indexInMap, interfaceId, arrayLength, elementAddress] = @@ -547,26 +546,27 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); }); describe('when burning 10 (remaining) tokenB from universalProfile1', () => { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('burn', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '10', '0x', ]); await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenB.getAddress(), abi)); }); it('should update lsp5keys: arrayLength 0, no map, no tokenB address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000000', @@ -591,7 +591,7 @@ export const shouldBehaveLikeLSP1Delegate = ( .connect(context.accounts.random) .transfer( context.accounts.random.address, - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, false, '0x', @@ -601,7 +601,7 @@ export const shouldBehaveLikeLSP1Delegate = ( .withArgs( context.accounts.random.address, context.accounts.random.address, - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, false, '0x', @@ -619,15 +619,15 @@ export const shouldBehaveLikeLSP1Delegate = ( it('should fund the universalProfle with 10 tokens (each) to test token transfers (TokenA, TokenB, TokenC)', async () => { await lsp7TokenA .connect(context.accounts.random) - .mint(context.universalProfile1.address, '10', false, '0x'); + .mint(await context.universalProfile1.getAddress(), '10', false, '0x'); await lsp7TokenB .connect(context.accounts.random) - .mint(context.universalProfile1.address, '10', false, '0x'); + .mint(await context.universalProfile1.getAddress(), '10', false, '0x'); await lsp7TokenC .connect(context.accounts.random) - .mint(context.universalProfile1.address, '10', false, '0x'); + .mint(await context.universalProfile1.getAddress(), '10', false, '0x'); }); it('should register lsp5keys: arrayLength 3, index [1,2,3], [tokenA, tokenB, tokenC] addresses in UP1 ', async () => { @@ -647,16 +647,16 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(interfaceIdTokenA).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(interfaceIdTokenB).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(interfaceIdTokenC).to.equal(INTERFACE_IDS.LSP7DigitalAsset); - expect(elementAddressTokenA).to.equal(lsp7TokenA.address); - expect(elementAddressTokenB).to.equal(lsp7TokenB.address); - expect(elementAddressTokenC).to.equal(lsp7TokenC.address); + expect(elementAddressTokenA).to.equal(await lsp7TokenA.getAddress()); + expect(elementAddressTokenB).to.equal(await lsp7TokenB.getAddress()); + expect(elementAddressTokenC).to.equal(await lsp7TokenC.getAddress()); }); describe('When transferring 10 (all) token A from UP1 to UP2', () => { before(async () => { const abi = lsp7TokenA.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), '10', false, '0x', @@ -664,7 +664,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenA.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenA.getAddress(), abi)); }); it('should pop and swap TokenA with TokenC, lsp5keys (tokenC should become first token) : arrayLength 1, index = 0, tokenC address in UP1', async () => { @@ -673,13 +673,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenC.address); + expect(elementAddress).to.equal(await lsp7TokenC.getAddress()); }); it('should update lsp5keys: arrayLength 2, no map, no tokenA address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenA.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenA.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000002', @@ -696,15 +697,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp7TokenA.address); + expect(elementAddress).to.equal(await lsp7TokenA.getAddress()); }); }); describe('When transferring 5 (half of amount) token B from UP1 to UP2', () => { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), '5', false, '0x', @@ -712,7 +713,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenB.getAddress(), abi)); }); it('should keep the same lsp5keys : arrayLength 2, index = 1, tokenB address in UP1', async () => { @@ -721,7 +722,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); it('should register lsp5keys: arrayLength 2, index 1, tokenB address in UP2', async () => { @@ -730,15 +731,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); }); describe('When transferring 4 (few) token B from UP1 to UP2', () => { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), '4', false, '0x', @@ -746,7 +747,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenB.getAddress(), abi)); }); it('should keep the same lsp5keys : arrayLength 2, index = 1, tokenB address in UP1', async () => { @@ -755,7 +756,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); it('should keep the same lsp5keys : arrayLength 2, index = 1, tokenB address in UP2', async () => { @@ -764,15 +765,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); }); describe('When transferring 1 (remaining) token B from UP1 to UP2', () => { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), '1', false, '0x', @@ -780,13 +781,14 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenB.getAddress(), abi)); }); it('should update lsp5keys (no pop and swap as TokenB has the last index): arrayLength 1, no map, no tokenB address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', @@ -803,15 +805,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); }); describe('When transferring 10 (all) token C from UP1 to UP2', () => { before(async () => { const abi = lsp7TokenC.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), '10', false, '0x', @@ -819,13 +821,14 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenC.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp7TokenC.getAddress(), abi)); }); it('should update lsp5keys (no pop and swap as TokenC has the last index): arrayLength 0, no map, no tokenB address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', @@ -842,15 +845,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(2); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.THREE); - expect(elementAddress).to.equal(lsp7TokenC.address); + expect(elementAddress).to.equal(await lsp7TokenC.getAddress()); }); }); describe('When transferring 1 (few) token B from UP2 to UP1', () => { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('transfer', [ - context.universalProfile2.address, - context.universalProfile1.address, + await context.universalProfile2.getAddress(), + await context.universalProfile1.getAddress(), '1', false, '0x', @@ -858,7 +861,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager2 .connect(context.accounts.owner2) - .execute(callPayload(context.universalProfile2, lsp7TokenB.address, abi)); + .execute(callPayload(context.universalProfile2, await lsp7TokenB.getAddress(), abi)); }); it('should register lsp5keys (UP1 able to re-register keys) : arrayLength 1, index = 0, tokenB address in UP1', async () => { @@ -867,7 +870,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); }); }); @@ -875,44 +878,44 @@ export const shouldBehaveLikeLSP1Delegate = ( describe('when removing all keys', () => { before(async () => { const abi1 = lsp7TokenB.interface.encodeFunctionData('burn', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), '1', '0x', ]); await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp7TokenB.address, abi1)); + .execute(callPayload(context.universalProfile1, await lsp7TokenB.getAddress(), abi1)); const abi2 = lsp7TokenB.interface.encodeFunctionData('burn', [ - context.universalProfile2.address, + await context.universalProfile2.getAddress(), '9', '0x', ]); await context.lsp6KeyManager2 .connect(context.accounts.owner2) - .execute(callPayload(context.universalProfile2, lsp7TokenB.address, abi2)); + .execute(callPayload(context.universalProfile2, await lsp7TokenB.getAddress(), abi2)); const abi3 = lsp7TokenA.interface.encodeFunctionData('burn', [ - context.universalProfile2.address, + await context.universalProfile2.getAddress(), '10', '0x', ]); await context.lsp6KeyManager2 .connect(context.accounts.owner2) - .execute(callPayload(context.universalProfile2, lsp7TokenA.address, abi3)); + .execute(callPayload(context.universalProfile2, await lsp7TokenA.getAddress(), abi3)); const abi4 = lsp7TokenC.interface.encodeFunctionData('burn', [ - context.universalProfile2.address, + await context.universalProfile2.getAddress(), '10', '0x', ]); await context.lsp6KeyManager2 .connect(context.accounts.owner2) - .execute(callPayload(context.universalProfile2, lsp7TokenC.address, abi4)); + .execute(callPayload(context.universalProfile2, await lsp7TokenC.getAddress(), abi4)); }); it('should remove all lsp5 keys on both UP', async () => { const arrayLengthUP1 = await context.universalProfile1['getData(bytes32)']( @@ -942,7 +945,7 @@ export const shouldBehaveLikeLSP1Delegate = ( it("should not revert and return 'LSP5: Error generating data key/value pairs' with empty LSP7 token transfer", async () => { const txParams = { - from: context.universalProfile1.address, + from: await context.universalProfile1.getAddress(), to: context.accounts.random.address, amount: 0, allowedNonLSP1Recipient: true, @@ -959,7 +962,7 @@ export const shouldBehaveLikeLSP1Delegate = ( const executePayload = context.universalProfile1.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp7Token.address, + await lsp7Token.getAddress(), 0, emptyTokenTransferPayload, ]); @@ -968,12 +971,7 @@ export const shouldBehaveLikeLSP1Delegate = ( const expectedReturnedValues = abiCoder.encode( ['bytes', 'bytes'], - [ - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('LSP5: Error generating data key/value pairs'), - ), - '0x', - ], + [ethers.hexlify(ethers.toUtf8Bytes('LSP5: Error generating data key/value pairs')), '0x'], ); // the call to the universalReceiver(...) in LSP7 sends the transfer details as `data` argument @@ -981,7 +979,7 @@ export const shouldBehaveLikeLSP1Delegate = ( const expectedReceivedData = abiCoder.encode( ['address', 'address', 'address', 'uint256', 'bytes'], [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), txParams.from, txParams.to, txParams.amount, @@ -994,7 +992,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect(tx) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - lsp7Token.address, + await lsp7Token.getAddress(), 0, LSP1_TYPE_IDS.LSP7Tokens_SenderNotification, expectedReceivedData, @@ -1024,7 +1022,7 @@ export const shouldBehaveLikeLSP1Delegate = ( // check that it does not revert await expect( await notTokenContractWithBalanceOfFunction.call( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ), @@ -1032,8 +1030,8 @@ export const shouldBehaveLikeLSP1Delegate = ( // check that it returns the correct string const universalReceiverResult = - await notTokenContractWithBalanceOfFunction.callStatic.call( - context.universalProfile1.address, + await notTokenContractWithBalanceOfFunction.call.staticCall( + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ); @@ -1043,20 +1041,20 @@ export const shouldBehaveLikeLSP1Delegate = ( const [resultDelegate] = abiCoder.decode(['bytes', 'bytes'], genericExecutorResult); expect(resultDelegate).to.equal( - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('LSP1: full balance is not sent')), + ethers.hexlify(ethers.toUtf8Bytes('LSP1: full balance is not sent')), ); // check that the correct string is emitted in the event await expect( notTokenContractWithBalanceOfFunction.call( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ), ) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - notTokenContractWithBalanceOfFunction.address, + notTokenContractWithBalanceOfFunction.getAddress(), 0, LSP1_TYPE_IDS.LSP7Tokens_SenderNotification, '0x', @@ -1075,15 +1073,15 @@ export const shouldBehaveLikeLSP1Delegate = ( // check that it does not revert await expect( await notTokenContract.call( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ), ).to.not.be.reverted; // check that it returns the correct string - const universalReceiverResult = await notTokenContract.callStatic.call( - context.universalProfile1.address, + const universalReceiverResult = await notTokenContract.call.staticCall( + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ); @@ -1093,18 +1091,20 @@ export const shouldBehaveLikeLSP1Delegate = ( const [resultDelegate] = abiCoder.decode(['bytes', 'bytes'], genericExecutorResult); expect(resultDelegate).to.equal( - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('LSP1: `balanceOf(address)` function not found'), - ), + ethers.hexlify(ethers.toUtf8Bytes('LSP1: `balanceOf(address)` function not found')), ); // check that the correct string is emitted in the event await expect( - notTokenContract.call(context.universalProfile1.address, 0, universalReceiverPayload), + notTokenContract.call( + await context.universalProfile1.getAddress(), + 0, + universalReceiverPayload, + ), ) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - notTokenContract.address, + await notTokenContract.getAddress(), 0, LSP1_TYPE_IDS.LSP7Tokens_SenderNotification, '0x', @@ -1135,19 +1135,20 @@ export const shouldBehaveLikeLSP1Delegate = ( arrayKey = ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length; arrayIndexKey = ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '0'.repeat(32); - assetMapKey = ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + token.address.substring(2); + assetMapKey = + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + (await token.getAddress()).substring(2); }); describe('when `LSP5ReceivedAssets[]` length value is `max(uint128)`', () => { const lsp5ArrayLengthDataKey = ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length; // set the `LSP5ReceivedAssets[]` length value to the max(uint128)` - const lsp5ArrayLengthDataValue = ethers.BigNumber.from(2).pow(128).sub(1); + const lsp5ArrayLengthDataValue = '0xffffffffffffffffffffffffffffffff'; before(async () => { const setDataPayload = context.universalProfile1.interface.encodeFunctionData('setData', [ lsp5ArrayLengthDataKey, - lsp5ArrayLengthDataValue.toHexString(), + lsp5ArrayLengthDataValue, ]); await context.lsp6KeyManager1.connect(context.accounts.owner1).execute(setDataPayload); @@ -1161,18 +1162,18 @@ export const shouldBehaveLikeLSP1Delegate = ( it('should revert when trying to transfer some tokens to UP but UP cannot register any more tokens', async () => { // try to transfer (= mint) some tokens to the UP // this should revert because the UP cannot register any more tokens - await expect(token.mint(context.universalProfile1.address, 10_000, false, '0x')) + await expect(token.mint(await context.universalProfile1.getAddress(), 10_000, false, '0x')) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - token.address, + await token.getAddress(), 0, LSP1_TYPE_IDS.LSP7Tokens_RecipientNotification, abiCoder.encode( ['address', 'address', 'address', 'uint256', 'bytes'], [ context.accounts.random.address, - ethers.constants.AddressZero, - context.universalProfile1.address, + ethers.ZeroAddress, + await context.universalProfile1.getAddress(), 10_000, '0x', ], @@ -1180,10 +1181,7 @@ export const shouldBehaveLikeLSP1Delegate = ( abiCoder.encode( ['bytes', 'bytes'], [ - ethers.utils.solidityPack( - ['string'], - ['LSP5: Error generating data key/value pairs'], - ), + ethers.solidityPacked(['string'], ['LSP5: Error generating data key/value pairs']), '0x', ], ), @@ -1195,12 +1193,13 @@ export const shouldBehaveLikeLSP1Delegate = ( const lsp5ArrayLengthDataKey = ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length; // set the `LSP5ReceivedAssets[]` length value to the max(uint128)` - const lsp5ArrayLengthDataValue = ethers.BigNumber.from(2).pow(128).sub(2); + const lsp5ArrayLengthDataValue = + ethers.toBigInt('0xffffffffffffffffffffffffffffffff') - BigInt(2); before(async () => { const setDataPayload = context.universalProfile1.interface.encodeFunctionData('setData', [ lsp5ArrayLengthDataKey, - lsp5ArrayLengthDataValue.toHexString(), + ethers.toBeHex(lsp5ArrayLengthDataValue), ]); await context.lsp6KeyManager1.connect(context.accounts.owner1).execute(setDataPayload); @@ -1219,7 +1218,8 @@ export const shouldBehaveLikeLSP1Delegate = ( [ ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00'.repeat(16), - ERC725YDataKeys.LSP5['LSP5ReceivedAssetsMap'] + token.address.substring(2), + ERC725YDataKeys.LSP5['LSP5ReceivedAssetsMap'] + + (await token.getAddress()).substring(2), ], ['0x', '0x', '0x'], ], @@ -1231,50 +1231,50 @@ export const shouldBehaveLikeLSP1Delegate = ( it('should not revert when trying to transfer some tokens to UP and UP (can register ONLY ONE MORE more tokens)', async () => { // try to transfer (= mint) some tokens to the UP // this should not revert because the UP can register one more asset - await token.mint(context.universalProfile1.address, 10_000, false, '0x'); + await token.mint(await context.universalProfile1.getAddress(), 10_000, false, '0x'); // check the `LSP5ReceivedAssets[]` length value was set correctly expect(await context.universalProfile1.getData(lsp5ArrayLengthDataKey)).to.equal( - lsp5ArrayLengthDataValue.add(1), + lsp5ArrayLengthDataValue + BigInt(1), ); - const index = lsp5ArrayLengthDataValue.toHexString(); + const index = ethers.toBeHex(lsp5ArrayLengthDataValue); const lsp5ArrayIndexDataKey = ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + index.substring(2); // checksummed address of the token - const storedAssetAddress = ethers.utils.getAddress( + const storedAssetAddress = ethers.getAddress( await context.universalProfile1.getData(lsp5ArrayIndexDataKey), ); // Check the address of the token was added to the `LSP5ReceivedAssets[maxLength - 1]` key - expect(storedAssetAddress).to.equal(token.address); + expect(storedAssetAddress).to.equal(await token.getAddress()); // Check that the correct tuple (interfaceId, index) was set under LSP5ReceivedAssetsMap + token address expect( await context.universalProfile1.getData( - ERC725YDataKeys.LSP5['LSP5ReceivedAssetsMap'] + token.address.substring(2), + ERC725YDataKeys.LSP5['LSP5ReceivedAssetsMap'] + (await token.getAddress()).substring(2), ), ).to.equal( - ethers.utils.solidityPack(['bytes4', 'uint128'], [INTERFACE_IDS.LSP7DigitalAsset, index]), + ethers.solidityPacked(['bytes4', 'uint128'], [INTERFACE_IDS.LSP7DigitalAsset, index]), ); }); }); describe('when the Map value of LSP5ReceivedAssetsMap is less than 20 bytes', () => { - let tokenTransferTx: Transaction; - let balance: BigNumber; + let tokenTransferTx: ContractTransaction; + let balance: bigint; before(async () => { await token .connect(context.accounts.owner1) - .mint(context.universalProfile1.address, 100, false, '0x'); + .mint(await context.universalProfile1.getAddress(), 100, false, '0x'); await context.universalProfile1 .connect(context.accounts.owner1) .setData( - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + token.address.substring(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + (await token.getAddress()).substring(2), '0xcafecafecafecafe', ); @@ -1282,14 +1282,14 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xcafecafecafecafe', ]); - balance = await token.balanceOf(context.universalProfile1.address); + balance = await token.balanceOf(await context.universalProfile1.getAddress()); const tokenTransferCalldata = token.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), context.accounts.owner1.address, balance, true, @@ -1298,7 +1298,7 @@ export const shouldBehaveLikeLSP1Delegate = ( tokenTransferTx = await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, token.address, 0, tokenTransferCalldata); + .execute(OPERATION_TYPES.CALL, await token.getAddress(), 0, tokenTransferCalldata); }); it('should pass', async () => { @@ -1306,20 +1306,20 @@ export const shouldBehaveLikeLSP1Delegate = ( }); it('should emit UniversalReceiver event', async () => { - const tokensSentBytes32Value = ethers.utils.hexZeroPad(balance.toHexString(), 32); + const tokensSentBytes32Value = ethers.zeroPadValue(ethers.toBeHex(balance), 32); const tokenTransferData = abiCoder.encode( ['address', 'address', 'address', 'uint256', 'bytes'], [ - context.universalProfile1.address, - context.universalProfile1.address, + await context.universalProfile1.getAddress(), + await context.universalProfile1.getAddress(), context.accounts.owner1.address, tokensSentBytes32Value, '0x', ], ); - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP5: Error generating data key/value pairs', '0x'], ); @@ -1327,7 +1327,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect(tokenTransferTx) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - token.address, + await token.getAddress(), 0, LSP1_TYPE_IDS.LSP7Tokens_SenderNotification, tokenTransferData, @@ -1340,25 +1340,25 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xcafecafecafecafe', ]); }); }); describe('when the Map value of LSP5ReceivedAssetsMap is bigger than 20 bytes, (valid `(byte4,uint128)` tuple + extra bytes)', () => { - let tokenTransferTx: Transaction; - let balance: BigNumber; + let tokenTransferTx: ContractTransaction; + let balance: bigint; before(async () => { await token .connect(context.accounts.owner1) - .mint(context.universalProfile1.address, 100, false, '0x'); + .mint(await context.universalProfile1.getAddress(), 100, false, '0x'); await context.universalProfile1 .connect(context.accounts.owner1) .setData( - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + token.address.substring(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + (await token.getAddress()).substring(2), '0xb3c4928f00000000000000000000000000000000cafecafe', ); @@ -1366,14 +1366,14 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xb3c4928f00000000000000000000000000000000cafecafe', ]); - balance = await token.balanceOf(context.universalProfile1.address); + balance = await token.balanceOf(await context.universalProfile1.getAddress()); const tokenTransferCalldata = token.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), context.accounts.owner1.address, balance, true, @@ -1382,7 +1382,7 @@ export const shouldBehaveLikeLSP1Delegate = ( tokenTransferTx = await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, token.address, 0, tokenTransferCalldata); + .execute(OPERATION_TYPES.CALL, await token.getAddress(), 0, tokenTransferCalldata); }); it('should pass', async () => { @@ -1390,20 +1390,20 @@ export const shouldBehaveLikeLSP1Delegate = ( }); it('should emit UniversalReceiver event', async () => { - const tokensSentBytes32Value = ethers.utils.hexZeroPad(balance.toHexString(), 32); + const tokensSentBytes32Value = ethers.zeroPadValue(ethers.toBeHex(balance), 32); const tokenTransferData = abiCoder.encode( ['address', 'address', 'address', 'uint256', 'bytes'], [ - context.universalProfile1.address, - context.universalProfile1.address, + await context.universalProfile1.getAddress(), + await context.universalProfile1.getAddress(), context.accounts.owner1.address, tokensSentBytes32Value, '0x', ], ); - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP5: Error generating data key/value pairs', '0x'], ); @@ -1411,7 +1411,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect(tokenTransferTx) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - token.address, + await token.getAddress(), 0, LSP1_TYPE_IDS.LSP7Tokens_SenderNotification, tokenTransferData, @@ -1428,25 +1428,25 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xb3c4928f00000000000000000000000000000000cafecafe', ]); }); }); describe('when the Map value of LSP5ReceivedAssetsMap is 20 random bytes', () => { - let tokenTransferTx: Transaction; - let balance: BigNumber; + let tokenTransferTx: ContractTransaction; + let balance: bigint; before(async () => { await token .connect(context.accounts.owner1) - .mint(context.universalProfile1.address, 100, false, '0x'); + .mint(await context.universalProfile1.getAddress(), 100, false, '0x'); await context.universalProfile1 .connect(context.accounts.owner1) .setData( - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + token.address.substring(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + (await token.getAddress()).substring(2), '0xcafecafecafecafecafecafecafecafecafecafe', ); @@ -1454,14 +1454,14 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xcafecafecafecafecafecafecafecafecafecafe', ]); - balance = await token.balanceOf(context.universalProfile1.address); + balance = await token.balanceOf(await context.universalProfile1.getAddress()); const tokenTransferCalldata = token.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), context.accounts.owner1.address, balance, true, @@ -1470,7 +1470,7 @@ export const shouldBehaveLikeLSP1Delegate = ( tokenTransferTx = await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, token.address, 0, tokenTransferCalldata); + .execute(OPERATION_TYPES.CALL, await token.getAddress(), 0, tokenTransferCalldata); }); it('should pass', async () => { @@ -1478,20 +1478,20 @@ export const shouldBehaveLikeLSP1Delegate = ( }); it('should emit UniversalReceiver event', async () => { - const tokensSentBytes32Value = ethers.utils.hexZeroPad(balance.toHexString(), 32); + const tokensSentBytes32Value = ethers.zeroPadValue(ethers.toBeHex(balance), 32); const tokenTransferData = abiCoder.encode( ['address', 'address', 'address', 'uint256', 'bytes'], [ - context.universalProfile1.address, - context.universalProfile1.address, + await context.universalProfile1.getAddress(), + await context.universalProfile1.getAddress(), context.accounts.owner1.address, tokensSentBytes32Value, '0x', ], ); - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP5: Error generating data key/value pairs', '0x'], ); @@ -1499,7 +1499,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect(tokenTransferTx) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - token.address, + await token.getAddress(), 0, LSP1_TYPE_IDS.LSP7Tokens_SenderNotification, tokenTransferData, @@ -1512,7 +1512,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xcafecafecafecafecafecafecafecafecafecafe', ]); }); @@ -1536,27 +1536,27 @@ export const shouldBehaveLikeLSP1Delegate = ( arrayKey = ERC725YDataKeys.LSP10['LSP10Vaults[]'].length; arrayIndexKey = ERC725YDataKeys.LSP10['LSP10Vaults[]'].index + '0'.repeat(32); - vaultMapKey = ERC725YDataKeys.LSP10.LSP10VaultsMap + vault.address.substring(2); + vaultMapKey = ERC725YDataKeys.LSP10.LSP10VaultsMap + (await vault.getAddress()).substring(2); }); describe('when the Map value of LSP10VaultsMap is less than 20 bytes', () => { - let acceptOwnershipTx: Transaction; + let acceptOwnershipTx: ContractTransaction; before(async () => { await vault .connect(context.accounts.owner1) - .transferOwnership(context.universalProfile1.address); + .transferOwnership(await context.universalProfile1.getAddress()); const acceptOwnershipCalldata = vault.interface.encodeFunctionData('acceptOwnership'); await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, vault.address, 0, acceptOwnershipCalldata); + .execute(OPERATION_TYPES.CALL, await vault.getAddress(), 0, acceptOwnershipCalldata); await context.universalProfile1 .connect(context.accounts.owner1) .setData( - ERC725YDataKeys.LSP10.LSP10VaultsMap + vault.address.substring(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await vault.getAddress()).substring(2), '0xcafecafecafecafe', ); @@ -1564,7 +1564,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, vaultMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - vault.address.toLowerCase(), + (await vault.getAddress()).toLowerCase(), '0xcafecafecafecafe', ]); @@ -1574,7 +1574,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, vault.address, 0, vaultTrasferCalldata); + .execute(OPERATION_TYPES.CALL, await vault.getAddress(), 0, vaultTrasferCalldata); acceptOwnershipTx = await vault.connect(context.accounts.owner1).acceptOwnership(); }); @@ -1584,7 +1584,7 @@ export const shouldBehaveLikeLSP1Delegate = ( }); it('it should emit UniversalReceiver event', async () => { - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP10: Error generating data key/value pairs', '0x'], ); @@ -1592,12 +1592,12 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect(acceptOwnershipTx) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - vault.address, + await vault.getAddress(), 0, LSP1_TYPE_IDS.LSP9OwnershipTransferred_SenderNotification, abiCoder.encode( ['address', 'address'], - [context.universalProfile1.address, context.accounts.owner1.address], + [await context.universalProfile1.getAddress(), context.accounts.owner1.address], ), lsp1ReturnedData, ); @@ -1608,30 +1608,30 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, vaultMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - vault.address.toLowerCase(), + (await vault.getAddress()).toLowerCase(), '0xcafecafecafecafe', ]); }); }); describe('when the Map value of LSP10VaultsMap is bigger than 20 bytes, (valid `(byte4,uint128)` tuple + extra bytes)', () => { - let acceptOwnershipTx: Transaction; + let acceptOwnershipTx: ContractTransaction; before(async () => { await vault .connect(context.accounts.owner1) - .transferOwnership(context.universalProfile1.address); + .transferOwnership(await context.universalProfile1.getAddress()); const acceptOwnershipCalldata = vault.interface.encodeFunctionData('acceptOwnership'); await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, vault.address, 0, acceptOwnershipCalldata); + .execute(OPERATION_TYPES.CALL, await vault.getAddress(), 0, acceptOwnershipCalldata); await context.universalProfile1 .connect(context.accounts.owner1) .setData( - ERC725YDataKeys.LSP10.LSP10VaultsMap + vault.address.substring(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await vault.getAddress()).substring(2), '0x28af17e600000000000000000000000000000000cafecafe', ); @@ -1639,11 +1639,11 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([ ERC725YDataKeys.LSP10['LSP10Vaults[]'].length, ERC725YDataKeys.LSP10['LSP10Vaults[]'].index + '0'.repeat(32), - ERC725YDataKeys.LSP10.LSP10VaultsMap + vault.address.substring(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await vault.getAddress()).substring(2), ]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - vault.address.toLowerCase(), + (await vault.getAddress()).toLowerCase(), '0x28af17e600000000000000000000000000000000cafecafe', ]); @@ -1653,7 +1653,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, vault.address, 0, vaultTrasferCalldata); + .execute(OPERATION_TYPES.CALL, await vault.getAddress(), 0, vaultTrasferCalldata); acceptOwnershipTx = await vault.connect(context.accounts.owner1).acceptOwnership(); }); @@ -1663,7 +1663,7 @@ export const shouldBehaveLikeLSP1Delegate = ( }); it('it should emit UniversalReceiver event', async () => { - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP10: Error generating data key/value pairs', '0x'], ); @@ -1671,12 +1671,12 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect(acceptOwnershipTx) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - vault.address, + await vault.getAddress(), 0, LSP1_TYPE_IDS.LSP9OwnershipTransferred_SenderNotification, abiCoder.encode( ['address', 'address'], - [context.universalProfile1.address, context.accounts.owner1.address], + [await context.universalProfile1.getAddress(), context.accounts.owner1.address], ), lsp1ReturnedData, ); @@ -1690,34 +1690,34 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([ ERC725YDataKeys.LSP10['LSP10Vaults[]'].length, ERC725YDataKeys.LSP10['LSP10Vaults[]'].index + '0'.repeat(32), - ERC725YDataKeys.LSP10.LSP10VaultsMap + vault.address.substring(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await vault.getAddress()).substring(2), ]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - vault.address.toLowerCase(), + (await vault.getAddress()).toLowerCase(), '0x28af17e600000000000000000000000000000000cafecafe', ]); }); }); describe('when the Map value of LSP10VaultsMap is 20 random bytes', () => { - let acceptOwnershipTx: Transaction; + let acceptOwnershipTx: ContractTransaction; before(async () => { await vault .connect(context.accounts.owner1) - .transferOwnership(context.universalProfile1.address); + .transferOwnership(await context.universalProfile1.getAddress()); const acceptOwnershipCalldata = vault.interface.encodeFunctionData('acceptOwnership'); await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, vault.address, 0, acceptOwnershipCalldata); + .execute(OPERATION_TYPES.CALL, await vault.getAddress(), 0, acceptOwnershipCalldata); await context.universalProfile1 .connect(context.accounts.owner1) .setData( - ERC725YDataKeys.LSP10.LSP10VaultsMap + vault.address.substring(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await vault.getAddress()).substring(2), '0xcafecafecafecafecafecafecafecafecafecafe', ); @@ -1725,11 +1725,11 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([ ERC725YDataKeys.LSP10['LSP10Vaults[]'].length, ERC725YDataKeys.LSP10['LSP10Vaults[]'].index + '0'.repeat(32), - ERC725YDataKeys.LSP10.LSP10VaultsMap + vault.address.substring(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await vault.getAddress()).substring(2), ]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - vault.address.toLowerCase(), + (await vault.getAddress()).toLowerCase(), '0xcafecafecafecafecafecafecafecafecafecafe', ]); @@ -1739,7 +1739,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, vault.address, 0, vaultTrasferCalldata); + .execute(OPERATION_TYPES.CALL, await vault.getAddress(), 0, vaultTrasferCalldata); acceptOwnershipTx = await vault.connect(context.accounts.owner1).acceptOwnership(); }); @@ -1749,7 +1749,7 @@ export const shouldBehaveLikeLSP1Delegate = ( }); it('it should emit UniversalReceiver event', async () => { - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP10: Error generating data key/value pairs', '0x'], ); @@ -1757,12 +1757,12 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect(acceptOwnershipTx) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - vault.address, + await vault.getAddress(), 0, LSP1_TYPE_IDS.LSP9OwnershipTransferred_SenderNotification, abiCoder.encode( ['address', 'address'], - [context.universalProfile1.address, context.accounts.owner1.address], + [await context.universalProfile1.getAddress(), context.accounts.owner1.address], ), lsp1ReturnedData, ); @@ -1773,7 +1773,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.universalProfile1.getDataBatch([arrayKey, arrayIndexKey, vaultMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - vault.address.toLowerCase(), + (await vault.getAddress()).toLowerCase(), '0xcafecafecafecafecafecafecafecafecafecafe', ]); }); @@ -1813,7 +1813,7 @@ export const shouldBehaveLikeLSP1Delegate = ( describe('when minting tokenId 1 of tokenA to universalProfile1', () => { before(async () => { const abi = lsp8TokenA.interface.encodeFunctionData('mint', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1821,7 +1821,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenA.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenA.getAddress(), abi)); }); it('should register lsp5keys: arrayLength 1, index 0, tokenA address in UP1', async () => { @@ -1830,14 +1830,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp8TokenA.address); + expect(elementAddress).to.equal(await lsp8TokenA.getAddress()); }); }); describe('when minting tokenId 1 of tokenB to universalProfile1', () => { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('mint', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1845,7 +1845,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenB.getAddress(), abi)); }); it('should register lsp5keys: arrayLength 2, index 1, tokenB address in UP1', async () => { const [indexInMap, interfaceId, arrayLength, elementAddress] = @@ -1853,14 +1853,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); }); describe('when minting tokenId 2 of tokenB (another) to universalProfile1', () => { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('mint', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), TOKEN_ID.TWO, false, '0x', @@ -1868,7 +1868,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenB.getAddress(), abi)); }); it('should keep the same lsp5keys: arrayLength 2, index 1, tokenB address in UP1', async () => { const [indexInMap, interfaceId, arrayLength, elementAddress] = @@ -1876,14 +1876,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); }); describe('when minting tokenId 1 of tokenC to universalProfile1', () => { before(async () => { const abi = lsp8TokenC.interface.encodeFunctionData('mint', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1891,7 +1891,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenC.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenC.getAddress(), abi)); }); it('should register lsp5keys: arrayLength 3, index 2, tokenC address in UP1', async () => { const [indexInMap, interfaceId, arrayLength, elementAddress] = @@ -1899,7 +1899,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(2); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.THREE); - expect(elementAddress).to.equal(lsp8TokenC.address); + expect(elementAddress).to.equal(await lsp8TokenC.getAddress()); }); }); }); @@ -1911,12 +1911,13 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenC.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenC.getAddress(), abi)); }); it('should update lsp5keys: arrayLength 2, no map, no tokenC address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenC.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenC.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000002', @@ -1934,7 +1935,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenA.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenA.getAddress(), abi)); }); it('should pop and swap TokenA with TokenB, lsp5keys (tokenB should become first token) : arrayLength 1, index = 0, tokenB address in UP1', async () => { @@ -1943,13 +1944,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); it('should update lsp5keys: arrayLength 1, no map, no tokenA address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenA.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenA.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', @@ -1967,7 +1969,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenB.getAddress(), abi)); }); it('should keep the same lsp5keys: arrayLength 1, index 0, tokenB address in UP1', async () => { const [indexInMap, interfaceId, arrayLength, elementAddress] = @@ -1975,7 +1977,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); }); @@ -1985,12 +1987,13 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenB.getAddress(), abi)); }); it('should update lsp5keys: arrayLength 0, no map, no tokenB address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000000', @@ -2008,23 +2011,23 @@ export const shouldBehaveLikeLSP1Delegate = ( // 1 tokenId of TokenA await lsp8TokenA .connect(context.accounts.random) - .mint(context.universalProfile1.address, TOKEN_ID.ONE, false, '0x'); + .mint(await context.universalProfile1.getAddress(), TOKEN_ID.ONE, false, '0x'); // 3 tokenIds of TokenB await lsp8TokenB .connect(context.accounts.random) - .mint(context.universalProfile1.address, TOKEN_ID.ONE, false, '0x'); + .mint(await context.universalProfile1.getAddress(), TOKEN_ID.ONE, false, '0x'); await lsp8TokenB .connect(context.accounts.random) - .mint(context.universalProfile1.address, TOKEN_ID.TWO, false, '0x'); + .mint(await context.universalProfile1.getAddress(), TOKEN_ID.TWO, false, '0x'); await lsp8TokenB .connect(context.accounts.random) - .mint(context.universalProfile1.address, TOKEN_ID.THREE, false, '0x'); + .mint(await context.universalProfile1.getAddress(), TOKEN_ID.THREE, false, '0x'); // 1 tokenId of TokenC await lsp8TokenC .connect(context.accounts.random) - .mint(context.universalProfile1.address, TOKEN_ID.ONE, false, '0x'); + .mint(await context.universalProfile1.getAddress(), TOKEN_ID.ONE, false, '0x'); }); it('should register lsp5keys: arrayLength 3, index [1,2,3], [tokenA, tokenB, tokenC] addresses in UP1 ', async () => { @@ -2044,16 +2047,16 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(interfaceIdTokenA).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(interfaceIdTokenB).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(interfaceIdTokenC).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); - expect(elementAddressTokenA).to.equal(lsp8TokenA.address); - expect(elementAddressTokenB).to.equal(lsp8TokenB.address); - expect(elementAddressTokenC).to.equal(lsp8TokenC.address); + expect(elementAddressTokenA).to.equal(await lsp8TokenA.getAddress()); + expect(elementAddressTokenB).to.equal(await lsp8TokenB.getAddress()); + expect(elementAddressTokenC).to.equal(await lsp8TokenC.getAddress()); }); describe('When transferring tokenId 1 (all) of token A from UP1 to UP2', () => { before(async () => { const abi = lsp8TokenA.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -2061,7 +2064,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenA.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenA.getAddress(), abi)); }); it('should pop and swap TokenA with TokenC, lsp5keys (tokenC should become first token) : arrayLength 1, index = 0, tokenC address in UP1', async () => { @@ -2070,13 +2073,14 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp8TokenC.address); + expect(elementAddress).to.equal(await lsp8TokenC.getAddress()); }); it('should update lsp5keys: arrayLength 2, no map, no tokenA address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenA.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenA.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000002', @@ -2093,15 +2097,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp8TokenA.address); + expect(elementAddress).to.equal(await lsp8TokenA.getAddress()); }); }); describe('When transferring tokenId 1 (not all balance) of token B from UP1 to UP2', () => { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -2109,7 +2113,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenB.getAddress(), abi)); }); it('should keep the same lsp5keys : arrayLength 2, index = 1, tokenB address in UP1', async () => { @@ -2118,7 +2122,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); it('should register lsp5keys: arrayLength 2, index 1, tokenB address in UP2', async () => { @@ -2127,15 +2131,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); }); describe('When transferring tokenId 2 (not all balance) of token B from UP1 to UP2', () => { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), TOKEN_ID.TWO, false, '0x', @@ -2143,7 +2147,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenB.getAddress(), abi)); }); it('should keep the same lsp5keys : arrayLength 2, index = 1, tokenB address in UP1', async () => { @@ -2152,7 +2156,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); it('should keep the same lsp5keys : arrayLength 2, index = 1, tokenB address in UP2', async () => { @@ -2161,15 +2165,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); }); describe('When transferring tokenId 3 (remaining balance) of token B from UP1 to UP2', () => { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), TOKEN_ID.THREE, false, '0x', @@ -2177,13 +2181,14 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenB.getAddress(), abi)); }); it('should update lsp5keys (no pop and swap as TokenB has the last index): arrayLength 1, no map, no tokenB address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', @@ -2200,15 +2205,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); }); describe('When transferring tokenId 1 (all balance) of token C from UP1 to UP2', () => { before(async () => { const abi = lsp8TokenC.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -2216,13 +2221,14 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp8TokenC.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp8TokenC.getAddress(), abi)); }); it('should update lsp5keys (no pop and swap as TokenC has the last index): arrayLength 0, no map, no tokenB address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', @@ -2239,15 +2245,15 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(2); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.THREE); - expect(elementAddress).to.equal(lsp8TokenC.address); + expect(elementAddress).to.equal(await lsp8TokenC.getAddress()); }); }); describe('When transferring 1 tokenId (not all balance) of token B from UP2 to UP1', () => { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('transfer', [ - context.universalProfile2.address, - context.universalProfile1.address, + await context.universalProfile2.getAddress(), + await context.universalProfile1.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -2255,7 +2261,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager2 .connect(context.accounts.owner2) - .execute(callPayload(context.universalProfile2, lsp8TokenB.address, abi)); + .execute(callPayload(context.universalProfile2, await lsp8TokenB.getAddress(), abi)); }); it('should register lsp5keys (UP1 able to re-register keys) : arrayLength 1, index = 0, tokenB address in UP1', async () => { @@ -2264,7 +2270,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP8IdentifiableDigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp8TokenB.address); + expect(elementAddress).to.equal(await lsp8TokenB.getAddress()); }); }); }); @@ -2290,7 +2296,7 @@ export const shouldBehaveLikeLSP1Delegate = ( // check that it does not revert await expect( await notTokenContractWithBalanceOfFunction.call( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ), @@ -2298,8 +2304,8 @@ export const shouldBehaveLikeLSP1Delegate = ( // check that it returns the correct string const universalReceiverResult = - await notTokenContractWithBalanceOfFunction.callStatic.call( - context.universalProfile1.address, + await notTokenContractWithBalanceOfFunction.call.staticCall( + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ); @@ -2309,20 +2315,20 @@ export const shouldBehaveLikeLSP1Delegate = ( const [resultDelegate] = abiCoder.decode(['bytes', 'bytes'], genericExecutorResult); expect(resultDelegate).to.equal( - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('LSP1: full balance is not sent')), + ethers.hexlify(ethers.toUtf8Bytes('LSP1: full balance is not sent')), ); // check that the correct string is emitted in the event await expect( await notTokenContractWithBalanceOfFunction.call( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ), ) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - notTokenContractWithBalanceOfFunction.address, + await notTokenContractWithBalanceOfFunction.getAddress(), 0, LSP1_TYPE_IDS.LSP8Tokens_SenderNotification, '0x', @@ -2341,15 +2347,15 @@ export const shouldBehaveLikeLSP1Delegate = ( // check that it does not revert await expect( await notTokenContract.call( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ), ).to.not.be.reverted; // check that it returns the correct string - const universalReceiverResult = await notTokenContract.callStatic.call( - context.universalProfile1.address, + const universalReceiverResult = await notTokenContract.call.staticCall( + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ); @@ -2359,22 +2365,20 @@ export const shouldBehaveLikeLSP1Delegate = ( const [resultDelegate] = abiCoder.decode(['bytes', 'bytes'], genericExecutorResult); expect(resultDelegate).to.equal( - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('LSP1: `balanceOf(address)` function not found'), - ), + ethers.hexlify(ethers.toUtf8Bytes('LSP1: `balanceOf(address)` function not found')), ); // check that the correct string is emitted in the event await expect( await notTokenContract.call( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), 0, universalReceiverPayload, ), ) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - notTokenContract.address, + await notTokenContract.getAddress(), 0, LSP1_TYPE_IDS.LSP8Tokens_SenderNotification, '0x', @@ -2407,13 +2411,13 @@ export const shouldBehaveLikeLSP1Delegate = ( before(async () => { await lsp9VaultA .connect(context.accounts.random) - .transferOwnership(context.universalProfile1.address); + .transferOwnership(await context.universalProfile1.getAddress()); const executePayload = context.universalProfile1.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp9VaultA.address, + await lsp9VaultA.getAddress(), 0, - lsp9VaultA.interface.getSighash('acceptOwnership'), + lsp9VaultA.interface.getFunction('acceptOwnership').selector, ]); await context.lsp6KeyManager1.connect(context.accounts.owner1).execute(executePayload); @@ -2425,7 +2429,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp9VaultA.address); + expect(elementAddress).to.equal(await lsp9VaultA.getAddress()); }); }); @@ -2433,13 +2437,13 @@ export const shouldBehaveLikeLSP1Delegate = ( before(async () => { await lsp9VaultB .connect(context.accounts.random) - .transferOwnership(context.universalProfile1.address); + .transferOwnership(await context.universalProfile1.getAddress()); const executePayload = context.universalProfile1.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp9VaultB.address, + await lsp9VaultB.getAddress(), 0, - lsp9VaultB.interface.getSighash('acceptOwnership'), + lsp9VaultB.interface.getFunction('acceptOwnership').selector, ]); await context.lsp6KeyManager1.connect(context.accounts.owner1).execute(executePayload); @@ -2451,7 +2455,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp9VaultB.address); + expect(elementAddress).to.equal(await lsp9VaultB.getAddress()); }); }); @@ -2459,13 +2463,13 @@ export const shouldBehaveLikeLSP1Delegate = ( before(async () => { await lsp9VaultC .connect(context.accounts.random) - .transferOwnership(context.universalProfile1.address); + .transferOwnership(await context.universalProfile1.getAddress()); const executePayload = context.universalProfile1.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp9VaultC.address, + await lsp9VaultC.getAddress(), 0, - lsp9VaultC.interface.getSighash('acceptOwnership'), + lsp9VaultC.interface.getFunction('acceptOwnership').selector, ]); await context.lsp6KeyManager1.connect(context.accounts.owner1).execute(executePayload); @@ -2477,7 +2481,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(2); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.THREE); - expect(elementAddress).to.equal(lsp9VaultC.address); + expect(elementAddress).to.equal(await lsp9VaultC.getAddress()); }); }); }); @@ -2486,18 +2490,18 @@ export const shouldBehaveLikeLSP1Delegate = ( describe('When transfering Ownership of VaultA from UP1 to UP2', () => { before(async () => { const abi = lsp9VaultA.interface.encodeFunctionData('transferOwnership', [ - context.universalProfile2.address, + await context.universalProfile2.getAddress(), ]); await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp9VaultA.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp9VaultA.getAddress(), abi)); const executePayload = context.universalProfile2.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp9VaultA.address, + await lsp9VaultA.getAddress(), 0, - lsp9VaultA.interface.getSighash('acceptOwnership'), + lsp9VaultA.interface.getFunction('acceptOwnership').selector, ]); await context.lsp6KeyManager2.connect(context.accounts.owner2).execute(executePayload); @@ -2509,7 +2513,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp9VaultC.address); + expect(elementAddress).to.equal(await lsp9VaultC.getAddress()); }); it('should register lsp10key: arrayLength 1, index 0, VaultA address in UP2', async () => { @@ -2518,25 +2522,25 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp9VaultA.address); + expect(elementAddress).to.equal(await lsp9VaultA.getAddress()); }); }); describe('When transfering Ownership of VaultB from UP1 to UP2', () => { before(async () => { const abi = lsp9VaultB.interface.encodeFunctionData('transferOwnership', [ - context.universalProfile2.address, + await context.universalProfile2.getAddress(), ]); await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp9VaultB.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp9VaultB.getAddress(), abi)); const executePayload = context.universalProfile2.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp9VaultB.address, + await lsp9VaultB.getAddress(), 0, - lsp9VaultB.interface.getSighash('acceptOwnership'), + lsp9VaultB.interface.getFunction('acceptOwnership').selector, ]); await context.lsp6KeyManager2.connect(context.accounts.owner2).execute(executePayload); @@ -2545,7 +2549,7 @@ export const shouldBehaveLikeLSP1Delegate = ( it('should update lsp10keys (no pop and swap as VaultB has the last index): arrayLength 1, no map, no VaultB address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP10.LSP10VaultsMap + lsp9VaultB.address.substr(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await lsp9VaultB.getAddress()).substring(2), ERC725YDataKeys.LSP10['LSP10Vaults[]'].length, ERC725YDataKeys.LSP10['LSP10Vaults[]'].index + '00000000000000000000000000000001', ]); @@ -2561,25 +2565,25 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp9VaultB.address); + expect(elementAddress).to.equal(await lsp9VaultB.getAddress()); }); }); describe('When transfering Ownership of VaultC from UP1 to UP2', () => { before(async () => { const abi = lsp9VaultC.interface.encodeFunctionData('transferOwnership', [ - context.universalProfile2.address, + await context.universalProfile2.getAddress(), ]); await context.lsp6KeyManager1 .connect(context.accounts.owner1) - .execute(callPayload(context.universalProfile1, lsp9VaultC.address, abi)); + .execute(callPayload(context.universalProfile1, await lsp9VaultC.getAddress(), abi)); const executePayload = context.universalProfile2.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp9VaultC.address, + await lsp9VaultC.getAddress(), 0, - lsp9VaultC.interface.getSighash('acceptOwnership'), + lsp9VaultC.interface.getFunction('acceptOwnership').selector, ]); await context.lsp6KeyManager2.connect(context.accounts.owner2).execute(executePayload); @@ -2588,7 +2592,7 @@ export const shouldBehaveLikeLSP1Delegate = ( it('should remove all lsp10keys : arrayLength 0, no map, no VaultC address in UP1', async () => { const [mapValue, arrayLength, elementAddress] = await context.universalProfile1.getDataBatch([ - ERC725YDataKeys.LSP10.LSP10VaultsMap + lsp9VaultB.address.substr(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await lsp9VaultB.getAddress()).substring(2), ERC725YDataKeys.LSP10['LSP10Vaults[]'].length, ERC725YDataKeys.LSP10['LSP10Vaults[]'].index + '00000000000000000000000000000000', ]); @@ -2604,25 +2608,25 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(2); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.THREE); - expect(elementAddress).to.equal(lsp9VaultC.address); + expect(elementAddress).to.equal(await lsp9VaultC.getAddress()); }); }); describe('When transferring Ownership of VaultB from UP2 to UP1', () => { before(async () => { const abi = lsp9VaultB.interface.encodeFunctionData('transferOwnership', [ - context.universalProfile1.address, + await context.universalProfile1.getAddress(), ]); await context.lsp6KeyManager2 .connect(context.accounts.owner2) - .execute(callPayload(context.universalProfile2, lsp9VaultB.address, abi)); + .execute(callPayload(context.universalProfile2, await lsp9VaultB.getAddress(), abi)); const executePayload = context.universalProfile1.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp9VaultB.address, + await lsp9VaultB.getAddress(), 0, - lsp9VaultB.interface.getSighash('acceptOwnership'), + lsp9VaultB.interface.getFunction('acceptOwnership').selector, ]); await context.lsp6KeyManager1.connect(context.accounts.owner1).execute(executePayload); @@ -2633,7 +2637,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp9VaultB.address); + expect(elementAddress).to.equal(await lsp9VaultB.getAddress()); }); }); }); @@ -2647,7 +2651,7 @@ export const shouldBehaveLikeLSP1Delegate = ( await context.lsp6KeyManager2 .connect(context.accounts.owner2) - .execute(callPayload(context.universalProfile2, lsp9VaultA.address, abi)); + .execute(callPayload(context.universalProfile2, await lsp9VaultA.getAddress(), abi)); await lsp9VaultA.connect(context.accounts.any).acceptOwnership(); }); @@ -2658,13 +2662,13 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(0); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); - expect(elementAddress).to.equal(lsp9VaultC.address); + expect(elementAddress).to.equal(await lsp9VaultC.getAddress()); }); }); }); describe('When renouncing ownership of a vault from UP2', () => { - let tx: Transaction; + let tx: ContractTransaction; let someVault: LSP9Vault; let dataKeys: string[]; let dataValues: string[]; @@ -2679,23 +2683,22 @@ export const shouldBehaveLikeLSP1Delegate = ( } someVault = await new LSP9Vault__factory(context.accounts.random).deploy( - context.universalProfile2.address, + await context.universalProfile2.getAddress(), ); dataKeys = [ - ERC725YDataKeys.LSP10.LSP10VaultsMap + someVault.address.substring(2), + ERC725YDataKeys.LSP10.LSP10VaultsMap + (await someVault.getAddress()).substring(2), ERC725YDataKeys.LSP10['LSP10Vaults[]'].length, ERC725YDataKeys.LSP10['LSP10Vaults[]'].index + LSP10ArrayLength.substring(2), ]; dataValues = [ INTERFACE_IDS.LSP9Vault + LSP10ArrayLength.substring(2), - `0x${ethers.BigNumber.from(LSP10ArrayLength) - .add(1) - .toHexString() + `0x${ethers + .toBeHex(ethers.toBigInt(LSP10ArrayLength) + BigInt(1)) .substring(2) .padStart(32, '00')}`, - someVault.address, + await someVault.getAddress(), ]; expect(await context.universalProfile2.getDataBatch(dataKeys)).to.deep.equal(dataValues); @@ -2704,19 +2707,29 @@ export const shouldBehaveLikeLSP1Delegate = ( someVault.interface.encodeFunctionData('renounceOwnership'); // Skip 1000 blocks - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(1000)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(1000)]); // Call renounceOwnership for the first time await context.universalProfile2 .connect(context.accounts.owner2) - .execute(OPERATION_TYPES.CALL, someVault.address, 0, renounceOwnershipCalldata); + .execute( + OPERATION_TYPES.CALL, + await someVault.getAddress(), + 0, + renounceOwnershipCalldata, + ); // Skip 199 block to reach the time where renouncing ownership can happen - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(199)]); + await network.provider.send('hardhat_mine', [ethers.toBeHex(199)]); tx = await context.universalProfile2 .connect(context.accounts.owner2) - .execute(OPERATION_TYPES.CALL, someVault.address, 0, renounceOwnershipCalldata); + .execute( + OPERATION_TYPES.CALL, + await someVault.getAddress(), + 0, + renounceOwnershipCalldata, + ); }); it('Should emit `UnviersalReceiver` event', async () => { @@ -2724,20 +2737,19 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(tx) .to.emit(context.universalProfile2, 'UniversalReceiver') .withArgs( - someVault.address, + await someVault.getAddress(), 0, LSP1_TYPE_IDS.LSP9OwnershipTransferred_SenderNotification, '0x', - ethers.utils.defaultAbiCoder.encode(['bytes', 'bytes'], ['0x', '0x']), + ethers.AbiCoder.defaultAbiCoder().encode(['bytes', 'bytes'], ['0x', '0x']), ); }); it('should remove the LSP10 data keys assigned for `someVault`', async () => { expect(await context.universalProfile2.getDataBatch(dataKeys)).to.deep.equal([ '0x', - `0x${ethers.BigNumber.from(dataValues[1]) - .sub(1) - .toHexString() + `0x${ethers + .toBeHex(ethers.toBigInt(dataValues[1]) - BigInt(1)) .substring(2) .padStart(32, '00')}`, '0x', @@ -2750,7 +2762,7 @@ export const shouldBehaveLikeLSP1Delegate = ( before(async () => { lsp9VaultD = await new LSP9Vault__factory(context.accounts.random).deploy( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), ); }); @@ -2761,7 +2773,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP9Vault); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp9VaultD.address); + expect(elementAddress).to.equal(await lsp9VaultD.getAddress()); }); }); @@ -2772,7 +2784,7 @@ export const shouldBehaveLikeLSP1Delegate = ( }); it('should revert if `LSP10Vaults[]` vault value is the max `uint128`', async () => { - const maxUint128 = ethers.BigNumber.from(2).pow(128).sub(1).toHexString(); + const maxUint128 = ethers.toBeHex(ethers.toBigInt('0xffffffffffffffffffffffffffffffff')); const key = ERC725YDataKeys.LSP10['LSP10Vaults[]'].length; const value = maxUint128; @@ -2789,17 +2801,17 @@ export const shouldBehaveLikeLSP1Delegate = ( // this should revert because the UP has already the max number of vaults allowed const tx = await new LSP9Vault__factory(context.accounts.random).deploy( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), ); - await expect(tx.deployTransaction) + await expect(tx.deploymentTransaction()) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - tx.address, + await tx.getAddress(), 0, LSP1_TYPE_IDS.LSP9OwnershipTransferred_RecipientNotification, '0x', - ethers.utils.defaultAbiCoder.encode( + ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP10: Error generating data key/value pairs', '0x'], ), @@ -2822,7 +2834,7 @@ export const shouldBehaveLikeLSP1Delegate = ( profileOwner.address, ); const deployedKeyManager = await new LSP6KeyManager__factory(profileOwner).deploy( - deployedUniversalProfile.address, + await deployedUniversalProfile.getAddress(), ); testContext = { @@ -2835,14 +2847,16 @@ export const shouldBehaveLikeLSP1Delegate = ( await setupKeyManager(testContext, [], []); // 2. deploy a Vault owned by the UP - vault = await new LSP9Vault__factory(profileOwner).deploy(deployedUniversalProfile.address); + vault = await new LSP9Vault__factory(profileOwner).deploy( + await deployedUniversalProfile.getAddress(), + ); // 3. deploy a URD and set its address on the UP storage under the LSP1Delegate data key lsp1Delegate = await new LSP1UniversalReceiverDelegateUP__factory(profileOwner).deploy(); const setLSP1DelegatePayload = testContext.universalProfile.interface.encodeFunctionData( 'setData', - [ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, lsp1Delegate.address], + [ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, await lsp1Delegate.getAddress()], ); await testContext.keyManager @@ -2864,7 +2878,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(lsp10VaultArrayIndexValue).to.equal('0x'); const lsp10VaultMapValue = await testContext.universalProfile['getData(bytes32)']( - ERC725YDataKeys.LSP10['LSP10VaultsMap'] + vault.address.substring(2), + ERC725YDataKeys.LSP10['LSP10VaultsMap'] + (await vault.getAddress()).substring(2), ); expect(lsp10VaultMapValue).to.equal('0x'); @@ -2875,7 +2889,7 @@ export const shouldBehaveLikeLSP1Delegate = ( ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ); // checksum the address - expect(ethers.utils.getAddress(result)).to.equal(lsp1Delegate.address); + expect(ethers.getAddress(result)).to.equal(await lsp1Delegate.getAddress()); }); describe('when transfering + accepting ownership of the Vault', () => { @@ -2889,7 +2903,7 @@ export const shouldBehaveLikeLSP1Delegate = ( const executePayload = testContext.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, vault.address, 0, transferOwnershipPayload], + [OPERATION_TYPES.CALL, await vault.getAddress(), 0, transferOwnershipPayload], ); await testContext.keyManager.connect(testContext.mainController).execute(executePayload); @@ -2900,9 +2914,7 @@ export const shouldBehaveLikeLSP1Delegate = ( const expectedReturnedValues = abiCoder.encode( ['bytes', 'bytes'], [ - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('LSP10: Error generating data key/value pairs'), - ), + ethers.hexlify(ethers.toUtf8Bytes('LSP10: Error generating data key/value pairs')), '0x', ], ); @@ -2913,12 +2925,12 @@ export const shouldBehaveLikeLSP1Delegate = ( await expect(acceptOwnershipTx) .to.emit(testContext.universalProfile, 'UniversalReceiver') .withArgs( - vault.address, + await vault.getAddress(), 0, LSP1_TYPE_IDS.LSP9OwnershipTransferred_SenderNotification, abiCoder.encode( ['address', 'address'], - [testContext.universalProfile.address, newVaultOwner.address], + [await testContext.universalProfile.getAddress(), newVaultOwner.address], ), expectedReturnedValues, ); @@ -2934,7 +2946,7 @@ export const shouldBehaveLikeLSP1Delegate = ( expect(lsp10VaultArrayLengthValue).to.equal('0x'); const lsp10VaultMapValue = await testContext.universalProfile['getData(bytes32)']( - ERC725YDataKeys.LSP10['LSP10VaultsMap'] + vault.address.substring(2), + ERC725YDataKeys.LSP10['LSP10VaultsMap'] + (await vault.getAddress()).substring(2), ); expect(lsp10VaultMapValue).to.equal('0x'); @@ -2957,11 +2969,11 @@ export const shouldBehaveLikeLSP1Delegate = ( const lsp10DataKeys = [ ERC725YDataKeys.LSP10['LSP10Vaults[]'].length, ERC725YDataKeys.LSP10['LSP10Vaults[]'].index + '00'.repeat(16), - ERC725YDataKeys.LSP10['LSP10VaultsMap'] + vault.address.substring(2), + ERC725YDataKeys.LSP10['LSP10VaultsMap'] + (await vault.getAddress()).substring(2), ]; const lsp10DataValues = [ bytes16Value1, - vault.address, + await vault.getAddress(), abiCoder.encode(['bytes4', 'uint64'], [INTERFACE_IDS.LSP9Vault, 0]), ]; @@ -2989,10 +3001,10 @@ export const shouldBehaveLikeLSP1Delegate = ( ); // checksum the address - expect(ethers.utils.getAddress(lsp10VaultArrayIndexValue)).to.equal(vault.address); + expect(ethers.getAddress(lsp10VaultArrayIndexValue)).to.equal(await vault.getAddress()); const lsp10VaultMapValue = await context.universalProfile1['getData(bytes32)']( - ERC725YDataKeys.LSP10['LSP10VaultsMap'] + vault.address.substring(2), + ERC725YDataKeys.LSP10['LSP10VaultsMap'] + (await vault.getAddress()).substring(2), ); expect(lsp10VaultMapValue).to.equal( @@ -3002,17 +3014,19 @@ export const shouldBehaveLikeLSP1Delegate = ( it("should not revert and return the string 'LSP10: Error generating data key/value pairs'", async () => { // 1. transfer ownership of the vault to the UP - await vault.connect(vaultOwner).transferOwnership(context.universalProfile1.address); + await vault + .connect(vaultOwner) + .transferOwnership(await context.universalProfile1.getAddress()); // check that the UP is the pending owner of the vault - expect(await vault.pendingOwner()).to.equal(context.universalProfile1.address); + expect(await vault.pendingOwner()).to.equal(await context.universalProfile1.getAddress()); // 2. UP accepts ownership of the vault - const acceptOwnershipPayload = vault.interface.getSighash('acceptOwnership'); + const acceptOwnershipPayload = vault.interface.getFunction('acceptOwnership').selector; const executePayload = context.universalProfile1.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - vault.address, + await vault.getAddress(), 0, acceptOwnershipPayload, ]); @@ -3022,28 +3036,23 @@ export const shouldBehaveLikeLSP1Delegate = ( .execute(executePayload); // check that the UP is now the owner of the vault - expect(await vault.owner()).to.equal(context.universalProfile1.address); + expect(await vault.owner()).to.equal(await context.universalProfile1.getAddress()); const expectedReturnedValues = abiCoder.encode( ['bytes', 'bytes'], - [ - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('LSP10: Error generating data key/value pairs'), - ), - '0x', - ], + [ethers.hexlify(ethers.toUtf8Bytes('LSP10: Error generating data key/value pairs')), '0x'], ); // check that the right return string is emitted in the UniversalReceiver event await expect(acceptOwnershipTx) .to.emit(context.universalProfile1, 'UniversalReceiver') .withArgs( - vault.address, + await vault.getAddress(), 0, LSP1_TYPE_IDS.LSP9OwnershipTransferred_RecipientNotification, abiCoder.encode( ['address', 'address'], - [vaultOwner.address, context.universalProfile1.address], + [vaultOwner.address, await context.universalProfile1.getAddress()], ), expectedReturnedValues, ); @@ -3061,10 +3070,10 @@ export const shouldBehaveLikeLSP1Delegate = ( ); // checksum the address - expect(ethers.utils.getAddress(lsp10VaultArrayIndexValue)).to.equal(vault.address); + expect(ethers.getAddress(lsp10VaultArrayIndexValue)).to.equal(await vault.getAddress()); const lsp10VaultMapValue = await context.universalProfile1['getData(bytes32)']( - ERC725YDataKeys.LSP10['LSP10VaultsMap'] + vault.address.substring(2), + ERC725YDataKeys.LSP10['LSP10VaultsMap'] + (await vault.getAddress()).substring(2), ); expect(lsp10VaultMapValue).to.equal( @@ -3096,17 +3105,17 @@ export const shouldBehaveLikeLSP1Delegate = ( const LSP7 = await new LSP7MintWhenDeployed__factory(context.accounts.owner1).deploy( 'MyToken', 'MTK', - context.universalProfile1.address, + await context.universalProfile1.getAddress(), LSP4_TOKEN_TYPES.TOKEN, ); - expect(await LSP7.balanceOf(context.universalProfile1.address)).to.equal(1000); - expect(await LSP7.balanceOf(context.universalProfile2.address)).to.equal(0); + expect(await LSP7.balanceOf(await context.universalProfile1.getAddress())).to.equal(1000); + expect(await LSP7.balanceOf(await context.universalProfile2.getAddress())).to.equal(0); // Encode LSP7 tokens tarnsfer (UP1 to UP2) const LSP7_TransferCalldata = LSP7.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), 1, false, '0x', @@ -3115,10 +3124,10 @@ export const shouldBehaveLikeLSP1Delegate = ( // Transfer LSP7 tokens await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, LSP7.address, 0, LSP7_TransferCalldata); + .execute(OPERATION_TYPES.CALL, LSP7.getAddress(), 0, LSP7_TransferCalldata); - expect(await LSP7.balanceOf(context.universalProfile1.address)).to.equal(999); - expect(await LSP7.balanceOf(context.universalProfile2.address)).to.equal(1); + expect(await LSP7.balanceOf(await context.universalProfile1.getAddress())).to.equal(999); + expect(await LSP7.balanceOf(await context.universalProfile2.getAddress())).to.equal(1); }); }); @@ -3128,21 +3137,26 @@ export const shouldBehaveLikeLSP1Delegate = ( const LSP8 = await new LSP8Tester__factory(context.accounts.owner1).deploy( 'MyToken', 'MTK', - context.universalProfile1.address, + await context.universalProfile1.getAddress(), LSP4_TOKEN_TYPES.NFT, LSP8_TOKEN_ID_FORMAT.NUMBER, ); // Mint token for UP1 - await LSP8.mint(context.universalProfile1.address, '0x' + '0'.repeat(64), true, '0x'); + await LSP8.mint( + await context.universalProfile1.getAddress(), + '0x' + '0'.repeat(64), + true, + '0x', + ); expect(await LSP8.tokenOwnerOf('0x' + '0'.repeat(64))).to.equal( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), ); // Encode LSP8 token tarnsfer (UP1 to UP2) const LSP8_TransferCalldata = LSP8.interface.encodeFunctionData('transfer', [ - context.universalProfile1.address, - context.universalProfile2.address, + await context.universalProfile1.getAddress(), + await context.universalProfile2.getAddress(), '0x' + '0'.repeat(64), false, '0x', @@ -3151,10 +3165,10 @@ export const shouldBehaveLikeLSP1Delegate = ( // Transfer LSP8 token await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, LSP8.address, 0, LSP8_TransferCalldata); + .execute(OPERATION_TYPES.CALL, await LSP8.getAddress(), 0, LSP8_TransferCalldata); expect(await LSP8.tokenOwnerOf('0x' + '0'.repeat(64))).to.equal( - context.universalProfile2.address, + await context.universalProfile2.getAddress(), ); }); }); @@ -3163,29 +3177,34 @@ export const shouldBehaveLikeLSP1Delegate = ( it('should not revert', async () => { // Deploy LSP9 (UP1 ownwer) const LSP9 = await new LSP9Vault__factory(context.accounts.owner1).deploy( - context.universalProfile1.address, + await context.universalProfile1.getAddress(), ); - expect(await LSP9.owner()).to.equal(context.universalProfile1.address); + expect(await LSP9.owner()).to.equal(await context.universalProfile1.getAddress()); // Encode LSP9 transfer & accept ownership (UP1 to UP2) const LSP9_TransferOwnerhsipCalldata = LSP9.interface.encodeFunctionData( 'transferOwnership', - [context.universalProfile2.address], + [await context.universalProfile2.getAddress()], ); const LSP9_AcceptOwnerhsipCalldata = LSP9.interface.encodeFunctionData('acceptOwnership'); // Transfer Ownership of LSP9 await context.universalProfile1 .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, LSP9.address, 0, LSP9_TransferOwnerhsipCalldata); + .execute( + OPERATION_TYPES.CALL, + await LSP9.getAddress(), + 0, + LSP9_TransferOwnerhsipCalldata, + ); // Accept Ownership of LSP9 await context.universalProfile2 .connect(context.accounts.owner2) - .execute(OPERATION_TYPES.CALL, LSP9.address, 0, LSP9_AcceptOwnerhsipCalldata); + .execute(OPERATION_TYPES.CALL, await LSP9.getAddress(), 0, LSP9_AcceptOwnerhsipCalldata); - expect(await LSP9.owner()).to.equal(context.universalProfile2.address); + expect(await LSP9.owner()).to.equal(await context.universalProfile2.getAddress()); }); }); }); diff --git a/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP.test.ts b/packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP.test.ts similarity index 99% rename from tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP.test.ts rename to packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP.test.ts index b0eab3e6a..5ae070d8f 100644 --- a/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP.test.ts @@ -29,6 +29,7 @@ describe('LSP1UniversalReceiverDelegateUP', () => { const [UP2, KM2] = await setupProfileWithKeyManagerWithURD(accounts.owner2); const lsp1universalReceiverDelegateUP = LSP1_URD_UP as LSP1UniversalReceiverDelegateUP; + const universalProfile1 = UP1 as UniversalProfile; const universalProfile2 = UP2 as UniversalProfile; const lsp6KeyManager1 = KM1 as LSP6KeyManager; diff --git a/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault.behaviour.ts similarity index 76% rename from tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault.behaviour.ts index 13e997898..63183f41c 100644 --- a/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault.behaviour.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // types import { @@ -19,16 +19,13 @@ import { import { ARRAY_LENGTH, LSP1_HOOK_PLACEHOLDER, abiCoder } from '../utils/helpers'; // constants -import { - ERC725YDataKeys, - INTERFACE_IDS, - OPERATION_TYPES, - LSP1_TYPE_IDS, - LSP8_TOKEN_ID_FORMAT, - LSP4_TOKEN_TYPES, -} from '../../constants'; +import { ERC725YDataKeys, INTERFACE_IDS, LSP1_TYPE_IDS } from '../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; + import { callPayload, getLSP5MapAndArrayKeysValue } from '../utils/fixtures'; -import { BigNumber, BytesLike, Transaction } from 'ethers'; +import { BytesLike, ContractTransaction } from 'ethers'; export type LSP1TestAccounts = { owner1: SignerWithAddress; @@ -129,9 +126,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise Promise Promise Promise Promise Promise Promise { @@ -265,15 +267,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenA.interface.encodeFunctionData('mint', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '10', false, '0x', @@ -283,9 +285,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -294,14 +296,14 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('mint', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '10', false, '0x', @@ -311,9 +313,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -322,14 +324,14 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('mint', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '10', false, '0x', @@ -339,25 +341,27 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { const [indexInMap, interfaceId, arrayLength, elementAddress] = await getLSP5MapAndArrayKeysValue(context.lsp9Vault1, lsp7TokenB); + expect(indexInMap).to.equal(1); expect(interfaceId).to.equal(INTERFACE_IDS.LSP7DigitalAsset); expect(arrayLength).to.equal(ARRAY_LENGTH.TWO); - expect(elementAddress).to.equal(lsp7TokenB.address); + expect(elementAddress).to.equal(await lsp7TokenB.getAddress()); }); }); describe('when minting 10 tokenC to lsp9Vault1', () => { before(async () => { const abi = lsp7TokenC.interface.encodeFunctionData('mint', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '10', false, '0x', @@ -367,9 +371,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -378,7 +382,7 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { before(async () => { const abi = lsp7TokenC.interface.encodeFunctionData('burn', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '10', '0x', ]); @@ -396,14 +400,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenC.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenC.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000002', ]); @@ -417,7 +422,7 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenA.interface.encodeFunctionData('burn', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '10', '0x', ]); @@ -426,9 +431,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenA.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenA.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', ]); @@ -457,7 +463,7 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('burn', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '10', '0x', ]); @@ -466,9 +472,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -477,14 +483,14 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('burn', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '10', '0x', ]); @@ -493,14 +499,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000000', ]); @@ -516,15 +523,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { await lsp7TokenA .connect(context.accounts.random) - .mint(context.lsp9Vault1.address, '10', false, '0x'); + .mint(await context.lsp9Vault1.getAddress(), '10', false, '0x'); await lsp7TokenB .connect(context.accounts.random) - .mint(context.lsp9Vault1.address, '10', false, '0x'); + .mint(await context.lsp9Vault1.getAddress(), '10', false, '0x'); await lsp7TokenC .connect(context.accounts.random) - .mint(context.lsp9Vault1.address, '10', false, '0x'); + .mint(await context.lsp9Vault1.getAddress(), '10', false, '0x'); }); it('should register lsp5keys: arrayLength 3, index [1,2,3], [tokenA, tokenB, tokenC] addresses in Vault1 ', async () => { @@ -544,16 +551,16 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenA.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), '10', false, '0x', @@ -563,9 +570,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenA.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenA.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000002', ]); @@ -596,15 +604,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), '5', false, '0x', @@ -614,9 +622,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { @@ -635,15 +643,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), '4', false, '0x', @@ -653,9 +661,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { @@ -674,15 +682,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), '1', false, '0x', @@ -692,15 +700,16 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', ]); @@ -716,15 +725,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenC.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), '10', false, '0x', @@ -734,15 +743,16 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp7TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp7TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', ]); @@ -758,15 +768,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp7TokenB.interface.encodeFunctionData('transfer', [ - context.lsp9Vault2.address, - context.lsp9Vault1.address, + await context.lsp9Vault2.getAddress(), + await context.lsp9Vault1.getAddress(), '1', false, '0x', @@ -776,9 +786,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise Promise { before(async () => { const abi1 = lsp7TokenB.interface.encodeFunctionData('burn', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), '1', '0x', ]); @@ -805,13 +815,13 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise Promise Promise { @@ -890,39 +900,45 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { - let tokenTransferTx: Transaction; - let balance: BigNumber; + let tokenTransferTx: ContractTransaction; + let balance: bigint; before(async () => { await token .connect(context.accounts.owner1) - .mint(context.lsp9Vault1.address, 100, true, '0x'); + .mint(await context.lsp9Vault1.getAddress(), 100, true, '0x'); const vaultSetDataCalldata = context.lsp9Vault1.interface.encodeFunctionData('setData', [ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + token.address.substring(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + (await token.getAddress()).substring(2), '0xcafecafecafecafe', ]); await context.universalProfile .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, context.lsp9Vault1.address, 0, vaultSetDataCalldata); + .execute( + OPERATION_TYPES.CALL, + await context.lsp9Vault1.getAddress(), + 0, + vaultSetDataCalldata, + ); expect( await context.lsp9Vault1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xcafecafecafecafe', ]); - balance = await token.balanceOf(context.lsp9Vault1.address); + balance = await token.balanceOf(await context.lsp9Vault1.getAddress()); const tokenTransferCalldata = token.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), context.accounts.owner1.address, balance, true, @@ -931,12 +947,17 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -944,20 +965,20 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { - const tokensSentBytes32Value = ethers.utils.hexZeroPad(balance.toHexString(), 32); + const tokensSentBytes32Value = ethers.zeroPadValue(ethers.toBeHex(balance), 32); const tokenTransferData = abiCoder.encode( ['address', 'address', 'address', 'uint256', 'bytes'], [ - context.lsp9Vault1.address, - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault1.getAddress(), context.accounts.owner1.address, tokensSentBytes32Value, '0x', ], ); - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP5: Error generating data key/value pairs', '0x'], ); @@ -965,7 +986,7 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { - let tokenTransferTx: Transaction; - let balance: BigNumber; + let tokenTransferTx: ContractTransaction; + let balance: bigint; before(async () => { await token .connect(context.accounts.owner1) - .mint(context.lsp9Vault1.address, 100, true, '0x'); + .mint(await context.lsp9Vault1.getAddress(), 100, true, '0x'); const vaultSetDataCalldata = context.lsp9Vault1.interface.encodeFunctionData('setData', [ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + token.address.substring(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + (await token.getAddress()).substring(2), '0xb3c4928f00000000000000000000000000000000cafecafe', ]); await context.universalProfile .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, context.lsp9Vault1.address, 0, vaultSetDataCalldata); + .execute( + OPERATION_TYPES.CALL, + await context.lsp9Vault1.getAddress(), + 0, + vaultSetDataCalldata, + ); expect( await context.lsp9Vault1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xb3c4928f00000000000000000000000000000000cafecafe', ]); - balance = await token.balanceOf(context.lsp9Vault1.address); + balance = await token.balanceOf(await context.lsp9Vault1.getAddress()); const tokenTransferCalldata = token.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), context.accounts.owner1.address, balance, true, @@ -1022,12 +1048,17 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -1035,20 +1066,20 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { - const tokensSentBytes32Value = ethers.utils.hexZeroPad(balance.toHexString(), 32); + const tokensSentBytes32Value = ethers.zeroPadValue(ethers.toBeHex(balance), 32); const tokenTransferData = abiCoder.encode( ['address', 'address', 'address', 'uint256', 'bytes'], [ - context.lsp9Vault1.address, - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault1.getAddress(), context.accounts.owner1.address, tokensSentBytes32Value, '0x', ], ); - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP5: Error generating data key/value pairs', '0x'], ); @@ -1056,7 +1087,7 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { - let tokenTransferTx: Transaction; - let balance: BigNumber; + let tokenTransferTx: ContractTransaction; + let balance: bigint; before(async () => { await token .connect(context.accounts.owner1) - .mint(context.lsp9Vault1.address, 100, true, '0x'); + .mint(await context.lsp9Vault1.getAddress(), 100, true, '0x'); const vaultSetDataCalldata = context.lsp9Vault1.interface.encodeFunctionData('setData', [ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + token.address.substring(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + (await token.getAddress()).substring(2), '0xcafecafecafecafecafecafecafecafecafecafe', ]); await context.universalProfile .connect(context.accounts.owner1) - .execute(OPERATION_TYPES.CALL, context.lsp9Vault1.address, 0, vaultSetDataCalldata); + .execute( + OPERATION_TYPES.CALL, + await context.lsp9Vault1.getAddress(), + 0, + vaultSetDataCalldata, + ); expect( await context.lsp9Vault1.getDataBatch([arrayKey, arrayIndexKey, assetMapKey]), ).to.deep.equal([ '0x' + '00'.repeat(15) + '01', - token.address.toLowerCase(), + (await token.getAddress()).toLowerCase(), '0xcafecafecafecafecafecafecafecafecafecafe', ]); - balance = await token.balanceOf(context.lsp9Vault1.address); + balance = await token.balanceOf(await context.lsp9Vault1.getAddress()); const tokenTransferCalldata = token.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), context.accounts.owner1.address, balance, true, @@ -1113,12 +1149,17 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -1126,20 +1167,20 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { - const tokensSentBytes32Value = ethers.utils.hexZeroPad(balance.toHexString(), 32); + const tokensSentBytes32Value = ethers.zeroPadValue(ethers.toBeHex(balance), 32); const tokenTransferData = abiCoder.encode( ['address', 'address', 'address', 'uint256', 'bytes'], [ - context.lsp9Vault1.address, - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault1.getAddress(), context.accounts.owner1.address, tokensSentBytes32Value, '0x', ], ); - const lsp1ReturnedData = ethers.utils.defaultAbiCoder.encode( + const lsp1ReturnedData = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'bytes'], ['LSP5: Error generating data key/value pairs', '0x'], ); @@ -1147,7 +1188,7 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise Promise { before(async () => { const abi = lsp8TokenA.interface.encodeFunctionData('mint', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1209,9 +1250,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -1220,14 +1261,14 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('mint', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1237,9 +1278,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -1248,14 +1289,14 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('mint', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), TOKEN_ID.TWO, false, '0x', @@ -1265,9 +1306,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -1276,14 +1317,14 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenC.interface.encodeFunctionData('mint', [ - context.lsp9Vault1.address, + await context.lsp9Vault1.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1293,9 +1334,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -1304,7 +1345,7 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenC.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenC.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000002', ]); @@ -1344,9 +1386,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenA.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenA.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', ]); @@ -1380,9 +1423,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -1391,7 +1434,7 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000000', ]); @@ -1427,23 +1471,23 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { @@ -1463,16 +1507,16 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenA.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1482,9 +1526,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenA.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenA.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000002', ]); @@ -1515,15 +1560,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1533,9 +1578,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { @@ -1554,15 +1599,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), TOKEN_ID.TWO, false, '0x', @@ -1572,9 +1617,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise { @@ -1593,15 +1638,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), TOKEN_ID.THREE, false, '0x', @@ -1611,15 +1656,16 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', ]); @@ -1635,15 +1681,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenC.interface.encodeFunctionData('transfer', [ - context.lsp9Vault1.address, - context.lsp9Vault2.address, + await context.lsp9Vault1.getAddress(), + await context.lsp9Vault2.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1653,15 +1699,16 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { const [mapValue, arrayLength, elementAddress] = await context.lsp9Vault1.getDataBatch([ - ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + lsp8TokenB.address.substr(2), + ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap + + (await lsp8TokenB.getAddress()).substring(2), ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].length, ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index + '00000000000000000000000000000001', ]); @@ -1677,15 +1724,15 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise { before(async () => { const abi = lsp8TokenB.interface.encodeFunctionData('transfer', [ - context.lsp9Vault2.address, - context.lsp9Vault1.address, + await context.lsp9Vault2.getAddress(), + await context.lsp9Vault1.getAddress(), TOKEN_ID.ONE, false, '0x', @@ -1695,9 +1742,9 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise Promise { @@ -1738,13 +1795,13 @@ export const shouldBehaveLikeLSP1Delegate = (buildContext: () => Promise Promise Promise Promise { ); const lsp9Vault1 = await new LSP9Vault__factory(accounts.any).deploy( - universalProfile.address, + await universalProfile.getAddress(), ); const lsp9Vault2 = await new LSP9Vault__factory(accounts.any).deploy( - universalProfile.address, + await universalProfile.getAddress(), ); // Setting lsp1UniversalReceiverDelegateVault as URD for the Vault const abi = lsp9Vault1.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, - lsp1universalReceiverDelegateVault.address, + await lsp1universalReceiverDelegateVault.getAddress(), ]); await universalProfile .connect(accounts.owner1) - .execute(OPERATION_TYPES.CALL, lsp9Vault1.address, 0, abi); + .execute(OPERATION_TYPES.CALL, await lsp9Vault1.getAddress(), 0, abi); await universalProfile .connect(accounts.owner1) - .execute(OPERATION_TYPES.CALL, lsp9Vault2.address, 0, abi); + .execute(OPERATION_TYPES.CALL, await lsp9Vault2.getAddress(), 0, abi); return { accounts, diff --git a/tests/LSP20CallVerification/LSP20CallVerification.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP20CallVerification.behaviour.ts similarity index 71% rename from tests/LSP20CallVerification/LSP20CallVerification.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP20CallVerification.behaviour.ts index c8c0a4f2f..956136121 100644 --- a/tests/LSP20CallVerification/LSP20CallVerification.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP20CallVerification.behaviour.ts @@ -1,32 +1,38 @@ import { expect } from 'chai'; import { ethers, network } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { FakeContract, smock } from '@defi-wonderland/smock'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // types import { - UniversalProfile, - UniversalProfile__factory, NotImplementingVerifyCall, NotImplementingVerifyCall__factory, ImplementingFallback, ImplementingFallback__factory, FallbackReturnSuccessValue, FallbackReturnSuccessValue__factory, - FirstCallReturnExpandedFailValue, - FirstCallReturnExpandedFailValue__factory, - FirstCallReturnFailValue, - FirstCallReturnFailValue__factory, LSP0ERC725Account, - ILSP20CallVerifier, - ILSP20CallVerifier__factory, OwnerWithURD, OwnerWithURD__factory, + UniversalProfile, + UniversalProfile__factory, + FirstCallReturnExpandedInvalidValue, + FirstCallReturnExpandedInvalidValue__factory, + FirstCallReturnInvalidValue, + FirstCallReturnInvalidValue__factory, + SecondCallReturnFailureValue__factory, + SecondCallReturnFailureValue, + FirstCallReturnSuccessValue, + FirstCallReturnSuccessValue__factory, + BothCallReturnSuccessValue, + BothCallReturnSuccessValue__factory, + SecondCallReturnExpandedSuccessValue, + SecondCallReturnExpandedSuccessValue__factory, } from '../../types'; // constants -import { LSP1_TYPE_IDS, LSP20_SUCCESS_VALUES, OPERATION_TYPES } from '../../constants'; -import { abiCoder } from './..//utils/helpers'; +import { LSP1_TYPE_IDS } from '../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { abiCoder } from '../utils/helpers'; export type LSP20TestContext = { accounts: SignerWithAddress[]; @@ -44,8 +50,8 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { describe('when owner is an EOA', () => { describe('when calling `setData(bytes32,bytes)`', () => { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomKey1')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(50)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('RandomKey1')); + const dataValue = ethers.hexlify(ethers.randomBytes(50)); it('should pass when owner calls', async () => { await context.universalProfile @@ -65,8 +71,8 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomKey2')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(50)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('RandomKey2')); + const dataValue = ethers.hexlify(ethers.randomBytes(50)); it('should pass when owner calls', async () => { await context.universalProfile @@ -152,7 +158,7 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { const operationsType = [OPERATION_TYPES.CALL]; const recipients = [context.accounts[1].address]; - const values = [ethers.BigNumber.from('0')]; + const values = [ethers.toBigInt('0')]; const datas = ['0x']; await expect( @@ -189,7 +195,7 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { it('should pass when the owner is calling', async () => { - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(500)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(500)]); await expect( context.universalProfile.connect(context.deployParams.owner).renounceOwnership(), @@ -197,7 +203,7 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(100)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(100)]); await expect(context.universalProfile.connect(context.accounts[3]).renounceOwnership()) .to.be.revertedWithCustomError(context.universalProfile, 'LSP20EOACannotVerifyCall') @@ -209,12 +215,12 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { newContractOwner = await new OwnerWithURD__factory(context.accounts[0]).deploy( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); await context.universalProfile .connect(context.deployParams.owner) - .transferOwnership(newContractOwner.address); + .transferOwnership(await newContractOwner.getAddress()); await newContractOwner.acceptOwnership(); }); @@ -226,7 +232,7 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { await context.universalProfile.connect(context.accounts[0]).renounceOwnership(); - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(199)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(199)]); const tx = await context.universalProfile .connect(context.accounts[0]) @@ -235,12 +241,12 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise Promise { @@ -276,8 +282,8 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomKey1')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(50)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('RandomKey1')); + const dataValue = ethers.hexlify(ethers.randomBytes(50)); await expect(context.universalProfile.setData(dataKey, dataValue)) .to.be.revertedWithCustomError(context.universalProfile, 'LSP20CallingVerifierFailed') @@ -295,9 +301,9 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { @@ -309,8 +315,8 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomKey1')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(50)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('RandomKey1')); + const dataValue = ethers.hexlify(ethers.randomBytes(50)); await expect( context.universalProfile.setData(dataKey, dataValue), @@ -328,9 +334,9 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { @@ -342,8 +348,8 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomKey1')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(50)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('RandomKey1')); + const dataValue = ethers.hexlify(ethers.randomBytes(50)); await expect(context.universalProfile.setData(dataKey, dataValue)).to.emit( ownerContract, @@ -353,18 +359,18 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - let ownerContract: FirstCallReturnExpandedFailValue; + let ownerContract: FirstCallReturnExpandedInvalidValue; before('deploying a new owner', async () => { - ownerContract = await new FirstCallReturnExpandedFailValue__factory( + ownerContract = await new FirstCallReturnExpandedInvalidValue__factory( context.deployParams.owner, ).deploy(); await context.universalProfile .connect(context.deployParams.owner) - .transferOwnership(ownerContract.address); + .transferOwnership(await ownerContract.getAddress()); - await ownerContract.acceptOwnership(context.universalProfile.address); + await ownerContract.acceptOwnership(context.universalProfile.target); }); after('reverting to previous owner', async () => { @@ -376,8 +382,8 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomKey1')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(50)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('RandomKey1')); + const dataValue = ethers.hexlify(ethers.randomBytes(50)); await expect( context.universalProfile.setData(dataKey, dataValue), @@ -386,18 +392,18 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - let ownerContract: FirstCallReturnFailValue; + let ownerContract: FirstCallReturnInvalidValue; before('deploying a new owner', async () => { - ownerContract = await new FirstCallReturnFailValue__factory( + ownerContract = await new FirstCallReturnInvalidValue__factory( context.deployParams.owner, ).deploy(); await context.universalProfile .connect(context.deployParams.owner) - .transferOwnership(ownerContract.address); + .transferOwnership(await ownerContract.getAddress()); - await ownerContract.acceptOwnership(context.universalProfile.address); + await ownerContract.acceptOwnership(context.universalProfile.target); }); after('reverting to previous owner', async () => { @@ -409,8 +415,8 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomKey1')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(50)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('RandomKey1')); + const dataValue = ethers.hexlify(ethers.randomBytes(50)); await expect(context.universalProfile.setData(dataKey, dataValue)) .to.be.revertedWithCustomError(context.universalProfile, 'LSP20CallVerificationFailed') @@ -419,23 +425,22 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - let firstCallReturnSuccessValueContract: FakeContract; + let firstCallReturnSuccessValueContract: FirstCallReturnSuccessValue; let newUniversalProfile: UniversalProfile; before(async () => { - firstCallReturnSuccessValueContract = await smock.fake(ILSP20CallVerifier__factory.abi); - firstCallReturnSuccessValueContract.lsp20VerifyCall.returns( - LSP20_SUCCESS_VALUES.VERIFY_CALL.NO_POST_VERIFICATION, - ); + firstCallReturnSuccessValueContract = await new FirstCallReturnSuccessValue__factory( + context.accounts[0], + ).deploy(); newUniversalProfile = await new UniversalProfile__factory(context.accounts[0]).deploy( - firstCallReturnSuccessValueContract.address, + firstCallReturnSuccessValueContract.target, ); }); it('should pass when calling `setData(bytes32,bytes)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect(newUniversalProfile.connect(context.accounts[3]).setData(key, value)) .to.emit(newUniversalProfile, 'DataChanged') @@ -447,26 +452,22 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - let firstCallReturnSuccessValueContract: FakeContract; + let firstCallReturnSuccessValueContract: FirstCallReturnSuccessValue; let newUniversalProfile: UniversalProfile; before(async () => { - firstCallReturnSuccessValueContract = await smock.fake(ILSP20CallVerifier__factory.abi); - firstCallReturnSuccessValueContract.lsp20VerifyCall.returns( - LSP20_SUCCESS_VALUES.VERIFY_CALL.NO_POST_VERIFICATION + - '0'.repeat(56) + - '0xcafecafecafecafecafecafecafecafecafecafe' + - '0'.repeat(24), - ); + firstCallReturnSuccessValueContract = await new FirstCallReturnSuccessValue__factory( + context.accounts[0], + ).deploy(); newUniversalProfile = await new UniversalProfile__factory(context.accounts[0]).deploy( - firstCallReturnSuccessValueContract.address, + firstCallReturnSuccessValueContract.target, ); }); it('should pass when calling `setData(bytes32,bytes)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect( newUniversalProfile.connect(context.accounts[3])['setData(bytes32,bytes)'](key, value), @@ -480,26 +481,22 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - let bothCallReturnSuccessValueContract: FakeContract; + let bothCallReturnSuccessValueContract: BothCallReturnSuccessValue; let newUniversalProfile: UniversalProfile; before(async () => { - bothCallReturnSuccessValueContract = await smock.fake(ILSP20CallVerifier__factory.abi); - bothCallReturnSuccessValueContract.lsp20VerifyCall.returns( - LSP20_SUCCESS_VALUES.VERIFY_CALL.WITH_POST_VERIFICATION, - ); - bothCallReturnSuccessValueContract.lsp20VerifyCallResult.returns( - LSP20_SUCCESS_VALUES.VERIFY_CALL_RESULT, - ); + bothCallReturnSuccessValueContract = await new BothCallReturnSuccessValue__factory( + context.accounts[0], + ).deploy(); newUniversalProfile = await new UniversalProfile__factory(context.accounts[0]).deploy( - bothCallReturnSuccessValueContract.address, + bothCallReturnSuccessValueContract.target, ); }); it('should pass when calling `setData(bytes32,bytes)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect(newUniversalProfile.connect(context.accounts[3]).setData(key, value)) .to.emit(newUniversalProfile, 'DataChanged') @@ -511,32 +508,22 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - let bothCallReturnSuccessValueContract: FakeContract; + let bothCallReturnSuccessValueContract: BothCallReturnSuccessValue; let newUniversalProfile: UniversalProfile; before(async () => { - bothCallReturnSuccessValueContract = await smock.fake(ILSP20CallVerifier__factory.abi); - bothCallReturnSuccessValueContract.lsp20VerifyCall.returns( - LSP20_SUCCESS_VALUES.VERIFY_CALL.WITH_POST_VERIFICATION + - '0'.repeat(56) + - '0xcafecafecafecafecafecafecafecafecafecafe' + - '0'.repeat(24), - ); - bothCallReturnSuccessValueContract.lsp20VerifyCallResult.returns( - LSP20_SUCCESS_VALUES.VERIFY_CALL_RESULT + - '0'.repeat(56) + - '0xcafecafecafecafecafecafecafecafecafecafe' + - '0'.repeat(24), - ); + bothCallReturnSuccessValueContract = await new BothCallReturnSuccessValue__factory( + context.accounts[0], + ).deploy(); newUniversalProfile = await new UniversalProfile__factory(context.accounts[0]).deploy( - bothCallReturnSuccessValueContract.address, + bothCallReturnSuccessValueContract.target, ); }); it('should pass when calling `setData(bytes32,bytes)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect( newUniversalProfile.connect(context.accounts[3])['setData(bytes32,bytes)'](key, value), @@ -550,24 +537,22 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - let secondCallReturnFailureContract: FakeContract; + let secondCallReturnFailureContract: SecondCallReturnFailureValue; let newUniversalProfile: UniversalProfile; before(async () => { - secondCallReturnFailureContract = await smock.fake(ILSP20CallVerifier__factory.abi); - secondCallReturnFailureContract.lsp20VerifyCall.returns( - LSP20_SUCCESS_VALUES.VERIFY_CALL.WITH_POST_VERIFICATION, - ); - secondCallReturnFailureContract.lsp20VerifyCallResult.returns('0x00000000'); + secondCallReturnFailureContract = await new SecondCallReturnFailureValue__factory( + context.accounts[0], + ).deploy(); newUniversalProfile = await new UniversalProfile__factory(context.accounts[0]).deploy( - secondCallReturnFailureContract.address, + secondCallReturnFailureContract.target, ); }); it('should revert when calling `setData(bytes32,bytes)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect( newUniversalProfile.connect(context.accounts[3]).setData(key, value), @@ -576,29 +561,21 @@ export const shouldBehaveLikeLSP20 = (buildContext: () => Promise { - let secondCallReturnExpandedValueContract: FakeContract; + let secondCallReturnExpandedValueContract: SecondCallReturnExpandedSuccessValue; let newUniversalProfile: UniversalProfile; before(async () => { - secondCallReturnExpandedValueContract = await smock.fake(ILSP20CallVerifier__factory.abi); - secondCallReturnExpandedValueContract.lsp20VerifyCall.returns( - LSP20_SUCCESS_VALUES.VERIFY_CALL.WITH_POST_VERIFICATION, - ); - secondCallReturnExpandedValueContract.lsp20VerifyCallResult.returns( - ethers.utils.solidityPack( - ['bytes4', 'bytes28'], - [LSP20_SUCCESS_VALUES.VERIFY_CALL_RESULT, '0x' + '0'.repeat(56)], - ), - ); + secondCallReturnExpandedValueContract = + await new SecondCallReturnExpandedSuccessValue__factory(context.accounts[0]).deploy(); newUniversalProfile = await new UniversalProfile__factory(context.accounts[0]).deploy( - secondCallReturnExpandedValueContract.address, + secondCallReturnExpandedValueContract.target, ); }); it('should pass when calling `setData(bytes32,bytes)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect(newUniversalProfile.connect(context.accounts[3]).setData(key, value)) .to.emit(newUniversalProfile, 'DataChanged') diff --git a/tests/LSP20CallVerification/LSP20WithLSP14.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP20WithLSP14.behaviour.ts similarity index 83% rename from tests/LSP20CallVerification/LSP20WithLSP14.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP20WithLSP14.behaviour.ts index 860389cd7..f628d8e3c 100644 --- a/tests/LSP20CallVerification/LSP20WithLSP14.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP20WithLSP14.behaviour.ts @@ -1,19 +1,19 @@ import { expect } from 'chai'; import { ethers, network, artifacts } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { - LSP0ERC725Account, UPWithInstantAcceptOwnership__factory, UPWithInstantAcceptOwnership, + LSP0ERC725Account, } from '../../types'; // constants -import { OPERATION_TYPES } from '../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; // helpers import { provider } from '../utils/helpers'; -import { BigNumber, ContractTransaction } from 'ethers'; +import { ContractTransaction, ContractTransactionResponse } from 'ethers'; export type LSP14CombinedWithLSP20TestContext = { accounts: SignerWithAddress[]; @@ -23,13 +23,13 @@ export type LSP14CombinedWithLSP20TestContext = { }; export const shouldBehaveLikeLSP14WithLSP20 = ( - buildContext: (initialFunding?: number | BigNumber) => Promise, + buildContext: (initialFunding?: number | bigint) => Promise, ) => { let context: LSP14CombinedWithLSP20TestContext; let newOwner: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('50')); + context = await buildContext(ethers.parseEther('50')); newOwner = context.accounts[1]; }); @@ -74,7 +74,7 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( await expect( context.contract .connect(context.deployParams.owner) - .transferOwnership(context.contract.address), + .transferOwnership(await context.contract.getAddress()), ).to.be.revertedWithCustomError(context.contract, 'LSP14CannotTransferOwnershipToSelf'); }); @@ -91,17 +91,17 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( it('execute(...) - LYX transfer', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const recipientBalanceBefore = await provider.getBalance(recipient.address); - const accountBalanceBefore = await provider.getBalance(context.contract.address); + const accountBalanceBefore = await provider.getBalance(await context.contract.getAddress()); await context.contract .connect(context.deployParams.owner) .execute(OPERATION_TYPES.CALL, recipient.address, amount, '0x'); const recipientBalanceAfter = await provider.getBalance(recipient.address); - const accountBalanceAfter = await provider.getBalance(context.contract.address); + const accountBalanceAfter = await provider.getBalance(await context.contract.getAddress()); // recipient balance should have gone up expect(recipientBalanceAfter).to.be.gt(recipientBalanceBefore); @@ -124,7 +124,7 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( await expect( context.contract .connect(context.deployParams.owner) - .transferOwnership(upWithCustomURD.address), + .transferOwnership(await upWithCustomURD.getAddress()), ).to.be.revertedWithCustomError( context.contract, 'LSP14MustAcceptOwnershipInSeparateTransaction', @@ -173,7 +173,7 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( it('should have cleared the pendingOwner after transferring ownership', async () => { const newPendingOwner = await context.contract.pendingOwner(); - expect(newPendingOwner).to.equal(ethers.constants.AddressZero); + expect(newPendingOwner).to.equal(ethers.ZeroAddress); }); it('should have emitted a OwnershipTransferred event', async () => { @@ -203,7 +203,7 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( it('should revert when calling `execute(...)`', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect( context.contract @@ -234,14 +234,14 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( it('execute(...) - LYX transfer', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect(() => context.contract .connect(newOwner) .execute(OPERATION_TYPES.CALL, recipient.address, amount, '0x'), ).to.changeEtherBalances( - [context.contract.address, recipient.address], + [await context.contract.getAddress(), recipient.address], [ `-${amount}`, // account balance should have gone down amount, // recipient balance should have gone up @@ -265,12 +265,12 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( describe('when calling renounceOwnership() the first time', () => { let currentOwner: SignerWithAddress; - let renounceOwnershipTx: ContractTransaction; + let renounceOwnershipTx: ContractTransactionResponse; let anotherOwner: string; before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); currentOwner = context.accounts[0]; @@ -280,7 +280,7 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( await context.contract.connect(currentOwner).transferOwnership(anotherOwner); // mine 1,000 blocks - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(1000)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(1000)]); renounceOwnershipTx = await context.contract.connect(currentOwner).renounceOwnership(); @@ -291,10 +291,10 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( const _renounceOwnershipStartedAtAfterSlotNumber = Number.parseInt( ( await artifacts.getBuildInfo( - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol:LSP0ERC725Account', + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol:LSP0ERC725Account', ) )?.output.contracts[ - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol' + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ].LSP0ERC725Account.storageLayout.storage.filter((elem) => { @@ -302,12 +302,12 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( })[0].slot, ); - const _renounceOwnershipStartedAtAfter = await provider.getStorageAt( - context.contract.address, + const _renounceOwnershipStartedAtAfter = await provider.getStorage( + await context.contract.getAddress(), _renounceOwnershipStartedAtAfterSlotNumber, ); - expect(ethers.BigNumber.from(_renounceOwnershipStartedAtAfter).toNumber()).to.equal( + expect(ethers.toBigInt(_renounceOwnershipStartedAtAfter)).to.equal( renounceOwnershipTx.blockNumber, ); }); @@ -321,13 +321,13 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( }); it('should reset the pendingOwner', async () => { - expect(await context.contract.pendingOwner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.pendingOwner()).to.equal(ethers.ZeroAddress); }); describe('currentOwner should still be able to interact with contract before confirming', () => { it('`setData(...)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Random Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Value')); + const key = ethers.keccak256(ethers.toUtf8Bytes('Random Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Random Value')); await context.contract.connect(currentOwner).setData(key, value); @@ -338,21 +338,24 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( it('transfer LYX via `execute(...)`', async () => { const recipient = context.accounts[3].address; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); // verify that balances have been updated await expect(() => context.contract .connect(currentOwner) .execute(OPERATION_TYPES.CALL, recipient, amount, '0x'), - ).to.changeEtherBalances([context.contract.address, recipient], [`-${amount}`, amount]); + ).to.changeEtherBalances( + [await context.contract.getAddress(), recipient], + [`-${amount}`, amount], + ); }); }); }); describe('when calling renounceOwnership() the second time', () => { before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); }); it('should revert if called in the delay period', async () => { @@ -363,7 +366,7 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( const renounceOwnershipOnceReceipt = await renounceOwnershipOnce.wait(); // skip 98 blocks, but not enough to reach the delay period - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(98)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(98)]); await expect(context.contract.connect(context.deployParams.owner).renounceOwnership()) .to.be.revertedWithCustomError(context.contract, 'LSP14NotInRenounceOwnershipInterval') @@ -375,17 +378,17 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( expect(await context.contract.owner()).to.equal(context.deployParams.owner.address); // skip 500 blocks for the next test - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(500)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(500)]); }); it('should initialize again if the confirmation period passed', async () => { const _renounceOwnershipStartedAtAfterSlotNumber = Number.parseInt( ( await artifacts.getBuildInfo( - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol:LSP0ERC725Account', + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol:LSP0ERC725Account', ) )?.output.contracts[ - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol' + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ].LSP0ERC725Account.storageLayout.storage.filter((elem) => { @@ -395,33 +398,31 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( await context.contract.connect(context.deployParams.owner).renounceOwnership(); - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(400)]); // skip 400 blocks + await network.provider.send('hardhat_mine', [ethers.toQuantity(400)]); // skip 400 blocks const tx = await context.contract.connect(context.deployParams.owner).renounceOwnership(); await tx.wait(); - const _renounceOwnershipStartedAtAfter = await provider.getStorageAt( - context.contract.address, + const _renounceOwnershipStartedAtAfter = await provider.getStorage( + await context.contract.getAddress(), _renounceOwnershipStartedAtAfterSlotNumber, ); - expect(ethers.BigNumber.from(_renounceOwnershipStartedAtAfter).toNumber()).to.equal( - tx.blockNumber, - ); + expect(ethers.toBigInt(_renounceOwnershipStartedAtAfter)).to.equal(tx.blockNumber); }); describe('when called after the delay and before the confirmation period end', () => { let renounceOwnershipSecondTx: ContractTransaction; before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); // Call renounceOwnership for the first time await context.contract.connect(context.deployParams.owner).renounceOwnership(); // Skip 199 block to reach the time where renouncing ownership can happen - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(199)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(199)]); renounceOwnershipSecondTx = await context.contract .connect(context.deployParams.owner) @@ -431,29 +432,29 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( it('should have emitted a OwnershipTransferred event', async () => { await expect(renounceOwnershipSecondTx) .to.emit(context.contract, 'OwnershipTransferred') - .withArgs(context.deployParams.owner.address, ethers.constants.AddressZero); + .withArgs(context.deployParams.owner.address, ethers.ZeroAddress); - expect(await context.contract.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.owner()).to.equal(ethers.ZeroAddress); }); it('should have emitted a OwnershipRenounced event', async () => { await expect(renounceOwnershipSecondTx).to.emit(context.contract, 'OwnershipRenounced'); - expect(await context.contract.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.owner()).to.equal(ethers.ZeroAddress); }); it('owner should now be address(0)', async () => { - expect(await context.contract.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.owner()).to.equal(ethers.ZeroAddress); }); it('should have reset the `_renounceOwnershipStartedAt` state variable to zero', async () => { const _renounceOwnershipStartedAtAfterSlotNumber = Number.parseInt( ( await artifacts.getBuildInfo( - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol:LSP0ERC725Account', + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol:LSP0ERC725Account', ) )?.output.contracts[ - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol' + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ].LSP0ERC725Account.storageLayout.storage.filter((elem) => { @@ -461,27 +462,27 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( })[0].slot, ); - const _renounceOwnershipStartedAtAfter = await provider.getStorageAt( - context.contract.address, + const _renounceOwnershipStartedAtAfter = await provider.getStorage( + await context.contract.getAddress(), _renounceOwnershipStartedAtAfterSlotNumber, ); - expect(ethers.BigNumber.from(_renounceOwnershipStartedAtAfter).toNumber()).to.equal(0); + expect(ethers.toBigInt(_renounceOwnershipStartedAtAfter)).to.equal(0); }); describe('currentOwner should not be able to interact with contract anymore after confirming', () => { it('`setData(...)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Random Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Value')); + const key = ethers.keccak256(ethers.toUtf8Bytes('Random Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Random Value')); await expect(context.contract.connect(context.deployParams.owner).setData(key, value)) .to.be.revertedWithCustomError(context.contract, 'LSP20EOACannotVerifyCall') - .withArgs(ethers.constants.AddressZero); + .withArgs(ethers.ZeroAddress); }); it('transfer LYX via `execute(...)`', async () => { const recipient = context.accounts[3].address; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect( context.contract @@ -489,7 +490,7 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( .execute(OPERATION_TYPES.CALL, recipient, amount, '0x'), ) .to.be.revertedWithCustomError(context.contract, 'LSP20EOACannotVerifyCall') - .withArgs(ethers.constants.AddressZero); + .withArgs(ethers.ZeroAddress); }); }); }); @@ -498,7 +499,7 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( let newOwner: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); // transferOwnership to a new owner newOwner = context.accounts[3]; @@ -511,14 +512,14 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( await context.contract.connect(context.deployParams.owner).renounceOwnership(); // Skip 199 block to reach the time where renouncing ownership can happen - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(199)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(199)]); // Call renounceOwnership for the second time await context.contract.connect(context.deployParams.owner).renounceOwnership(); }); it('should reset the pendingOwner whenever renounceOwnership(..) is confirmed', async () => { - expect(await context.contract.pendingOwner()).to.equal(ethers.constants.AddressZero); + expect(await context.contract.pendingOwner()).to.equal(ethers.ZeroAddress); }); it('previous pendingOwner should not be able to call acceptOwnership(...) anymore', async () => { @@ -537,17 +538,17 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( // Simulate a scenario where we are at just few hundred blocks after the blockchain started // (few hundred blocks after genesis) - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(138)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(138)]); }); it('should instantiate the renounceOwnership process in 2 steps correctly', async () => { const _renounceOwnershipStartedAtAfterSlotNumber = Number.parseInt( ( await artifacts.getBuildInfo( - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol:LSP0ERC725Account', + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol:LSP0ERC725Account', ) )?.output.contracts[ - 'contracts/LSP0ERC725Account/LSP0ERC725Account.sol' + '@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ].LSP0ERC725Account.storageLayout.storage.filter((elem) => { @@ -561,12 +562,12 @@ export const shouldBehaveLikeLSP14WithLSP20 = ( await renounceOwnershipTx.wait(); - const _renounceOwnershipStartedAtAfter = await provider.getStorageAt( - context.contract.address, + const _renounceOwnershipStartedAtAfter = await provider.getStorage( + await context.contract.getAddress(), _renounceOwnershipStartedAtAfterSlotNumber, ); - expect(ethers.BigNumber.from(_renounceOwnershipStartedAtAfter)).to.equal( + expect(ethers.toBigInt(_renounceOwnershipStartedAtAfter)).to.equal( renounceOwnershipTx.blockNumber, ); diff --git a/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddExtensions.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddExtensions.test.ts similarity index 92% rename from tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddExtensions.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddExtensions.test.ts index 40f050a36..db34ae3a5 100644 --- a/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddExtensions.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddExtensions.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS } from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -47,27 +48,27 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( extensionHandlerKey1 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded extensionHandlerKey2 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded extensionHandlerKey3 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded extensionHandlerKey4 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded extensionHandlerKey5 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded [extensionA, extensionB, extensionC, extensionD] = getRandomAddresses(4); @@ -107,9 +108,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( encodeCompactBytesArray([ // Adding the Extension Handler Keys as AllowedERC725YDataKey to test if it break the behavior ERC725YDataKeys.LSP17.LSP17ExtensionPrefix, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), ]), PERMISSIONS.CALL, ]; @@ -126,7 +127,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( ]; permissionArrayValues = [ - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), + ethers.zeroPadValue(ethers.toBeHex(7), 16), context.mainController.address, canAddAndChangeExtensions.address, canOnlyAddExtensions.address, @@ -526,13 +527,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( dataKeys: [ extensionHandlerKey5, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], - dataValues: [ - extensionA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), - '0xaabbccdd', + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], + dataValues: [extensionA, ethers.zeroPadValue(ethers.toBeHex(7), 16), '0xaabbccdd'], }; await context.universalProfile @@ -549,13 +546,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( dataKeys: [ extensionHandlerKey5, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ], - dataValues: [ - extensionB, - ethers.utils.hexZeroPad(ethers.utils.hexlify(8), 16), - '0xaabb', + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), ], + dataValues: [extensionB, ethers.zeroPadValue(ethers.toBeHex(8), 16), '0xaabb'], }; await context.universalProfile @@ -572,9 +565,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( dataKeys: [ extensionHandlerKey5, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), ], - dataValues: ['0x', ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), '0x'], + dataValues: ['0x', ethers.zeroPadValue(ethers.toBeHex(7), 16), '0x'], }; await context.universalProfile @@ -594,13 +587,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( dataKeys: [ extensionHandlerKey5, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], - dataValues: [ - extensionA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), - '0xaabbccdd', + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], + dataValues: [extensionA, ethers.zeroPadValue(ethers.toBeHex(7), 16), '0xaabbccdd'], }; await expect( @@ -616,10 +605,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when adding a ExtensionHandler and ERC725Y Data Key', () => { it("should revert because of caller don't have SETDATA Permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey5, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey5, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -702,10 +688,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when adding a ExtensionHandler and ERC725Y Data Key', () => { it("should revert because of caller don't have SETDATA Permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey4, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -751,7 +734,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( extensionHandlerKey5, extensionHandlerKey1, extensionHandlerKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [extensionA, extensionB, extensionC, '0xaabbccdd'], }; @@ -832,10 +815,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when adding a ExtensionHandler and ERC725Y Data Key', () => { it("should revert because of caller don't have SETDATA Permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey4, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -870,10 +850,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when Adding multiple ExtensionHandler keys with adding ERC725Y Data Key', () => { it("should revert because caller don't have ADDExtensions permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey4, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -909,10 +886,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when Adding multiple ExtensionHandler keys with adding other allowedERC725YDataKey', () => { it("should revert because caller don't have ADDExtensions permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey4, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -945,7 +919,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( const payloadParam = { dataKeys: [ extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), ], dataValues: [extensionA, '0xaabbccdd'], }; @@ -967,7 +941,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should be allowed to set a 20 bytes long address', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase(); await context.universalProfile.connect(context.mainController).setData(key, value); @@ -979,7 +953,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should be allowed to set a 21 bytes long address', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase() + '00'; await context.universalProfile.connect(context.mainController).setData(key, value); @@ -991,7 +965,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert when setting a random 10 bytes value', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xcafecafecafecafecafe'; await expect( @@ -1004,7 +978,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert when setting a random 30 bytes value', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef'; await expect( diff --git a/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddURD.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddURD.test.ts similarity index 95% rename from tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddURD.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddURD.test.ts index d0dde441b..88847b0e1 100644 --- a/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddURD.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeAddURD.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS } from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -49,19 +50,19 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( universalReceiverDelegateKey1 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(32)).substring(2, 42); + ethers.hexlify(ethers.randomBytes(32)).substring(2, 42); universalReceiverDelegateKey2 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(32)).substring(2, 42); + ethers.hexlify(ethers.randomBytes(32)).substring(2, 42); universalReceiverDelegateKey3 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(32)).substring(2, 42); + ethers.hexlify(ethers.randomBytes(32)).substring(2, 42); universalReceiverDelegateKey4 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(32)).substring(2, 42); + ethers.hexlify(ethers.randomBytes(32)).substring(2, 42); [ universalReceiverDelegateA, @@ -109,9 +110,9 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( // Adding the LSP1 Keys as AllowedERC725YDataKey to test if it break the behavior ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix, ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), ]), PERMISSIONS.CALL, ]; @@ -128,7 +129,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( ]; permissionArrayValues = [ - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), + ethers.zeroPadValue(ethers.toBeHex(7), 16), context.mainController.address, canAddAndChangeUniversalReceiverDelegate.address, canOnlyAddUniversalReceiverDelegate.address, @@ -540,11 +541,11 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [ universalReceiverDelegateA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), + ethers.zeroPadValue(ethers.toBeHex(7), 16), '0xaabbccdd', ], }; @@ -563,11 +564,11 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), ], dataValues: [ universalReceiverDelegateB, - ethers.utils.hexZeroPad(ethers.utils.hexlify(8), 16), + ethers.zeroPadValue(ethers.toBeHex(8), 16), '0xaabb', ], }; @@ -586,9 +587,9 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), ], - dataValues: ['0x', ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), '0x'], + dataValues: ['0x', ethers.zeroPadValue(ethers.toBeHex(7), 16), '0x'], }; await context.universalProfile @@ -608,11 +609,11 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [ universalReceiverDelegateA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), + ethers.zeroPadValue(ethers.toBeHex(7), 16), '0xaabbccdd', ], }; @@ -632,7 +633,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -724,7 +725,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -775,7 +776,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, universalReceiverDelegateKey1, universalReceiverDelegateKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [ universalReceiverDelegateA, @@ -874,7 +875,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -912,7 +913,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -954,7 +955,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -990,7 +991,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; diff --git a/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeOwner.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeOwner.test.ts similarity index 81% rename from tests/LSP20CallVerification/LSP6/Admin/PermissionChangeOwner.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeOwner.test.ts index 961062800..ae922613f 100644 --- a/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeOwner.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Admin/PermissionChangeOwner.test.ts @@ -1,12 +1,14 @@ import { expect } from 'chai'; import { ethers, network } from 'hardhat'; -import { BigNumber, ContractTransaction } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { ContractTransaction } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, PERMISSIONS, OPERATION_TYPES } from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { PERMISSIONS } from '@lukso/lsp6-contracts'; -import { LSP6KeyManager, LSP6KeyManager__factory } from '../../../../types'; +import { LSP6KeyManager, LSP6KeyManager__factory } from '../../types'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -16,7 +18,7 @@ import { setupKeyManager } from '../../../utils/fixtures'; import { provider } from '../../../utils/helpers'; export const shouldBehaveLikePermissionChangeOwner = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -28,13 +30,13 @@ export const shouldBehaveLikePermissionChangeOwner = ( let permissionsValues: string[]; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); canChangeOwner = context.accounts[1]; cannotChangeOwner = context.accounts[2]; newKeyManager = await new LSP6KeyManager__factory(context.mainController).deploy( - context.universalProfile.address, + context.universalProfile.target, ); permissionsKeys = [ @@ -53,7 +55,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( await expect( context.universalProfile .connect(canChangeOwner) - .transferOwnership(context.universalProfile.address), + .transferOwnership(await context.universalProfile.getAddress()), ).to.be.revertedWithCustomError( context.universalProfile, 'LSP14CannotTransferOwnershipToSelf', @@ -67,7 +69,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( await expect( context.universalProfile .connect(cannotChangeOwner) - .transferOwnership(newKeyManager.address), + .transferOwnership(await newKeyManager.getAddress()), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(cannotChangeOwner.address, 'TRANSFEROWNERSHIP'); @@ -78,18 +80,18 @@ export const shouldBehaveLikePermissionChangeOwner = ( before('`transferOwnership(...)` to new Key Manager', async () => { await context.universalProfile .connect(context.mainController) - .transferOwnership(newKeyManager.address); + .transferOwnership(await newKeyManager.getAddress()); }); after('reset ownership', async () => { await context.universalProfile .connect(context.mainController) - .transferOwnership(ethers.constants.AddressZero); + .transferOwnership(ethers.ZeroAddress); }); it('should have set newKeyManager as pendingOwner', async () => { const pendingOwner = await context.universalProfile.pendingOwner(); - expect(pendingOwner).to.equal(newKeyManager.address); + expect(pendingOwner).to.equal(await newKeyManager.getAddress()); }); it('owner should remain the current KeyManager', async () => { @@ -97,12 +99,12 @@ export const shouldBehaveLikePermissionChangeOwner = ( await context.universalProfile .connect(context.mainController) - .transferOwnership(newKeyManager.address); + .transferOwnership(await newKeyManager.getAddress()); const ownerAfter = await context.universalProfile.owner(); - expect(ownerBefore).to.equal(context.keyManager.address); - expect(ownerAfter).to.equal(context.keyManager.address); + expect(ownerBefore).to.equal(await context.keyManager.getAddress()); + expect(ownerAfter).to.equal(await context.keyManager.getAddress()); }); describe('it should still be possible to call onlyOwner functions via the old KeyManager', () => { @@ -118,17 +120,21 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('execute(...) - LYX transfer', async () => { const recipient = context.accounts[8]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const recipientBalanceBefore = await provider.getBalance(recipient.address); - const accountBalanceBefore = await provider.getBalance(context.universalProfile.address); + const accountBalanceBefore = await provider.getBalance( + await context.universalProfile.getAddress(), + ); await context.universalProfile .connect(context.mainController) .execute(OPERATION_TYPES.CALL, recipient.address, amount, '0x'); const recipientBalanceAfter = await provider.getBalance(recipient.address); - const accountBalanceAfter = await provider.getBalance(context.universalProfile.address); + const accountBalanceAfter = await provider.getBalance( + await context.universalProfile.getAddress(), + ); // recipient balance should have gone up expect(recipientBalanceAfter).to.be.gt(recipientBalanceBefore); @@ -154,18 +160,18 @@ export const shouldBehaveLikePermissionChangeOwner = ( before('`transferOwnership(...)` to new KeyManager', async () => { await context.universalProfile .connect(canChangeOwner) - .transferOwnership(newKeyManager.address); + .transferOwnership(await newKeyManager.getAddress()); }); after('reset ownership', async () => { await context.universalProfile .connect(context.mainController) - .transferOwnership(ethers.constants.AddressZero); + .transferOwnership(ethers.ZeroAddress); }); it('should have set newKeyManager as pendingOwner', async () => { const pendingOwner = await context.universalProfile.pendingOwner(); - expect(pendingOwner).to.equal(newKeyManager.address); + expect(pendingOwner).to.equal(await newKeyManager.getAddress()); }); it('owner should remain the current KeyManager', async () => { @@ -173,25 +179,25 @@ export const shouldBehaveLikePermissionChangeOwner = ( await context.universalProfile .connect(canChangeOwner) - .transferOwnership(newKeyManager.address); + .transferOwnership(await newKeyManager.getAddress()); const ownerAfter = await context.universalProfile.owner(); - expect(ownerBefore).to.equal(context.keyManager.address); - expect(ownerAfter).to.equal(context.keyManager.address); + expect(ownerBefore).to.equal(await context.keyManager.getAddress()); + expect(ownerAfter).to.equal(await context.keyManager.getAddress()); }); it('should override the pendingOwner when transferOwnership(...) is called twice', async () => { const overridenPendingOwner = await new LSP6KeyManager__factory( context.mainController, - ).deploy(context.universalProfile.address); + ).deploy(await context.universalProfile.getAddress()); await context.universalProfile .connect(canChangeOwner) - .transferOwnership(overridenPendingOwner.address); + .transferOwnership(await overridenPendingOwner.getAddress()); const pendingOwner = await context.universalProfile.pendingOwner(); - expect(pendingOwner).to.equal(overridenPendingOwner.address); + expect(pendingOwner).to.equal(await overridenPendingOwner.getAddress()); }); }); }); @@ -199,12 +205,12 @@ export const shouldBehaveLikePermissionChangeOwner = ( describe('when calling acceptOwnership(...) from a KeyManager that is not the pendingOwner', () => { it('should revert', async () => { const notPendingKeyManager = await new LSP6KeyManager__factory(context.accounts[5]).deploy( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const pendignOwner = await context.universalProfile.pendingOwner(); - const payload = context.universalProfile.interface.getSighash('acceptOwnership'); + const payload = context.universalProfile.interface.getFunction('acceptOwnership').selector; await expect(notPendingKeyManager.connect(context.mainController).execute(payload)) .to.be.revertedWithCustomError(context.universalProfile, 'LSP20EOACannotVerifyCall') @@ -219,7 +225,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( before(async () => { await context.universalProfile .connect(context.mainController) - .transferOwnership(newKeyManager.address); + .transferOwnership(await newKeyManager.getAddress()); pendingOwner = await context.universalProfile.pendingOwner(); }); @@ -233,7 +239,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('should let you accept ownership if controller has permission', async () => { await context.universalProfile.connect(canChangeOwner).acceptOwnership(); - expect(await context.universalProfile.owner()).to.equal(newKeyManager.address); + expect(await context.universalProfile.owner()).to.equal(await newKeyManager.getAddress()); }); it("should have change the account's owner to the pendingOwner (= pending KeyManager)", async () => { @@ -243,7 +249,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('should have cleared the pendingOwner after transfering ownership', async () => { const newPendingOwner = await context.universalProfile.pendingOwner(); - expect(newPendingOwner).to.equal(ethers.constants.AddressZero); + expect(newPendingOwner).to.equal(ethers.ZeroAddress); }); }); }); @@ -267,12 +273,12 @@ export const shouldBehaveLikePermissionChangeOwner = ( await expect(oldKeyManager.connect(context.mainController).execute(payload)) .to.be.revertedWithCustomError(newKeyManager, 'NoPermissionsSet') - .withArgs(oldKeyManager.address); + .withArgs(await oldKeyManager.getAddress()); }); it('should revert with error `NoPermissionsSet` when calling `execute(...)`', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -283,7 +289,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( await expect(oldKeyManager.connect(context.mainController).execute(payload)) .to.be.revertedWithCustomError(newKeyManager, 'NoPermissionsSet') - .withArgs(oldKeyManager.address); + .withArgs(await oldKeyManager.getAddress()); }); }); @@ -305,10 +311,12 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('execute(...) - LYX transfer', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const recipientBalanceBefore = await provider.getBalance(recipient.address); - const accountBalanceBefore = await provider.getBalance(context.universalProfile.address); + const accountBalanceBefore = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -320,7 +328,9 @@ export const shouldBehaveLikePermissionChangeOwner = ( await newKeyManager.connect(context.mainController).execute(payload); const recipientBalanceAfter = await provider.getBalance(recipient.address); - const accountBalanceAfter = await provider.getBalance(context.universalProfile.address); + const accountBalanceAfter = await provider.getBalance( + await context.universalProfile.getAddress(), + ); // recipient balance should have gone up expect(recipientBalanceAfter).to.be.gt(recipientBalanceBefore); @@ -343,7 +353,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( .renounceOwnership(); // mine 200 blocks - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(200)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(200)]); // 2nd call renounceOwnershipSecondTx = await context.universalProfile @@ -366,13 +376,11 @@ export const shouldBehaveLikePermissionChangeOwner = ( }); it('should clear the `pendingOwner` and set it to `AddressZero`', async () => { - expect(await context.universalProfile.pendingOwner()).to.equal( - ethers.constants.AddressZero, - ); + expect(await context.universalProfile.pendingOwner()).to.equal(ethers.ZeroAddress); }); it('should update the owner to `AddressZero`', async () => { - expect(await context.universalProfile.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.universalProfile.owner()).to.equal(ethers.ZeroAddress); }); }); }); diff --git a/tests/LSP20CallVerification/LSP6/Interactions/AllowedAddresses.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/AllowedAddresses.test.ts similarity index 77% rename from tests/LSP20CallVerification/LSP6/Interactions/AllowedAddresses.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/AllowedAddresses.test.ts index fb76b459d..0e99cbf28 100644 --- a/tests/LSP20CallVerification/LSP6/Interactions/AllowedAddresses.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/AllowedAddresses.test.ts @@ -1,17 +1,13 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { TargetContract, TargetContract__factory } from '../../../../types'; +import { TargetContract, TargetContract__factory } from '../../types'; // constants -import { - ALL_PERMISSIONS, - ERC725YDataKeys, - OPERATION_TYPES, - PERMISSIONS, - CALLTYPE, -} from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -69,7 +65,7 @@ export const shouldBehaveLikeAllowedAddresses = (buildContext: () => Promise Promise Promise { it(`sending 1 LYX to EOA ${recipient}`, async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceEOA = await provider.getBalance(recipient); - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await context.universalProfile .connect(context.mainController) .execute(OPERATION_TYPES.CALL, recipient, amount, EMPTY_PAYLOAD); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); expect(newBalanceUP).to.be.lt(initialBalanceUP); const newBalanceEOA = await provider.getBalance(recipient); @@ -117,16 +117,18 @@ export const shouldBehaveLikeAllowedAddresses = (buildContext: () => Promise { it('should be allowed to send LYX to an allowed address (= EOA)', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceEOA = await provider.getBalance(allowedEOA.address); - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await context.universalProfile .connect(canCallOnlyTwoAddresses) .execute(OPERATION_TYPES.CALL, allowedEOA.address, amount, EMPTY_PAYLOAD); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance(await context.universalProfile.getAddress()); expect(newBalanceUP).to.be.lt(initialBalanceUP); const newBalanceEOA = await provider.getBalance(allowedEOA.address); @@ -142,14 +144,21 @@ export const shouldBehaveLikeAllowedAddresses = (buildContext: () => Promise { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(notAllowedEOA.address); await expect( @@ -158,14 +167,14 @@ export const shouldBehaveLikeAllowedAddresses = (buildContext: () => Promise Promise Promise Promise { it(`-> should revert when sending 1 LYX to EOA ${recipient}`, async () => { - await provider.getBalance(context.universalProfile.address); + await provider.getBalance(await context.universalProfile.getAddress()); await provider.getBalance(recipient); - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect( context.universalProfile diff --git a/tests/LSP20CallVerification/LSP6/Interactions/AllowedFunctions.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/AllowedFunctions.test.ts similarity index 73% rename from tests/LSP20CallVerification/LSP6/Interactions/AllowedFunctions.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/AllowedFunctions.test.ts index 94ad6e9da..f11605ed1 100644 --- a/tests/LSP20CallVerification/LSP6/Interactions/AllowedFunctions.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/AllowedFunctions.test.ts @@ -1,26 +1,22 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { + TargetContract, + TargetContract__factory, LSP7Mintable, LSP7Mintable__factory, LSP8Mintable, LSP8Mintable__factory, - TargetContract, - TargetContract__factory, -} from '../../../../types'; +} from '../../types'; // constants -import { - ERC725YDataKeys, - OPERATION_TYPES, - PERMISSIONS, - INTERFACE_IDS, - CALLTYPE, - LSP8_TOKEN_ID_FORMAT, - LSP4_TOKEN_TYPES, -} from '../../../../constants'; +import { ERC725YDataKeys, INTERFACE_IDS } from '../../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -61,7 +57,7 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise Promise { describe('when calling a contract', () => { it('should pass when the bytes4 selector of the function called is listed in its AllowedFunctions', async () => { - const initialName = await targetContract.callStatic.getName(); + const initialName = await targetContract.getName(); const newName = 'Updated Name'; const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ @@ -117,15 +123,20 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise { - const initialNumber = await targetContract.callStatic.getNumber(); + const initialNumber = await targetContract.getNumber(); const newNumber = 18; const targetContractPayload = targetContract.interface.encodeFunctionData('setNumber', [ @@ -135,16 +146,21 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise { await lsp8Contract .connect(context.accounts[0]) - .mint(context.universalProfile.address, tokenId, true, '0x'); + .mint(await context.universalProfile.getAddress(), tokenId, true, '0x'); }); await lsp7Contract .connect(context.accounts[0]) - .transferOwnership(context.universalProfile.address); + .transferOwnership(await context.universalProfile.getAddress()); const permissionsKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - addressCanCallOnlyTransferOnLSP8.address.substring(2), + (await addressCanCallOnlyTransferOnLSP8.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - addressCanCallOnlyTransferOnLSP8.address.substring(2), + (await addressCanCallOnlyTransferOnLSP8.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8.address.substring(2), + ( + await addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8.getAddress() + ).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8.address.substring(2), + ( + await addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8.getAddress() + ).substring(2), ]; const permissionsValues = [ @@ -235,7 +255,7 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise Promise Promise Promise Promise Promise Promise Promise { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Token Icon')); + const key = ethers.keccak256(ethers.toUtf8Bytes('Token Icon')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes(':)')); + const value = ethers.hexlify(ethers.toUtf8Bytes(':)')); const setDataPayload = lsp7Contract.interface.encodeFunctionData('setData', [key, value]); await context.universalProfile .connect(addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8) - .execute(OPERATION_TYPES.CALL, lsp7Contract.address, 0, setDataPayload); + .execute(OPERATION_TYPES.CALL, lsp7Contract.target, 0, setDataPayload); - expect(await lsp7Contract.callStatic.getData(key)).to.equal(value); + expect(await lsp7Contract.getData(key)).to.equal(value); }); }); @@ -392,7 +415,7 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise { - const randomTokenId = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const randomTokenId = ethers.hexlify(ethers.randomBytes(32)); const recipient = context.accounts[4].address; const mintPayload = lsp8Contract.interface.encodeFunctionData('mint', [ @@ -435,13 +458,13 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise { it('ERC1271', async () => { - const sampleHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Sample Message')); + const sampleHash = ethers.keccak256(ethers.toUtf8Bytes('Sample Message')); const sampleSignature = await context.mainController.signMessage('Sample Message'); const payload = signatureValidatorContract.interface.encodeFunctionData( @@ -128,19 +122,24 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('Key')); const value = '0xcafecafecafecafe'; await context.universalProfile.connect(context.mainController).setData(key, value); - const result = await context.universalProfile.callStatic['getData(bytes32)'](key); + const result = await context.universalProfile.getData(key); expect(result).to.equal(value); }); }); @@ -149,7 +148,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise { describe('when interacting with a contract that implements + register ERC1271 interface', () => { it('should pass', async () => { - const sampleHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Sample Message')); + const sampleHash = ethers.keccak256(ethers.toUtf8Bytes('Sample Message')); const sampleSignature = await addressCanInteractOnlyWithERC1271.signMessage( 'Sample Message', ); @@ -161,7 +160,12 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise { it('should allow to transfer LYX', async () => { - const initialAccountBalance = await provider.getBalance(otherUniversalProfile.address); + const initialAccountBalance = await provider.getBalance(otherUniversalProfile.target); await context.universalProfile .connect(addressCanInteractOnlyWithERC1271) .execute( OPERATION_TYPES.CALL, - otherUniversalProfile.address, - ethers.utils.parseEther('1'), + otherUniversalProfile.target, + ethers.parseEther('1'), '0x', ); - const newAccountBalance = await provider.getBalance(otherUniversalProfile.address); + const newAccountBalance = await provider.getBalance(otherUniversalProfile.target); expect(newAccountBalance).to.be.gt(initialAccountBalance); }); }); @@ -193,13 +197,13 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise { describe('when interacting with a contract that implements + register ERC1271 interface', () => { it('should fail', async () => { - const sampleHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Sample Message')); + const sampleHash = ethers.keccak256(ethers.toUtf8Bytes('Sample Message')); const sampleSignature = await addressCanInteractOnlyWithLSP7.signMessage('Sample Message'); const payload = signatureValidatorContract.interface.encodeFunctionData( @@ -219,13 +223,18 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise Promise interacting with lsp7TokenA', async () => { @@ -299,7 +308,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise interacting with lsp7TokenB', async () => { @@ -319,7 +330,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise interacting with lsp7TokenC', async () => { @@ -339,7 +352,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -25,7 +31,7 @@ export const shouldBehaveLikeBatchExecute = ( rLyxToken: LSP7Mintable; before(async () => { - context = await buildContext(ethers.utils.parseEther('50')); + context = await buildContext(ethers.parseEther('50')); // main controller permissions are already set in the fixture await setupKeyManager(context, [], []); @@ -55,9 +61,9 @@ export const shouldBehaveLikeBatchExecute = ( false, ); - await lyxDaiToken.mint(context.universalProfile.address, 100, false, '0x'); - await metaCoin.mint(context.universalProfile.address, 100, false, '0x'); - await rLyxToken.mint(context.universalProfile.address, 100, false, '0x'); + await lyxDaiToken.mint(await context.universalProfile.getAddress(), 100, false, '0x'); + await metaCoin.mint(await context.universalProfile.getAddress(), 100, false, '0x'); + await rLyxToken.mint(await context.universalProfile.getAddress(), 100, false, '0x'); }); describe('example scenarios', () => { @@ -72,11 +78,7 @@ export const shouldBehaveLikeBatchExecute = ( context.accounts[3].address, ]; - const amounts = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('2'), - ethers.utils.parseEther('3'), - ]; + const amounts = [ethers.parseEther('1'), ethers.parseEther('2'), ethers.parseEther('3')]; const data = ['0x', '0x', '0x']; @@ -85,8 +87,8 @@ export const shouldBehaveLikeBatchExecute = ( .executeBatch(operations, recipients, amounts, data); await expect(tx).to.changeEtherBalance( - context.universalProfile.address, - ethers.utils.parseEther('-6'), + await context.universalProfile.getAddress(), + ethers.parseEther('-6'), ); await expect(tx).to.changeEtherBalances(recipients, amounts); }); @@ -95,15 +97,17 @@ export const shouldBehaveLikeBatchExecute = ( const { universalProfile } = context; const recipient = context.accounts[1].address; - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = ethers.parseEther('3'); const daiAmount = 25; // CHECK balance fo LYX and DAI before transfer - expect(await lyxDaiToken.balanceOf(context.universalProfile.address)).to.equal(100); + expect(await lyxDaiToken.balanceOf(await context.universalProfile.getAddress())).to.equal( + 100, + ); expect(await lyxDaiToken.balanceOf(recipient)).to.equal(0); const lyxDaiTransferPayload = lyxDaiToken.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipient, daiAmount, true, @@ -112,7 +116,7 @@ export const shouldBehaveLikeBatchExecute = ( const operationTypes = [OPERATION_TYPES.CALL, OPERATION_TYPES.CALL]; - const targets = [recipient, lyxDaiToken.address]; + const targets = [recipient, lyxDaiToken.target]; const values = [lyxAmount, 0]; @@ -128,11 +132,11 @@ export const shouldBehaveLikeBatchExecute = ( .executeBatch(operationTypes, targets, values, payloads); await expect(tx).to.changeEtherBalances( - [recipient, universalProfile.address], + [recipient, await universalProfile.getAddress()], [lyxAmount, `-${lyxAmount}`], ); expect(await lyxDaiToken.balanceOf(recipient)).to.equal(daiAmount); - expect(await lyxDaiToken.balanceOf(universalProfile.address)).to.equal(75); + expect(await lyxDaiToken.balanceOf(await universalProfile.getAddress())).to.equal(75); }); it('should send 3x different tokens to the same recipient', async () => { @@ -141,14 +145,16 @@ export const shouldBehaveLikeBatchExecute = ( const recipient = context.accounts[1].address; const universalProfileLyxDaiBalanceBefore = await lyxDaiToken.balanceOf( - universalProfile.address, + await universalProfile.getAddress(), ); const recipientLyxDaiBalanceBefore = await lyxDaiToken.balanceOf(recipient); const universalProfileMetaCoinBalanceBefore = await metaCoin.balanceOf( - universalProfile.address, + await universalProfile.getAddress(), ); const recipientMetaCoinBalanceBefore = await metaCoin.balanceOf(recipient); - const universalProfileRLyxBalanceBefore = await rLyxToken.balanceOf(universalProfile.address); + const universalProfileRLyxBalanceBefore = await rLyxToken.balanceOf( + await universalProfile.getAddress(), + ); const recipientRLyxBalanceBefore = await rLyxToken.balanceOf(recipient); const lyxDaiAmount = 25; @@ -158,17 +164,17 @@ export const shouldBehaveLikeBatchExecute = ( // prettier-ignore const lyxDaiTransferPayload = lyxDaiToken.interface.encodeFunctionData( "transfer", - [context.universalProfile.address, recipient, lyxDaiAmount, true, "0x"] + [await context.universalProfile.getAddress(), recipient, lyxDaiAmount, true, "0x"] ); // prettier-ignore const metaCoinTransferPayload = metaCoin.interface.encodeFunctionData( "transfer", - [context.universalProfile.address, recipient, metaCoinAmount, true, "0x"] + [await context.universalProfile.getAddress(), recipient, metaCoinAmount, true, "0x"] ); const rLYXTransferPayload = metaCoin.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipient, rLyxAmount, true, @@ -177,7 +183,7 @@ export const shouldBehaveLikeBatchExecute = ( const operationTypes = [OPERATION_TYPES.CALL, OPERATION_TYPES.CALL, OPERATION_TYPES.CALL]; - const targets = [lyxDaiToken.address, metaCoin.address, rLyxToken.address]; + const targets = [lyxDaiToken.target, metaCoin.target, rLyxToken.target]; const values = [0, 0, 0]; @@ -187,23 +193,23 @@ export const shouldBehaveLikeBatchExecute = ( .connect(context.mainController) .executeBatch(operationTypes, targets, values, payloads); - expect(await lyxDaiToken.balanceOf(universalProfile.address)).to.equal( - universalProfileLyxDaiBalanceBefore.sub(lyxDaiAmount), + expect(await lyxDaiToken.balanceOf(await universalProfile.getAddress())).to.equal( + universalProfileLyxDaiBalanceBefore - BigInt(lyxDaiAmount), ); expect(await lyxDaiToken.balanceOf(recipient)).to.equal( - recipientLyxDaiBalanceBefore.add(lyxDaiAmount), + recipientLyxDaiBalanceBefore + BigInt(lyxDaiAmount), ); - expect(await metaCoin.balanceOf(universalProfile.address)).to.equal( - universalProfileMetaCoinBalanceBefore.sub(metaCoinAmount), + expect(await metaCoin.balanceOf(await universalProfile.getAddress())).to.equal( + universalProfileMetaCoinBalanceBefore - BigInt(metaCoinAmount), ); expect(await metaCoin.balanceOf(recipient)).to.equal( - recipientMetaCoinBalanceBefore.add(metaCoinAmount), + recipientMetaCoinBalanceBefore + BigInt(metaCoinAmount), ); - expect(await rLyxToken.balanceOf(universalProfile.address)).to.equal( - universalProfileRLyxBalanceBefore.sub(rLyxAmount), + expect(await rLyxToken.balanceOf(await universalProfile.getAddress())).to.equal( + universalProfileRLyxBalanceBefore - BigInt(rLyxAmount), ); expect(await rLyxToken.balanceOf(recipient)).to.equal( - recipientRLyxBalanceBefore.add(rLyxAmount), + recipientRLyxBalanceBefore + BigInt(rLyxAmount), ); }); @@ -212,25 +218,23 @@ export const shouldBehaveLikeBatchExecute = ( const lsp7TokenProxyBytecode = String( '0x3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3', - ).replace('bebebebebebebebebebebebebebebebebebebebe', lsp7MintableBase.address.substring(2)); + ).replace( + 'bebebebebebebebebebebebebebebebebebebebe', + (await lsp7MintableBase.getAddress()).substring(2), + ); const futureTokenAddress = await context.universalProfile .connect(context.mainController) - .callStatic.execute( - OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, - 0, - lsp7TokenProxyBytecode, - ); + .execute.staticCall(OPERATION_TYPES.CREATE, ethers.ZeroAddress, 0, lsp7TokenProxyBytecode); const futureTokenInstance = new LSP7MintableInit__factory(context.accounts[0]).attach( futureTokenAddress, - ); + ) as LSP7MintableInit; const lsp7InitializePayload = futureTokenInstance.interface.encodeFunctionData('initialize', [ 'My LSP7 UP Token', 'UPLSP7', - context.universalProfile.address, + await context.universalProfile.getAddress(), LSP4_TOKEN_TYPES.TOKEN, false, ]); @@ -248,7 +252,7 @@ export const shouldBehaveLikeBatchExecute = ( .connect(context.mainController) .executeBatch( [OPERATION_TYPES.CREATE, OPERATION_TYPES.CALL, OPERATION_TYPES.CALL], - [ethers.constants.AddressZero, futureTokenAddress, futureTokenAddress], + [ethers.ZeroAddress, futureTokenAddress, futureTokenAddress], [0, 0, 0], [lsp7TokenProxyBytecode, lsp7InitializePayload, lsp7SetDataPayload], ); @@ -256,9 +260,9 @@ export const shouldBehaveLikeBatchExecute = ( // CHECK that token contract has been deployed await expect(tx).to.emit(context.universalProfile, 'ContractCreated').withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(futureTokenAddress), + ethers.getAddress(futureTokenAddress), 0, - ethers.utils.hexZeroPad('0x00', 32), // salt + ethers.zeroPadValue('0x00', 32), // salt ); // CHECK initialize parameters have been set correctly @@ -267,9 +271,11 @@ export const shouldBehaveLikeBatchExecute = ( ERC725YDataKeys.LSP4['LSP4TokenSymbol'], ); - expect(ethers.utils.toUtf8String(nameResult)).to.equal('My LSP7 UP Token'); - expect(ethers.utils.toUtf8String(symbolResult)).to.equal('UPLSP7'); - expect(await futureTokenInstance.owner()).to.equal(context.universalProfile.address); + expect(ethers.toUtf8String(nameResult)).to.equal('My LSP7 UP Token'); + expect(ethers.toUtf8String(symbolResult)).to.equal('UPLSP7'); + expect(await futureTokenInstance.owner()).to.equal( + await context.universalProfile.getAddress(), + ); // CHECK LSP4 token metadata has been set expect(await futureTokenInstance.getData(ERC725YDataKeys.LSP4['LSP4Metadata'])).to.equal( @@ -284,7 +290,7 @@ export const shouldBehaveLikeBatchExecute = ( [ 'My UP LSP7 Token', 'UPLSP7', - context.universalProfile.address, + await context.universalProfile.getAddress(), LSP4_TOKEN_TYPES.TOKEN, false, ], @@ -295,9 +301,9 @@ export const shouldBehaveLikeBatchExecute = ( // in the 2nd and 3rd payloads of the LSP6 batch `execute(bytes[])` const futureTokenAddress = await context.universalProfile .connect(context.mainController) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, LSP7Mintable__factory.bytecode + lsp7ConstructorArguments.substring(2), ); @@ -305,14 +311,14 @@ export const shouldBehaveLikeBatchExecute = ( // step 2 - mint some tokens // use the interface of an existing token for encoding the function call const lsp7MintingPayload = lyxDaiToken.interface.encodeFunctionData('mint', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), 3_000, false, '0x', ]); // step 3 - transfer batch to multiple addresses - const sender = context.universalProfile.address; + const sender = await context.universalProfile.getAddress(); const recipients = [ context.accounts[1].address, context.accounts[2].address, @@ -332,7 +338,7 @@ export const shouldBehaveLikeBatchExecute = ( .connect(context.mainController) .executeBatch( [OPERATION_TYPES.CREATE, OPERATION_TYPES.CALL, OPERATION_TYPES.CALL], - [ethers.constants.AddressZero, futureTokenAddress, futureTokenAddress], + [ethers.ZeroAddress, futureTokenAddress, futureTokenAddress], [0, 0, 0], [ LSP7Mintable__factory.bytecode + lsp7ConstructorArguments.substring(2), @@ -344,15 +350,15 @@ export const shouldBehaveLikeBatchExecute = ( // CHECK for `ContractCreated` event await expect(tx).to.emit(context.universalProfile, 'ContractCreated').withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(futureTokenAddress), + ethers.getAddress(futureTokenAddress), 0, - ethers.utils.hexZeroPad('0x00', 32), // salt + ethers.zeroPadValue('0x00', 32), // salt ); // CHECK for tokens balances of recipients - const createdTokenContract = await new LSP7Mintable__factory(context.accounts[0]).attach( + const createdTokenContract = (await new LSP7Mintable__factory(context.accounts[0]).attach( futureTokenAddress, - ); + )) as LSP7Mintable; expect([ await createdTokenContract.balanceOf(recipients[0]), await createdTokenContract.balanceOf(recipients[1]), @@ -430,13 +436,13 @@ export const shouldBehaveLikeBatchExecute = ( describe('when one of the payload reverts', () => { it('should revert the whole transaction if first payload reverts', async () => { - const upBalance = await provider.getBalance(context.universalProfile.address); + const upBalance = await provider.getBalance(await context.universalProfile.getAddress()); - const validAmount = ethers.utils.parseEther('1'); + const validAmount = ethers.parseEther('1'); expect(validAmount).to.be.lt(upBalance); // sanity check // make it revert by sending too much value than the actual balance - const invalidAmount = upBalance.add(10); + const invalidAmount = upBalance + BigInt(10); const randomRecipient = ethers.Wallet.createRandom().address; @@ -453,13 +459,13 @@ export const shouldBehaveLikeBatchExecute = ( }); it('should revert the whole transaction if last payload reverts', async () => { - const upBalance = await provider.getBalance(context.universalProfile.address); + const upBalance = await provider.getBalance(await context.universalProfile.getAddress()); - const validAmount = ethers.utils.parseEther('1'); + const validAmount = ethers.parseEther('1'); expect(validAmount).to.be.lt(upBalance); // sanity check // make it revert by sending too much value than the actual balance - const invalidAmount = upBalance.add(10); + const invalidAmount = upBalance + BigInt(10); const randomRecipient = ethers.Wallet.createRandom().address; @@ -478,9 +484,9 @@ export const shouldBehaveLikeBatchExecute = ( describe('when one of the payload is a delegate call', () => { it('should revert the whole transaction', async () => { - const upBalance = await provider.getBalance(context.universalProfile.address); + const upBalance = await provider.getBalance(await context.universalProfile.getAddress()); - const validAmount = ethers.utils.parseEther('1'); + const validAmount = ethers.parseEther('1'); expect(validAmount).to.be.lt(upBalance); // sanity check const randomRecipient = ethers.Wallet.createRandom().address; @@ -498,9 +504,9 @@ export const shouldBehaveLikeBatchExecute = ( }); it('should revert the whole transaction when calling through `batchCalls`', async () => { - const upBalance = await provider.getBalance(context.universalProfile.address); + const upBalance = await provider.getBalance(await context.universalProfile.getAddress()); - const validAmount = ethers.utils.parseEther('1'); + const validAmount = ethers.parseEther('1'); expect(validAmount).to.be.lt(upBalance); // sanity check const randomRecipient = ethers.Wallet.createRandom().address; diff --git a/tests/LSP20CallVerification/LSP6/Interactions/OtherScenarios.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/OtherScenarios.test.ts similarity index 84% rename from tests/LSP20CallVerification/LSP6/Interactions/OtherScenarios.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/OtherScenarios.test.ts index 5ad9619b5..eac90fb33 100644 --- a/tests/LSP20CallVerification/LSP6/Interactions/OtherScenarios.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/OtherScenarios.test.ts @@ -1,10 +1,11 @@ import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { TargetContract__factory, TargetContract } from '../../../../types'; +import { TargetContract__factory, TargetContract } from '../../types'; // constants -import { ALL_PERMISSIONS, ERC725YDataKeys, PERMISSIONS } from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -44,7 +45,7 @@ export const otherTestScenarios = (buildContext: () => Promise) await expect( context.universalProfile .connect(context.mainController) - .execute(INVALID_OPERATION_TYPE, targetContract.address, 0, targetPayload), + .execute(INVALID_OPERATION_TYPE, await targetContract.getAddress(), 0, targetPayload), ).to.be.revertedWithCustomError(context.universalProfile, 'ERC725X_UnknownOperationType'); }); @@ -56,7 +57,7 @@ export const otherTestScenarios = (buildContext: () => Promise) await expect( context.universalProfile .connect(addressCanMakeCall) - .execute(INVALID_OPERATION_TYPE, targetContract.address, 0, targetPayload), + .execute(INVALID_OPERATION_TYPE, await targetContract.getAddress(), 0, targetPayload), ).to.be.revertedWithCustomError(context.universalProfile, 'ERC725X_UnknownOperationType'); }); }); diff --git a/tests/LSP20CallVerification/LSP6/Interactions/PermissionCall.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionCall.test.ts similarity index 85% rename from tests/LSP20CallVerification/LSP6/Interactions/PermissionCall.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionCall.test.ts index a2aa9b93f..0d88a54b3 100644 --- a/tests/LSP20CallVerification/LSP6/Interactions/PermissionCall.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionCall.test.ts @@ -1,7 +1,6 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { BigNumber } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { FallbackInitializer, @@ -10,16 +9,12 @@ import { FallbackRevert__factory, TargetContract, TargetContract__factory, -} from '../../../../types'; +} from '../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - PERMISSIONS, - OPERATION_TYPES, - CALLTYPE, -} from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -35,7 +30,7 @@ import { } from '../../../utils/helpers'; export const shouldBehaveLikePermissionCall = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -91,8 +86,8 @@ export const shouldBehaveLikePermissionCall = ( [CALLTYPE.CALL, CALLTYPE.CALL, CALLTYPE.CALL, CALLTYPE.CALL], [ allowedEOA, - allowedContractWithFallback.address, - allowedContractWithFallbackRevert.address, + await allowedContractWithFallback.getAddress(), + await allowedContractWithFallbackRevert.getAddress(), ], ['0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff'], @@ -130,7 +125,7 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile .connect(addressCannotMakeCallNoAllowedCalls) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, '0x'), + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, '0x'), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(addressCannotMakeCallNoAllowedCalls.address, 'CALL'); @@ -156,7 +151,7 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile .connect(addressCannotMakeCallWithAllowedCalls) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, '0x'), + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, '0x'), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(addressCannotMakeCallWithAllowedCalls.address, 'CALL'); @@ -182,7 +177,7 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile .connect(addressCanMakeCallNoAllowedCalls) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, '0x'), + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, '0x'), ) .to.be.revertedWithCustomError(context.keyManager, 'NoCallsAllowed') .withArgs(addressCanMakeCallNoAllowedCalls.address); @@ -228,12 +223,12 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile .connect(addressCanMakeCallWithAllowedCalls) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, '0x'), + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, '0x'), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( addressCanMakeCallWithAllowedCalls.address, - targetContract.address, + await targetContract.getAddress(), '0x00000000', ); }); @@ -244,10 +239,15 @@ export const shouldBehaveLikePermissionCall = ( it("should pass and update `to` contract's storage", async () => { await context.universalProfile .connect(addressCanMakeCallWithAllowedCalls) - .execute(OPERATION_TYPES.CALL, allowedContractWithFallback.address, 0, '0x'); + .execute( + OPERATION_TYPES.CALL, + await allowedContractWithFallback.getAddress(), + 0, + '0x', + ); expect(await allowedContractWithFallback.caller()).to.equal( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); }); }); @@ -259,7 +259,7 @@ export const shouldBehaveLikePermissionCall = ( .connect(addressCanMakeCallWithAllowedCalls) .execute( OPERATION_TYPES.CALL, - allowedContractWithFallbackRevert.address, + await allowedContractWithFallbackRevert.getAddress(), 0, '0x', ), @@ -288,10 +288,15 @@ export const shouldBehaveLikePermissionCall = ( await context.universalProfile .connect(addressWithSuperCall) - .execute(OPERATION_TYPES.CALL, targetContractWithFallback.address, 0, '0x'); + .execute( + OPERATION_TYPES.CALL, + await targetContractWithFallback.getAddress(), + 0, + '0x', + ); expect(await targetContractWithFallback.caller()).to.equal( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); }); }); @@ -305,7 +310,12 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile .connect(addressWithSuperCall) - .execute(OPERATION_TYPES.CALL, targetContractWithFallbackRevert.address, 0, '0x'), + .execute( + OPERATION_TYPES.CALL, + await targetContractWithFallbackRevert.getAddress(), + 0, + '0x', + ), ).to.be.revertedWith('fallback reverted'); }); }); @@ -349,7 +359,7 @@ export const shouldBehaveLikePermissionCall = ( combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.EXECUTE_RELAY_CALL), combineAllowedCalls( [CALLTYPE.CALL], - [targetContract.address], + [await targetContract.getAddress()], ['0xffffffff'], ['0xffffffff'], ), @@ -367,23 +377,23 @@ export const shouldBehaveLikePermissionCall = ( await context.universalProfile .connect(context.mainController) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, targetPayload); + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetPayload); - const result = await targetContract.callStatic.getName(); + const result = await targetContract.getName(); expect(result).to.equal(argument); }); describe('when calling a function that returns some value', () => { it('should return the value to the Key Manager <- UP <- targetContract.getName()', async () => { - const expectedName = await targetContract.callStatic.getName(); + const expectedName = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('getName'); const result = await context.universalProfile .connect(context.mainController) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ); @@ -393,15 +403,15 @@ export const shouldBehaveLikePermissionCall = ( }); it('Should return the value to the Key Manager <- UP <- targetContract.getNumber()', async () => { - const expectedNumber = await targetContract.callStatic.getNumber(); + const expectedNumber = await targetContract.getNumber(); const targetContractPayload = targetContract.interface.encodeFunctionData('getNumber'); const result = await context.universalProfile .connect(context.mainController) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ); @@ -418,7 +428,7 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile.execute( OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ), @@ -439,7 +449,7 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile .connect(addressCanMakeCallNoAllowedCalls) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, targetPayload), + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetPayload), ) .to.be.revertedWithCustomError(context.keyManager, 'NoCallsAllowed') .withArgs(addressCanMakeCallNoAllowedCalls.address); @@ -456,9 +466,9 @@ export const shouldBehaveLikePermissionCall = ( await context.universalProfile .connect(addressCanMakeCallWithAllowedCalls) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, targetPayload); + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetPayload); - const result = await targetContract.callStatic.getName(); + const result = await targetContract.getName(); expect(result).to.equal(argument); }); }); @@ -473,7 +483,7 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile .connect(addressCannotMakeCall) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, targetPayload), + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetPayload), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(addressCannotMakeCall.address, 'CALL'); @@ -501,7 +511,7 @@ export const shouldBehaveLikePermissionCall = ( 'lsp20VerifyCall', [ context.accounts[2].address, - context.keyManager.address, + await context.keyManager.getAddress(), context.accounts[2].address, 0, '0xaabbccdd', @@ -511,7 +521,7 @@ export const shouldBehaveLikePermissionCall = ( await expect( context.universalProfile.execute( OPERATION_TYPES.CALL, - context.keyManager.address, + await context.keyManager.getAddress(), 0, lsp20VerifyCallPayload, ), @@ -535,7 +545,7 @@ export const shouldBehaveLikePermissionCall = ( let executePayload; before(async () => { - context = await buildContext(ethers.utils.parseEther('50')); + context = await buildContext(ethers.parseEther('50')); const accounts = await ethers.getSigners(); @@ -575,7 +585,7 @@ export const shouldBehaveLikePermissionCall = ( const allowedCall = combineAllowedCalls( [combineCallTypes(CALLTYPE.CALL, CALLTYPE.VALUE)], - [targetContract.address], + [await targetContract.getAddress()], ['0xffffffff'], ['0xffffffff'], ); @@ -599,7 +609,7 @@ export const shouldBehaveLikePermissionCall = ( afterEach('clearing target contract storage', async () => { await context.accounts[0].sendTransaction({ - to: targetContract.address, + to: await targetContract.getAddress(), data: '0xcafecafe', }); }); @@ -608,7 +618,7 @@ export const shouldBehaveLikePermissionCall = ( before(async () => { executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 36, '0xdeadbeef', ]); @@ -625,7 +635,7 @@ export const shouldBehaveLikePermissionCall = ( await expect( // We need to do low level send transactions as the data offset is not standard controllerCanTransferValue.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }), ) @@ -638,7 +648,7 @@ export const shouldBehaveLikePermissionCall = ( it("should revert with 'NotAuthorised' error to 'TRANSFERVALUE'", async () => { await expect( controllerCanCall.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }), ) @@ -651,7 +661,7 @@ export const shouldBehaveLikePermissionCall = ( it("should revert with 'NotAuthorised' error to 'TRANSFERVALUE' (as value transfer is the first thing being checked", async () => { await expect( controllerCanOnlySign.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }), ) @@ -662,15 +672,17 @@ export const shouldBehaveLikePermissionCall = ( describe('when caller has both permissions CALL + TRANSFERVALUE', () => { it('should pass and allow to call the contract', async () => { - expect(await provider.getBalance(targetContract.address)).to.equal(0); + expect(await provider.getBalance(await targetContract.getAddress())).to.equal(0); await controllerCanTransferValueAndCall.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); - expect(await provider.getBalance(targetContract.address)).to.equal(36); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); + expect(await provider.getBalance(await targetContract.getAddress())).to.equal(36); }); }); }); @@ -679,7 +691,7 @@ export const shouldBehaveLikePermissionCall = ( before(async () => { executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, '0x', ]); @@ -694,20 +706,24 @@ export const shouldBehaveLikePermissionCall = ( describe('when controller has permission CALL only', () => { it('should pass', async () => { await controllerCanCall.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); describe('when controller has SUPER_CALL', () => { it('should pass', async () => { await controllerCanSuperCall.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); @@ -715,7 +731,7 @@ export const shouldBehaveLikePermissionCall = ( it('should revert with `NotAuthorised` error to `CALL`', async () => { await expect( controllerCanOnlySign.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }), ) @@ -737,7 +753,7 @@ export const shouldBehaveLikePermissionCall = ( let executePayload; before(async () => { - context = await buildContext(ethers.utils.parseEther('50')); + context = await buildContext(ethers.parseEther('50')); const accounts = await ethers.getSigners(); @@ -762,7 +778,7 @@ export const shouldBehaveLikePermissionCall = ( const allowedCall = combineAllowedCalls( [combineCallTypes(CALLTYPE.CALL)], - [targetContract.address], + [await targetContract.getAddress()], ['0xffffffff'], ['0xffffffff'], ); @@ -781,7 +797,7 @@ export const shouldBehaveLikePermissionCall = ( afterEach('clearing target contract storage', async () => { await context.accounts[0].sendTransaction({ - to: targetContract.address, + to: await targetContract.getAddress(), data: '0xcafecafe', }); }); @@ -790,7 +806,7 @@ export const shouldBehaveLikePermissionCall = ( before('constructing manually the payload', async () => { // 0x44c028fe --> ERC725X.execute(uint256,address,uint256,bytes) selector // 0000000000000000000000000000000000000000000000000000000000000000 --> operationType = CALL (0) - // 0000000000000000000000004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 --> target = targetContract.address + // 0000000000000000000000004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 --> target = await targetContract.getAddress() // 0000000000000000000000000000000000000000000000000000000000000000 --> value = 0 // 00000000000000000000000000000000000000000000000000000000000000a0 --> offset = 160 // cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe --> 32 random bytes in between @@ -798,27 +814,31 @@ export const shouldBehaveLikePermissionCall = ( // deadbeef00000000000000000000000000000000000000000000000000000000 --> `data` = 0xdeadbeef executePayload = '0x44c028fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + - targetContract.address.substring(2).toLowerCase() + + (await targetContract.getAddress()).substring(2).toLowerCase() + '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe0000000000000000000000000000000000000000000000000000000000000004deadbeef00000000000000000000000000000000000000000000000000000000'; }); describe('when caller has permission CALL', () => { it('should pass', async () => { await controllerCanCall.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); describe('when caller has permission SUPER_CALL', () => { it('should pass', async () => { await controllerCanSuperCall.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); @@ -826,7 +846,7 @@ export const shouldBehaveLikePermissionCall = ( it("should revert with 'NotAuthorised' error to 'CALL'", async () => { await expect( controllerCanOnlySign.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }), ) @@ -840,34 +860,38 @@ export const shouldBehaveLikePermissionCall = ( before('constructing manually the payload', async () => { // 0x44c028fe --> ERC725X.execute(uint256,address,uint256,bytes) selector // 0000000000000000000000000000000000000000000000000000000000000000 --> operationType = CALL (0) - // 0000000000000000000000004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 --> target = targetContract.address + // 0000000000000000000000004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 --> target = await targetContract.getAddress() // 0000000000000000000000000000000000000000000000000000000000000000 --> value = 0 // 00000000000000000000000000000000000000000000000000000000000000a0 --> offset = 160 // cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe --> 32 random bytes in between // 0000000000000000000000000000000000000000000000000000000000000000 --> `data.length` = 0 executePayload = '0x44c028fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + - targetContract.address.substring(2).toLowerCase() + + (await targetContract.getAddress()).substring(2).toLowerCase() + '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe0000000000000000000000000000000000000000000000000000000000000000'; }); describe('when caller has permission CALL', () => { it('should pass', async () => { await controllerCanCall.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); describe('when caller has permission SUPER_CALL', () => { it('should pass', async () => { await controllerCanSuperCall.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); @@ -875,7 +899,7 @@ export const shouldBehaveLikePermissionCall = ( it("should revert with 'NotAuthorised' error to 'CALL'", async () => { await expect( controllerCanOnlySign.sendTransaction({ - to: context.universalProfile.address, + to: await context.universalProfile.getAddress(), data: executePayload, }), ) diff --git a/tests/LSP20CallVerification/LSP6/Interactions/PermissionDelegateCall.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionDelegateCall.test.ts similarity index 92% rename from tests/LSP20CallVerification/LSP6/Interactions/PermissionDelegateCall.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionDelegateCall.test.ts index c4b5f09ec..c937c9f22 100644 --- a/tests/LSP20CallVerification/LSP6/Interactions/PermissionDelegateCall.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionDelegateCall.test.ts @@ -1,16 +1,12 @@ import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { ERC725YDelegateCall, ERC725YDelegateCall__factory } from '../../../../types'; +import { ERC725YDelegateCall, ERC725YDelegateCall__factory } from '../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - PERMISSIONS, - OPERATION_TYPES, - CALLTYPE, -} from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -37,7 +33,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( erc725YDelegateCallContract = await new ERC725YDelegateCall__factory( context.mainController, - ).deploy(context.universalProfile.address); + ).deploy(await context.universalProfile.getAddress()); const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -74,7 +70,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( .connect(context.mainController) .execute( OPERATION_TYPES.DELEGATECALL, - erc725YDelegateCallContract.address, + await erc725YDelegateCallContract.getAddress(), 0, delegateCallPayload, ), @@ -102,7 +98,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( .connect(addressCanDelegateCall) .execute( OPERATION_TYPES.DELEGATECALL, - erc725YDelegateCallContract.address, + await erc725YDelegateCallContract.getAddress(), 0, delegateCallPayload, ), @@ -130,7 +126,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( .connect(addressCannotDelegateCall) .execute( OPERATION_TYPES.DELEGATECALL, - erc725YDelegateCallContract.address, + await erc725YDelegateCallContract.getAddress(), 0, delegateCallPayload, ), @@ -166,7 +162,10 @@ export const shouldBehaveLikePermissionDelegateCall = ( PERMISSIONS.SUPER_DELEGATECALL, combineAllowedCalls( [CALLTYPE.DELEGATECALL, CALLTYPE.DELEGATECALL], - [allowedDelegateCallContracts[0].address, allowedDelegateCallContracts[1].address], + [ + await allowedDelegateCallContracts[0].getAddress(), + await allowedDelegateCallContracts[1].getAddress(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -219,7 +218,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( .connect(caller) .execute( OPERATION_TYPES.DELEGATECALL, - randomContracts[ii].address, + await randomContracts[ii].getAddress(), 0, delegateCallPayload, ), @@ -257,7 +256,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( .connect(caller) .execute( OPERATION_TYPES.DELEGATECALL, - allowedDelegateCallContracts[0].address, + await allowedDelegateCallContracts[0].getAddress(), 0, delegateCallPayload, ), @@ -288,7 +287,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( .connect(caller) .execute( OPERATION_TYPES.DELEGATECALL, - allowedDelegateCallContracts[1].address, + await allowedDelegateCallContracts[1].getAddress(), 0, delegateCallPayload, ), diff --git a/tests/LSP20CallVerification/LSP6/Interactions/PermissionDeploy.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionDeploy.test.ts similarity index 77% rename from tests/LSP20CallVerification/LSP6/Interactions/PermissionDeploy.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionDeploy.test.ts index f7232c6d3..63fd4a5fa 100644 --- a/tests/LSP20CallVerification/LSP6/Interactions/PermissionDeploy.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionDeploy.test.ts @@ -1,17 +1,14 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { calculateCreate2 } from 'eth-create2-calculator'; -import { TargetContract__factory } from '../../../../types'; +import { TargetContract__factory } from '../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - PERMISSIONS, - OPERATION_TYPES, -} from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -46,9 +43,9 @@ export const shouldBehaveLikePermissionDeploy = (buildContext: () => Promise { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const expectedContractAddress = await context.universalProfile.callStatic['execute']( + const expectedContractAddress = await context.universalProfile.execute.staticCall( OPERATION_TYPES.CREATE, // operation type - ethers.constants.AddressZero, // recipient + ethers.ZeroAddress, // recipient 0, // value contractBytecodeToDeploy, ); @@ -56,7 +53,7 @@ export const shouldBehaveLikePermissionDeploy = (buildContext: () => Promise Promise { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const preComputedAddress = calculateCreate2( - context.universalProfile.address, + await context.universalProfile.getAddress(), salt, contractBytecodeToDeploy, ).toLowerCase(); @@ -85,13 +82,13 @@ export const shouldBehaveLikePermissionDeploy = (buildContext: () => Promise Promise Promise Promise Promise Promise Promise { it('should pass and return data', async () => { - const expectedName = await targetContract.callStatic.getName(); + const expectedName = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('getName'); const result = await context.universalProfile .connect(context.mainController) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ); @@ -90,15 +86,15 @@ export const shouldBehaveLikePermissionStaticCall = ( describe('when caller has permission STATICCALL + some allowed calls', () => { it('should pass and return data', async () => { - const expectedName = await targetContract.callStatic.getName(); + const expectedName = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('getName'); const result = await context.universalProfile .connect(addressCanMakeStaticCall) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ); @@ -108,7 +104,7 @@ export const shouldBehaveLikePermissionStaticCall = ( }); it('should revert when trying to change state at the target contract', async () => { - const initialValue = await targetContract.callStatic.getName(); + const initialValue = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ 'modified name', @@ -117,11 +113,16 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.universalProfile .connect(addressCanMakeStaticCall) - .execute(OPERATION_TYPES.STATICCALL, targetContract.address, 0, targetContractPayload), + .execute( + OPERATION_TYPES.STATICCALL, + await targetContract.getAddress(), + 0, + targetContractPayload, + ), ).to.be.reverted; // ensure state hasn't changed. - const newValue = await targetContract.callStatic.getName(); + const newValue = await targetContract.getName(); expect(initialValue).to.equal(newValue); }); @@ -133,7 +134,12 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.universalProfile .connect(addressCanMakeStaticCall) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload), + .execute( + OPERATION_TYPES.CALL, + await targetContract.getAddress(), + 0, + targetContractPayload, + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(addressCanMakeStaticCall.address, 'CALL'); @@ -147,9 +153,9 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.universalProfile .connect(addressCanMakeStaticCallNoAllowedCalls) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ), @@ -166,7 +172,12 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.universalProfile .connect(addressCannotMakeStaticCall) - .execute(OPERATION_TYPES.STATICCALL, targetContract.address, 0, targetContractPayload), + .execute( + OPERATION_TYPES.STATICCALL, + await targetContract.getAddress(), + 0, + targetContractPayload, + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(addressCannotMakeStaticCall.address, 'STATICCALL'); @@ -196,7 +207,10 @@ export const shouldBehaveLikePermissionStaticCall = ( PERMISSIONS.STATICCALL, combineAllowedCalls( [CALLTYPE.STATICCALL, CALLTYPE.STATICCALL], - [allowedTargetContracts[0].address, allowedTargetContracts[1].address], + [ + await allowedTargetContracts[0].getAddress(), + await allowedTargetContracts[1].getAddress(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -213,16 +227,16 @@ export const shouldBehaveLikePermissionStaticCall = ( .connect(caller) .execute( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getName'), + targetContract.interface.getFunction('getName').selector, ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( caller.address, - targetContract.address, - targetContract.interface.getSighash('getName'), + await targetContract.getAddress(), + targetContract.interface.getFunction('getName').selector, ); }); @@ -234,11 +248,11 @@ export const shouldBehaveLikePermissionStaticCall = ( const result = await context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getName'), + targetContract.interface.getFunction('getName').selector, ); const [decodedResult] = abiCoder.decode(['string'], result); @@ -252,11 +266,11 @@ export const shouldBehaveLikePermissionStaticCall = ( const result = await context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getNumber'), + targetContract.interface.getFunction('getNumber').selector, ); const [decodedResult] = abiCoder.decode(['uint256'], result); @@ -271,9 +285,9 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ), @@ -288,9 +302,9 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ), @@ -306,11 +320,11 @@ export const shouldBehaveLikePermissionStaticCall = ( const result = await context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getName'), + targetContract.interface.getFunction('getName').selector, ); const [decodedResult] = abiCoder.decode(['string'], result); @@ -324,11 +338,11 @@ export const shouldBehaveLikePermissionStaticCall = ( const result = await context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getNumber'), + targetContract.interface.getFunction('getNumber').selector, ); const [decodedResult] = abiCoder.decode(['uint256'], result); @@ -343,9 +357,9 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ), @@ -360,9 +374,9 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ), @@ -394,7 +408,10 @@ export const shouldBehaveLikePermissionStaticCall = ( PERMISSIONS.SUPER_STATICCALL, combineAllowedCalls( ['00000004', '00000004'], - [allowedTargetContracts[0].address, allowedTargetContracts[1].address], + [ + await allowedTargetContracts[0].getAddress(), + await allowedTargetContracts[1].getAddress(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -412,11 +429,11 @@ export const shouldBehaveLikePermissionStaticCall = ( const result = await context.universalProfile .connect(caller) - .callStatic.execute( + .execute.staticCall( OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getName'), + targetContract.interface.getFunction('getName').selector, ); const [decodedResult] = abiCoder.decode(['string'], result); diff --git a/tests/LSP20CallVerification/LSP6/Interactions/PermissionTransferValue.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionTransferValue.test.ts similarity index 77% rename from tests/LSP20CallVerification/LSP6/Interactions/PermissionTransferValue.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionTransferValue.test.ts index 5ddbef075..cc2d96d5e 100644 --- a/tests/LSP20CallVerification/LSP6/Interactions/PermissionTransferValue.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/PermissionTransferValue.test.ts @@ -1,32 +1,28 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber } from 'ethers'; -import { FakeContract, smock } from '@defi-wonderland/smock'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ExecutorLSP20, ExecutorLSP20__factory, - LSP7Mintable, - LSP7Mintable__factory, TargetContract__factory, TargetPayableContract, TargetPayableContract__factory, - UniversalProfile__factory, - UniversalProfile, GraffitiEventExtension__factory, GraffitiEventExtension, -} from '../../../../types'; + LSP7Mintable, + LSP7Mintable__factory, + UniversalProfile__factory, + UniversalProfile, + FallbackContract__factory, + FallbackContract, +} from '../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - PERMISSIONS, - OPERATION_TYPES, - CALLTYPE, - LSP4_TOKEN_TYPES, -} from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -41,7 +37,7 @@ import { } from '../../../utils/helpers'; export const shouldBehaveLikePermissionTransferValue = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -58,7 +54,7 @@ export const shouldBehaveLikePermissionTransferValue = ( let graffitiExtension: GraffitiEventExtension; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); canTransferValue = context.accounts[1]; canTransferValueAndCall = context.accounts[2]; @@ -78,13 +74,13 @@ export const shouldBehaveLikePermissionTransferValue = ( await recipientUP .connect(context.accounts[0]) - .setData(lsp17ExtensionDataKeyForGraffiti, graffitiExtension.address); + .setData(lsp17ExtensionDataKeyForGraffiti, await graffitiExtension.getAddress()); // CHECK that a LSP17 Extension is was set for graffiti data `bytes4(0)` expect( // checksum address retrieved from storage (stored in lower case with hex) - ethers.utils.getAddress(await recipientUP.getData(lsp17ExtensionDataKeyForGraffiti)), - ).to.equal(graffitiExtension.address); + ethers.getAddress(await recipientUP.getData(lsp17ExtensionDataKeyForGraffiti)), + ).to.equal(await graffitiExtension.getAddress()); const permissionsKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -106,7 +102,7 @@ export const shouldBehaveLikePermissionTransferValue = ( PERMISSIONS.TRANSFERVALUE, combineAllowedCalls( [CALLTYPE.VALUE, CALLTYPE.VALUE], - [recipient.address, recipientUP.address], + [recipient.address, recipientUP.target], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -116,7 +112,7 @@ export const shouldBehaveLikePermissionTransferValue = ( combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), ], - [recipient.address, recipientUP.address], + [recipient.address, recipientUP.target], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -132,7 +128,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const data = '0x'; it('should pass when caller has ALL PERMISSIONS', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); /** * verify that balances have been updated @@ -143,55 +139,54 @@ export const shouldBehaveLikePermissionTransferValue = ( .connect(context.mainController) .execute(OPERATION_TYPES.CALL, recipient.address, amount, data), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); it('should pass when caller has permission TRANSFERVALUE only', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect(() => context.universalProfile .connect(canTransferValue) .execute(OPERATION_TYPES.CALL, recipient.address, amount, data), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); it('should pass when caller has permission TRANSFERVALUE + CALL', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect(() => context.universalProfile .connect(canTransferValueAndCall) .execute(OPERATION_TYPES.CALL, recipient.address, amount, data), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); it('should fail when caller does not have permission TRANSFERVALUE', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); await expect( context.universalProfile .connect(cannotTransferValue) - .execute( - OPERATION_TYPES.CALL, - recipient.address, - ethers.utils.parseEther('3'), - data, - ), + .execute(OPERATION_TYPES.CALL, recipient.address, ethers.parseEther('3'), data), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(cannotTransferValue.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -204,15 +199,19 @@ export const shouldBehaveLikePermissionTransferValue = ( const data = '0xaabbccdd'; it('should pass when caller has ALL PERMISSIONS', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); await context.universalProfile .connect(context.mainController) - .execute(OPERATION_TYPES.CALL, recipient.address, ethers.utils.parseEther('3'), data); + .execute(OPERATION_TYPES.CALL, recipient.address, ethers.parseEther('3'), data); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); expect(newBalanceUP).to.be.lt(initialBalanceUP); const newBalanceRecipient = await provider.getBalance(recipient.address); @@ -220,36 +219,35 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should pass when caller has permission TRANSFERVALUE + CALL', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect(() => context.universalProfile .connect(canTransferValueAndCall) .execute(OPERATION_TYPES.CALL, recipient.address, amount, data), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); it('should fail when caller has permission TRANSFERVALUE only', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); await expect( context.universalProfile .connect(canTransferValue) - .execute( - OPERATION_TYPES.CALL, - recipient.address, - ethers.utils.parseEther('3'), - data, - ), + .execute(OPERATION_TYPES.CALL, recipient.address, ethers.parseEther('3'), data), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canTransferValue.address, 'CALL'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -258,23 +256,22 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should fail when caller does not have permission TRANSFERVALUE', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); await expect( context.universalProfile .connect(cannotTransferValue) - .execute( - OPERATION_TYPES.CALL, - recipient.address, - ethers.utils.parseEther('3'), - data, - ), + .execute(OPERATION_TYPES.CALL, recipient.address, ethers.parseEther('3'), data), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(cannotTransferValue.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -287,23 +284,22 @@ export const shouldBehaveLikePermissionTransferValue = ( const data = '0x00000000aabbccdd'; it('should fail when caller has permission TRANSFERVALUE only', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); await expect( context.universalProfile .connect(canTransferValue) - .execute( - OPERATION_TYPES.CALL, - recipient.address, - ethers.utils.parseEther('3'), - data, - ), + .execute(OPERATION_TYPES.CALL, recipient.address, ethers.parseEther('3'), data), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canTransferValue.address, 'CALL'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -312,14 +308,14 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should pass when caller has permission TRANSFERVALUE + CALL', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); await expect(() => context.universalProfile .connect(canTransferValueAndCall) .execute(OPERATION_TYPES.CALL, recipient.address, amount, data), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); @@ -332,24 +328,23 @@ export const shouldBehaveLikePermissionTransferValue = ( const data = '0x00000000aabbccdd'; it('should fail when caller has permission TRANSFERVALUE only', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); - const initialBalanceRecipient = await provider.getBalance(recipientUP.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const initialBalanceRecipient = await provider.getBalance(recipientUP.target); await expect( context.universalProfile .connect(canTransferValue) - .execute( - OPERATION_TYPES.CALL, - recipientUP.address, - ethers.utils.parseEther('3'), - data, - ), + .execute(OPERATION_TYPES.CALL, recipientUP.target, ethers.parseEther('3'), data), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canTransferValue.address, 'CALL'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); - const newBalanceRecipient = await provider.getBalance(recipientUP.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const newBalanceRecipient = await provider.getBalance(recipientUP.target); // verify that native token balances have not changed expect(newBalanceUP).to.equal(initialBalanceUP); @@ -357,14 +352,14 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should pass when caller has permission TRANSFERVALUE + CALL', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const tx = await context.universalProfile .connect(canTransferValueAndCall) - .execute(OPERATION_TYPES.CALL, recipientUP.address, amount, data); + .execute(OPERATION_TYPES.CALL, recipientUP.target, amount, data); expect(tx).to.changeEtherBalances( - [context.universalProfile.address, recipientUP.address], + [await context.universalProfile.getAddress(), recipientUP.target], [`-${amount}`, amount], ); @@ -389,21 +384,21 @@ export const shouldBehaveLikePermissionTransferValue = ( const GAS_PROVIDED = 200_000; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); recipient = context.accounts[1].address; contractCanTransferValue = await new ExecutorLSP20__factory(context.accounts[0]).deploy( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + context.mainController.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - contractCanTransferValue.address.substring(2), + (await contractCanTransferValue.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - contractCanTransferValue.address.substring(2), + (await contractCanTransferValue.getAddress()).substring(2), ]; const permissionValues = [ @@ -422,14 +417,14 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('> Contract calls', () => { it('Should send 1 LYX to an address hardcoded in Executor (`sendOneLyxHardcoded`)', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => contractCanTransferValue.sendOneLyxHardcoded({ gasLimit: GAS_PROVIDED, }), ).to.changeEtherBalances( - [context.universalProfile.address, hardcodedRecipient], + [await context.universalProfile.getAddress(), hardcodedRecipient], [ `-${amount}`, // UP balance should have gone down amount, // recipient balance should have gone up @@ -438,14 +433,14 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('Should send 1 LYX to an address provided to Executor (`sendOneLyxToRecipient`)', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => contractCanTransferValue.sendOneLyxToRecipient(recipient, { gasLimit: GAS_PROVIDED, }), ).to.changeEtherBalances( - [context.universalProfile.address, recipient], + [await context.universalProfile.getAddress(), recipient], [`-${amount}`, amount], ); }); @@ -453,27 +448,27 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('> Low-level calls', () => { it('Should send 1 LYX to an address hardcoded in Executor (`sendOneLyxHardcodedRawCall`)', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => contractCanTransferValue.sendOneLyxHardcodedRawCall({ gasLimit: GAS_PROVIDED, }), ).to.changeEtherBalances( - [context.universalProfile.address, hardcodedRecipient], + [await context.universalProfile.getAddress(), hardcodedRecipient], [`-${amount}`, amount], ); }); it('Should send 1 LYX to an address provided to Executor (`sendOneLyxToRecipientRawCall`)', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => contractCanTransferValue.sendOneLyxToRecipientRawCall(recipient, { gasLimit: GAS_PROVIDED, }), ).to.changeEtherBalances( - [context.universalProfile.address, recipient], + [await context.universalProfile.getAddress(), recipient], [`-${amount}`, amount], ); }); @@ -490,10 +485,10 @@ export const shouldBehaveLikePermissionTransferValue = ( let bobContext: LSP6TestContext; before(async () => { - aliceContext = await buildContext(ethers.utils.parseEther('50')); + aliceContext = await buildContext(ethers.parseEther('50')); alice = aliceContext.accounts[0]; - bobContext = await buildContext(ethers.utils.parseEther('50')); + bobContext = await buildContext(ethers.parseEther('50')); bob = bobContext.accounts[1]; const alicePermissionKeys = [ @@ -504,9 +499,9 @@ export const shouldBehaveLikePermissionTransferValue = ( const bobPermissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + bob.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - aliceContext.universalProfile.address.substring(2), + (await aliceContext.universalProfile.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - aliceContext.universalProfile.address.substring(2), + (await aliceContext.universalProfile.getAddress()).substring(2), ]; const bobPermissionValues = [ @@ -514,7 +509,7 @@ export const shouldBehaveLikePermissionTransferValue = ( PERMISSIONS.TRANSFERVALUE, combineAllowedCalls( [CALLTYPE.VALUE], - [aliceContext.universalProfile.address], + [await aliceContext.universalProfile.getAddress()], ['0xffffffff'], ['0xffffffff'], ), @@ -543,31 +538,34 @@ export const shouldBehaveLikePermissionTransferValue = ( it("Alice's UP should have permission TRANSFERVALUE on Bob's UP", async () => { const key = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - aliceContext.universalProfile.address.substring(2); + (await aliceContext.universalProfile.getAddress()).substring(2); const result = await bobContext.universalProfile.getData(key); expect(result).to.equal(PERMISSIONS.TRANSFERVALUE); }); it("Alice should be able to send 5 LYX from Bob's UP to her UP", async () => { - const amount = ethers.utils.parseEther('5'); + const amount = ethers.parseEther('5'); const finalTransferLyxPayload = bobContext.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, aliceContext.universalProfile.address, amount, '0x'], + [OPERATION_TYPES.CALL, await aliceContext.universalProfile.getAddress(), amount, '0x'], ); - await expect(() => + await expect(async () => aliceContext.universalProfile .connect(alice) .execute( OPERATION_TYPES.CALL, - bobContext.universalProfile.address, + await bobContext.universalProfile.getAddress(), 0, finalTransferLyxPayload, ), ).to.changeEtherBalances( - [bobContext.universalProfile.address, aliceContext.universalProfile.address], + [ + await bobContext.universalProfile.getAddress(), + await aliceContext.universalProfile.getAddress(), + ], [`-${amount}`, amount], ); }); @@ -579,7 +577,7 @@ export const shouldBehaveLikePermissionTransferValue = ( let targetContract: TargetPayableContract; let lyxRecipientEOA: string; - let lyxRecipientContract: FakeContract; + let lyxRecipientContract: FallbackContract; const recipientsEOA: string[] = [ ethers.Wallet.createRandom().address, @@ -592,7 +590,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const recipientUPs: string[] = []; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); caller = context.accounts[1]; @@ -609,17 +607,11 @@ export const shouldBehaveLikePermissionTransferValue = ( lyxRecipientEOA = ethers.Wallet.createRandom().address; // this contract has a payable fallback function and can receive native tokens - lyxRecipientContract = await smock.fake([ - { - stateMutability: 'payable', - type: 'fallback', - }, - ]); - lyxRecipientContract.fallback.returns(); + lyxRecipientContract = await new FallbackContract__factory(context.accounts[0]).deploy(); await lsp7Token .connect(context.accounts[0]) - .mint(context.universalProfile.address, 100, false, '0x'); + .mint(await context.universalProfile.getAddress(), 100, false, '0x'); const permissionsKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + caller.address.substring(2), @@ -639,10 +631,10 @@ export const shouldBehaveLikePermissionTransferValue = ( combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), ], [ - lsp7Token.address, - targetContract.address, + lsp7Token.target as string, + await targetContract.getAddress(), lyxRecipientEOA, - lyxRecipientContract.address, + lyxRecipientContract.target as string, ], ['0xffffffff', '0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff', '0xffffffff'], @@ -655,21 +647,21 @@ export const shouldBehaveLikePermissionTransferValue = ( const newUP = await new UniversalProfile__factory(context.accounts[0]).deploy( context.accounts[0].address, ); - recipientUPs.push(newUP.address); + recipientUPs.push(newUP.target as string); } }); describe('when sending native tokens without `data`', () => { recipientsEOA.forEach((recipient) => { it(`should allow to send LYX to any EOA (e.g; at address -> ${recipient})`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => context.universalProfile .connect(caller) .execute(OPERATION_TYPES.CALL, recipient, amount, '0x'), ).to.changeEtherBalances( - [context.universalProfile.address, recipient], + [await context.universalProfile.getAddress(), recipient], [`-${amount}`, amount], ); }); @@ -677,14 +669,14 @@ export const shouldBehaveLikePermissionTransferValue = ( recipientUPs.forEach((recipientUP) => { it(`should allow to send LYX to any UP contract (e.g: at address -> ${recipientUP})`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => context.universalProfile .connect(caller) .execute(OPERATION_TYPES.CALL, recipientUP, amount, '0x'), ).to.changeEtherBalances( - [context.universalProfile.address, recipientUP], + [await context.universalProfile.getAddress(), recipientUP], [`-${amount}`, amount], ); }); @@ -694,7 +686,7 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('when sending native tokens with `data`', () => { recipientsEOA.forEach((recipient) => { it(`should not allow to send LYX with some \`data\` to a random EOA (e.g: at address -> ${recipient})`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; await expect( @@ -709,7 +701,7 @@ export const shouldBehaveLikePermissionTransferValue = ( recipientUPs.forEach((recipientUP) => { it(`should not allow to send LYX with some \`data\` to a random UP (e.g: at address -> ${recipientUP})`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; await expect( @@ -723,7 +715,7 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should allow to send LYX with some `data` to an EOA listed in the AllowedCalls', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; await expect( @@ -731,21 +723,21 @@ export const shouldBehaveLikePermissionTransferValue = ( .connect(caller) .execute(OPERATION_TYPES.CALL, lyxRecipientEOA, amount, data), ).to.changeEtherBalances( - [context.universalProfile.address, lyxRecipientEOA], + [await context.universalProfile.getAddress(), lyxRecipientEOA], [`-${amount}`, amount], ); }); it('should allow to send LYX with some `data` to a contract listed in the AllowedCalls', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; await expect( context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, lyxRecipientContract.address, amount, data), + .execute(OPERATION_TYPES.CALL, lyxRecipientContract.target, amount, data), ).to.changeEtherBalances( - [context.universalProfile.address, lyxRecipientContract.address], + [await context.universalProfile.getAddress(), lyxRecipientContract.target], [`-${amount}`, amount], ); }); @@ -762,7 +754,7 @@ export const shouldBehaveLikePermissionTransferValue = ( ); const lsp7TransferPayload = newLSP7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), context.accounts[5].address, 10, true, // sending to an EOA @@ -772,26 +764,28 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect( context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, newLSP7Token.address, 5, lsp7TransferPayload), + .execute(OPERATION_TYPES.CALL, newLSP7Token.target, 5, lsp7TransferPayload), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( caller.address, - newLSP7Token.address, - newLSP7Token.interface.getSighash('transfer'), + newLSP7Token.target, + newLSP7Token.interface.getFunction('transfer').selector, ); }); it('should be allowed to interact with an allowed LSP7 contract', async () => { const recipient = context.accounts[5].address; - const tokenAmount = ethers.BigNumber.from(10); + const tokenAmount = ethers.toBigInt(10); - const lsp7SenderBalanceBefore = await lsp7Token.balanceOf(context.universalProfile.address); + const lsp7SenderBalanceBefore = await lsp7Token.balanceOf( + await context.universalProfile.getAddress(), + ); const lsp7RecipientBalanceBefore = await lsp7Token.balanceOf(recipient); const lsp7TransferPayload = lsp7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipient, tokenAmount, true, // sending to an EOA @@ -800,15 +794,17 @@ export const shouldBehaveLikePermissionTransferValue = ( await context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, lsp7Token.address, 0, lsp7TransferPayload); + .execute(OPERATION_TYPES.CALL, lsp7Token.target, 0, lsp7TransferPayload); - const lsp7SenderBalanceAfter = await lsp7Token.balanceOf(context.universalProfile.address); + const lsp7SenderBalanceAfter = await lsp7Token.balanceOf( + await context.universalProfile.getAddress(), + ); const lsp7RecipientBalanceAfter = await lsp7Token.balanceOf(recipient); - expect(lsp7SenderBalanceAfter).to.equal(lsp7SenderBalanceBefore.sub(tokenAmount)); + expect(lsp7SenderBalanceAfter).to.equal(lsp7SenderBalanceBefore - tokenAmount); - expect(lsp7RecipientBalanceAfter).to.equal(lsp7RecipientBalanceBefore.add(tokenAmount)); + expect(lsp7RecipientBalanceAfter).to.equal(lsp7RecipientBalanceBefore + tokenAmount); }); it('should be allowed to interact with an allowed contract', async () => { @@ -820,7 +816,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, targetPayload); + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetPayload); const result = await targetContract.value(); expect(result).to.equal(newValue); @@ -828,7 +824,7 @@ export const shouldBehaveLikePermissionTransferValue = ( it('should be allowed to interact with an allowed contract + send some LYX while calling the function', async () => { const newValue = 358; - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = ethers.parseEther('3'); const targetContractPayload = targetContract.interface.encodeFunctionData('updateState', [ newValue, @@ -839,12 +835,12 @@ export const shouldBehaveLikePermissionTransferValue = ( .connect(caller) .execute( OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), lyxAmount, targetContractPayload, ), ).to.changeEtherBalances( - [context.universalProfile.address, targetContract.address], + [await context.universalProfile.getAddress(), await targetContract.getAddress()], [`-${lyxAmount}`, lyxAmount], ); @@ -854,7 +850,7 @@ export const shouldBehaveLikePermissionTransferValue = ( it('should not be allowed to interact with a not allowed contract + send some LYX while calling the function', async () => { const newValue = 8910; - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = ethers.parseEther('3'); const randomTargetContract = await new TargetPayableContract__factory( context.accounts[0], @@ -870,7 +866,7 @@ export const shouldBehaveLikePermissionTransferValue = ( .connect(caller) .execute( OPERATION_TYPES.CALL, - randomTargetContract.address, + await randomTargetContract.getAddress(), lyxAmount, targetContractPayload, ), @@ -878,8 +874,8 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( caller.address, - randomTargetContract.address, - randomTargetContract.interface.getSighash('updateState'), + await randomTargetContract.getAddress(), + randomTargetContract.interface.getFunction('updateState').selector, ); }); }); @@ -890,7 +886,7 @@ export const shouldBehaveLikePermissionTransferValue = ( let allowedAddress: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); caller = context.accounts[1]; allowedAddress = context.accounts[2]; @@ -918,9 +914,11 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('when transferring LYX without `data`', () => { it('should not be allowed to transfer LYX to a non-allowed address', async () => { const recipient = context.accounts[3].address; - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient); @@ -932,7 +930,7 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs(caller.address, recipient, '0x00000000'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance(await context.universalProfile.getAddress()); expect(newBalanceUP).to.equal(initialBalanceUP); const newBalanceRecipient = await provider.getBalance(recipient); @@ -940,14 +938,14 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should be allowed to transfer LYX to an allowed address', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => context.universalProfile .connect(caller) .execute(OPERATION_TYPES.CALL, allowedAddress.address, amount, '0x'), ).to.changeEtherBalances( - [context.universalProfile.address, allowedAddress.address], + [await context.universalProfile.getAddress(), allowedAddress.address], [`-${amount}`, amount], ); }); @@ -956,7 +954,7 @@ export const shouldBehaveLikePermissionTransferValue = ( // TODO: this test overlaps with the one above and pass, but the expected behaviour is not clear describe('when transferring LYX with `data`', () => { it('should be allowed to transfer LYX to an allowed address while sending some `data`', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; await expect(() => @@ -964,7 +962,7 @@ export const shouldBehaveLikePermissionTransferValue = ( .connect(caller) .execute(OPERATION_TYPES.CALL, allowedAddress.address, amount, data), ).to.changeEtherBalances( - [context.universalProfile.address, allowedAddress.address], + [await context.universalProfile.getAddress(), allowedAddress.address], [`-${amount}`, amount], ); }); @@ -982,7 +980,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, payload); + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, payload); const result = await targetContract.getNumber(); expect(result).to.equal(newValue); @@ -1002,20 +1000,20 @@ export const shouldBehaveLikePermissionTransferValue = ( ); // give some tokens to the UP - await lsp7Token.mint(context.universalProfile.address, 100, false, '0x'); + await lsp7Token.mint(await context.universalProfile.getAddress(), 100, false, '0x'); const tokenRecipient = context.accounts[5].address; const tokenAmount = 10; const senderTokenBalanceBefore = await lsp7Token.balanceOf( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const recipientTokenBalanceBefore = await lsp7Token.balanceOf(tokenRecipient); expect(senderTokenBalanceBefore).to.equal(100); expect(recipientTokenBalanceBefore).to.equal(0); const tokenTransferPayload = lsp7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), tokenRecipient, tokenAmount, true, @@ -1024,15 +1022,17 @@ export const shouldBehaveLikePermissionTransferValue = ( await context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, lsp7Token.address, 0, tokenTransferPayload); + .execute(OPERATION_TYPES.CALL, lsp7Token.target, 0, tokenTransferPayload); const senderTokenBalanceAfter = await lsp7Token.balanceOf( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const recipientTokenBalanceAfter = await lsp7Token.balanceOf(tokenRecipient); - expect(senderTokenBalanceAfter).to.equal(senderTokenBalanceBefore.sub(tokenAmount)); + expect(senderTokenBalanceAfter).to.equal( + senderTokenBalanceBefore - BigInt(tokenAmount), + ); expect(recipientTokenBalanceAfter).to.equal( - recipientTokenBalanceBefore.add(tokenAmount), + recipientTokenBalanceBefore + BigInt(tokenAmount), ); }); } @@ -1040,7 +1040,7 @@ export const shouldBehaveLikePermissionTransferValue = ( }); describe('should not be allowed to interact with any contract if sending LYX along the call', () => { - const lyxAmount = ethers.utils.parseEther('1'); + const lyxAmount = ethers.parseEther('1'); for (let ii = 1; ii <= 5; ii++) { it(`Target Payable Contract nb ${ii}`, async () => { @@ -1048,8 +1048,12 @@ export const shouldBehaveLikePermissionTransferValue = ( context.accounts[0], ).deploy(); - const upLyxBalanceBefore = await provider.getBalance(context.universalProfile.address); - const targetContractLyxBalanceBefore = await provider.getBalance(targetContract.address); + const upLyxBalanceBefore = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const targetContractLyxBalanceBefore = await provider.getBalance( + await targetContract.getAddress(), + ); expect(targetContractLyxBalanceBefore).to.equal(0); const targetPayload = targetContract.interface.encodeFunctionData('updateState', [35]); @@ -1057,20 +1061,29 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect( context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, targetContract.address, lyxAmount, targetPayload), + .execute( + OPERATION_TYPES.CALL, + await targetContract.getAddress(), + lyxAmount, + targetPayload, + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( caller.address, - targetContract.address, - targetContract.interface.getSighash('updateState'), + await targetContract.getAddress(), + targetContract.interface.getFunction('updateState').selector, ); // verify LYX (native tokens) balances have not changed - const upLyxBalanceAfter = await provider.getBalance(context.universalProfile.address); + const upLyxBalanceAfter = await provider.getBalance( + await context.universalProfile.getAddress(), + ); expect(upLyxBalanceAfter).to.equal(upLyxBalanceBefore); - const targetContractLyxBalanceAfter = await provider.getBalance(targetContract.address); + const targetContractLyxBalanceAfter = await provider.getBalance( + await targetContract.getAddress(), + ); expect(targetContractLyxBalanceAfter).to.equal(0); }); } @@ -1082,7 +1095,7 @@ export const shouldBehaveLikePermissionTransferValue = ( let allowedAddress: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); caller = context.accounts[1]; allowedAddress = context.accounts[2]; @@ -1119,14 +1132,14 @@ export const shouldBehaveLikePermissionTransferValue = ( recipients.forEach((recipient) => { it(`should send LYX to EOA -> ${recipient}`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => context.universalProfile .connect(caller) .execute(OPERATION_TYPES.CALL, recipient, amount, '0x'), ).to.changeEtherBalances( - [context.universalProfile.address, recipient], + [await context.universalProfile.getAddress(), recipient], [`-${amount}`, amount], ); }); @@ -1145,7 +1158,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, targetContract.address, 0, payload); + .execute(OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, payload); const result = await targetContract.getNumber(); expect(result).to.equal(newValue); @@ -1165,20 +1178,20 @@ export const shouldBehaveLikePermissionTransferValue = ( ); // give some tokens to the UP - await lsp7Token.mint(context.universalProfile.address, 100, false, '0x'); + await lsp7Token.mint(await context.universalProfile.getAddress(), 100, false, '0x'); const tokenRecipient = context.accounts[5].address; const tokenAmount = 10; const senderTokenBalanceBefore = await lsp7Token.balanceOf( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const recipientTokenBalanceBefore = await lsp7Token.balanceOf(tokenRecipient); expect(senderTokenBalanceBefore).to.equal(100); expect(recipientTokenBalanceBefore).to.equal(0); const tokenTransferPayload = lsp7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), tokenRecipient, tokenAmount, true, @@ -1187,15 +1200,17 @@ export const shouldBehaveLikePermissionTransferValue = ( await context.universalProfile .connect(caller) - .execute(OPERATION_TYPES.CALL, lsp7Token.address, 0, tokenTransferPayload); + .execute(OPERATION_TYPES.CALL, lsp7Token.target, 0, tokenTransferPayload); const senderTokenBalanceAfter = await lsp7Token.balanceOf( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const recipientTokenBalanceAfter = await lsp7Token.balanceOf(tokenRecipient); - expect(senderTokenBalanceAfter).to.equal(senderTokenBalanceBefore.sub(tokenAmount)); + expect(senderTokenBalanceAfter).to.equal( + senderTokenBalanceBefore - BigInt(tokenAmount), + ); expect(recipientTokenBalanceAfter).to.equal( - recipientTokenBalanceBefore.add(tokenAmount), + recipientTokenBalanceBefore + BigInt(tokenAmount), ); }); } diff --git a/tests/LSP20CallVerification/LSP6/Interactions/Security.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/Security.test.ts similarity index 76% rename from tests/LSP20CallVerification/LSP6/Interactions/Security.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/Security.test.ts index 8b39ce1a5..b518c2690 100644 --- a/tests/LSP20CallVerification/LSP6/Interactions/Security.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/Interactions/Security.test.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { ethers, artifacts } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { FirstToCallLSP20, @@ -12,17 +12,12 @@ import { TargetContract, TargetContract__factory, UniversalReceiverDelegateDataUpdater__factory, -} from '../../../../types'; +} from '../../types'; // constants -import { - ALL_PERMISSIONS, - ERC725YDataKeys, - LSP1_TYPE_IDS, - OPERATION_TYPES, - PERMISSIONS, - CALLTYPE, -} from '../../../../constants'; +import { ERC725YDataKeys, LSP1_TYPE_IDS } from '../../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -57,7 +52,9 @@ export const testSecurityScenarios = (buildContext: () => Promise Promise Promise Promise Promise Promise Promise Promise Promise Promise Promise Promise { secondReentrant = await new SecondToCallLSP20__factory(context.accounts[0]).deploy( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); firstReentrant = await new FirstToCallLSP20__factory(context.accounts[0]).deploy( - context.universalProfile.address, - secondReentrant.address, + await context.universalProfile.getAddress(), + await secondReentrant.getAddress(), ); const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - context.mainController.address.substring(2), + (await context.mainController.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - firstReentrant.address.substring(2), + (await firstReentrant.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - secondReentrant.address.substring(2), + (await secondReentrant.getAddress()).substring(2), ]; const permissionValues = [ @@ -255,10 +263,15 @@ export const testSecurityScenarios = (buildContext: () => Promise Promise { const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - secondReentrant.address.substring(2), + (await secondReentrant.getAddress()).substring(2), ]; const permissionValues = [ @@ -281,11 +294,14 @@ export const testSecurityScenarios = (buildContext: () => Promise Promise Promise { @@ -326,8 +342,8 @@ export const testSecurityScenarios = (buildContext: () => Promise Promise Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { describe('CHANGEOWNER', () => { shouldBehaveLikePermissionChangeOwner(buildContext); diff --git a/tests/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts similarity index 84% rename from tests/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts index 62b8aa8dc..96de6a820 100644 --- a/tests/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/LSP20WithLSP6.test.ts @@ -1,4 +1,3 @@ -import { BigNumber } from 'ethers'; import { ethers } from 'hardhat'; import { UniversalProfile__factory, LSP6KeyManager__factory } from '../../../types'; @@ -8,7 +7,7 @@ import { LSP6TestContext } from '../../utils/context'; import { shouldBehaveLikeLSP6 } from './LSP20WithLSP6.behaviour'; describe('LSP20 + LSP6 with constructor', () => { - const buildTestContext = async (initialFunding?: BigNumber): Promise => { + const buildTestContext = async (initialFunding?: bigint): Promise => { const accounts = await ethers.getSigners(); const mainController = accounts[0]; @@ -20,7 +19,7 @@ describe('LSP20 + LSP6 with constructor', () => { ); const keyManager = await new LSP6KeyManager__factory(mainController).deploy( - universalProfile.address, + universalProfile.target, ); return { accounts, mainController, universalProfile, keyManager, initialFunding }; diff --git a/tests/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts similarity index 72% rename from tests/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts index 5d9729e17..e91a5aae3 100644 --- a/tests/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/LSP20WithLSP6Init.test.ts @@ -1,26 +1,30 @@ import { expect } from 'chai'; -import { BigNumber } from 'ethers'; import { ethers } from 'hardhat'; -import { UniversalProfileInit__factory, LSP6KeyManagerInit__factory } from '../../../types'; +import { + UniversalProfileInit__factory, + LSP6KeyManagerInit__factory, + LSP6KeyManagerInit, +} from '../../../types'; import { LSP6TestContext } from '../../utils/context'; import { deployProxy } from '../../utils/fixtures'; import { shouldBehaveLikeLSP6 } from './LSP20WithLSP6.behaviour'; +import { UniversalProfileInit } from '@lukso/universalprofile-contracts/types'; describe('LSP20 Init + LSP6 Init with proxy', () => { - const buildProxyTestContext = async (initialFunding?: BigNumber): Promise => { + const buildProxyTestContext = async (initialFunding?: bigint): Promise => { const accounts = await ethers.getSigners(); const mainController = accounts[0]; const baseUP = await new UniversalProfileInit__factory(mainController).deploy(); - const upProxy = await deployProxy(baseUP.address, mainController); - const universalProfile = await baseUP.attach(upProxy); + const upProxy = await deployProxy(await baseUP.getAddress(), mainController); + const universalProfile = baseUP.attach(upProxy) as UniversalProfileInit; const baseKM = await new LSP6KeyManagerInit__factory(mainController).deploy(); - const kmProxy = await deployProxy(baseKM.address, mainController); - const keyManager = await baseKM.attach(kmProxy); + const kmProxy = await deployProxy(await baseKM.getAddress(), mainController); + const keyManager = baseKM.attach(kmProxy) as unknown as LSP6KeyManagerInit; return { accounts, mainController, universalProfile, keyManager, initialFunding }; }; @@ -30,7 +34,7 @@ describe('LSP20 Init + LSP6 Init with proxy', () => { value: context.initialFunding, }); - await context.keyManager['initialize(address)'](context.universalProfile.address); + await context.keyManager['initialize(address)'](await context.universalProfile.getAddress()); return context; }; @@ -63,7 +67,7 @@ describe('LSP20 Init + LSP6 Init with proxy', () => { }); describe('when testing deployed contract', () => { - shouldBehaveLikeLSP6(async (initialFunding?: BigNumber) => { + shouldBehaveLikeLSP6(async (initialFunding?: bigint) => { const context = await buildProxyTestContext(initialFunding); await initializeProxy(context); return context; diff --git a/tests/LSP20CallVerification/LSP6/SetData/AllowedERC725YDataKeys.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetData/AllowedERC725YDataKeys.test.ts similarity index 74% rename from tests/LSP20CallVerification/LSP6/SetData/AllowedERC725YDataKeys.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetData/AllowedERC725YDataKeys.test.ts index 96b4735ce..bddd939c4 100644 --- a/tests/LSP20CallVerification/LSP6/SetData/AllowedERC725YDataKeys.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetData/AllowedERC725YDataKeys.test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; -import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ALL_PERMISSIONS, ERC725YDataKeys, PERMISSIONS } from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -11,7 +11,7 @@ import { setupKeyManager } from '../../../utils/fixtures'; // helpers import { encodeCompactBytesArray, decodeCompactBytes } from '../../../utils/helpers'; -import { BytesLike } from 'ethers'; +import { BytesLike, keccak256, hexlify, toUtf8Bytes, randomBytes } from 'ethers'; export type TestCase = { datakeyToSet: BytesLike; @@ -26,10 +26,10 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('keyType: Singleton', () => { let controllerCanSetOneKey: SignerWithAddress, controllerCanSetManyKeys: SignerWithAddress; - const customKey1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey1')); - const customKey2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey2')); - const customKey3 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey3')); - const customKey4 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey4')); + const customKey1 = keccak256(toUtf8Bytes('CustomKey1')); + const customKey2 = keccak256(toUtf8Bytes('CustomKey2')); + const customKey3 = keccak256(toUtf8Bytes('CustomKey3')); + const customKey4 = keccak256(toUtf8Bytes('CustomKey4')); before(async () => { context = await buildContext(); @@ -109,7 +109,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting one key', () => { it('should pass when setting the right key', async () => { const key = customKey1; - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const newValue = hexlify(toUtf8Bytes('Some data')); await context.universalProfile.connect(controllerCanSetOneKey).setData(key, newValue); @@ -118,8 +118,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( }); it('should fail when setting the wrong key', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NotAllowedKey')); - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const key = keccak256(toUtf8Bytes('NotAllowedKey')); + const newValue = hexlify(toUtf8Bytes('Some data')); await expect( context.universalProfile.connect(controllerCanSetOneKey).setData(key, newValue), @@ -132,14 +132,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting multiple keys', () => { it('should fail when the list contains none of the allowed keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('ZZZZZZZZZZ')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('ZZZZZZZZZZ')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value ZZZZZZZZ')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Value ZZZZZZZZ')), ]; await expect( @@ -152,13 +152,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should fail, even if the list contains the allowed key', async () => { const keys = [ customKey1, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Custom Value 1')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), ]; await expect( @@ -174,9 +174,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when the input is all the allowed keys', async () => { const keys = [customKey2, customKey3, customKey4]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 3')), + hexlify(toUtf8Bytes('Some data 1')), + hexlify(toUtf8Bytes('Some data 2')), + hexlify(toUtf8Bytes('Some data 3')), ]; await context.universalProfile.connect(controllerCanSetManyKeys).setDataBatch(keys, values); @@ -188,14 +188,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should fail when the input contains none of the allowed keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('ZZZZZZZZZZ')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('ZZZZZZZZZZ')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value ZZZZZZZZ')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Value ZZZZZZZZ')), ]; await expect( @@ -208,7 +208,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting one key', () => { it('should pass when trying to set the 1st allowed key', async () => { const key = customKey2; - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const newValue = hexlify(toUtf8Bytes('Some data')); await context.universalProfile.connect(controllerCanSetManyKeys).setData(key, newValue); @@ -218,7 +218,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when trying to set the 2nd allowed key', async () => { const key = customKey3; - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const newValue = hexlify(toUtf8Bytes('Some data')); await context.universalProfile.connect(controllerCanSetManyKeys).setData(key, newValue); @@ -228,7 +228,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when trying to set the 3rd allowed key', async () => { const key = customKey4; - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const newValue = hexlify(toUtf8Bytes('Some data')); await context.universalProfile.connect(controllerCanSetManyKeys).setData(key, newValue); @@ -237,8 +237,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( }); it('should fail when setting a not-allowed Singleton key', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NotAllowedKey')); - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const key = keccak256(toUtf8Bytes('NotAllowedKey')); + const newValue = hexlify(toUtf8Bytes('Some data')); await expect( context.universalProfile.connect(controllerCanSetManyKeys).setData(key, newValue), @@ -253,8 +253,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('the input is the first two (subset) allowed keys', async () => { const keys = [customKey2, customKey3]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), + hexlify(toUtf8Bytes('Some data 1')), + hexlify(toUtf8Bytes('Some data 2')), ]; await context.universalProfile @@ -268,8 +268,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('the input is the last two (subset) allowed keys', async () => { const keys = [customKey3, customKey4]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), + hexlify(toUtf8Bytes('Some data 1')), + hexlify(toUtf8Bytes('Some data 2')), ]; await context.universalProfile @@ -283,8 +283,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('the input is the first + last (subset) allowed keys', async () => { const keys = [customKey2, customKey4]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), + hexlify(toUtf8Bytes('Some data 1')), + hexlify(toUtf8Bytes('Some data 2')), ]; await context.universalProfile @@ -302,13 +302,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('1st key in input = 1st allowed key. Other 2 keys = not allowed', async () => { const keys = [ customKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Custom Value 2')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), ]; await expect( @@ -320,14 +320,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('2nd key in input = 1st allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), customKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Custom Value 2')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), ]; await expect( @@ -339,14 +339,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('3rd key in input = 1st allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), customKey2, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Custom Value 2')), ]; await expect( @@ -359,13 +359,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('1st key in input = 2nd allowed key. Other 2 keys = not allowed', async () => { const keys = [ customKey3, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Custom Value 2')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), ]; await expect( @@ -377,14 +377,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('2nd key in input = 2nd allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), customKey3, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Custom Value 3')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), ]; await expect( @@ -396,14 +396,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('3rd key in input = 2nd allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), customKey3, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Custom Value 3')), ]; await expect( @@ -416,13 +416,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('1st key in input = 3rd allowed key. Other 2 keys = not allowed', async () => { const keys = [ customKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Custom Value 4')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), ]; await expect( @@ -434,14 +434,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('2nd key in input = 3rd allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), customKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Custom Value 4')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), ]; await expect( @@ -453,14 +453,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('3rd key in input = 3rd allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), customKey4, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 4')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Custom Value 4')), ]; await expect( @@ -471,16 +471,12 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( }); it('1st key in input = not allowed key. Other 2 keys = allowed', async () => { - const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - customKey2, - customKey3, - ]; + const keys = [keccak256(toUtf8Bytes('XXXXXXXXXX')), customKey2, customKey3]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Custom Value 2')), + hexlify(toUtf8Bytes('Custom Value 3')), ]; await expect( @@ -491,15 +487,11 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( }); it('2nd key in input = not allowed key. Other 2 keys = allowed', async () => { - const keys = [ - customKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - customKey3, - ]; + const keys = [customKey2, keccak256(toUtf8Bytes('XXXXXXXXXX')), customKey3]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), + hexlify(toUtf8Bytes('Custom Value 2')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Custom Value 3')), ]; await expect( @@ -510,16 +502,12 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( }); it('3rd key in input = not allowed key. Other 2 keys = allowed', async () => { - const keys = [ - customKey2, - customKey3, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ]; + const keys = [customKey2, customKey3, keccak256(toUtf8Bytes('XXXXXXXXXX'))]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Custom Value 2')), + hexlify(toUtf8Bytes('Custom Value 3')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), ]; await expect( @@ -539,13 +527,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( customKey2, customKey3, customKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey3')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Some Data for customKey2')), + hexlify(toUtf8Bytes('Some Data for customKey3')), + hexlify(toUtf8Bytes('Some Data for customKey4')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), ]; await expect( @@ -562,21 +550,21 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( customKey2, customKey3, customKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('ZZZZZZZZZZ')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('AAAAAAAAAA')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('BBBBBBBBBB')), + keccak256(toUtf8Bytes('XXXXXXXXXX')), + keccak256(toUtf8Bytes('YYYYYYYYYY')), + keccak256(toUtf8Bytes('ZZZZZZZZZZ')), + keccak256(toUtf8Bytes('AAAAAAAAAA')), + keccak256(toUtf8Bytes('BBBBBBBBBB')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value ZZZZZZZZ')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value AAAAAAAA')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value BBBBBBBB')), + hexlify(toUtf8Bytes('Custom Value 2')), + hexlify(toUtf8Bytes('Custom Value 3')), + hexlify(toUtf8Bytes('Custom Value 4')), + hexlify(toUtf8Bytes('Value XXXXXXXX')), + hexlify(toUtf8Bytes('Value YYYYYYYY')), + hexlify(toUtf8Bytes('Value ZZZZZZZZ')), + hexlify(toUtf8Bytes('Value AAAAAAAA')), + hexlify(toUtf8Bytes('Value BBBBBBBB')), ]; await expect( @@ -603,27 +591,15 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( customKey4, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey3')), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 1) for customKey2'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 1) for customKey3'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 2) for customKey2'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 1) for customKey4'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 2) for customKey3'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 2) for customKey4'), - ), + hexlify(toUtf8Bytes('Some Data for customKey2')), + hexlify(toUtf8Bytes('Some Data for customKey4')), + hexlify(toUtf8Bytes('Some Data for customKey3')), + hexlify(toUtf8Bytes('Some Data (override 1) for customKey2')), + hexlify(toUtf8Bytes('Some Data (override 1) for customKey3')), + hexlify(toUtf8Bytes('Some Data (override 2) for customKey2')), + hexlify(toUtf8Bytes('Some Data (override 1) for customKey4')), + hexlify(toUtf8Bytes('Some Data (override 2) for customKey3')), + hexlify(toUtf8Bytes('Some Data (override 2) for customKey4')), ]; await context.universalProfile @@ -651,8 +627,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when address can set any key', () => { describe('when setting one key', () => { it('should pass when setting any random key', async () => { - const key = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const key = hexlify(randomBytes(32)); + const value = hexlify(toUtf8Bytes('Some data')); await context.universalProfile.connect(context.mainController).setData(key, value); @@ -664,14 +640,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting multiple keys', () => { it('should pass when setting any multiple keys', async () => { const keys = [ - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), + hexlify(randomBytes(32)), + hexlify(randomBytes(32)), + hexlify(randomBytes(32)), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 3')), + hexlify(toUtf8Bytes('Some data 1')), + hexlify(toUtf8Bytes('Some data 2')), + hexlify(toUtf8Bytes('Some data 3')), ]; await context.universalProfile.connect(context.mainController).setDataBatch(keys, values); @@ -726,7 +702,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting one key', () => { it('should pass when setting SupportedStandards:LSPX', async () => { const mappingKey = LSPXKey; - const mappingValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x24ae6f23')); + const mappingValue = hexlify(toUtf8Bytes('0x24ae6f23')); await context.universalProfile .connect(controllerCanSetMappingKeys) @@ -738,7 +714,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when overriding SupportedStandards:LSPX', async () => { const mappingKey = LSPXKey; - const mappingValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x24ae6f23')); + const mappingValue = hexlify(toUtf8Bytes('0x24ae6f23')); await context.universalProfile .connect(controllerCanSetMappingKeys) @@ -750,7 +726,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting SupportedStandards:LSPY', async () => { const mappingKey = LSPYKey; - const mappingValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x5e8d18c5')); + const mappingValue = hexlify(toUtf8Bytes('0x5e8d18c5')); await context.universalProfile .connect(controllerCanSetMappingKeys) @@ -762,7 +738,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting SupportedStandards:LSPZ', async () => { const mappingKey = LSPZKey; - const mappingValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x25b71a36')); + const mappingValue = hexlify(toUtf8Bytes('0x25b71a36')); await context.universalProfile .connect(controllerCanSetMappingKeys) @@ -852,9 +828,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( '0xcccccccccccccccccccccccccccccccc00000000000000000000000022222222', ]; const randomMappingValues = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 3')), + hexlify(toUtf8Bytes('Random Mapping Value 1')), + hexlify(toUtf8Bytes('Random Mapping Value 2')), + hexlify(toUtf8Bytes('Random Mapping Value 3')), ]; await expect( @@ -874,8 +850,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( ]; const mappingValues = [ '0x24ae6f23', - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 2')), + hexlify(toUtf8Bytes('Random Mapping Value 1')), + hexlify(toUtf8Bytes('Random Mapping Value 2')), ]; await expect( @@ -894,9 +870,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting any random Mapping key', async () => { const randomMappingKey = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000011111111'; - const randomMappingValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Random Mapping Value'), - ); + const randomMappingValue = hexlify(toUtf8Bytes('Random Mapping Value')); await context.universalProfile .connect(context.mainController) @@ -915,9 +889,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( '0xcccccccccccccccccccccccccccccccc00000000000000000000000022222222', ]; const randomMappingValues = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 3')), + hexlify(toUtf8Bytes('Random Mapping Value 1')), + hexlify(toUtf8Bytes('Random Mapping Value 2')), + hexlify(toUtf8Bytes('Random Mapping Value 3')), ]; await context.universalProfile @@ -976,7 +950,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting array key length MyArray[]', async () => { const key = arrayKeyLength; // eg: MyArray[].length = 10 elements - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x0a')); + const value = hexlify(toUtf8Bytes('0x0a')); await context.universalProfile.connect(controllerCanSetArrayKeys).setData(key, value); @@ -986,7 +960,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting 1st array element MyArray[0]', async () => { const key = arrayKeyElement1; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xaaaaaaaa')); + const value = hexlify(toUtf8Bytes('0xaaaaaaaa')); await context.universalProfile.connect(controllerCanSetArrayKeys).setData(key, value); @@ -996,7 +970,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting 2nd array element MyArray[1]', async () => { const key = arrayKeyElement2; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xbbbbbbbb')); + const value = hexlify(toUtf8Bytes('0xbbbbbbbb')); await context.universalProfile.connect(controllerCanSetArrayKeys).setData(key, value); @@ -1006,7 +980,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting 3rd array element MyArray[3]', async () => { const key = arrayKeyElement3; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xcccccccc')); + const value = hexlify(toUtf8Bytes('0xcccccccc')); await context.universalProfile.connect(controllerCanSetArrayKeys).setData(key, value); @@ -1078,8 +1052,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('Testing bytes32(0) (= zero key) edge cases', () => { let controllerCanSetSomeKeys: SignerWithAddress; - const customKey1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey1')); - const customKey2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey2')); + const customKey1 = keccak256(toUtf8Bytes('CustomKey1')); + const customKey2 = keccak256(toUtf8Bytes('CustomKey2')); const zeroKey = '0x0000000000000000000000000000000000000000000000000000000000000000'; @@ -1123,7 +1097,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( [{ allowedDataKey: customKey1 }, { allowedDataKey: customKey2 }].forEach((testCase) => { it(`should pass when setting a data key listed in the allowed ERC725Y data keys: ${testCase.allowedDataKey}`, async () => { const key = testCase.allowedDataKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value); @@ -1134,24 +1108,24 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( [ { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 1')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 1')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 2')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 2')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 3')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 3')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 4')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 4')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 5')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 5')), }, ].forEach((testCase) => { it(`should revert when trying to set any random data key (e.g: ${testCase.datakeyToSet})`, async () => { const key = testCase.datakeyToSet; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await expect( context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value), @@ -1163,7 +1137,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should revert when trying to set bytes31(0) dynamic key, not in AllowedERC725YDataKeys', async () => { const key = bytes31DynamicKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await expect(context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value)) .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedERC725YDataKey') @@ -1172,7 +1146,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass and allow to set the bytes32(0) data key', async () => { const key = zeroKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value); @@ -1182,9 +1156,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when trying to set an array of data keys that includes bytes32(0) (= zero data key)', async () => { const keys = [customKey1, customKey2, zeroKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + hexlify(toUtf8Bytes('some value for ' + keys[0])), + hexlify(toUtf8Bytes('some value for ' + keys[1])), + hexlify(toUtf8Bytes('some value for ' + keys[2])), ]; await context.universalProfile.connect(controllerCanSetSomeKeys).setDataBatch(keys, values); @@ -1195,9 +1169,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should revert when trying to set an array of data keys including a dynamic bytes31(0) data key, not in AllowedERC725YDataKeys', async () => { const keys = [customKey1, customKey2, bytes31DynamicKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + hexlify(toUtf8Bytes('some value for ' + keys[0])), + hexlify(toUtf8Bytes('some value for ' + keys[1])), + hexlify(toUtf8Bytes('some value for ' + keys[2])), ]; await expect( @@ -1210,9 +1184,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should revert when trying to set an array of data keys including a dynamic bytes20(0) data key, not in AllowedERC725YDataKeys', async () => { const keys = [customKey1, customKey2, bytes20DynamicKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + hexlify(toUtf8Bytes('some value for ' + keys[0])), + hexlify(toUtf8Bytes('some value for ' + keys[1])), + hexlify(toUtf8Bytes('some value for ' + keys[2])), ]; await expect( @@ -1255,7 +1229,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( [{ allowedDataKey: customKey1 }, { allowedDataKey: customKey2 }].forEach((testCase) => { it(`should pass when setting a data key listed in the allowed ERC725Y data keys: ${testCase.allowedDataKey}`, async () => { const key = testCase.allowedDataKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value); @@ -1266,24 +1240,24 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( [ { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 1')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 1')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 2')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 2')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 3')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 3')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 4')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 4')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 5')), + datakeyToSet: keccak256(toUtf8Bytes('Some random data key 5')), }, ].forEach((testCase) => { it(`should revert when trying to set any random data key (e.g: ${testCase.datakeyToSet})`, async () => { const key = testCase.datakeyToSet; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await expect( context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value), @@ -1295,7 +1269,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should allow setting up a key with a prefix of 31 null bytes, as bytes31(0) is part of AllowedERC725YDataKeys', async () => { const key = bytes31DynamicKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value); @@ -1305,7 +1279,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should allow setting up a key with a prefix of 20 null bytes, as bytes20(0) is part of AllowedERC725YDataKeys', async () => { const key = bytes20DynamicKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value); @@ -1315,7 +1289,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass and allow to set the bytes32(0) data key', async () => { const key = zeroKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value); @@ -1325,9 +1299,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting an array of data keys that includes bytes32(0) (= zero data key)', async () => { const keys = [customKey1, customKey2, zeroKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + hexlify(toUtf8Bytes('some value for ' + keys[0])), + hexlify(toUtf8Bytes('some value for ' + keys[1])), + hexlify(toUtf8Bytes('some value for ' + keys[2])), ]; await context.universalProfile.connect(controllerCanSetSomeKeys).setDataBatch(keys, values); @@ -1338,9 +1312,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when trying to set an array of data keys including a dynamic bytes24(0) data key, because bytes20(0) dynamic data ke is in AllowedERC725YDataKeys', async () => { const keys = [customKey1, customKey2, bytes24DynamicKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + hexlify(toUtf8Bytes('some value for ' + keys[0])), + hexlify(toUtf8Bytes('some value for ' + keys[1])), + hexlify(toUtf8Bytes('some value for ' + keys[2])), ]; await context.universalProfile.connect(controllerCanSetSomeKeys).setDataBatch(keys, values); @@ -1351,9 +1325,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should revert when trying to set an array of data keys including a dynamic bytes19(0) data key, not in AllowedERC725YDataKeys', async () => { const keys = [customKey1, customKey2, bytes19DynamicKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + hexlify(toUtf8Bytes('some value for ' + keys[0])), + hexlify(toUtf8Bytes('some value for ' + keys[1])), + hexlify(toUtf8Bytes('some value for ' + keys[2])), ]; await expect( @@ -1407,7 +1381,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( ].forEach((testCase) => { it(`e.g: ${testCase.datakeyToSet}`, async () => { const key = testCase.datakeyToSet; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value); @@ -1440,7 +1414,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( ].forEach((testCase) => { it(`should revert (e.g: ${testCase.datakeyToSet})`, async () => { const key = testCase.datakeyToSet; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = hexlify(toUtf8Bytes('some value for ' + key)); await expect( context.universalProfile.connect(controllerCanSetSomeKeys).setData(key, value), diff --git a/tests/LSP20CallVerification/LSP6/SetData/PermissionSetData.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetData/PermissionSetData.test.ts similarity index 71% rename from tests/LSP20CallVerification/LSP6/SetData/PermissionSetData.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetData/PermissionSetData.test.ts index d1ea42ea4..89b252508 100644 --- a/tests/LSP20CallVerification/LSP6/SetData/PermissionSetData.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetData/PermissionSetData.test.ts @@ -1,17 +1,14 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { encodeData, ERC725JSONSchema } from '@erc725/erc725.js'; -import { ExecutorLSP20, ExecutorLSP20__factory } from '../../../../types'; +import { ExecutorLSP20, ExecutorLSP20__factory } from '../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - PERMISSIONS, - OPERATION_TYPES, -} from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -82,12 +79,12 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise { describe('For UP owner', () => { it('should pass', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!')); await context.universalProfile.connect(context.mainController).setData(key, value); - const fetchedResult = await context.universalProfile.callStatic['getData(bytes32)'](key); + const fetchedResult = await context.universalProfile.getData(key); expect(fetchedResult).to.equal(value); }); }); describe('For address that has permission SETDATA with AllowedERC725YDataKeys', () => { it('should pass', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!')); await context.universalProfile .connect(canSetDataWithAllowedERC725YDataKeys) .setData(key, value); - const fetchedResult = await context.universalProfile.callStatic['getData(bytes32)'](key); + const fetchedResult = await context.universalProfile.getData(key); expect(fetchedResult).to.equal(value); }); }); describe('For address that has permission SETDATA without any AllowedERC725YDataKeys', () => { it('should revert', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!')); await expect( context.universalProfile @@ -139,8 +136,8 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { it('should not allow', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!')); await expect(context.universalProfile.connect(cannotSetData).setData(key, value)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') @@ -153,24 +150,24 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { it('(should pass): adding 5 singleton keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFourthKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFifthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFourthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFifthKey')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('aaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('bbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('cccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('dddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('eeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('aaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('bbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('cccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('dddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('eeeeeeeeee')), ]; await context.universalProfile.connect(context.mainController).setDataBatch(keys, values); - const fetchedResult = await context.universalProfile.callStatic.getDataBatch(keys); + const fetchedResult = await context.universalProfile.getDataBatch(keys); expect(fetchedResult).to.deep.equal(values); }); @@ -184,7 +181,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise Promise Promise { it('(should pass): adding 5 singleton keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFourthKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFifthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFourthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFifthKey')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('aaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('bbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('cccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('dddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('eeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('aaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('bbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('cccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('dddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('eeeeeeeeee')), ]; await context.universalProfile .connect(canSetDataWithAllowedERC725YDataKeys) .setDataBatch(keys, values); - const fetchedResult = await context.universalProfile.callStatic.getDataBatch(keys); + const fetchedResult = await context.universalProfile.getDataBatch(keys); expect(fetchedResult).to.deep.equal(values); }); @@ -258,7 +257,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise Promise Promise { it('(should revert): adding 5 singleton keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFourthKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFifthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFourthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFifthKey')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('aaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('bbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('cccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('dddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('eeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('aaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('bbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('cccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('dddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('eeeeeeeeee')), ]; await expect( @@ -340,9 +341,11 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise { it('(should fail): adding 5 singleton keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFourthKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFifthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFourthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFifthKey')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('aaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('bbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('cccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('dddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('eeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('aaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('bbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('cccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('dddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('eeeeeeeeee')), ]; await expect(context.universalProfile.connect(cannotSetData).setDataBatch(keys, values)) @@ -406,9 +409,11 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise Promise Promise contract calls', () => { it('should allow to set a key hardcoded inside a function of the calling contract', async () => { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call await contractCanSetData.setHardcodedKey(); // check that store[key] is now set to value - const newStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const newStorage = await context.universalProfile.getData(hardcodedDataKey); expect(newStorage).to.equal(hardcodedDataValue); }); it('Should allow to set a key computed inside a function of the calling contract', async () => { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call await contractCanSetData.setComputedKey(); // check that store[key] is now set to value - const newStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const newStorage = await context.universalProfile.getData(hardcodedDataKey); expect(newStorage).to.equal(hardcodedDataValue); }); it('Should allow to set a key computed from parameters given to a function of the calling contract', async () => { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call await contractCanSetData.setComputedKeyFromParams(hardcodedDataKey, hardcodedDataValue); // check that store[key] is now set to value - const newStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const newStorage = await context.universalProfile.getData(hardcodedDataKey); expect(newStorage).to.equal(hardcodedDataValue); }); }); @@ -533,13 +526,11 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Low-level calls', () => { it('Should allow to `setHardcodedKeyRawCall` on UP', async () => { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // check if low-level call succeeded - const result = await contractCanSetData.callStatic.setHardcodedKeyRawCall({ + const result = await contractCanSetData.setHardcodedKeyRawCall.staticCall({ gasLimit: GAS_PROVIDED, }); expect(result).to.be.true; @@ -550,17 +541,13 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call @@ -569,17 +556,13 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call @@ -592,9 +575,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise Promise { const key = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - aliceContext.universalProfile.address.substring(2); + (await aliceContext.universalProfile.getAddress()).substring(2); const result = await bobContext.universalProfile.getData(key); expect(result).to.equal(PERMISSIONS.SETDATA); }); it("Alice's UP should't be able to `setData(...)` on Bob's UP when it doesn't have any AllowedERC725YDataKeys", async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Alice's Key")); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes("Alice's Value")); + const key = ethers.keccak256(ethers.toUtf8Bytes("Alice's Key")); + const value = ethers.hexlify(ethers.toUtf8Bytes("Alice's Value")); const finalSetDataPayload = bobContext.universalProfile.interface.encodeFunctionData( 'setData', @@ -672,25 +653,25 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Alice's Key")); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes("Alice's Value")); + const key = ethers.keccak256(ethers.toUtf8Bytes("Alice's Key")); + const value = ethers.hexlify(ethers.toUtf8Bytes("Alice's Value")); // Adding `key` to AllowedERC725YDataKeys for Alice await bobContext.universalProfile .connect(bob) .setData( ERC725YDataKeys.LSP6['AddressPermissions:AllowedERC725YDataKeys'] + - aliceContext.universalProfile.address.substring(2), + (await aliceContext.universalProfile.getAddress()).substring(2), encodeCompactBytesArray([key]), ); @@ -701,7 +682,12 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise { @@ -738,8 +724,8 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { for (let ii = 1; ii <= 5; ii++) { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(`dissallowed key ${ii}`)); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes(`some value ${ii}`)); + const key = ethers.keccak256(ethers.toUtf8Bytes(`dissallowed key ${ii}`)); + const value = ethers.hexlify(ethers.toUtf8Bytes(`some value ${ii}`)); it(`should be allowed to set a disallowed key: ${key}`, async () => { await context.universalProfile.connect(caller).setData(key, value); @@ -752,7 +738,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { it('should be allowed to set the 1st allowed key', async () => { - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value 1')); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value 1')); await context.universalProfile.connect(caller).setData(AllowedERC725YDataKeys[0], value); @@ -761,7 +747,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value 2')); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value 2')); await context.universalProfile.connect(caller).setData(AllowedERC725YDataKeys[1], value); @@ -770,7 +756,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value 3')); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value 3')); await context.universalProfile.connect(caller).setData(AllowedERC725YDataKeys[2], value); diff --git a/tests/LSP20CallVerification/LSP6/SetPermissions/PermissionChangeAddController.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/PermissionChangeAddController.test.ts similarity index 88% rename from tests/LSP20CallVerification/LSP6/SetPermissions/PermissionChangeAddController.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/PermissionChangeAddController.test.ts index 2f0eb16b0..e2dc6cdeb 100644 --- a/tests/LSP20CallVerification/LSP6/SetPermissions/PermissionChangeAddController.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/PermissionChangeAddController.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS } from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -108,7 +109,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; permissionArrayValues = [ - ethers.utils.hexZeroPad(ethers.utils.hexlify(6), 16), + ethers.zeroPadValue(ethers.toBeHex(6), 16), context.mainController.address, canOnlyAddController.address, canOnlyEditPermissions.address, @@ -144,7 +145,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const key = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newController.address.substr(2); + newController.address.substring(2); await context.universalProfile .connect(context.mainController) @@ -175,9 +176,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).add(1).toNumber(); + const newLength = ethers.toBigInt(currentLength + 1); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); await context.universalProfile.connect(context.mainController).setData(key, value); @@ -191,9 +192,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).sub(1).toNumber(); + const newLength = ethers.toBigInt(currentLength - 1); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); await context.universalProfile.connect(context.mainController).setData(key, value); @@ -261,7 +262,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( // prettier-ignore const result = await context.universalProfile.getData(key); - expect(ethers.utils.getAddress(result)).to.equal(value); + expect(ethers.getAddress(result)).to.equal(value); }); it('should revert when setting a random 10 bytes value', async () => { @@ -387,9 +388,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).add(1).toNumber(); + const newLength = ethers.toBigInt(currentLength + 1); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); await context.universalProfile.connect(canOnlyAddController).setData(key, value); @@ -403,9 +404,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).sub(1).toNumber(); + const newLength = ethers.toBigInt(currentLength - 1); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); await expect(context.universalProfile.connect(canOnlyAddController).setData(key, value)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') @@ -529,7 +530,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const key = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newController.address.substr(2); + newController.address.substring(2); const value = PERMISSIONS.SETDATA; @@ -569,9 +570,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).add(1).toNumber(); + const newLength = ethers.toBigInt(currentLength + 1); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); await expect( context.universalProfile.connect(canOnlyEditPermissions).setData(key, value), @@ -585,9 +586,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).sub(1).toNumber(); + const newLength = ethers.toBigInt(currentLength - 1); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); await context.universalProfile.connect(canOnlyEditPermissions).setData(key, value); @@ -626,7 +627,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( // prettier-ignore const result = await context.universalProfile.getData(key); - expect(ethers.utils.getAddress(result)).to.equal(value); + expect(ethers.getAddress(result)).to.equal(value); }); it('should revert when setting a random 10 bytes value', async () => { @@ -722,7 +723,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const key = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newController.address.substr(2); + newController.address.substring(2); const value = PERMISSIONS.SETDATA; @@ -760,9 +761,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).add(1).toNumber(); + const newLength = ethers.toBigInt(currentLength + 1); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); await expect(context.universalProfile.connect(canOnlySetData).setData(key, value)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') @@ -774,9 +775,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).sub(1).toNumber(); + const newLength = ethers.toBigInt(currentLength - 1); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); await expect(context.universalProfile.connect(canOnlySetData).setData(key, value)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') @@ -848,9 +849,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( let addressesToEditPermissions: [SignerWithAddress, SignerWithAddress]; const allowedERC725YDataKeys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Second Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Third Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Second Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Third Key')), ]; let permissionKeys: string[]; @@ -887,7 +888,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( PERMISSIONS.TRANSFERVALUE, PERMISSIONS.TRANSFERVALUE, // AddressPermissions[].length - ethers.utils.hexZeroPad(ethers.utils.hexlify(5), 16), + ethers.zeroPadValue(ethers.toBeHex(5), 16), ]; }); @@ -906,17 +907,17 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyTwo = ethers.Wallet.createRandom(); const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My SecondKey Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My SecondKey Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyOne.address.substr(2), + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyTwo.address.substr(2), + newControllerKeyTwo.address.substring(2), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, ]; @@ -930,8 +931,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( it('(should pass): 2 x keys + change 2 x existing permissions', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My 1st Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My 2nd Key')), + ethers.keccak256(ethers.toUtf8Bytes('My 1st Key')), + ethers.keccak256(ethers.toUtf8Bytes('My 2nd Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + addressesToEditPermissions[0].address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -939,8 +940,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -956,8 +957,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyOne = ethers.Wallet.createRandom(); const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My SecondKey Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My SecondKey Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -965,8 +966,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SIGN, combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1003,11 +1004,11 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(5), 16), + ethers.zeroPadValue(ethers.toBeHex(5), 16), ]; await expect( @@ -1028,8 +1029,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1045,17 +1046,17 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyOne = ethers.Wallet.createRandom(); const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My SecondKey Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My SecondKey Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyOne.address.substr(2), + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - addressesToEditPermissions[0].address.substr(2), + addressesToEditPermissions[0].address.substring(2), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SIGN, combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1071,8 +1072,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyOne = ethers.Wallet.createRandom(); const newControllerKeyTwo = ethers.Wallet.createRandom(); - const NotAllowedERC725YDataKey = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('Not Allowed Data Key'), + const NotAllowedERC725YDataKey = ethers.keccak256( + ethers.toUtf8Bytes('Not Allowed Data Key'), ); // prettier-ignore @@ -1080,15 +1081,15 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( allowedERC725YDataKeys[0], NotAllowedERC725YDataKey, ERC725YDataKeys.LSP6["AddressPermissions:Permissions"] + - newControllerKeyOne.address.substr(2), + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6["AddressPermissions:Permissions"] + - newControllerKeyTwo.address.substr(2), + newControllerKeyTwo.address.substring(2), ]; // prettier-ignore const dataValues = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes("My First Value")), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes("Random data for not allowed value")), + ethers.hexlify(ethers.toUtf8Bytes("My First Value")), + ethers.hexlify(ethers.toUtf8Bytes("Random data for not allowed value")), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, ]; @@ -1107,17 +1108,17 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyTwo = ethers.Wallet.createRandom(); const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Second Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Second Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyOne.address.substr(2), + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyTwo.address.substr(2), + newControllerKeyTwo.address.substring(2), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, ]; @@ -1134,9 +1135,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ERC725YDataKeys.LSP6['AddressPermissions[]'].length, ); - const newPermissionsArrayLength = ethers.BigNumber.from(currentPermissionsArrayLength) - .add(1) - .toNumber(); + const newPermissionsArrayLength = ethers.toBigInt(currentPermissionsArrayLength + 1); const newControllerKeyOne = ethers.Wallet.createRandom(); const newControllerKeyTwo = ethers.Wallet.createRandom(); @@ -1145,18 +1144,18 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( allowedERC725YDataKeys[0], allowedERC725YDataKeys[1], ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyOne.address.substr(2), + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyTwo.address.substr(2), + newControllerKeyTwo.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions[]'].length, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(newPermissionsArrayLength), 16), + ethers.zeroPadValue(ethers.toBeHex(newPermissionsArrayLength), 16), ]; await context.universalProfile @@ -1184,14 +1183,14 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( allowedERC725YDataKeys[0], allowedERC725YDataKeys[1], ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyOne.address.substr(2), + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyTwo.address.substr(2), + newControllerKeyTwo.address.substring(2), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, ]; @@ -1210,7 +1209,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ERC725YDataKeys.LSP6['AddressPermissions[]'].length, ); - const newArrayLength = ethers.BigNumber.from(currentArrayLength).add(1).toNumber(); + const newArrayLength = ethers.toBigInt(currentArrayLength + 1); const keys = [ allowedERC725YDataKeys[0], @@ -1219,9 +1218,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), - ethers.utils.hexZeroPad(ethers.utils.hexlify(newArrayLength), 16), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), + ethers.zeroPadValue(ethers.toBeHex(newArrayLength), 16), ]; await expect( @@ -1240,14 +1239,14 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( allowedERC725YDataKeys[0], allowedERC725YDataKeys[1], ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - newControllerKeyOne.address.substr(2), + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - addressesToEditPermissions[0].address.substr(2), + addressesToEditPermissions[0].address.substring(2), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SIGN, combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1262,8 +1261,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( }); it('(should fail): edit permissions of 2 x existing controllers + (set 1 x allowed data key) + (set 1 x NOT allowed data key)', async () => { - const NotAllowedERC725YDataKey = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('Not Allowed Data Key'), + const NotAllowedERC725YDataKey = ethers.keccak256( + ethers.toUtf8Bytes('Not Allowed Data Key'), ); const keys = [ @@ -1278,8 +1277,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const values = [ combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random data for not allowed value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('Random data for not allowed value')), ]; await expect( @@ -1302,8 +1301,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1327,11 +1326,11 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', - ethers.utils.hexZeroPad(ethers.utils.hexlify(4), 16), + ethers.zeroPadValue(ethers.toBeHex(4), 16), ]; await context.universalProfile diff --git a/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedCalls.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedCalls.test.ts similarity index 99% rename from tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedCalls.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedCalls.test.ts index 7a77517f0..7be728539 100644 --- a/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedCalls.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedCalls.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, PERMISSIONS, INTERFACE_IDS, CALLTYPE } from '../../../../constants'; +import { ERC725YDataKeys, INTERFACE_IDS } from '../../../../constants'; +import { CALLTYPE, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; diff --git a/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedERC725YDataKeys.test.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedERC725YDataKeys.test.ts similarity index 92% rename from tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedERC725YDataKeys.test.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedERC725YDataKeys.test.ts index cfbe6cc53..1548d39d8 100644 --- a/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedERC725YDataKeys.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/SetPermissions/SetAllowedERC725YDataKeys.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, PERMISSIONS } from '../../../../constants'; +import { ERC725YDataKeys } from '../../../../constants'; +import { PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../../utils/context'; @@ -60,7 +61,7 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( encodeCompactBytesArray([ ERC725YDataKeys.LSP3['LSP3Profile'], // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Some Custom Profile Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Some Custom Profile Data Key")), ]), '0x11223344', '0x0000000000000000000000000000000000000000000000000000000000000000', @@ -81,9 +82,9 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( const value = encodeCompactBytesArray([ ERC725YDataKeys.LSP3['LSP3Profile'], // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Some Custom Profile Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Some Custom Profile Data Key")), // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Another Custom Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Another Custom Data Key")), ]); await expect(context.universalProfile.connect(canOnlyAddController).setData(key, value)) @@ -141,9 +142,9 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( const value = encodeCompactBytesArray([ // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("My Custom Profile Key 1")), + ethers.keccak256(ethers.toUtf8Bytes("My Custom Profile Key 1")), // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("My Custom Profile Key 2")), + ethers.keccak256(ethers.toUtf8Bytes("My Custom Profile Key 2")), ]); await context.universalProfile.connect(canOnlyAddController).setData(key, value); @@ -184,9 +185,9 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( const value = encodeCompactBytesArray([ ERC725YDataKeys.LSP3['LSP3Profile'], // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Some Custom Profile Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Some Custom Profile Data Key")), // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Another Custom Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Another Custom Data Key")), ]); await context.universalProfile.connect(canOnlyEditPermissions).setData(key, value); @@ -249,8 +250,8 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( newController.address.substr(2); const value = encodeCompactBytesArray([ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Custom Key 1')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Custom Key 2')), + ethers.keccak256(ethers.toUtf8Bytes('My Custom Key 1')), + ethers.keccak256(ethers.toUtf8Bytes('My Custom Key 2')), ]); await expect( diff --git a/tests/LSP20CallVerification/LSP6/index.ts b/packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/index.ts similarity index 100% rename from tests/LSP20CallVerification/LSP6/index.ts rename to packages/lsp-smart-contracts/tests/LSP20CallVerification/LSP6/index.ts diff --git a/tests/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts b/packages/lsp-smart-contracts/tests/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts similarity index 74% rename from tests/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts rename to packages/lsp-smart-contracts/tests/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts index b94465f54..9c2089ce3 100644 --- a/tests/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP23LinkedContractsDeployment/LSP23LinkedContractsDeployment.test.ts @@ -2,11 +2,12 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { - ILSP23LinkedContractsFactory, KeyManagerWithExtraParams, LSP6KeyManager, UniversalProfile, + ILSP23LinkedContractsFactory, } from '../../types'; + import { ERC725YDataKeys } from '../../constants'; import { calculateProxiesAddresses, @@ -14,6 +15,7 @@ import { createDataKey, deployImplementationContracts, } from './helpers'; +import { EventLog } from 'ethers'; describe('UniversalProfileDeployer', function () { describe('for non-proxies deployment', async function () { @@ -32,9 +34,11 @@ describe('UniversalProfileDeployer', function () { // universalProfileCreationCode = universalProfileBytecode + abi encoded address of upInitPostDeploymentModule const universalProfileCreationCode = universalProfileBytecode + - ethers.utils.defaultAbiCoder.encode(['address'], [upPostDeploymentModule.address]).slice(2); + ethers.AbiCoder.defaultAbiCoder() + .encode(['address'], [await upPostDeploymentModule.getAddress()]) + .slice(2); - const salt = ethers.utils.randomBytes(32); + const salt = ethers.randomBytes(32); const primaryContractDeployment: ILSP23LinkedContractsFactory.PrimaryContractDeploymentStruct = { @@ -45,7 +49,7 @@ describe('UniversalProfileDeployer', function () { const secondaryContractDeployment: ILSP23LinkedContractsFactory.SecondaryContractDeploymentStruct = { - fundingAmount: ethers.BigNumber.from(0), + fundingAmount: ethers.toBigInt(0), creationBytecode: keyManagerBytecode, addPrimaryContractAddress: true, extraConstructorParams: '0x', @@ -69,7 +73,7 @@ describe('UniversalProfileDeployer', function () { const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ ERC725YDataKeys.LSP3.LSP3Profile, // LSP3Metadata ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, // URD Address @@ -82,12 +86,12 @@ describe('UniversalProfileDeployer', function () { ERC725YDataKeys.LSP6['AddressPermissions[]'].index + create16BytesUint(2), // Index of the third address ], [ - ethers.utils.randomBytes(32), // LSP3Metadata + ethers.randomBytes(32), // LSP3Metadata universalReceiver.address, // URD Address allPermissionsSignerPermissionsValue, // URD Permissions allPermissionsSignerPermissionsValue, // Recovery Address permissions allPermissionsSignerPermissionsValue, // Signers permissions - ethers.utils.defaultAbiCoder.encode(['uint256'], [3]), // Address Permissions array length + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [3]), // Address Permissions array length universalReceiver.address, recoverySigner.address, allPermissionsSigner.address, @@ -96,17 +100,17 @@ describe('UniversalProfileDeployer', function () { // get the address of the UP and the KeyManager contracts const [upContract, keyManagerContract] = - await LSP23LinkedContractsFactory.callStatic.deployContracts( + await LSP23LinkedContractsFactory.deployContracts.staticCall( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, ); await LSP23LinkedContractsFactory.deployContracts( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, { // Need to specify gasLimit, otherwise Hardhat reverts strangely with the following error: @@ -119,29 +123,31 @@ describe('UniversalProfileDeployer', function () { await LSP23LinkedContractsFactory.computeAddresses( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, ); expect(upContract).to.equal(expectedUpAddress); expect(keyManagerContract).to.equal(expectedKeyManagerAddress); - const keyManagerInstance = KeyManagerFactory.attach(keyManagerContract) as LSP6KeyManager; + const keyManagerInstance = KeyManagerFactory.attach( + keyManagerContract, + ) as unknown as LSP6KeyManager; const universalProfileInstance = UniversalProfileFactory.attach( upContract, - ) as UniversalProfile; + ) as unknown as UniversalProfile; // CHECK that the UP is owned by the KeyManager contract expect(await universalProfileInstance.owner()).to.equal(keyManagerContract); // CHECK that the `target()` of the KeyManager contract is the UP contract - expect(await keyManagerInstance.target()).to.equal(upContract); + expect(await keyManagerInstance['target()'].staticCall()).to.equal(upContract); }); it('should deploy both contract (with value)', async function () { const [allPermissionsSigner, universalReceiver, recoverySigner] = await ethers.getSigners(); - const universalProfileFundAmount = ethers.utils.parseEther('1'); + const universalProfileFundAmount = ethers.parseEther('1'); const keyManagerBytecode = (await ethers.getContractFactory('LSP6KeyManager')).bytecode; const universalProfileBytecode = (await ethers.getContractFactory('UniversalProfile')) @@ -153,9 +159,11 @@ describe('UniversalProfileDeployer', function () { // universalProfileCreationCode = universalProfileBytecode + abi encoded address of upInitPostDeploymentModule const universalProfileCreationCode = universalProfileBytecode + - ethers.utils.defaultAbiCoder.encode(['address'], [upPostDeploymentModule.address]).slice(2); + ethers.AbiCoder.defaultAbiCoder() + .encode(['address'], [await upPostDeploymentModule.getAddress()]) + .slice(2); - const salt = ethers.utils.randomBytes(32); + const salt = ethers.randomBytes(32); const primaryContractDeployment: ILSP23LinkedContractsFactory.PrimaryContractDeploymentStruct = { @@ -190,7 +198,7 @@ describe('UniversalProfileDeployer', function () { const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ ERC725YDataKeys.LSP3.LSP3Profile, // LSP3Metadata ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, // URD Address @@ -203,12 +211,12 @@ describe('UniversalProfileDeployer', function () { ERC725YDataKeys.LSP6['AddressPermissions[]'].index + create16BytesUint(2), // Index of the third address ], [ - ethers.utils.randomBytes(32), // LSP3Metadata + ethers.randomBytes(32), // LSP3Metadata universalReceiver.address, // URD Address allPermissionsSignerPermissionsValue, // URD Permissions allPermissionsSignerPermissionsValue, // Recovery Address permissions allPermissionsSignerPermissionsValue, // Signers permissions - ethers.utils.defaultAbiCoder.encode(['uint256'], [3]), // Address Permissions array length + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [3]), // Address Permissions array length universalReceiver.address, recoverySigner.address, allPermissionsSigner.address, @@ -217,10 +225,10 @@ describe('UniversalProfileDeployer', function () { // get the address of the UP and the KeyManager contracts const [upContract, keyManagerContract] = - await LSP23LinkedContractsFactory.callStatic.deployContracts( + await LSP23LinkedContractsFactory.deployContracts.staticCall( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, { value: universalProfileFundAmount }, ); @@ -229,7 +237,7 @@ describe('UniversalProfileDeployer', function () { await LSP23LinkedContractsFactory.computeAddresses( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, ); @@ -240,7 +248,7 @@ describe('UniversalProfileDeployer', function () { it('should revert when values are wrong', async function () { const [allPermissionsSigner, universalReceiver, recoverySigner] = await ethers.getSigners(); - const universalProfileFundAmount = ethers.utils.parseEther('1'); + const universalProfileFundAmount = ethers.parseEther('1'); const keyManagerBytecode = (await ethers.getContractFactory('LSP6KeyManager')).bytecode; const universalProfileBytecode = (await ethers.getContractFactory('UniversalProfile')) @@ -252,9 +260,11 @@ describe('UniversalProfileDeployer', function () { // universalProfileCreationCode = universalProfileBytecode + abi encoded address of upInitPostDeploymentModule const universalProfileCreationCode = universalProfileBytecode + - ethers.utils.defaultAbiCoder.encode(['address'], [upPostDeploymentModule.address]).slice(2); + ethers.AbiCoder.defaultAbiCoder() + .encode(['address'], [await upPostDeploymentModule.getAddress()]) + .slice(2); - const salt = ethers.utils.randomBytes(32); + const salt = ethers.randomBytes(32); const primaryContractDeployment: ILSP23LinkedContractsFactory.PrimaryContractDeploymentStruct = { @@ -289,7 +299,7 @@ describe('UniversalProfileDeployer', function () { const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ ERC725YDataKeys.LSP3.LSP3Profile, // LSP3Metadata ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, // URD Address @@ -302,12 +312,12 @@ describe('UniversalProfileDeployer', function () { ERC725YDataKeys.LSP6['AddressPermissions[]'].index + create16BytesUint(2), // Index of the third address ], [ - ethers.utils.randomBytes(32), // LSP3Metadata + ethers.randomBytes(32), // LSP3Metadata universalReceiver.address, // URD Address allPermissionsSignerPermissionsValue, // URD Permissions allPermissionsSignerPermissionsValue, // Recovery Address permissions allPermissionsSignerPermissionsValue, // Signers permissions - ethers.utils.defaultAbiCoder.encode(['uint256'], [3]), // Address Permissions array length + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [3]), // Address Permissions array length universalReceiver.address, recoverySigner.address, allPermissionsSigner.address, @@ -316,12 +326,12 @@ describe('UniversalProfileDeployer', function () { // get the address of the UP and the KeyManager contracts await expect( - LSP23LinkedContractsFactory.callStatic.deployContracts( + LSP23LinkedContractsFactory.deployContracts.staticCall( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, - { value: universalProfileFundAmount.add(ethers.utils.parseEther('0.1')) }, + { value: universalProfileFundAmount + ethers.parseEther('0.1') }, ), ).to.be.revertedWithCustomError(LSP23LinkedContractsFactory, 'InvalidValueSum'); }); @@ -340,9 +350,11 @@ describe('UniversalProfileDeployer', function () { // universalProfileCreationCode = universalProfileBytecode + abi encoded address of upInitPostDeploymentModule const universalProfileCreationCode = universalProfileBytecode + - ethers.utils.defaultAbiCoder.encode(['address'], [upPostDeploymentModule.address]).slice(2); + ethers.AbiCoder.defaultAbiCoder() + .encode(['address'], [await upPostDeploymentModule.getAddress()]) + .slice(2); - const salt = ethers.utils.randomBytes(32); + const salt = ethers.randomBytes(32); const primaryContractDeployment: ILSP23LinkedContractsFactory.PrimaryContractDeploymentStruct = { @@ -351,16 +363,16 @@ describe('UniversalProfileDeployer', function () { creationBytecode: universalProfileCreationCode, }; - const firstAddress = ethers.utils.hexlify(ethers.utils.randomBytes(20)); + const firstAddress = ethers.hexlify(ethers.randomBytes(20)); - const secondaryContractFirstParam = ethers.utils.defaultAbiCoder.encode( + const secondaryContractFirstParam = ethers.AbiCoder.defaultAbiCoder().encode( ['address'], [firstAddress], ); - const lastAddress = ethers.utils.hexlify(ethers.utils.randomBytes(20)); + const lastAddress = ethers.hexlify(ethers.randomBytes(20)); - const secondaryContractLastParam = ethers.utils.defaultAbiCoder.encode( + const secondaryContractLastParam = ethers.AbiCoder.defaultAbiCoder().encode( ['address'], [lastAddress], ); @@ -393,7 +405,7 @@ describe('UniversalProfileDeployer', function () { const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ ERC725YDataKeys.LSP3.LSP3Profile, // LSP3Metadata ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, // URD Address @@ -406,12 +418,12 @@ describe('UniversalProfileDeployer', function () { ERC725YDataKeys.LSP6['AddressPermissions[]'].index + create16BytesUint(2), // Index of the third address ], [ - ethers.utils.randomBytes(32), // LSP3Metadata + ethers.randomBytes(32), // LSP3Metadata universalReceiver.address, // URD Address allPermissionsSignerPermissionsValue, // URD Permissions allPermissionsSignerPermissionsValue, // Recovery Address permissions allPermissionsSignerPermissionsValue, // Signers permissions - ethers.utils.defaultAbiCoder.encode(['uint256'], [3]), // Address Permissions array length + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [3]), // Address Permissions array length universalReceiver.address, recoverySigner.address, allPermissionsSigner.address, @@ -420,17 +432,17 @@ describe('UniversalProfileDeployer', function () { // get the address of the UP and the KeyManager contracts const [upContract, keyManagerContract] = - await LSP23LinkedContractsFactory.callStatic.deployContracts( + await LSP23LinkedContractsFactory.deployContracts.staticCall( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, ); await LSP23LinkedContractsFactory.deployContracts( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, { // Need to specify gasLimit, otherwise Hardhat reverts strangely with the following error: @@ -443,7 +455,7 @@ describe('UniversalProfileDeployer', function () { await LSP23LinkedContractsFactory.computeAddresses( primaryContractDeployment, secondaryContractDeployment, - upPostDeploymentModule.address, + await upPostDeploymentModule.getAddress(), encodedBytes, ); @@ -452,16 +464,16 @@ describe('UniversalProfileDeployer', function () { const keyManagerInstance = KeyManagerFactory.attach( keyManagerContract, - ) as KeyManagerWithExtraParams; + ) as unknown as KeyManagerWithExtraParams; const universalProfileInstance = UniversalProfileFactory.attach( upContract, - ) as UniversalProfile; + ) as unknown as UniversalProfile; // CHECK that the UP is owned by the KeyManager contract expect(await universalProfileInstance.owner()).to.equal(keyManagerContract); // CHECK that the `target()` of the KeyManager contract is the UP contract - expect(await keyManagerInstance.target()).to.equal(upContract); + expect(await keyManagerInstance['target()'].staticCall()).to.equal(upContract); expect(await keyManagerInstance.FIRST_PARAM()).to.deep.equal(firstAddress); expect(await keyManagerInstance.LAST_PARAM()).to.deep.equal(lastAddress); @@ -480,22 +492,22 @@ describe('UniversalProfileDeployer', function () { KeyManagerInitFactory, } = await deployImplementationContracts(); - const salt = ethers.utils.randomBytes(32); + const salt = ethers.randomBytes(32); const primaryContractDeploymentInit: ILSP23LinkedContractsFactory.PrimaryContractDeploymentInitStruct = { salt, fundingAmount: 0, - implementationContract: universalProfileInit.address, + implementationContract: await universalProfileInit.getAddress(), initializationCalldata: universalProfileInit.interface.encodeFunctionData('initialize', [ - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), ]), }; const secondaryContractDeploymentInit: ILSP23LinkedContractsFactory.SecondaryContractDeploymentInitStruct = { fundingAmount: 0, - implementationContract: keyManagerInit.address, + implementationContract: await keyManagerInit.getAddress(), addPrimaryContractAddress: true, initializationCalldata: '0xc4d66de8', extraInitializationParams: '0x', @@ -519,7 +531,7 @@ describe('UniversalProfileDeployer', function () { const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ ERC725YDataKeys.LSP3.LSP3Profile, // LSP3Metadata ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, // URD Address @@ -532,12 +544,12 @@ describe('UniversalProfileDeployer', function () { ERC725YDataKeys.LSP6['AddressPermissions[]'].index + create16BytesUint(2), // Index of the third address ], [ - ethers.utils.randomBytes(32), // LSP3Metadata + ethers.randomBytes(32), // LSP3Metadata universalReceiver.address, // URD Address allPermissionsSignerPermissionsValue, // URD Permissions allPermissionsSignerPermissionsValue, // Recovery Address permissions allPermissionsSignerPermissionsValue, // Signers permissions - ethers.utils.defaultAbiCoder.encode(['uint256'], [3]), // Address Permissions array length + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [3]), // Address Permissions array length universalReceiver.address, recoverySigner.address, allPermissionsSigner.address, @@ -546,31 +558,33 @@ describe('UniversalProfileDeployer', function () { // get the address of the UP and the KeyManager contracts const [upAddress, keyManagerAddress] = - await LSP23LinkedContractsFactory.callStatic.deployERC1167Proxies( + await LSP23LinkedContractsFactory.deployERC1167Proxies.staticCall( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, ); await LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, ); - const upProxy = UniversalProfileInitFactory.attach(upAddress); - const keyManagerProxy = KeyManagerInitFactory.attach(keyManagerAddress); + const upProxy = UniversalProfileInitFactory.attach(upAddress) as UniversalProfile; + const keyManagerProxy = KeyManagerInitFactory.attach( + keyManagerAddress, + ) as unknown as LSP6KeyManager; const upProxyOwner = await upProxy.owner(); - const keyManagerProxyOwner = await keyManagerProxy.target(); + const keyManagerProxyOwner = await keyManagerProxy['target()'].staticCall(); const [expectedUpProxyAddress, expectedKeyManagerProxyAddress] = await LSP23LinkedContractsFactory.computeERC1167Addresses( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, ); @@ -581,9 +595,9 @@ describe('UniversalProfileDeployer', function () { secondaryContractDeploymentInit.initializationCalldata, secondaryContractDeploymentInit.addPrimaryContractAddress, secondaryContractDeploymentInit.extraInitializationParams, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - LSP23LinkedContractsFactory.address, + await LSP23LinkedContractsFactory.getAddress(), ); expect(upAddress).to.equal(expectedUpProxyAddress); @@ -594,14 +608,14 @@ describe('UniversalProfileDeployer', function () { expect(keyManagerAddress).to.equal(expectedKeyManagerProxyAddress); expect(keyManagerAddress).to.equal(calculatedKMProxyAddress); - expect(upProxyOwner).to.equal(keyManagerProxy.address); - expect(upProxyOwner).to.equal(keyManagerProxy.address); - expect(keyManagerProxyOwner).to.equal(upProxy.address); - expect(keyManagerProxyOwner).to.equal(upProxy.address); + expect(upProxyOwner).to.equal(await keyManagerProxy.getAddress()); + expect(upProxyOwner).to.equal(await keyManagerProxy.getAddress()); + expect(keyManagerProxyOwner).to.equal(await upProxy.getAddress()); + expect(keyManagerProxyOwner).to.equal(await upProxy.getAddress()); }); it('should revert if the sent value is not equal to the sum of primary and secondary funding amounts', async function () { - const primaryFundingAmount = ethers.utils.parseEther('1'); - const secondaryFundingAmount = ethers.utils.parseEther('1'); + const primaryFundingAmount = ethers.parseEther('1'); + const secondaryFundingAmount = ethers.parseEther('1'); const { LSP23LinkedContractsFactory, @@ -610,22 +624,22 @@ describe('UniversalProfileDeployer', function () { keyManagerInit, } = await deployImplementationContracts(); - const salt = ethers.utils.randomBytes(32); + const salt = ethers.randomBytes(32); const primaryContractDeploymentInit: ILSP23LinkedContractsFactory.PrimaryContractDeploymentInitStruct = { salt, fundingAmount: primaryFundingAmount, - implementationContract: universalProfileInit.address, + implementationContract: await universalProfileInit.getAddress(), initializationCalldata: universalProfileInit.interface.encodeFunctionData('initialize', [ - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), ]), }; const secondaryContractDeploymentInit: ILSP23LinkedContractsFactory.SecondaryContractDeploymentInitStruct = { fundingAmount: secondaryFundingAmount, - implementationContract: keyManagerInit.address, + implementationContract: await keyManagerInit.getAddress(), addPrimaryContractAddress: true, initializationCalldata: '0xc4d66de8', extraInitializationParams: '0x', @@ -633,12 +647,12 @@ describe('UniversalProfileDeployer', function () { const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ ERC725YDataKeys.LSP3.LSP3Profile, // LSP3Metadata ], [ - ethers.utils.randomBytes(32), // LSP3Metadata + ethers.randomBytes(32), // LSP3Metadata ], ]); @@ -646,7 +660,7 @@ describe('UniversalProfileDeployer', function () { LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, { value: primaryFundingAmount }, // sending primary funding amount ), @@ -657,12 +671,10 @@ describe('UniversalProfileDeployer', function () { LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, { - value: primaryFundingAmount - .add(secondaryFundingAmount) - .add(ethers.utils.parseEther('0.1')), + value: primaryFundingAmount + secondaryFundingAmount + ethers.parseEther('0.1'), }, // Sending extra 0.1 ETH ), ).to.be.revertedWithCustomError(LSP23LinkedContractsFactory, 'InvalidValueSum'); @@ -675,60 +687,60 @@ describe('UniversalProfileDeployer', function () { keyManagerInit, } = await deployImplementationContracts(); - const salt = ethers.utils.randomBytes(32); - const primaryFundingAmount = ethers.utils.parseEther('1'); - const secondaryFundingAmount = ethers.utils.parseEther('0'); // key manager does not accept funds + const salt = ethers.randomBytes(32); + const primaryFundingAmount = ethers.parseEther('1'); + const secondaryFundingAmount = ethers.parseEther('0'); // key manager does not accept funds const primaryContractDeploymentInit: ILSP23LinkedContractsFactory.PrimaryContractDeploymentInitStruct = { salt, fundingAmount: primaryFundingAmount, - implementationContract: universalProfileInit.address, + implementationContract: await universalProfileInit.getAddress(), initializationCalldata: universalProfileInit.interface.encodeFunctionData('initialize', [ - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), ]), }; const secondaryContractDeploymentInit: ILSP23LinkedContractsFactory.SecondaryContractDeploymentInitStruct = { fundingAmount: secondaryFundingAmount, - implementationContract: keyManagerInit.address, + implementationContract: await keyManagerInit.getAddress(), addPrimaryContractAddress: true, initializationCalldata: '0xc4d66de8', extraInitializationParams: '0x', }; const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ERC725YDataKeys.LSP3.LSP3Profile], - [ethers.utils.randomBytes(32)], + [ethers.randomBytes(32)], ]); const [primaryAddress, secondaryAddress] = - await LSP23LinkedContractsFactory.callStatic.deployERC1167Proxies( + await LSP23LinkedContractsFactory.deployERC1167Proxies.staticCall( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount) }, + { value: primaryFundingAmount + secondaryFundingAmount }, ); await LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount) }, + { value: primaryFundingAmount + secondaryFundingAmount }, ); const primaryAddressBalance = await ethers.provider.getBalance(primaryAddress); const secondaryAddressBalance = await ethers.provider.getBalance(secondaryAddress); expect(primaryAddressBalance).to.equal(primaryFundingAmount); - expect(primaryAddress).to.not.equal(ethers.constants.AddressZero); + expect(primaryAddress).to.not.equal(ethers.ZeroAddress); expect(secondaryAddressBalance).to.equal(secondaryFundingAmount); - expect(secondaryAddress).to.not.equal(ethers.constants.AddressZero); + expect(secondaryAddress).to.not.equal(ethers.ZeroAddress); }); it('should successfully deploy primary and secondary proxies', async function () { const { @@ -738,53 +750,54 @@ describe('UniversalProfileDeployer', function () { keyManagerInit, } = await deployImplementationContracts(); - const salt = ethers.utils.randomBytes(32); - const primaryFundingAmount = ethers.utils.parseEther('1'); - const secondaryFundingAmount = ethers.utils.parseEther('0'); + const salt = ethers.randomBytes(32); + const primaryFundingAmount = ethers.parseEther('1'); + const secondaryFundingAmount = ethers.parseEther('0'); const primaryContractDeploymentInit = { salt, fundingAmount: primaryFundingAmount, - implementationContract: universalProfileInit.address, + implementationContract: await universalProfileInit.getAddress(), initializationCalldata: universalProfileInit.interface.encodeFunctionData('initialize', [ - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), ]), }; const secondaryContractDeploymentInit = { fundingAmount: secondaryFundingAmount, - implementationContract: keyManagerInit.address, + implementationContract: await keyManagerInit.getAddress(), addPrimaryContractAddress: true, initializationCalldata: '0xc4d66de8', extraInitializationParams: '0x', }; const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ERC725YDataKeys.LSP3.LSP3Profile], - [ethers.utils.randomBytes(32)], + [ethers.randomBytes(32)], ]); const [primaryAddress, secondaryAddress] = - await LSP23LinkedContractsFactory.callStatic.deployERC1167Proxies( + await LSP23LinkedContractsFactory.deployERC1167Proxies.staticCall( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount) }, + { value: primaryFundingAmount + secondaryFundingAmount }, ); await LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount), gasLimit: 30_000_000 }, + { value: primaryFundingAmount + secondaryFundingAmount, gasLimit: 30_000_000 }, ); - expect(primaryAddress).to.not.equal(ethers.constants.AddressZero); - expect(secondaryAddress).to.not.equal(ethers.constants.AddressZero); + expect(primaryAddress).to.not.equal(ethers.ZeroAddress); + expect(secondaryAddress).to.not.equal(ethers.ZeroAddress); }); + it('should deploy proxies with correct initialization calldata (with secondary contract contains extraParams)', async function () { const { LSP23LinkedContractsFactory, upInitPostDeploymentModule, universalProfileInit } = await deployImplementationContracts(); @@ -793,60 +806,60 @@ describe('UniversalProfileDeployer', function () { 'KeyManagerInitWithExtraParams', ); const keyManagerWithExtraParamsFactory = await KeyManagerWithExtraParamsFactory.deploy(); - await keyManagerWithExtraParamsFactory.deployed(); + await keyManagerWithExtraParamsFactory.waitForDeployment(); - const salt = ethers.utils.randomBytes(32); - const primaryFundingAmount = ethers.utils.parseEther('1'); - const secondaryFundingAmount = ethers.utils.parseEther('0'); + const salt = ethers.hexlify(ethers.randomBytes(32)); + const primaryFundingAmount = ethers.parseEther('1'); + const secondaryFundingAmount = ethers.parseEther('0'); const primaryContractDeploymentInit = { salt, fundingAmount: primaryFundingAmount, - implementationContract: universalProfileInit.address, + implementationContract: await universalProfileInit.getAddress(), initializationCalldata: universalProfileInit.interface.encodeFunctionData('initialize', [ - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), ]), }; - const firstAddress = ethers.utils.hexlify(ethers.utils.randomBytes(20)); - const firstParam = ethers.utils.defaultAbiCoder.encode(['address'], [firstAddress]); + const firstAddress = ethers.hexlify(ethers.randomBytes(20)); + const firstParam = ethers.AbiCoder.defaultAbiCoder().encode(['address'], [firstAddress]); const initializeWithExtraParamsSelector = '0x00dc68f1'; const initializationDataWithSelector = initializeWithExtraParamsSelector + firstParam.slice(2); - const lastAddress = ethers.utils.hexlify(ethers.utils.randomBytes(20)); - const lastParam = ethers.utils.defaultAbiCoder.encode(['address'], [lastAddress]); + const lastAddress = ethers.hexlify(ethers.randomBytes(20)); + const lastParam = ethers.AbiCoder.defaultAbiCoder().encode(['address'], [lastAddress]); const secondaryContractDeploymentInit = { fundingAmount: secondaryFundingAmount, - implementationContract: keyManagerWithExtraParamsFactory.address, + implementationContract: keyManagerWithExtraParamsFactory.target, addPrimaryContractAddress: true, initializationCalldata: initializationDataWithSelector, extraInitializationParams: lastParam, }; const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ERC725YDataKeys.LSP3.LSP3Profile], - [ethers.utils.randomBytes(32)], + [ethers.randomBytes(32)], ]); const [primaryAddress, secondaryAddress] = - await LSP23LinkedContractsFactory.callStatic.deployERC1167Proxies( + await LSP23LinkedContractsFactory.deployERC1167Proxies.staticCall( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount) }, + { value: primaryFundingAmount + secondaryFundingAmount }, ); await LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount), gasLimit: 30_000_000 }, + { value: primaryFundingAmount + secondaryFundingAmount, gasLimit: 30_000_000 }, ); const keyManagerWithExtraParams = KeyManagerWithExtraParamsFactory.attach(secondaryAddress); @@ -854,8 +867,8 @@ describe('UniversalProfileDeployer', function () { expect(await keyManagerWithExtraParams.firstParam()).to.deep.equal(firstAddress); expect(await keyManagerWithExtraParams.lastParam()).to.deep.equal(lastAddress); - expect(primaryAddress).to.not.equal(ethers.constants.AddressZero); - expect(secondaryAddress).to.not.equal(ethers.constants.AddressZero); + expect(primaryAddress).to.not.equal(ethers.ZeroAddress); + expect(secondaryAddress).to.not.equal(ethers.ZeroAddress); }); it('should emit DeployedERC1167Proxies event with correct parameters', async function () { const { @@ -865,61 +878,62 @@ describe('UniversalProfileDeployer', function () { keyManagerInit, } = await deployImplementationContracts(); - const salt = ethers.utils.randomBytes(32); - const primaryFundingAmount = ethers.utils.parseEther('1'); - const secondaryFundingAmount = ethers.utils.parseEther('0'); + const salt = ethers.randomBytes(32); + const primaryFundingAmount = ethers.parseEther('1'); + const secondaryFundingAmount = ethers.parseEther('0'); const primaryContractDeploymentInit = { salt, fundingAmount: primaryFundingAmount, - implementationContract: universalProfileInit.address, + implementationContract: await universalProfileInit.getAddress(), initializationCalldata: universalProfileInit.interface.encodeFunctionData('initialize', [ - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), ]), }; const secondaryContractDeploymentInit = { fundingAmount: secondaryFundingAmount, - implementationContract: keyManagerInit.address, + implementationContract: await keyManagerInit.getAddress(), addPrimaryContractAddress: true, initializationCalldata: '0xc4d66de8', extraInitializationParams: '0x', }; const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ERC725YDataKeys.LSP3.LSP3Profile], - [ethers.utils.randomBytes(32)], + [ethers.randomBytes(32)], ]); const [primaryAddress, secondaryAddress] = - await LSP23LinkedContractsFactory.callStatic.deployERC1167Proxies( + await LSP23LinkedContractsFactory.deployERC1167Proxies.staticCall( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount) }, + { value: primaryFundingAmount + secondaryFundingAmount }, ); const tx = await LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount) }, + { value: primaryFundingAmount + secondaryFundingAmount }, ); const receipt = await tx.wait(); - const event = receipt.events?.find((e) => e.event === 'DeployedERC1167Proxies'); + // const event = receipt.events?.find((e) => e.event === 'DeployedERC1167Proxies'); + const event = receipt.logs.find((e: EventLog) => e.eventName === 'DeployedERC1167Proxies'); expect(event).to.not.be.undefined; - const args = event.args; + const args = (event as EventLog).args; expect(args[0]).to.equal(primaryAddress); expect(args[1]).to.equal(secondaryAddress); - expect(args[2].salt).to.deep.equal(ethers.utils.hexlify(primaryContractDeploymentInit.salt)); + expect(args[2].salt).to.deep.equal(ethers.hexlify(primaryContractDeploymentInit.salt)); expect(args[2].fundingAmount).to.deep.equal(primaryContractDeploymentInit.fundingAmount); expect(args[2].implementationContract).to.deep.equal( primaryContractDeploymentInit.implementationContract, @@ -936,48 +950,48 @@ describe('UniversalProfileDeployer', function () { keyManagerInit, } = await deployImplementationContracts(); - const salt = ethers.utils.randomBytes(32); - const primaryFundingAmount = ethers.utils.parseEther('1'); + const salt = ethers.randomBytes(32); + const primaryFundingAmount = ethers.parseEther('1'); const secondaryFundingAmount = 0; const primaryContractDeploymentInit = { salt, fundingAmount: primaryFundingAmount, - implementationContract: universalProfileInit.address, + implementationContract: await universalProfileInit.getAddress(), initializationCalldata: universalProfileInit.interface.encodeFunctionData('initialize', [ - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), ]), }; const secondaryContractDeploymentInit = { fundingAmount: secondaryFundingAmount, - implementationContract: keyManagerInit.address, + implementationContract: await keyManagerInit.getAddress(), addPrimaryContractAddress: true, initializationCalldata: '0xc4d66de8', extraInitializationParams: '0x', }; const types = ['bytes32[]', 'bytes[]']; - const encodedBytes = ethers.utils.defaultAbiCoder.encode(types, [ + const encodedBytes = ethers.AbiCoder.defaultAbiCoder().encode(types, [ [ERC725YDataKeys.LSP3.LSP3Profile], - [ethers.utils.randomBytes(32)], + [ethers.randomBytes(32)], ]); await LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount) }, + { value: primaryFundingAmount + BigInt(secondaryFundingAmount) }, ); await expect( LSP23LinkedContractsFactory.deployERC1167Proxies( primaryContractDeploymentInit, secondaryContractDeploymentInit, - upInitPostDeploymentModule.address, + await upInitPostDeploymentModule.getAddress(), encodedBytes, - { value: primaryFundingAmount.add(secondaryFundingAmount) }, + { value: primaryFundingAmount + BigInt(secondaryFundingAmount) }, ), ).to.be.revertedWith('ERC1167: create2 failed'); }); diff --git a/tests/LSP23LinkedContractsDeployment/helpers.ts b/packages/lsp-smart-contracts/tests/LSP23LinkedContractsDeployment/helpers.ts similarity index 68% rename from tests/LSP23LinkedContractsDeployment/helpers.ts rename to packages/lsp-smart-contracts/tests/LSP23LinkedContractsDeployment/helpers.ts index 2622b5ab3..40192d1b3 100644 --- a/tests/LSP23LinkedContractsDeployment/helpers.ts +++ b/packages/lsp-smart-contracts/tests/LSP23LinkedContractsDeployment/helpers.ts @@ -1,6 +1,13 @@ import { ethers } from 'hardhat'; import { BytesLike } from 'ethers'; import { PromiseOrValue } from '../../types/common'; +import { + UniversalProfileInit__factory, + LSP6KeyManagerInit__factory, + LSP23LinkedContractsFactory__factory, + UniversalProfileInitPostDeploymentModule__factory, + UniversalProfilePostDeploymentModule__factory, +} from '../../types'; export async function calculateProxiesAddresses( salt: PromiseOrValue, @@ -13,8 +20,8 @@ export async function calculateProxiesAddresses( postDeploymentCalldata: BytesLike, linkedContractsFactoryAddress: string, ): Promise<[string, string]> { - const generatedSalt = ethers.utils.keccak256( - ethers.utils.defaultAbiCoder.encode( + const generatedSalt = ethers.keccak256( + ethers.AbiCoder.defaultAbiCoder().encode( ['bytes32', 'address', 'bytes', 'bool', 'bytes', 'address', 'bytes'], [ salt, @@ -28,20 +35,20 @@ export async function calculateProxiesAddresses( ), ); - const expectedPrimaryContractAddress = ethers.utils.getCreate2Address( + const expectedPrimaryContractAddress = ethers.getCreate2Address( linkedContractsFactoryAddress, generatedSalt, - ethers.utils.keccak256( + ethers.keccak256( '0x3d602d80600a3d3981f3363d3d373d3d3d363d73' + (primaryImplementationContractAddress as string).slice(2) + '5af43d82803e903d91602b57fd5bf3', ), ); - const expectedSecondaryContractAddress = ethers.utils.getCreate2Address( + const expectedSecondaryContractAddress = ethers.getCreate2Address( linkedContractsFactoryAddress, - ethers.utils.keccak256(expectedPrimaryContractAddress), - ethers.utils.keccak256( + ethers.keccak256(expectedPrimaryContractAddress), + ethers.keccak256( '0x3d602d80600a3d3981f3363d3d373d3d3d363d73' + (secondaryImplementationContractAddress as string).slice(2) + '5af43d82803e903d91602b57fd5bf3', @@ -56,28 +63,28 @@ export function createDataKey(prefix, address) { } export const create16BytesUint = (value: number) => { - return ethers.utils.hexZeroPad(ethers.utils.hexlify(value), 16).slice(2); + return ethers.zeroPadValue(ethers.toBeHex(value), 16).slice(2); }; export async function deployImplementationContracts() { - const KeyManagerInitFactory = await ethers.getContractFactory('LSP6KeyManagerInit'); + const [deployer] = await ethers.getSigners(); + + const KeyManagerInitFactory = new LSP6KeyManagerInit__factory(deployer); const keyManagerInit = await KeyManagerInitFactory.deploy(); - const UniversalProfileInitFactory = await ethers.getContractFactory('UniversalProfileInit'); + const UniversalProfileInitFactory = new UniversalProfileInit__factory(deployer); const universalProfileInit = await UniversalProfileInitFactory.deploy(); - const LinkedContractsFactoryFactory = await ethers.getContractFactory( - 'LSP23LinkedContractsFactory', - ); + const LinkedContractsFactoryFactory = new LSP23LinkedContractsFactory__factory(deployer); const LSP23LinkedContractsFactory = await LinkedContractsFactoryFactory.deploy(); - const UPPostDeploymentManagerFactory = await ethers.getContractFactory( - 'UniversalProfilePostDeploymentModule', + const UPPostDeploymentManagerFactory = new UniversalProfilePostDeploymentModule__factory( + deployer, ); const upPostDeploymentModule = await UPPostDeploymentManagerFactory.deploy(); - const UPInitPostDeploymentManagerFactory = await ethers.getContractFactory( - 'UniversalProfileInitPostDeploymentModule', + const UPInitPostDeploymentManagerFactory = new UniversalProfileInitPostDeploymentModule__factory( + deployer, ); const upInitPostDeploymentModule = await UPInitPostDeploymentManagerFactory.deploy(); diff --git a/tests/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour.ts similarity index 77% rename from tests/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour.ts index 68579e129..91c752f8d 100644 --- a/tests/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // LSP7 + LSP8 import { LSP7DigitalAsset, LSP8IdentifiableDigitalAsset, LSP9Vault } from '../../types'; @@ -27,9 +27,9 @@ export const shouldBehaveLikeLSP4DigitalAssetMetadata = ( describe('when setting data on ERC725Y storage', () => { describe('when sending value while setting data', () => { it('should revert with `setData`', async () => { - const msgValue = ethers.utils.parseEther('2'); - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(256)); + const msgValue = ethers.parseEther('2'); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(256)); await expect( context.contract @@ -39,9 +39,9 @@ export const shouldBehaveLikeLSP4DigitalAssetMetadata = ( }); it('should revert with `setDataBatch`', async () => { - const msgValue = ethers.utils.parseEther('2'); - const key = [ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key'))]; - const value = [ethers.utils.hexlify(ethers.utils.randomBytes(256))]; + const msgValue = ethers.parseEther('2'); + const key = [ethers.keccak256(ethers.toUtf8Bytes('My Key'))]; + const value = [ethers.hexlify(ethers.randomBytes(256))]; await expect( context.contract @@ -53,7 +53,7 @@ export const shouldBehaveLikeLSP4DigitalAssetMetadata = ( it('should revert when trying to edit Token Name', async () => { const key = ERC725YDataKeys.LSP4['LSP4TokenName']; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Overriden Token Name')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Overriden Token Name')); expect( context.contract.connect(context.deployParams.owner).setData(key, value), @@ -62,7 +62,7 @@ export const shouldBehaveLikeLSP4DigitalAssetMetadata = ( it('should revert when trying to edit Token Symbol', async () => { const key = ERC725YDataKeys.LSP4['LSP4TokenSymbol']; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('BAD')); + const value = ethers.hexlify(ethers.toUtf8Bytes('BAD')); expect( context.contract.connect(context.deployParams.owner).setData(key, value), @@ -80,8 +80,8 @@ export const shouldBehaveLikeLSP4DigitalAssetMetadata = ( describe('when setting a data key with a value less than 256 bytes', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(200)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(200)); await expect(context.contract.connect(context.deployParams.owner).setData(key, value)) .to.emit(context.contract, 'DataChanged') @@ -94,8 +94,8 @@ export const shouldBehaveLikeLSP4DigitalAssetMetadata = ( describe('when setting a data key with a value more than 256 bytes', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect(context.contract.connect(context.deployParams.owner).setData(key, value)) .to.emit(context.contract, 'DataChanged') @@ -108,8 +108,8 @@ export const shouldBehaveLikeLSP4DigitalAssetMetadata = ( describe('when setting a data key with a value exactly 256 bytes long', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(256)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(256)); await expect(context.contract.connect(context.deployParams.owner).setData(key, value)) .to.emit(context.contract, 'DataChanged') diff --git a/tests/LSP6KeyManager/Admin/PermissionChangeAddExtensions.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeAddExtensions.test.ts similarity index 92% rename from tests/LSP6KeyManager/Admin/PermissionChangeAddExtensions.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeAddExtensions.test.ts index 561c9b5db..c715bf8f6 100644 --- a/tests/LSP6KeyManager/Admin/PermissionChangeAddExtensions.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeAddExtensions.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -47,27 +48,27 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( extensionHandlerKey1 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded extensionHandlerKey2 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded extensionHandlerKey3 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded extensionHandlerKey4 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded extensionHandlerKey5 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(4)).substring(2) + // function selector + ethers.hexlify(ethers.randomBytes(4)).substring(2) + // function selector '00000000000000000000000000000000'; // zero padded [extensionA, extensionB, extensionC, extensionD] = getRandomAddresses(4); @@ -107,9 +108,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( encodeCompactBytesArray([ // Adding the Extension Handler Keys as AllowedERC725YDataKey to test if it break the behavior ERC725YDataKeys.LSP17.LSP17ExtensionPrefix, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), ]), PERMISSIONS.CALL, ]; @@ -126,7 +127,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( ]; permissionArrayValues = [ - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), + ethers.zeroPadValue(ethers.toBeHex(7), 16), context.mainController.address, canAddAndChangeExtensions.address, canOnlyAddExtensions.address, @@ -197,14 +198,14 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert when adding the KeyManager address as extensions for lsp20VerifyCall function', async () => { const lsp20VerifyCallSelector = - context.keyManager.interface.getSighash('lsp20VerifyCall'); + context.keyManager.interface.getFunction('lsp20VerifyCall').selector; const payloadParam = { dataKey: ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + lsp20VerifyCallSelector.slice(2) + '00000000000000000000000000000000', // zero padded, - dataValue: context.keyManager.address, + dataValue: await context.keyManager.getAddress(), }; const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -222,14 +223,14 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert when adding the KeyManager address as extensions for lsp20VerifyCallResult function', async () => { const lsp20VerifyCallResultSelector = - context.keyManager.interface.getSighash('lsp20VerifyCallResult'); + context.keyManager.interface.getFunction('lsp20VerifyCallResult').selector; const payloadParam = { dataKey: ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + lsp20VerifyCallResultSelector.slice(2) + '00000000000000000000000000000000', // zero padded, - dataValue: context.keyManager.address, + dataValue: await context.keyManager.getAddress(), }; const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -247,10 +248,10 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should pass when adding the random address as extensions for lsp20VerifyCall and lsp20VerifyCallResult functions', async () => { const lsp20VerifyCallSelector = - context.keyManager.interface.getSighash('lsp20VerifyCall'); + context.keyManager.interface.getFunction('lsp20VerifyCall').selector; const lsp20VerifyCallResultSelector = - context.keyManager.interface.getSighash('lsp20VerifyCallResult'); + context.keyManager.interface.getFunction('lsp20VerifyCallResult').selector; const payloadParam = { dataKeys: [ @@ -279,7 +280,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should be allowed to set a 20 bytes long address', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase(); await context.universalProfile.connect(context.mainController).setData(key, value); @@ -291,7 +292,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should be allowed to set a 21 bytes long address', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase() + '00'; await context.universalProfile.connect(context.mainController).setData(key, value); @@ -303,7 +304,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert when setting a random 10 bytes value', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xcafecafecafecafecafe'; await expect( @@ -316,7 +317,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert when setting a random 30 bytes value', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef'; await expect( @@ -384,7 +385,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should be allowed to set a 20 bytes long address', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase(); await context.universalProfile.connect(canAddAndChangeExtensions).setData(key, value); @@ -396,7 +397,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should be allowed to set a 21 bytes long address', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase() + '00'; await context.universalProfile.connect(canAddAndChangeExtensions).setData(key, value); @@ -408,7 +409,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert when setting a random 10 bytes value', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xcafecafecafecafecafe'; await expect( @@ -421,7 +422,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert when setting a random 30 bytes value', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef'; await expect( @@ -454,7 +455,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should be allowed to set a 20 bytes long address for a new handler', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase(); await context.universalProfile.connect(canOnlyAddExtensions).setData(key, value); @@ -466,7 +467,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should be allowed to set a 21 bytes long address for a new handler', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase() + '00'; await context.universalProfile.connect(canOnlyAddExtensions).setData(key, value); @@ -478,7 +479,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert with `InvalidDataValuesForDataKeys` when setting a random 10 bytes value for a new handler', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xcafecafecafecafecafe'; await expect( @@ -491,7 +492,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert with `InvalidDataValuesForDataKeys` when setting a random 30 bytes value for a new handler', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef'; await expect( @@ -592,7 +593,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should NOT be allowed to set a 20 bytes long address for a new handler', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase(); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -608,7 +609,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should NOT be allowed to set a 21 bytes long address for a new handler', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = ethers.Wallet.createRandom().address.toLowerCase() + '00'; const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -624,7 +625,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert with `InvalidValueForDataKey` error when setting a random 10 bytes value for a new handler', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xcafecafecafecafecafe'; await expect( @@ -637,7 +638,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( it('should revert with `InvalidValueForDataKey` error when setting a random 30 bytes value for a new handler', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const randomValue = '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef'; await expect( @@ -890,13 +891,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( dataKeys: [ extensionHandlerKey5, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], - dataValues: [ - extensionA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), - '0xaabbccdd', + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], + dataValues: [extensionA, ethers.zeroPadValue(ethers.toBeHex(7), 16), '0xaabbccdd'], }; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -916,13 +913,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( dataKeys: [ extensionHandlerKey5, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ], - dataValues: [ - extensionB, - ethers.utils.hexZeroPad(ethers.utils.hexlify(8), 16), - '0xaabb', + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), ], + dataValues: [extensionB, ethers.zeroPadValue(ethers.toBeHex(8), 16), '0xaabb'], }; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -942,9 +935,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( dataKeys: [ extensionHandlerKey5, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), ], - dataValues: ['0x', ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), '0x'], + dataValues: ['0x', ethers.zeroPadValue(ethers.toBeHex(7), 16), '0x'], }; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -967,13 +960,9 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( dataKeys: [ extensionHandlerKey5, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], - dataValues: [ - extensionA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), - '0xaabbccdd', + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], + dataValues: [extensionA, ethers.zeroPadValue(ethers.toBeHex(7), 16), '0xaabbccdd'], }; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -990,10 +979,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when adding a ExtensionHandler and ERC725Y Data Key', () => { it("should revert because of caller don't have SETDATA Permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey5, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey5, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -1087,10 +1073,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when adding a ExtensionHandler and ERC725Y Data Key', () => { it("should revert because of caller don't have SETDATA Permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey4, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -1140,7 +1123,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( extensionHandlerKey5, extensionHandlerKey1, extensionHandlerKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [extensionA, extensionB, extensionC, '0xaabbccdd'], }; @@ -1227,10 +1210,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when adding a ExtensionHandler and ERC725Y Data Key', () => { it("should revert because of caller don't have SETDATA Permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey4, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -1268,10 +1248,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when Adding multiple ExtensionHandler keys with adding ERC725Y Data Key', () => { it("should revert because caller don't have ADDExtensions permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey4, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -1309,10 +1286,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( describe('when Adding multiple ExtensionHandler keys with adding other allowedERC725YDataKey', () => { it("should revert because caller don't have ADDExtensions permission", async () => { const payloadParam = { - dataKeys: [ - extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), - ], + dataKeys: [extensionHandlerKey4, ethers.keccak256(ethers.toUtf8Bytes('MyKey'))], dataValues: [extensionA, '0xaabbccdd'], }; @@ -1350,7 +1324,7 @@ export const shouldBehaveLikePermissionChangeOrAddExtensions = ( const payloadParam = { dataKeys: [ extensionHandlerKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), ], dataValues: [extensionA, '0xaabbccdd'], }; diff --git a/tests/LSP6KeyManager/Admin/PermissionChangeAddURD.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeAddURD.test.ts similarity index 96% rename from tests/LSP6KeyManager/Admin/PermissionChangeAddURD.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeAddURD.test.ts index 8474edacf..27d0cd352 100644 --- a/tests/LSP6KeyManager/Admin/PermissionChangeAddURD.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeAddURD.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -49,19 +50,19 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( universalReceiverDelegateKey1 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(32)).substring(2, 42); + ethers.hexlify(ethers.randomBytes(32)).substring(2, 42); universalReceiverDelegateKey2 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(32)).substring(2, 42); + ethers.hexlify(ethers.randomBytes(32)).substring(2, 42); universalReceiverDelegateKey3 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(32)).substring(2, 42); + ethers.hexlify(ethers.randomBytes(32)).substring(2, 42); universalReceiverDelegateKey4 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(32)).substring(2, 42); + ethers.hexlify(ethers.randomBytes(32)).substring(2, 42); [ universalReceiverDelegateA, @@ -109,9 +110,9 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( // Adding the LSP1 Keys as AllowedERC725YDataKey to test if it break the behavior ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix, ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), ]), PERMISSIONS.CALL, ]; @@ -128,7 +129,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( ]; permissionArrayValues = [ - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), + ethers.zeroPadValue(ethers.toBeHex(7), 16), context.mainController.address, canAddAndChangeUniversalReceiverDelegate.address, canOnlyAddUniversalReceiverDelegate.address, @@ -603,11 +604,11 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [ universalReceiverDelegateA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), + ethers.zeroPadValue(ethers.toBeHex(7), 16), '0xaabbccdd', ], }; @@ -629,11 +630,11 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), ], dataValues: [ universalReceiverDelegateB, - ethers.utils.hexZeroPad(ethers.utils.hexlify(8), 16), + ethers.zeroPadValue(ethers.toBeHex(8), 16), '0xaabb', ], }; @@ -655,9 +656,9 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), ], - dataValues: ['0x', ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), '0x'], + dataValues: ['0x', ethers.zeroPadValue(ethers.toBeHex(7), 16), '0x'], }; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -680,11 +681,11 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions[]'].length, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [ universalReceiverDelegateA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(7), 16), + ethers.zeroPadValue(ethers.toBeHex(7), 16), '0xaabbccdd', ], }; @@ -707,7 +708,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -816,7 +817,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -875,7 +876,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, universalReceiverDelegateKey1, universalReceiverDelegateKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [ universalReceiverDelegateA, @@ -988,7 +989,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -1030,7 +1031,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -1074,7 +1075,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; @@ -1114,7 +1115,7 @@ export const shouldBehaveLikePermissionChangeOrAddURD = ( const payloadParam = { dataKeys: [ universalReceiverDelegateKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), ], dataValues: [universalReceiverDelegateA, '0xaabbccdd'], }; diff --git a/tests/LSP6KeyManager/Admin/PermissionChangeOwner.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeOwner.test.ts similarity index 84% rename from tests/LSP6KeyManager/Admin/PermissionChangeOwner.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeOwner.test.ts index 4922faf24..55413cb7c 100644 --- a/tests/LSP6KeyManager/Admin/PermissionChangeOwner.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionChangeOwner.test.ts @@ -1,10 +1,13 @@ import { expect } from 'chai'; import { ethers, network } from 'hardhat'; -import { BigNumber, ContractTransaction } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { ContractTransaction } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, PERMISSIONS, OPERATION_TYPES, LSP25_VERSION } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { PERMISSIONS } from '@lukso/lsp6-contracts'; +import { LSP25_VERSION } from '@lukso/lsp25-contracts'; import { LSP6KeyManager, LSP6KeyManager__factory } from '../../../types'; @@ -15,7 +18,7 @@ import { EIP191Signer } from '@lukso/eip191-signer.js'; import { LOCAL_PRIVATE_KEYS } from '../../utils/helpers'; export const shouldBehaveLikePermissionChangeOwner = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -30,23 +33,23 @@ export const shouldBehaveLikePermissionChangeOwner = ( let permissionsValues: string[]; before(async () => { - context = await buildContext(ethers.utils.parseEther('20')); + context = await buildContext(ethers.parseEther('20')); canChangeOwner = context.accounts[1]; cannotChangeOwner = context.accounts[2]; newKeyManager = await new LSP6KeyManager__factory(context.mainController).deploy( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); transferOwnershipPayload = context.universalProfile.interface.encodeFunctionData( 'transferOwnership', - [newKeyManager.address], + [await newKeyManager.getAddress()], ); resetOwnershipPayload = context.universalProfile.interface.encodeFunctionData( 'transferOwnership', - [ethers.constants.AddressZero], + [ethers.ZeroAddress], ); permissionsKeys = [ @@ -64,7 +67,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('should revert', async () => { const transferOwnershipPayload = context.universalProfile.interface.encodeFunctionData( 'transferOwnership', - [context.universalProfile.address], + [await context.universalProfile.getAddress()], ); await expect( @@ -98,7 +101,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('should have set newKeyManager as pendingOwner', async () => { const pendingOwner = await context.universalProfile.pendingOwner(); - expect(pendingOwner).to.equal(newKeyManager.address); + expect(pendingOwner).to.equal(await newKeyManager.getAddress()); }); it('owner should remain the current KeyManager', async () => { @@ -106,15 +109,15 @@ export const shouldBehaveLikePermissionChangeOwner = ( const transferOwnershipPayload = context.universalProfile.interface.encodeFunctionData( 'transferOwnership', - [newKeyManager.address], + [await newKeyManager.getAddress()], ); await context.keyManager.connect(context.mainController).execute(transferOwnershipPayload); const ownerAfter = await context.universalProfile.owner(); - expect(ownerBefore).to.equal(context.keyManager.address); - expect(ownerAfter).to.equal(context.keyManager.address); + expect(ownerBefore).to.equal(await context.keyManager.getAddress()); + expect(ownerAfter).to.equal(await context.keyManager.getAddress()); }); describe('it should still be possible to call onlyOwner functions via the old KeyManager', () => { @@ -135,7 +138,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('execute(...) - LYX transfer', async () => { const recipient = context.accounts[8]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -162,7 +165,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( ); // checksum the address of the pendingOwner fetched from the storage - const pendingOwner = ethers.utils.getAddress(await context.universalProfile.pendingOwner()); + const pendingOwner = ethers.getAddress(await context.universalProfile.pendingOwner()); expect(pendingOwner).to.equal(overridenPendingOwner); }); }); @@ -178,7 +181,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('should have set newKeyManager as pendingOwner', async () => { const pendingOwner = await context.universalProfile.pendingOwner(); - expect(pendingOwner).to.equal(newKeyManager.address); + expect(pendingOwner).to.equal(await newKeyManager.getAddress()); }); it('owner should remain the current KeyManager', async () => { @@ -186,32 +189,32 @@ export const shouldBehaveLikePermissionChangeOwner = ( const transferOwnershipPayload = context.universalProfile.interface.encodeFunctionData( 'transferOwnership', - [newKeyManager.address], + [await newKeyManager.getAddress()], ); await context.keyManager.connect(canChangeOwner).execute(transferOwnershipPayload); const ownerAfter = await context.universalProfile.owner(); - expect(ownerBefore).to.equal(context.keyManager.address); - expect(ownerAfter).to.equal(context.keyManager.address); + expect(ownerBefore).to.equal(await context.keyManager.getAddress()); + expect(ownerAfter).to.equal(await context.keyManager.getAddress()); }); it('should override the pendingOwner when transferOwnership(...) is called twice', async () => { const overridenPendingOwner = await new LSP6KeyManager__factory( context.mainController, - ).deploy(context.universalProfile.address); + ).deploy(await context.universalProfile.getAddress()); await context.keyManager .connect(canChangeOwner) .execute( context.universalProfile.interface.encodeFunctionData('transferOwnership', [ - overridenPendingOwner.address, + await overridenPendingOwner.getAddress(), ]), ); const pendingOwner = await context.universalProfile.pendingOwner(); - expect(pendingOwner).to.equal(overridenPendingOwner.address); + expect(pendingOwner).to.equal(await overridenPendingOwner.getAddress()); }); }); }); @@ -223,14 +226,14 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('should revert', async () => { const notPendingKeyManager = await new LSP6KeyManager__factory(context.accounts[5]).deploy( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); - const payload = context.universalProfile.interface.getSighash('acceptOwnership'); + const payload = context.universalProfile.interface.getFunction('acceptOwnership').selector; await expect(notPendingKeyManager.connect(context.mainController).execute(payload)) .to.be.revertedWithCustomError(context.keyManager, 'NoPermissionsSet') - .withArgs(notPendingKeyManager.address); + .withArgs(await notPendingKeyManager.getAddress()); }); }); @@ -240,12 +243,12 @@ export const shouldBehaveLikePermissionChangeOwner = ( before('`transferOwnership(...)` to new Key Manager', async () => { await context.universalProfile .connect(context.mainController) - .transferOwnership(newKeyManager.address); + .transferOwnership(await newKeyManager.getAddress()); pendingOwner = await context.universalProfile.pendingOwner(); const acceptOwnershipPayload = - context.universalProfile.interface.getSighash('acceptOwnership'); + context.universalProfile.interface.getFunction('acceptOwnership').selector; await newKeyManager.connect(context.mainController).execute(acceptOwnershipPayload); }); @@ -257,7 +260,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('should have cleared the pendingOwner after transfering ownership', async () => { const newPendingOwner = await context.universalProfile.pendingOwner(); - expect(newPendingOwner).to.equal(ethers.constants.AddressZero); + expect(newPendingOwner).to.equal(ethers.ZeroAddress); }); }); @@ -281,12 +284,12 @@ export const shouldBehaveLikePermissionChangeOwner = ( await expect(oldKeyManager.connect(context.mainController).execute(payload)) .to.be.revertedWithCustomError(newKeyManager, 'NoPermissionsSet') - .withArgs(oldKeyManager.address); + .withArgs(await oldKeyManager.getAddress()); }); it('should revert with error `NoPermissionsSet` when calling `execute(...)`', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -297,7 +300,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( await expect(oldKeyManager.connect(context.mainController).execute(payload)) .to.be.revertedWithCustomError(newKeyManager, 'NoPermissionsSet') - .withArgs(oldKeyManager.address); + .withArgs(await oldKeyManager.getAddress()); }); }); @@ -319,7 +322,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( it('execute(...) - LYX transfer', async () => { const recipient = context.accounts[3]; - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -342,7 +345,8 @@ export const shouldBehaveLikePermissionChangeOwner = ( let renounceOwnershipSecondTx: ContractTransaction; before(async () => { - const payload = context.universalProfile.interface.getSighash('renounceOwnership'); + const payload = + context.universalProfile.interface.getFunction('renounceOwnership').selector; // 1st call renounceOwnershipFirstTx = await newKeyManager @@ -350,7 +354,7 @@ export const shouldBehaveLikePermissionChangeOwner = ( .execute(payload); // mine 200 blocks - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(200)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(200)]); // 2nd call renounceOwnershipSecondTx = await newKeyManager @@ -373,13 +377,11 @@ export const shouldBehaveLikePermissionChangeOwner = ( }); it('should clear the `pendingOwner` and set it to `AddressZero`', async () => { - expect(await context.universalProfile.pendingOwner()).to.equal( - ethers.constants.AddressZero, - ); + expect(await context.universalProfile.pendingOwner()).to.equal(ethers.ZeroAddress); }); it('should update the owner to `AddressZero`', async () => { - expect(await context.universalProfile.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.universalProfile.owner()).to.equal(ethers.ZeroAddress); }); }); @@ -395,7 +397,8 @@ export const shouldBehaveLikePermissionChangeOwner = ( // ------------------------------- // ------ General variables for relay call ------ - const payload = context.universalProfile.interface.getSighash('renounceOwnership'); + const payload = + context.universalProfile.interface.getFunction('renounceOwnership').selector; const eip191Signer = new EIP191Signer(); const HARDHAT_CHAINID = 31337; const validityTimestamps = 0; @@ -405,13 +408,13 @@ export const shouldBehaveLikePermissionChangeOwner = ( // ------ 1st call ------ const firstNonce = await context.keyManager.getNonce(context.mainController.address, 0); - const firstEncodedMessage = ethers.utils.solidityPack( + const firstEncodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [LSP25_VERSION, HARDHAT_CHAINID, firstNonce, validityTimestamps, valueToSend, payload], ); const firstSignature = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), firstEncodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT0, ).signature; @@ -424,18 +427,18 @@ export const shouldBehaveLikePermissionChangeOwner = ( // ---------------------- // mine 200 blocks - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(200)]); + await network.provider.send('hardhat_mine', [ethers.toQuantity(200)]); // ------ 2nd call ------ const secondNonce = await context.keyManager.getNonce(context.mainController.address, 0); - const secondEncodedMessage = ethers.utils.solidityPack( + const secondEncodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [LSP25_VERSION, HARDHAT_CHAINID, secondNonce, validityTimestamps, valueToSend, payload], ); const secondSignature = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), secondEncodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT0, ).signature; @@ -463,13 +466,11 @@ export const shouldBehaveLikePermissionChangeOwner = ( }); it('should clear the `pendingOwner` and set it to `AddressZero`', async () => { - expect(await context.universalProfile.pendingOwner()).to.equal( - ethers.constants.AddressZero, - ); + expect(await context.universalProfile.pendingOwner()).to.equal(ethers.ZeroAddress); }); it('should update the owner to `AddressZero`', async () => { - expect(await context.universalProfile.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.universalProfile.owner()).to.equal(ethers.ZeroAddress); }); }); }); diff --git a/tests/LSP6KeyManager/Admin/PermissionSign.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionSign.test.ts similarity index 76% rename from tests/LSP6KeyManager/Admin/PermissionSign.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionSign.test.ts index c3e517d78..c40144dbb 100644 --- a/tests/LSP6KeyManager/Admin/PermissionSign.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Admin/PermissionSign.test.ts @@ -1,10 +1,12 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { EIP191Signer } from '@lukso/eip191-signer.js'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS, ERC1271_VALUES } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ERC1271_VALUES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -40,10 +42,10 @@ export const shouldBehaveLikePermissionSign = (buildContext: () => Promise { describe('should verify the signature, regardless of how it was signed', () => { it('e.g: with Ethereum signed message', async () => { - const messageHash = ethers.utils.hashMessage(dataToSign); + const messageHash = ethers.hashMessage(dataToSign); const signature = await signer.signMessage(dataToSign); - const result = await context.keyManager.callStatic.isValidSignature(messageHash, signature); + const result = await context.keyManager.isValidSignature(messageHash, signature); expect(result).to.equal(ERC1271_VALUES.SUCCESS_VALUE); }); @@ -51,12 +53,12 @@ export const shouldBehaveLikePermissionSign = (buildContext: () => Promise Promise { describe('should verify the signature, regardless of how it was signed', () => { it('e.g: Ethereum signed message', async () => { - const messageHash = ethers.utils.hashMessage(dataToSign); + const messageHash = ethers.hashMessage(dataToSign); const signature = await signer.signMessage(dataToSign); - const result = await context.keyManager.callStatic.isValidSignature(messageHash, signature); + const result = await context.keyManager.isValidSignature(messageHash, signature); expect(result).to.equal(ERC1271_VALUES.SUCCESS_VALUE); }); it("e.g: with EIP191Signer '\\x19\\x00'", async () => { const lsp6Signer = new EIP191Signer(); const signedMessage = await lsp6Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), dataToSign, LOCAL_PRIVATE_KEYS.ACCOUNT1, ); - const result = await context.keyManager.callStatic.isValidSignature( + const result = await context.keyManager.isValidSignature( signedMessage.messageHash, signedMessage.signature, ); @@ -95,22 +97,22 @@ export const shouldBehaveLikePermissionSign = (buildContext: () => Promise { describe('should fail when verifying a signature, regardless of how it was signed', () => { it('e.g: with Ethereum signed message', async () => { - const messageHash = ethers.utils.hashMessage(dataToSign); + const messageHash = ethers.hashMessage(dataToSign); const signature = await nonSigner.signMessage(dataToSign); - const result = await context.keyManager.callStatic.isValidSignature(messageHash, signature); + const result = await context.keyManager.isValidSignature(messageHash, signature); expect(result).to.equal(ERC1271_VALUES.FAIL_VALUE); }); it("e.g: with EIP191Signer '\\x19\\x00'", async () => { const lsp6Signer = new EIP191Signer(); const signedMessage = await lsp6Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), dataToSign, LOCAL_PRIVATE_KEYS.ACCOUNT2, ); - const result = await context.keyManager.callStatic.isValidSignature( + const result = await context.keyManager.isValidSignature( signedMessage.messageHash, signedMessage.signature, ); diff --git a/tests/LSP6KeyManager/Interactions/AllowedAddresses.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/AllowedAddresses.test.ts similarity index 81% rename from tests/LSP6KeyManager/Interactions/AllowedAddresses.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/AllowedAddresses.test.ts index 0c8ec4ade..26b608954 100644 --- a/tests/LSP6KeyManager/Interactions/AllowedAddresses.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/AllowedAddresses.test.ts @@ -1,17 +1,13 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { TargetContract, TargetContract__factory } from '../../../types'; // constants -import { - ALL_PERMISSIONS, - ERC725YDataKeys, - OPERATION_TYPES, - PERMISSIONS, - CALLTYPE, -} from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -70,7 +66,7 @@ export const shouldBehaveLikeAllowedAddresses = (buildContext: () => Promise Promise Promise { it(`sending 1 LYX to EOA ${recipient}`, async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceEOA = await provider.getBalance(recipient); - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const transferPayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -111,7 +109,9 @@ export const shouldBehaveLikeAllowedAddresses = (buildContext: () => Promise Promise { it('should be allowed to send LYX to an allowed address (= EOA)', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceEOA = await provider.getBalance(allowedEOA.address); - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const transferPayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -137,7 +139,7 @@ export const shouldBehaveLikeAllowedAddresses = (buildContext: () => Promise Promise { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(notAllowedEOA.address); const transferPayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, notAllowedEOA.address, - ethers.utils.parseEther('1'), + ethers.parseEther('1'), EMPTY_PAYLOAD, ]); @@ -179,7 +183,7 @@ export const shouldBehaveLikeAllowedAddresses = (buildContext: () => Promise Promise Promise Promise { it(`-> should revert when sending 1 LYX to EOA ${recipient}`, async () => { - await provider.getBalance(context.universalProfile.address); + await provider.getBalance(await context.universalProfile.getAddress()); await provider.getBalance(recipient); - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const transferPayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, diff --git a/tests/LSP6KeyManager/Interactions/AllowedFunctions.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/AllowedFunctions.test.ts similarity index 81% rename from tests/LSP6KeyManager/Interactions/AllowedFunctions.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/AllowedFunctions.test.ts index b1ffe13ce..ce5343853 100644 --- a/tests/LSP6KeyManager/Interactions/AllowedFunctions.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/AllowedFunctions.test.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { EIP191Signer } from '@lukso/eip191-signer.js'; import { @@ -13,16 +13,12 @@ import { } from '../../../types'; // constants -import { - ERC725YDataKeys, - OPERATION_TYPES, - LSP25_VERSION, - PERMISSIONS, - INTERFACE_IDS, - CALLTYPE, - LSP8_TOKEN_ID_FORMAT, - LSP4_TOKEN_TYPES, -} from '../../../constants'; +import { ERC725YDataKeys, INTERFACE_IDS } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; +import { LSP25_VERSION } from '@lukso/lsp25-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -63,7 +59,7 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise Promise { describe('when calling a contract', () => { it('should pass when the bytes4 selector of the function called is listed in its AllowedFunctions', async () => { - const initialName = await targetContract.callStatic.getName(); + const initialName = await targetContract.getName(); const newName = 'Updated Name'; const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ @@ -128,20 +124,20 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise { - const initialNumber = await targetContract.callStatic.getNumber(); + const initialNumber = await targetContract.getNumber(); const newNumber = 18; const targetContractPayload = targetContract.interface.encodeFunctionData('setNumber', [ @@ -149,7 +145,7 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise Promise Promise Promise Promise Promise { - const currentNumber = await targetContract.callStatic.getNumber(); + const currentNumber = await targetContract.getNumber(); - const nonce = await context.keyManager.callStatic.getNonce( + const nonce = await context.keyManager.getNonce( addressCanCallOnlyOneFunction.address, channelId, ); @@ -265,13 +261,13 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise Promise { await lsp8Contract .connect(context.accounts[0]) - .mint(context.universalProfile.address, tokenId, true, '0x'); + .mint(await context.universalProfile.getAddress(), tokenId, true, '0x'); }); await lsp7Contract .connect(context.accounts[0]) - .transferOwnership(context.universalProfile.address); + .transferOwnership(await context.universalProfile.getAddress()); const permissionsKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - addressCanCallOnlyTransferOnLSP8.address.substring(2), + (await addressCanCallOnlyTransferOnLSP8.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - addressCanCallOnlyTransferOnLSP8.address.substring(2), + (await addressCanCallOnlyTransferOnLSP8.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8.address.substring(2), + ( + await addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8.getAddress() + ).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8.address.substring(2), + ( + await addressCanCallAnyLSP7FunctionAndOnlyAuthorizeOperatorOnLSP8.getAddress() + ).substring(2), ]; const permissionsValues = [ @@ -380,7 +380,7 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise Promise Promise Promise Promise Promise Promise Promise Promise Promise Promise { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Token Icon')); + const key = ethers.keccak256(ethers.toUtf8Bytes('Token Icon')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes(':)')); + const value = ethers.hexlify(ethers.toUtf8Bytes(':)')); const setDataPayload = lsp7Contract.interface.encodeFunctionData('setData', [key, value]); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp7Contract.address, + lsp7Contract.target, 0, setDataPayload, ]); @@ -560,7 +563,7 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise Promise { - const randomTokenId = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const randomTokenId = ethers.hexlify(ethers.randomBytes(32)); const recipient = context.accounts[4].address; const mintPayload = lsp8Contract.interface.encodeFunctionData('mint', [ @@ -609,7 +612,7 @@ export const shouldBehaveLikeAllowedFunctions = (buildContext: () => Promise Promise Promise Promise Promise { it('ERC1271', async () => { - const sampleHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Sample Message')); + const sampleHash = ethers.keccak256(ethers.toUtf8Bytes('Sample Message')); const sampleSignature = await context.mainController.signMessage('Sample Message'); const payload = signatureValidatorContract.interface.encodeFunctionData( @@ -133,14 +127,14 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Key')); + const key = ethers.keccak256(ethers.toUtf8Bytes('Key')); const value = '0xcafecafecafecafe'; const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -159,7 +153,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise { describe('when interacting with a contract that implements + register ERC1271 interface', () => { it('should pass', async () => { - const sampleHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Sample Message')); + const sampleHash = ethers.keccak256(ethers.toUtf8Bytes('Sample Message')); const sampleSignature = await addressCanInteractOnlyWithERC1271.signMessage( 'Sample Message', ); @@ -180,14 +174,14 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise { it('should allow to transfer LYX', async () => { - const initialAccountBalance = await provider.getBalance(otherUniversalProfile.address); + const initialAccountBalance = await provider.getBalance(otherUniversalProfile.target); const transferLyxPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, otherUniversalProfile.address, ethers.utils.parseEther('1'), '0x'], + [OPERATION_TYPES.CALL, otherUniversalProfile.target, ethers.parseEther('1'), '0x'], ); await context.keyManager .connect(addressCanInteractOnlyWithERC1271) .execute(transferLyxPayload); - const newAccountBalance = await provider.getBalance(otherUniversalProfile.address); + const newAccountBalance = await provider.getBalance(otherUniversalProfile.target); expect(newAccountBalance).to.be.gt(initialAccountBalance); }); }); @@ -220,7 +214,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise Promise { describe('when interacting with a contract that implements + register ERC1271 interface', () => { it('should fail', async () => { - const sampleHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Sample Message')); + const sampleHash = ethers.keccak256(ethers.toUtf8Bytes('Sample Message')); const sampleSignature = await addressCanInteractOnlyWithLSP7.signMessage('Sample Message'); const payload = signatureValidatorContract.interface.encodeFunctionData( @@ -251,7 +245,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise Promise { const transferLyxPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, otherUniversalProfile.address, ethers.utils.parseEther('1'), '0x'], + [OPERATION_TYPES.CALL, otherUniversalProfile.target, ethers.parseEther('1'), '0x'], ); await expect( @@ -279,7 +273,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise interacting with lsp7TokenA', async () => { @@ -333,7 +327,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise Promise interacting with lsp7TokenB', async () => { @@ -358,7 +354,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise Promise interacting with lsp7TokenC', async () => { @@ -383,7 +381,7 @@ export const shouldBehaveLikeAllowedStandards = (buildContext: () => Promise Promise Promise Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -30,7 +27,7 @@ export const shouldBehaveLikeBatchExecute = ( rLyxToken: LSP7Mintable; before(async () => { - context = await buildContext(ethers.utils.parseEther('50')); + context = await buildContext(ethers.parseEther('50')); const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -66,9 +63,9 @@ export const shouldBehaveLikeBatchExecute = ( false, ); - await lyxDaiToken.mint(context.universalProfile.address, 100, false, '0x'); - await metaCoin.mint(context.universalProfile.address, 100, false, '0x'); - await rLyxToken.mint(context.universalProfile.address, 100, false, '0x'); + await lyxDaiToken.mint(await context.universalProfile.getAddress(), 100, false, '0x'); + await metaCoin.mint(await context.universalProfile.getAddress(), 100, false, '0x'); + await rLyxToken.mint(await context.universalProfile.getAddress(), 100, false, '0x'); }); describe('example scenarios', () => { @@ -81,11 +78,7 @@ export const shouldBehaveLikeBatchExecute = ( context.accounts[3].address, ]; - const amounts = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('2'), - ethers.utils.parseEther('3'), - ]; + const amounts = [ethers.parseEther('1'), ethers.parseEther('2'), ethers.parseEther('3')]; const batchExecutePayloads = recipients.map((recipient, index) => { return universalProfile.interface.encodeFunctionData('execute', [ @@ -101,21 +94,23 @@ export const shouldBehaveLikeBatchExecute = ( .executeBatch([0, 0, 0], batchExecutePayloads); await expect(tx).to.changeEtherBalance( - context.universalProfile.address, - ethers.utils.parseEther('-6'), + await context.universalProfile.getAddress(), + ethers.parseEther('-6'), ); await expect(tx).to.changeEtherBalances(recipients, amounts); }); it('should send LYX + some LSP7 tokens to the same address', async () => { - expect(await lyxDaiToken.balanceOf(context.universalProfile.address)).to.equal(100); + expect(await lyxDaiToken.balanceOf(await context.universalProfile.getAddress())).to.equal( + 100, + ); const recipient = context.accounts[1].address; - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = ethers.parseEther('3'); const lyxDaiAmount = 25; const lyxDaiTransferPayload = lyxDaiToken.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipient, lyxDaiAmount, true, @@ -131,7 +126,7 @@ export const shouldBehaveLikeBatchExecute = ( ]), context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lyxDaiToken.address, + lyxDaiToken.target, 0, lyxDaiTransferPayload, ]), @@ -159,17 +154,17 @@ export const shouldBehaveLikeBatchExecute = ( // prettier-ignore const lyxDaiTransferPayload = lyxDaiToken.interface.encodeFunctionData( "transfer", - [context.universalProfile.address, recipient, lyxDaiAmount, true, "0x"] + [await context.universalProfile.getAddress(), recipient, lyxDaiAmount, true, "0x"] ); // prettier-ignore const metaCoinTransferPayload = metaCoin.interface.encodeFunctionData( "transfer", - [context.universalProfile.address, recipient, metaCoinAmount, true, "0x"] + [await context.universalProfile.getAddress(), recipient, metaCoinAmount, true, "0x"] ); const rLYXTransferPayload = metaCoin.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipient, rLyxAmount, true, @@ -179,17 +174,17 @@ export const shouldBehaveLikeBatchExecute = ( const payloads = [ context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, lyxDaiToken.address, 0, lyxDaiTransferPayload], // prettier-ignore + [OPERATION_TYPES.CALL, lyxDaiToken.target, 0, lyxDaiTransferPayload], // prettier-ignore ), context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - metaCoin.address, + metaCoin.target, 0, metaCoinTransferPayload, ]), context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - rLyxToken.address, + rLyxToken.target, 0, rLYXTransferPayload, ]), @@ -198,13 +193,13 @@ export const shouldBehaveLikeBatchExecute = ( await context.keyManager.connect(context.mainController).executeBatch([0, 0, 0], payloads); expect(await lyxDaiToken.balanceOf(recipient)).to.equal( - recipientLyxDaiBalanceBefore.add(lyxDaiAmount), + recipientLyxDaiBalanceBefore + BigInt(lyxDaiAmount), ); expect(await metaCoin.balanceOf(recipient)).to.equal( - recipientMetaCoinBalanceBefore.add(metaCoinAmount), + recipientMetaCoinBalanceBefore + BigInt(metaCoinAmount), ); expect(await rLyxToken.balanceOf(recipient)).to.equal( - recipientRLyxBalanceBefore.add(rLyxAmount), + recipientRLyxBalanceBefore + BigInt(rLyxAmount), ); }); @@ -213,27 +208,30 @@ export const shouldBehaveLikeBatchExecute = ( const lsp7TokenProxyBytecode = String( '0x3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3', - ).replace('bebebebebebebebebebebebebebebebebebebebe', lsp7MintableBase.address.substring(2)); + ).replace( + 'bebebebebebebebebebebebebebebebebebebebe', + (lsp7MintableBase.target as string).substring(2), + ); const lsp7ProxyDeploymentPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CREATE, ethers.constants.AddressZero, 0, lsp7TokenProxyBytecode], + [OPERATION_TYPES.CREATE, ethers.ZeroAddress, 0, lsp7TokenProxyBytecode], ); const callResult = await context.keyManager .connect(context.mainController) - .callStatic.execute(lsp7ProxyDeploymentPayload); + .execute.staticCall(lsp7ProxyDeploymentPayload); const [futureTokenAddress] = abiCoder.decode(['bytes'], callResult); - const futureTokenInstance = await new LSP7MintableInit__factory(context.accounts[0]).attach( + const futureTokenInstance = new LSP7MintableInit__factory(context.accounts[0]).attach( futureTokenAddress, - ); + ) as LSP7MintableInit; const lsp7InitializePayload = futureTokenInstance.interface.encodeFunctionData('initialize', [ 'My LSP7 UP Token', 'UPLSP7', - context.universalProfile.address, + await context.universalProfile.getAddress(), LSP4_TOKEN_TYPES.TOKEN, false, ]); @@ -275,9 +273,9 @@ export const shouldBehaveLikeBatchExecute = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(futureTokenAddress), + ethers.getAddress(futureTokenAddress), 0, - ethers.utils.hexZeroPad('0x00', 32), + ethers.zeroPadValue('0x00', 32), ); // CHECK initialize parameters have been set correctly @@ -286,9 +284,11 @@ export const shouldBehaveLikeBatchExecute = ( ERC725YDataKeys.LSP4['LSP4TokenSymbol'], ); - expect(ethers.utils.toUtf8String(nameResult)).to.equal('My LSP7 UP Token'); - expect(ethers.utils.toUtf8String(symbolResult)).to.equal('UPLSP7'); - expect(await futureTokenInstance.owner()).to.equal(context.universalProfile.address); + expect(ethers.toUtf8String(nameResult)).to.equal('My LSP7 UP Token'); + expect(ethers.toUtf8String(symbolResult)).to.equal('UPLSP7'); + expect(await futureTokenInstance.owner()).to.equal( + await context.universalProfile.getAddress(), + ); // CHECK LSP4 token metadata has been set expect(await futureTokenInstance.getData(ERC725YDataKeys.LSP4['LSP4Metadata'])).to.equal( @@ -303,7 +303,7 @@ export const shouldBehaveLikeBatchExecute = ( [ 'My UP LSP7 Token', 'UPLSP7', - context.universalProfile.address, + await context.universalProfile.getAddress(), LSP4_TOKEN_TYPES.TOKEN, false, ], @@ -313,7 +313,7 @@ export const shouldBehaveLikeBatchExecute = ( 'execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, LSP7Mintable__factory.bytecode + lsp7ConstructorArguments.substring(2), ], @@ -324,21 +324,21 @@ export const shouldBehaveLikeBatchExecute = ( // in the 2nd and 3rd payloads of the LSP6 batch `execute(bytes[])` const callResult = await context.keyManager .connect(context.mainController) - .callStatic.execute(lsp7DeploymentPayload); + .execute.staticCall(lsp7DeploymentPayload); const [futureTokenAddress] = abiCoder.decode(['bytes'], callResult); // step 2 - mint some tokens // use the interface of an existing token for encoding the function call const lsp7MintingPayload = lyxDaiToken.interface.encodeFunctionData('mint', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), 3_000, false, '0x', ]); // step 3 - transfer batch to multiple addresses - const sender = context.universalProfile.address; + const sender = await context.universalProfile.getAddress(); const recipients = [ context.accounts[1].address, context.accounts[2].address, @@ -382,15 +382,15 @@ export const shouldBehaveLikeBatchExecute = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(futureTokenAddress), + ethers.getAddress(futureTokenAddress), 0, - ethers.utils.hexZeroPad('0x00', 32), + ethers.zeroPadValue('0x00', 32), ); // CHECK for tokens balances of recipients - const createdTokenContract = await new LSP7Mintable__factory(context.accounts[0]).attach( + const createdTokenContract = new LSP7Mintable__factory(context.accounts[0]).attach( futureTokenAddress, - ); + ) as LSP7Mintable; expect([ await createdTokenContract.balanceOf(recipients[0]), await createdTokenContract.balanceOf(recipients[1]), @@ -403,16 +403,16 @@ export const shouldBehaveLikeBatchExecute = ( describe('when all the payloads are setData(...)', () => { describe('if specifying 0 for each values[index]', () => { it('should revert and not leave any funds locked on the Key Manager', async () => { - const amountToFund = ethers.utils.parseEther('5'); + const amountToFund = ethers.parseEther('5'); const dataKeys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key1')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key2')), + ethers.keccak256(ethers.toUtf8Bytes('key1')), + ethers.keccak256(ethers.toUtf8Bytes('key2')), ]; const dataValues = ['0xaaaaaaaa', '0xbbbbbbbb']; const keyManagerBalanceBefore = await ethers.provider.getBalance( - context.keyManager.address, + await context.keyManager.getAddress(), ); const firstSetDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -438,27 +438,27 @@ export const shouldBehaveLikeBatchExecute = ( .withArgs(0, amountToFund); const keyManagerBalanceAfter = await ethers.provider.getBalance( - context.keyManager.address, + await context.keyManager.getAddress(), ); expect(keyManagerBalanceAfter).to.equal(keyManagerBalanceBefore); // the Key Manager must not hold any funds and must always forward any funds sent to it. // it's balance must always be 0 after any execution - expect(await provider.getBalance(context.keyManager.address)).to.equal(0); + expect(await provider.getBalance(await context.keyManager.getAddress())).to.equal(0); }); }); describe('if specifying some value for each values[index]', () => { it('should pass when sending value while setting data', async () => { - const msgValues = [ethers.utils.parseEther('2'), ethers.utils.parseEther('2')]; - const totalMsgValue = msgValues.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const msgValues = [ethers.parseEther('2'), ethers.parseEther('2')]; + const totalMsgValue = msgValues.reduce( + (accumulator, currentValue) => accumulator + currentValue, ); const dataKeys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key1')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key2')), + ethers.keccak256(ethers.toUtf8Bytes('key1')), + ethers.keccak256(ethers.toUtf8Bytes('key2')), ]; const dataValues = ['0xaaaaaaaa', '0xbbbbbbbb']; @@ -478,7 +478,7 @@ export const shouldBehaveLikeBatchExecute = ( .executeBatch(msgValues, [firstSetDataPayload, secondSetDataPayload], { value: totalMsgValue, }), - ).to.changeEtherBalances([context.universalProfile.address], [totalMsgValue]); + ).to.changeEtherBalances([await context.universalProfile.getAddress()], [totalMsgValue]); expect(await context.universalProfile.getDataBatch(dataKeys)).to.deep.equal(dataValues); }); @@ -490,10 +490,10 @@ export const shouldBehaveLikeBatchExecute = ( it('should pass', async () => { const recipient = context.accounts[5].address; - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Sample Data Key')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(10)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('Sample Data Key')); + const dataValue = ethers.hexlify(ethers.randomBytes(10)); - const msgValues = [ethers.BigNumber.from(0), ethers.BigNumber.from('5')]; + const msgValues = [ethers.toBigInt(0), ethers.toBigInt('5')]; const payloads = [ context.universalProfile.interface.encodeFunctionData('setData', [dataKey, dataValue]), @@ -505,15 +505,18 @@ export const shouldBehaveLikeBatchExecute = ( ]), ]; - const totalValues = msgValues.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const totalValues = msgValues.reduce( + (accumulator, currentValue) => accumulator + currentValue, ); await expect( context.keyManager.connect(context.mainController).executeBatch(msgValues, payloads, { value: totalValues, }), - ).to.changeEtherBalances([context.universalProfile.address, recipient], msgValues); + ).to.changeEtherBalances( + [await context.universalProfile.getAddress(), recipient], + msgValues, + ); expect(await context.universalProfile.getData(dataKey)).to.equal(dataValue); }); @@ -523,10 +526,10 @@ export const shouldBehaveLikeBatchExecute = ( it('should pass and increase the UP balance', async () => { const recipient = context.accounts[5].address; - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Sample Data Key')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(10)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('Sample Data Key')); + const dataValue = ethers.hexlify(ethers.randomBytes(10)); - const msgValues = [ethers.BigNumber.from(5), ethers.BigNumber.from('5')]; + const msgValues = [ethers.toBigInt(5), ethers.toBigInt('5')]; const payloads = [ context.universalProfile.interface.encodeFunctionData('setData', [dataKey, dataValue]), @@ -538,8 +541,8 @@ export const shouldBehaveLikeBatchExecute = ( ]), ]; - const totalValues = msgValues.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const totalValues = msgValues.reduce( + (accumulator, currentValue) => accumulator + currentValue, ); await context.keyManager @@ -552,7 +555,10 @@ export const shouldBehaveLikeBatchExecute = ( context.keyManager.connect(context.mainController).executeBatch(msgValues, payloads, { value: totalValues, }), - ).to.changeEtherBalances([context.universalProfile.address, recipient], msgValues); + ).to.changeEtherBalances( + [await context.universalProfile.getAddress(), recipient], + msgValues, + ); expect(await context.universalProfile.getData(dataKey)).to.equal(dataValue); }); @@ -567,23 +573,19 @@ export const shouldBehaveLikeBatchExecute = ( const thirdRecipient = context.accounts[5].address; const amountsToTransfer = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), ]; - const values = [ - ethers.utils.parseEther('2'), - ethers.utils.parseEther('2'), - ethers.utils.parseEther('2'), - ]; + const values = [ethers.parseEther('2'), ethers.parseEther('2'), ethers.parseEther('2')]; - const totalValues = values.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const totalValues = values.reduce( + (accumulator, currentValue) => accumulator + currentValue, ); // total of values[] - 1. To check we are not sending enough fuds - const msgValue = totalValues.sub(1); + const msgValue = totalValues - BigInt(1); const payloads = [ context.universalProfile.interface.encodeFunctionData('execute', [ @@ -623,23 +625,19 @@ export const shouldBehaveLikeBatchExecute = ( const thirdRecipient = context.accounts[5].address; const amountsToTransfer = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), ]; - const values = [ - ethers.utils.parseEther('2'), - ethers.utils.parseEther('2'), - ethers.utils.parseEther('2'), - ]; + const values = [ethers.parseEther('2'), ethers.parseEther('2'), ethers.parseEther('2')]; - const totalValues = values.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const totalValues = values.reduce( + (accumulator, currentValue) => accumulator + currentValue, ); // total of values[] + 1. To check we cannot send to much funds and leave some in the Key Manager - const msgValue = totalValues.add(1); + const msgValue = totalValues + BigInt(1); const payloads = [ context.universalProfile.interface.encodeFunctionData('execute', [ @@ -679,19 +677,15 @@ export const shouldBehaveLikeBatchExecute = ( const thirdRecipient = context.accounts[5].address; const amountsToTransfer = [ - ethers.utils.parseEther('2'), - ethers.utils.parseEther('2'), - ethers.utils.parseEther('2'), + ethers.parseEther('2'), + ethers.parseEther('2'), + ethers.parseEther('2'), ]; - const values = [ - ethers.utils.parseEther('2'), - ethers.utils.parseEther('2'), - ethers.utils.parseEther('2'), - ]; + const values = [ethers.parseEther('2'), ethers.parseEther('2'), ethers.parseEther('2')]; - const totalValues = values.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const totalValues = values.reduce( + (accumulator, currentValue) => accumulator + currentValue, ); const payloads = [ @@ -722,7 +716,12 @@ export const shouldBehaveLikeBatchExecute = ( }); await expect(tx).to.changeEtherBalances( - [context.universalProfile.address, firstRecipient, secondRecipient, thirdRecipient], + [ + await context.universalProfile.getAddress(), + firstRecipient, + secondRecipient, + thirdRecipient, + ], [0, amountsToTransfer[0], amountsToTransfer[1], amountsToTransfer[2]], ); }); @@ -732,13 +731,13 @@ export const shouldBehaveLikeBatchExecute = ( describe('when one of the payload reverts', () => { it('should revert the whole transaction if first payload reverts', async () => { - const upBalance = await provider.getBalance(context.universalProfile.address); + const upBalance = await provider.getBalance(await context.universalProfile.getAddress()); - const validAmount = ethers.utils.parseEther('1'); + const validAmount = ethers.parseEther('1'); expect(validAmount).to.be.lt(upBalance); // sanity check // make it revert by sending too much value than the actual balance - const invalidAmount = upBalance.add(10); + const invalidAmount = upBalance + BigInt(10); const randomRecipient = ethers.Wallet.createRandom().address; @@ -768,13 +767,13 @@ export const shouldBehaveLikeBatchExecute = ( }); it('should revert the whole transaction if last payload reverts', async () => { - const upBalance = await provider.getBalance(context.universalProfile.address); + const upBalance = await provider.getBalance(await context.universalProfile.getAddress()); - const validAmount = ethers.utils.parseEther('1'); + const validAmount = ethers.parseEther('1'); expect(validAmount).to.be.lt(upBalance); // sanity check // make it revert by sending too much value than the actual balance - const invalidAmount = upBalance.add(10); + const invalidAmount = upBalance + BigInt(10); const randomRecipient = ethers.Wallet.createRandom().address; diff --git a/tests/LSP6KeyManager/Interactions/InvalidExecutePayloads.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/InvalidExecutePayloads.test.ts similarity index 92% rename from tests/LSP6KeyManager/Interactions/InvalidExecutePayloads.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/InvalidExecutePayloads.test.ts index a3ea3a31a..3686e29b0 100644 --- a/tests/LSP6KeyManager/Interactions/InvalidExecutePayloads.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/InvalidExecutePayloads.test.ts @@ -1,10 +1,11 @@ import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { TargetContract__factory, TargetContract } from '../../../types'; // constants -import { ALL_PERMISSIONS, ERC725YDataKeys, PERMISSIONS } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -72,7 +73,7 @@ export const testInvalidExecutePayloads = (buildContext: () => Promise Promise Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -94,8 +89,8 @@ export const shouldBehaveLikePermissionCall = ( [CALLTYPE.CALL, CALLTYPE.CALL, CALLTYPE.CALL, CALLTYPE.CALL], [ allowedEOA, - allowedContractWithFallback.address, - allowedContractWithFallbackRevert.address, + await allowedContractWithFallback.getAddress(), + await allowedContractWithFallbackRevert.getAddress(), ], ['0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff'], @@ -137,7 +132,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, '0x', ]); @@ -173,7 +168,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, '0x', ]); @@ -207,7 +202,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, '0x', ]); @@ -262,7 +257,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, '0x', ]); @@ -273,7 +268,7 @@ export const shouldBehaveLikePermissionCall = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( addressCanMakeCallWithAllowedCalls.address, - targetContract.address, + await targetContract.getAddress(), '0x00000000', ); }); @@ -284,7 +279,7 @@ export const shouldBehaveLikePermissionCall = ( it("should pass and update `to` contract's storage", async () => { const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - allowedContractWithFallback.address, + await allowedContractWithFallback.getAddress(), 0, '0x', ]); @@ -292,7 +287,7 @@ export const shouldBehaveLikePermissionCall = ( await context.keyManager.connect(addressCanMakeCallWithAllowedCalls).execute(payload); expect(await allowedContractWithFallback.caller()).to.equal( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); }); }); @@ -301,7 +296,7 @@ export const shouldBehaveLikePermissionCall = ( it('should fail and bubble the error back to the Key Manager', async () => { const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - allowedContractWithFallbackRevert.address, + await allowedContractWithFallbackRevert.getAddress(), 0, '0x', ]); @@ -338,7 +333,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContractWithFallback.address, + await targetContractWithFallback.getAddress(), 0, '0x', ]); @@ -346,7 +341,7 @@ export const shouldBehaveLikePermissionCall = ( await context.keyManager.connect(addressWithSuperCall).execute(payload); expect(await targetContractWithFallback.caller()).to.equal( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); }); }); @@ -359,7 +354,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContractWithFallbackRevert.address, + await targetContractWithFallbackRevert.getAddress(), 0, '0x', ]); @@ -409,7 +404,7 @@ export const shouldBehaveLikePermissionCall = ( combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.EXECUTE_RELAY_CALL), combineAllowedCalls( [CALLTYPE.CALL], - [targetContract.address], + [await targetContract.getAddress()], ['0xffffffff'], ['0xffffffff'], ), @@ -427,31 +422,31 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); await context.keyManager.connect(context.mainController).execute(payload); - const result = await targetContract.callStatic.getName(); + const result = await targetContract.getName(); expect(result).to.equal(argument); }); describe('when calling a function that returns some value', () => { it('should return the value to the Key Manager <- UP <- targetContract.getName()', async () => { - const expectedName = await targetContract.callStatic.getName(); + const expectedName = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('getName'); const executePayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const result = await context.keyManager .connect(context.mainController) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedBytes] = abiCoder.decode(['bytes'], result); @@ -460,18 +455,18 @@ export const shouldBehaveLikePermissionCall = ( }); it('Should return the value to the Key Manager <- UP <- targetContract.getNumber()', async () => { - const expectedNumber = await targetContract.callStatic.getNumber(); + const expectedNumber = await targetContract.getNumber(); const targetContractPayload = targetContract.interface.encodeFunctionData('getNumber'); const executePayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const result = await context.keyManager .connect(context.mainController) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedBytes] = abiCoder.decode(['bytes'], result); @@ -486,7 +481,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ]); @@ -509,7 +504,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); @@ -532,14 +527,14 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); await context.keyManager.connect(addressCanMakeCallWithAllowedCalls).execute(payload); - const result = await targetContract.callStatic.getName(); + const result = await targetContract.getName(); expect(result).to.equal(argument); }); }); @@ -553,7 +548,7 @@ export const shouldBehaveLikePermissionCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); @@ -577,7 +572,7 @@ export const shouldBehaveLikePermissionCall = ( const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ newName, ]); - const nonce = await context.keyManager.callStatic.getNonce( + const nonce = await context.keyManager.getNonce( context.mainController.address, channelId, ); @@ -586,13 +581,13 @@ export const shouldBehaveLikePermissionCall = ( const executeRelayCallPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -607,7 +602,7 @@ export const shouldBehaveLikePermissionCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT0, ); @@ -620,7 +615,7 @@ export const shouldBehaveLikePermissionCall = ( { value: valueToSend }, ); - const result = await targetContract.callStatic.getName(); + const result = await targetContract.getName(); expect(result).to.equal(newName); }); }); @@ -632,7 +627,7 @@ export const shouldBehaveLikePermissionCall = ( const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ newName, ]); - const nonce = await context.keyManager.callStatic.getNonce( + const nonce = await context.keyManager.getNonce( context.mainController.address, channelId, ); @@ -641,7 +636,7 @@ export const shouldBehaveLikePermissionCall = ( const executeRelayCallPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const HARDHAT_CHAINID = 31337; @@ -649,7 +644,7 @@ export const shouldBehaveLikePermissionCall = ( const eip191Signer = new EIP191Signer(); - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -665,7 +660,7 @@ export const shouldBehaveLikePermissionCall = ( const incorrectSignerAddress = eip191Signer.recover( eip191Signer.hashDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, ), signature, @@ -696,7 +691,7 @@ export const shouldBehaveLikePermissionCall = ( newName, ]); - const nonce = await context.keyManager.callStatic.getNonce( + const nonce = await context.keyManager.getNonce( addressCanMakeCallWithAllowedCalls.address, channelId, ); @@ -705,13 +700,13 @@ export const shouldBehaveLikePermissionCall = ( const executeRelayCallPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -726,7 +721,7 @@ export const shouldBehaveLikePermissionCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT2, ); @@ -739,7 +734,7 @@ export const shouldBehaveLikePermissionCall = ( { value: valueToSend }, ); - const result = await targetContract.callStatic.getName(); + const result = await targetContract.getName(); expect(result).to.equal(newName); }); }); @@ -751,7 +746,7 @@ export const shouldBehaveLikePermissionCall = ( const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ newName, ]); - const nonce = await context.keyManager.callStatic.getNonce( + const nonce = await context.keyManager.getNonce( addressCanMakeCallNoAllowedCalls.address, channelId, ); @@ -760,13 +755,13 @@ export const shouldBehaveLikePermissionCall = ( const executeRelayCallPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -781,7 +776,7 @@ export const shouldBehaveLikePermissionCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT1, ); @@ -808,7 +803,7 @@ export const shouldBehaveLikePermissionCall = ( const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ newName, ]); - const nonce = await context.keyManager.callStatic.getNonce( + const nonce = await context.keyManager.getNonce( addressCanMakeCallWithAllowedCalls.address, channelId, ); @@ -817,13 +812,13 @@ export const shouldBehaveLikePermissionCall = ( const executeRelayCallPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -840,7 +835,7 @@ export const shouldBehaveLikePermissionCall = ( const eip191Signer = new EIP191Signer(); const incorrectSignerAddress = eip191Signer.recover( eip191Signer.hashDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, ), signature, @@ -864,12 +859,12 @@ export const shouldBehaveLikePermissionCall = ( describe('when signer does not have permission CALL', () => { describe('when signing tx with EIP191Signer `\\x19\\x00` prefix', () => { it('should revert with `NotAuthorised` and permission CALL error', async () => { - const initialName = await targetContract.callStatic.getName(); + const initialName = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ 'Random name', ]); - const nonce = await context.keyManager.callStatic.getNonce( + const nonce = await context.keyManager.getNonce( addressCannotMakeCall.address, channelId, ); @@ -878,13 +873,13 @@ export const shouldBehaveLikePermissionCall = ( const executeRelayCallPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -899,7 +894,7 @@ export const shouldBehaveLikePermissionCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT3, ); @@ -917,19 +912,19 @@ export const shouldBehaveLikePermissionCall = ( .withArgs(addressCannotMakeCall.address, 'CALL'); // ensure no state change at the target contract - const result = await targetContract.callStatic.getName(); + const result = await targetContract.getName(); expect(result).to.equal(initialName); }); }); describe('when signing tx with Ethereum Signed Message prefix', () => { it('should retrieve the incorrect signer address and revert with `NoPermissionSet`', async () => { - const initialName = await targetContract.callStatic.getName(); + const initialName = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ 'Random name', ]); - const nonce = await context.keyManager.callStatic.getNonce( + const nonce = await context.keyManager.getNonce( addressCannotMakeCall.address, channelId, ); @@ -938,13 +933,13 @@ export const shouldBehaveLikePermissionCall = ( const executeRelayCallPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, targetContract.address, 0, targetContractPayload], + [OPERATION_TYPES.CALL, await targetContract.getAddress(), 0, targetContractPayload], ); const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -962,7 +957,7 @@ export const shouldBehaveLikePermissionCall = ( const incorrectSignerAddress = await eip191Signer.recover( eip191Signer.hashDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, ), ethereumSignature, @@ -981,7 +976,7 @@ export const shouldBehaveLikePermissionCall = ( .withArgs(incorrectSignerAddress); // ensure state at target contract has not changed - expect(await targetContract.callStatic.getName()).to.equal(initialName); + expect(await targetContract.getName()).to.equal(initialName); }); }); }); @@ -1016,7 +1011,7 @@ export const shouldBehaveLikePermissionCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ]); @@ -1031,7 +1026,7 @@ export const shouldBehaveLikePermissionCall = ( 'lsp20VerifyCall', [ context.accounts[2].address, - context.keyManager.address, + await context.keyManager.getAddress(), context.accounts[2].address, 0, '0xaabbccdd', @@ -1040,7 +1035,7 @@ export const shouldBehaveLikePermissionCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - context.keyManager.address, + await context.keyManager.getAddress(), 0, lsp20VerifyCallPayload, ]); @@ -1067,7 +1062,7 @@ export const shouldBehaveLikePermissionCall = ( let executePayload; before(async () => { - context = await buildContext(ethers.utils.parseEther('50')); + context = await buildContext(ethers.parseEther('50')); const accounts = await ethers.getSigners(); @@ -1107,7 +1102,7 @@ export const shouldBehaveLikePermissionCall = ( const allowedCall = combineAllowedCalls( [combineCallTypes(CALLTYPE.CALL, CALLTYPE.VALUE)], - [targetContract.address], + [await targetContract.getAddress()], ['0xffffffff'], ['0xffffffff'], ); @@ -1135,7 +1130,7 @@ export const shouldBehaveLikePermissionCall = ( afterEach('clearing target contract storage', async () => { await context.accounts[0].sendTransaction({ - to: targetContract.address, + to: await targetContract.getAddress(), data: '0xcafecafe', }); }); @@ -1144,7 +1139,7 @@ export const shouldBehaveLikePermissionCall = ( before(async () => { executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 36, '0xdeadbeef', ]); @@ -1186,14 +1181,16 @@ export const shouldBehaveLikePermissionCall = ( describe('when caller has both permissions CALL + TRANSFERVALUE', () => { it('should pass and allow to call the contract', async () => { - expect(await provider.getBalance(targetContract.address)).to.equal(0); + expect(await provider.getBalance(await targetContract.getAddress())).to.equal(0); await context.keyManager .connect(controllerCanTransferValueAndCall) .execute(executePayload); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); - expect(await provider.getBalance(targetContract.address)).to.equal(36); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); + expect(await provider.getBalance(await targetContract.getAddress())).to.equal(36); }); }); }); @@ -1202,7 +1199,7 @@ export const shouldBehaveLikePermissionCall = ( before(async () => { executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, '0x', ]); @@ -1217,14 +1214,18 @@ export const shouldBehaveLikePermissionCall = ( describe('when controller has permission CALL only', () => { it('should pass', async () => { await context.keyManager.connect(controllerCanCall).execute(executePayload); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); describe('when controller has SUPER_CALL', () => { it('should pass', async () => { await context.keyManager.connect(controllerCanSuperCall).execute(executePayload); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); @@ -1251,7 +1252,7 @@ export const shouldBehaveLikePermissionCall = ( let executePayload; before(async () => { - context = await buildContext(ethers.utils.parseEther('50')); + context = await buildContext(ethers.parseEther('50')); const accounts = await ethers.getSigners(); @@ -1276,7 +1277,7 @@ export const shouldBehaveLikePermissionCall = ( const allowedCall = combineAllowedCalls( [combineCallTypes(CALLTYPE.CALL)], - [targetContract.address], + [await targetContract.getAddress()], ['0xffffffff'], ['0xffffffff'], ); @@ -1295,7 +1296,7 @@ export const shouldBehaveLikePermissionCall = ( afterEach('clearing target contract storage', async () => { await context.accounts[0].sendTransaction({ - to: targetContract.address, + to: await targetContract.getAddress(), data: '0xcafecafe', }); }); @@ -1304,7 +1305,7 @@ export const shouldBehaveLikePermissionCall = ( before('constructing manually the payload', async () => { // 0x44c028fe --> ERC725X.execute(uint256,address,uint256,bytes) selector // 0000000000000000000000000000000000000000000000000000000000000000 --> operationType = CALL (0) - // 0000000000000000000000004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 --> target = targetContract.address + // 0000000000000000000000004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 --> target = await targetContract.getAddress() // 0000000000000000000000000000000000000000000000000000000000000000 --> value = 0 // 00000000000000000000000000000000000000000000000000000000000000a0 --> offset = 160 // cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe --> 32 random bytes in between @@ -1312,21 +1313,25 @@ export const shouldBehaveLikePermissionCall = ( // deadbeef00000000000000000000000000000000000000000000000000000000 --> `data` = 0xdeadbeef executePayload = '0x44c028fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + - targetContract.address.substring(2).toLowerCase() + + (await targetContract.getAddress()).substring(2).toLowerCase() + '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe0000000000000000000000000000000000000000000000000000000000000004deadbeef00000000000000000000000000000000000000000000000000000000'; }); describe('when caller has permission CALL', () => { it('should pass', async () => { await context.keyManager.connect(controllerCanCall).execute(executePayload); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); describe('when caller has permission SUPER_CALL', () => { it('should pass', async () => { await context.keyManager.connect(controllerCanSuperCall).execute(executePayload); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); @@ -1345,28 +1350,32 @@ export const shouldBehaveLikePermissionCall = ( before('constructing manually the payload', async () => { // 0x44c028fe --> ERC725X.execute(uint256,address,uint256,bytes) selector // 0000000000000000000000000000000000000000000000000000000000000000 --> operationType = CALL (0) - // 0000000000000000000000004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 --> target = targetContract.address + // 0000000000000000000000004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 --> target = await targetContract.getAddress() // 0000000000000000000000000000000000000000000000000000000000000000 --> value = 0 // 00000000000000000000000000000000000000000000000000000000000000a0 --> offset = 160 // cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe --> 32 random bytes in between // 0000000000000000000000000000000000000000000000000000000000000000 --> `data.length` = 0 executePayload = '0x44c028fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + - targetContract.address.substring(2).toLowerCase() + + (await targetContract.getAddress()).substring(2).toLowerCase() + '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe0000000000000000000000000000000000000000000000000000000000000000'; }); describe('when caller has permission CALL', () => { it('should pass', async () => { await context.keyManager.connect(controllerCanCall).execute(executePayload); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); describe('when caller has permission SUPER_CALL', () => { it('should pass', async () => { await context.keyManager.connect(controllerCanSuperCall).execute(executePayload); - expect(await targetContract.caller()).to.equal(context.universalProfile.address); + expect(await targetContract.caller()).to.equal( + await context.universalProfile.getAddress(), + ); }); }); diff --git a/tests/LSP6KeyManager/Interactions/PermissionDelegateCall.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionDelegateCall.test.ts similarity index 91% rename from tests/LSP6KeyManager/Interactions/PermissionDelegateCall.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionDelegateCall.test.ts index 0230085a2..9a57ef4e7 100644 --- a/tests/LSP6KeyManager/Interactions/PermissionDelegateCall.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionDelegateCall.test.ts @@ -1,16 +1,12 @@ import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ERC725YDelegateCall, ERC725YDelegateCall__factory } from '../../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - PERMISSIONS, - OPERATION_TYPES, - CALLTYPE, -} from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -37,7 +33,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( erc725YDelegateCallContract = await new ERC725YDelegateCall__factory( context.mainController, - ).deploy(context.universalProfile.address); + ).deploy(await context.universalProfile.getAddress()); const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -71,7 +67,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.DELEGATECALL, - erc725YDelegateCallContract.address, + await erc725YDelegateCallContract.getAddress(), 0, delegateCallPayload, ]); @@ -99,7 +95,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.DELEGATECALL, - erc725YDelegateCallContract.address, + await erc725YDelegateCallContract.getAddress(), 0, delegateCallPayload, ]); @@ -127,7 +123,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.DELEGATECALL, - erc725YDelegateCallContract.address, + await erc725YDelegateCallContract.getAddress(), 0, delegateCallPayload, ]); @@ -166,7 +162,10 @@ export const shouldBehaveLikePermissionDelegateCall = ( PERMISSIONS.SUPER_DELEGATECALL, combineAllowedCalls( [CALLTYPE.DELEGATECALL, CALLTYPE.DELEGATECALL], - [allowedDelegateCallContracts[0].address, allowedDelegateCallContracts[1].address], + [ + await allowedDelegateCallContracts[0].getAddress(), + await allowedDelegateCallContracts[1].getAddress(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -216,7 +215,12 @@ export const shouldBehaveLikePermissionDelegateCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.DELEGATECALL, randomContracts[ii].address, 0, delegateCallPayload], + [ + OPERATION_TYPES.DELEGATECALL, + await randomContracts[ii].getAddress(), + 0, + delegateCallPayload, + ], ); await expect( @@ -252,7 +256,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.DELEGATECALL, - allowedDelegateCallContracts[0].address, + await allowedDelegateCallContracts[0].getAddress(), 0, delegateCallPayload, ]); @@ -283,7 +287,7 @@ export const shouldBehaveLikePermissionDelegateCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.DELEGATECALL, - allowedDelegateCallContracts[1].address, + await allowedDelegateCallContracts[1].getAddress(), 0, delegateCallPayload, ]); diff --git a/tests/LSP6KeyManager/Interactions/PermissionDeploy.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionDeploy.test.ts similarity index 82% rename from tests/LSP6KeyManager/Interactions/PermissionDeploy.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionDeploy.test.ts index fb4b607dc..7957ee2b5 100644 --- a/tests/LSP6KeyManager/Interactions/PermissionDeploy.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionDeploy.test.ts @@ -1,29 +1,25 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { calculateCreate2 } from 'eth-create2-calculator'; import { EIP191Signer } from '@lukso/eip191-signer.js'; import { TargetContract__factory, UniversalProfile__factory } from '../../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - LSP25_VERSION, - PERMISSIONS, - OPERATION_TYPES, -} from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { LSP25_VERSION } from '@lukso/lsp25-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; import { setupKeyManager } from '../../utils/fixtures'; import { abiCoder, combinePermissions, LOCAL_PRIVATE_KEYS, provider } from '../../utils/helpers'; -import { BigNumber } from 'ethers'; export const shouldBehaveLikePermissionDeploy = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -33,7 +29,7 @@ export const shouldBehaveLikePermissionDeploy = ( addressCannotDeploy: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); addressCanDeploy = context.accounts[1]; addressCanDeployAndTransferValue = context.accounts[2]; @@ -78,7 +74,7 @@ export const shouldBehaveLikePermissionDeploy = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy, // init code ]); @@ -87,7 +83,7 @@ export const shouldBehaveLikePermissionDeploy = ( // so we can check it against the address emitted in the ContractCreated event const result = await context.keyManager .connect(context.mainController) - .callStatic.execute(payload); + .execute.staticCall(payload); const [expectedContractAddress] = abiCoder.decode(['bytes'], result); @@ -95,9 +91,9 @@ export const shouldBehaveLikePermissionDeploy = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(expectedContractAddress), + ethers.getAddress(expectedContractAddress), 0, - ethers.utils.hexZeroPad('0x00', 32), + ethers.zeroPadValue('0x00', 32), ); }); @@ -106,16 +102,16 @@ export const shouldBehaveLikePermissionDeploy = ( const initialUpOwner = context.mainController.address; // generate the init code that contains the constructor args with the initial UP owner - const upDeploymentTx = new UniversalProfile__factory( + const upDeploymentTx = await new UniversalProfile__factory( context.accounts[0], ).getDeployTransaction(initialUpOwner); const contractBytecodeToDeploy = upDeploymentTx.data; - const fundingAmount = ethers.utils.parseEther('10'); + const fundingAmount = ethers.parseEther('10'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, fundingAmount, contractBytecodeToDeploy, // init code ]); @@ -124,7 +120,7 @@ export const shouldBehaveLikePermissionDeploy = ( // so we can check it against the address emitted in the ContractCreated event const callResult = await context.keyManager .connect(context.mainController) - .callStatic.execute(payload); + .execute.staticCall(payload); const [expectedContractAddress] = abiCoder.decode(['bytes'], callResult); @@ -132,15 +128,15 @@ export const shouldBehaveLikePermissionDeploy = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(expectedContractAddress), + ethers.getAddress(expectedContractAddress), fundingAmount, - ethers.utils.hexZeroPad('0x00', 32), + ethers.zeroPadValue('0x00', 32), ); // check that the newly deployed contract (UP) has the correct owner const newUp = new UniversalProfile__factory(context.accounts[0]).attach( expectedContractAddress, - ); + ) as UniversalProfile; expect(await newUp.owner()).to.equal(initialUpOwner); // check that the newly deployed contract (UP) has beedn funded with the correct balance @@ -149,24 +145,24 @@ export const shouldBehaveLikePermissionDeploy = ( it('should be allowed to deploy a contract with CREATE2', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy + salt.substring(2), ]); const preComputedAddress = calculateCreate2( - context.universalProfile.address, + await context.universalProfile.getAddress(), salt, contractBytecodeToDeploy, ).toLowerCase(); await expect(context.keyManager.connect(context.mainController).execute(payload)) .to.emit(context.universalProfile, 'ContractCreated') - .withArgs(OPERATION_TYPES.CREATE2, ethers.utils.getAddress(preComputedAddress), 0, salt); + .withArgs(OPERATION_TYPES.CREATE2, ethers.getAddress(preComputedAddress), 0, salt); }); it('should be allowed to deploy + fund a contract with CREATE2', async () => { @@ -174,24 +170,24 @@ export const shouldBehaveLikePermissionDeploy = ( const initialUpOwner = context.mainController.address; // generate the init code that contains the constructor args with the initial UP owner - const upDeploymentTx = new UniversalProfile__factory( + const upDeploymentTx = await new UniversalProfile__factory( context.accounts[0], ).getDeployTransaction(initialUpOwner); const contractBytecodeToDeploy = upDeploymentTx.data; - const fundingAmount = ethers.utils.parseEther('10'); + const fundingAmount = ethers.parseEther('10'); - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, fundingAmount, contractBytecodeToDeploy + salt.substring(2), ]); const preComputedAddress = calculateCreate2( - context.universalProfile.address, + await context.universalProfile.getAddress(), salt, contractBytecodeToDeploy, ).toLowerCase(); @@ -200,13 +196,15 @@ export const shouldBehaveLikePermissionDeploy = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE2, - ethers.utils.getAddress(preComputedAddress), + ethers.getAddress(preComputedAddress), fundingAmount, salt, ); // check that the newly deployed contract (UP) has the correct owner - const newUp = new UniversalProfile__factory(context.accounts[0]).attach(preComputedAddress); + const newUp = new UniversalProfile__factory(context.accounts[0]).attach( + preComputedAddress, + ) as UniversalProfile; expect(await newUp.owner()).to.equal(initialUpOwner); @@ -221,12 +219,12 @@ export const shouldBehaveLikePermissionDeploy = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy, ]); - const result = await context.keyManager.connect(addressCanDeploy).callStatic.execute(payload); + const result = await context.keyManager.connect(addressCanDeploy).execute.staticCall(payload); const [expectedContractAddress] = abiCoder.decode(['bytes'], result); @@ -234,9 +232,9 @@ export const shouldBehaveLikePermissionDeploy = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(expectedContractAddress), + ethers.getAddress(expectedContractAddress), 0, - ethers.utils.hexZeroPad('0x00', 32), + ethers.zeroPadValue('0x00', 32), ); }); @@ -245,16 +243,16 @@ export const shouldBehaveLikePermissionDeploy = ( const initialUpOwner = context.mainController.address; // generate the init code that contains the constructor args with the initial UP owner - const upDeploymentTx = new UniversalProfile__factory( + const upDeploymentTx = await new UniversalProfile__factory( context.accounts[0], ).getDeployTransaction(initialUpOwner); const contractBytecodeToDeploy = upDeploymentTx.data; - const fundingAmount = ethers.utils.parseEther('10'); + const fundingAmount = ethers.parseEther('10'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, fundingAmount, contractBytecodeToDeploy, // init code ]); @@ -266,24 +264,24 @@ export const shouldBehaveLikePermissionDeploy = ( it('should be allowed to deploy a contract with CREATE2', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy + salt.substring(2), ]); const preComputedAddress = calculateCreate2( - context.universalProfile.address, + await context.universalProfile.getAddress(), salt, contractBytecodeToDeploy, ).toLowerCase(); await expect(context.keyManager.connect(addressCanDeploy).execute(payload)) .to.emit(context.universalProfile, 'ContractCreated') - .withArgs(OPERATION_TYPES.CREATE2, ethers.utils.getAddress(preComputedAddress), 0, salt); + .withArgs(OPERATION_TYPES.CREATE2, ethers.getAddress(preComputedAddress), 0, salt); }); it('should revert with error `NotAuthorised(SUPER_TRANSFERVALUE)` when trying to deploy + fund a contract with CREATE2', async () => { @@ -291,18 +289,18 @@ export const shouldBehaveLikePermissionDeploy = ( const initialUpOwner = context.mainController.address; // generate the init code that contains the constructor args with the initial UP owner - const upDeploymentTx = new UniversalProfile__factory( + const upDeploymentTx = await new UniversalProfile__factory( context.accounts[0], ).getDeployTransaction(initialUpOwner); const contractBytecodeToDeploy = upDeploymentTx.data; - const fundingAmount = ethers.utils.parseEther('10'); + const fundingAmount = ethers.parseEther('10'); - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, fundingAmount, contractBytecodeToDeploy + salt.substring(2), ]); @@ -319,7 +317,7 @@ export const shouldBehaveLikePermissionDeploy = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy, // init code ]); @@ -328,7 +326,7 @@ export const shouldBehaveLikePermissionDeploy = ( // so we can check it against the address emitted in the ContractCreated event const result = await context.keyManager .connect(addressCanDeployAndTransferValue) - .callStatic.execute(payload); + .execute.staticCall(payload); const [expectedContractAddress] = abiCoder.decode(['bytes'], result); @@ -336,9 +334,9 @@ export const shouldBehaveLikePermissionDeploy = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(expectedContractAddress), + ethers.getAddress(expectedContractAddress), 0, - ethers.utils.hexZeroPad('0x00', 32), + ethers.zeroPadValue('0x00', 32), ); }); @@ -347,16 +345,16 @@ export const shouldBehaveLikePermissionDeploy = ( const initialUpOwner = context.mainController.address; // generate the init code that contains the constructor args with the initial UP owner - const upDeploymentTx = new UniversalProfile__factory( + const upDeploymentTx = await new UniversalProfile__factory( context.accounts[0], ).getDeployTransaction(initialUpOwner); const contractBytecodeToDeploy = upDeploymentTx.data; - const fundingAmount = ethers.utils.parseEther('10'); + const fundingAmount = ethers.parseEther('10'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, fundingAmount, contractBytecodeToDeploy, // init code ]); @@ -368,24 +366,24 @@ export const shouldBehaveLikePermissionDeploy = ( it('should be allowed to deploy a contract with CREATE2', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy + salt.substring(2), ]); const preComputedAddress = calculateCreate2( - context.universalProfile.address, + await context.universalProfile.getAddress(), salt, contractBytecodeToDeploy, ).toLowerCase(); await expect(context.keyManager.connect(addressCanDeployAndTransferValue).execute(payload)) .to.emit(context.universalProfile, 'ContractCreated') - .withArgs(OPERATION_TYPES.CREATE2, ethers.utils.getAddress(preComputedAddress), 0, salt); + .withArgs(OPERATION_TYPES.CREATE2, ethers.getAddress(preComputedAddress), 0, salt); }); it('should revert with error `NotAuthorised(SUPER_TRANSFERVALUE)` when trying to deploy + fund a contract with CREATE2', async () => { @@ -393,18 +391,18 @@ export const shouldBehaveLikePermissionDeploy = ( const initialUpOwner = context.mainController.address; // generate the init code that contains the constructor args with the initial UP owner - const upDeploymentTx = new UniversalProfile__factory( + const upDeploymentTx = await new UniversalProfile__factory( context.accounts[0], ).getDeployTransaction(initialUpOwner); const contractBytecodeToDeploy = upDeploymentTx.data; - const fundingAmount = ethers.utils.parseEther('10'); + const fundingAmount = ethers.parseEther('10'); - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, fundingAmount, contractBytecodeToDeploy + salt.substring(2), ]); @@ -421,7 +419,7 @@ export const shouldBehaveLikePermissionDeploy = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy, // init code ]); @@ -430,7 +428,7 @@ export const shouldBehaveLikePermissionDeploy = ( // so we can check it against the address emitted in the ContractCreated event const result = await context.keyManager .connect(addressCanDeployAndSuperTransferValue) - .callStatic.execute(payload); + .execute.staticCall(payload); const [expectedContractAddress] = abiCoder.decode(['bytes'], result); @@ -440,9 +438,9 @@ export const shouldBehaveLikePermissionDeploy = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(expectedContractAddress), + ethers.getAddress(expectedContractAddress), 0, - ethers.utils.hexZeroPad('0x00', 32), + ethers.zeroPadValue('0x00', 32), ); }); @@ -451,16 +449,16 @@ export const shouldBehaveLikePermissionDeploy = ( const initialUpOwner = context.mainController.address; // generate the init code that contains the constructor args with the initial UP owner - const upDeploymentTx = new UniversalProfile__factory( + const upDeploymentTx = await new UniversalProfile__factory( context.accounts[0], ).getDeployTransaction(initialUpOwner); const contractBytecodeToDeploy = upDeploymentTx.data; - const fundingAmount = ethers.utils.parseEther('10'); + const fundingAmount = ethers.parseEther('10'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, fundingAmount, contractBytecodeToDeploy, // init code ]); @@ -469,7 +467,7 @@ export const shouldBehaveLikePermissionDeploy = ( // so we can check it against the address emitted in the ContractCreated event const result = await context.keyManager .connect(addressCanDeployAndSuperTransferValue) - .callStatic.execute(payload); + .execute.staticCall(payload); const [expectedContractAddress] = abiCoder.decode(['bytes'], result); @@ -479,15 +477,15 @@ export const shouldBehaveLikePermissionDeploy = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE, - ethers.utils.getAddress(expectedContractAddress), + ethers.getAddress(expectedContractAddress), fundingAmount, - ethers.utils.hexZeroPad('0x00', 32), + ethers.zeroPadValue('0x00', 32), ); // check that the newly deployed contract (UP) has the correct owner const newUp = new UniversalProfile__factory(context.accounts[0]).attach( expectedContractAddress, - ); + ) as UniversalProfile; expect(await newUp.owner()).to.equal(initialUpOwner); // check that the newly deployed contract (UP) has beedn funded with the correct balance @@ -496,17 +494,17 @@ export const shouldBehaveLikePermissionDeploy = ( it('should be allowed to deploy a contract with CREATE2', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy + salt.substring(2), ]); const preComputedAddress = calculateCreate2( - context.universalProfile.address, + await context.universalProfile.getAddress(), salt, contractBytecodeToDeploy, ).toLowerCase(); @@ -515,7 +513,7 @@ export const shouldBehaveLikePermissionDeploy = ( context.keyManager.connect(addressCanDeployAndSuperTransferValue).execute(payload), ) .to.emit(context.universalProfile, 'ContractCreated') - .withArgs(OPERATION_TYPES.CREATE2, ethers.utils.getAddress(preComputedAddress), 0, salt); + .withArgs(OPERATION_TYPES.CREATE2, ethers.getAddress(preComputedAddress), 0, salt); }); it('should be allowed to deploy + fund a contract with CREATE2', async () => { @@ -523,24 +521,24 @@ export const shouldBehaveLikePermissionDeploy = ( const initialUpOwner = context.mainController.address; // generate the init code that contains the constructor args with the initial UP owner - const upDeploymentTx = new UniversalProfile__factory( + const upDeploymentTx = await new UniversalProfile__factory( context.accounts[0], ).getDeployTransaction(initialUpOwner); const contractBytecodeToDeploy = upDeploymentTx.data; - const fundingAmount = ethers.utils.parseEther('10'); + const fundingAmount = ethers.parseEther('10'); - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, fundingAmount, contractBytecodeToDeploy + salt.substring(2), ]); const preComputedAddress = calculateCreate2( - context.universalProfile.address, + await context.universalProfile.getAddress(), salt, contractBytecodeToDeploy, ).toLowerCase(); @@ -551,13 +549,15 @@ export const shouldBehaveLikePermissionDeploy = ( .to.emit(context.universalProfile, 'ContractCreated') .withArgs( OPERATION_TYPES.CREATE2, - ethers.utils.getAddress(preComputedAddress), + ethers.getAddress(preComputedAddress), fundingAmount, salt, ); // check that the newly deployed contract (UP) has the correct owner - const newUp = new UniversalProfile__factory(context.accounts[0]).attach(preComputedAddress); + const newUp = new UniversalProfile__factory(context.accounts[0]).attach( + preComputedAddress, + ) as UniversalProfile; expect(await newUp.owner()).to.equal(initialUpOwner); @@ -573,7 +573,7 @@ export const shouldBehaveLikePermissionDeploy = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy, ]); @@ -585,11 +585,11 @@ export const shouldBehaveLikePermissionDeploy = ( it('should revert when trying to deploy a contract via CREATE2', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy + salt.substring(2), ]); @@ -606,16 +606,13 @@ export const shouldBehaveLikePermissionDeploy = ( it('should recover the wrong signer address and revert with `NoPermissionsSet`', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const nonce = await context.keyManager.callStatic.getNonce( - addressCannotDeploy.address, - 0, - ); + const nonce = await context.keyManager.getNonce(addressCannotDeploy.address, 0); const validityTimestamps = 0; const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy, ]); @@ -623,7 +620,7 @@ export const shouldBehaveLikePermissionDeploy = ( const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [LSP25_VERSION, HARDHAT_CHAINID, nonce, validityTimestamps, valueToSend, payload], ); @@ -634,7 +631,7 @@ export const shouldBehaveLikePermissionDeploy = ( const incorrectSignerAddress = eip191Signer.recover( eip191Signer.hashDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, ), ethereumSignature, @@ -656,16 +653,13 @@ export const shouldBehaveLikePermissionDeploy = ( it('should revert with `NotAuthorised` with correct signer address but missing permission DEPLOY', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const nonce = await context.keyManager.callStatic.getNonce( - addressCannotDeploy.address, - 0, - ); + const nonce = await context.keyManager.getNonce(addressCannotDeploy.address, 0); const validityTimestamps = 0; const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy, ]); @@ -673,7 +667,7 @@ export const shouldBehaveLikePermissionDeploy = ( const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [LSP25_VERSION, HARDHAT_CHAINID, nonce, validityTimestamps, valueToSend, payload], ); @@ -681,7 +675,7 @@ export const shouldBehaveLikePermissionDeploy = ( const eip191Signer = new EIP191Signer(); const { signature } = eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT4, ); @@ -703,18 +697,15 @@ export const shouldBehaveLikePermissionDeploy = ( describe('when signing with Ethereum Signed Message', () => { it('should recover the wrong signer address and revert with `NoPermissionsSet`', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); - const nonce = await context.keyManager.callStatic.getNonce( - addressCannotDeploy.address, - 0, - ); + const nonce = await context.keyManager.getNonce(addressCannotDeploy.address, 0); const validityTimestamps = 0; const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy + salt.substring(2), ]); @@ -722,7 +713,7 @@ export const shouldBehaveLikePermissionDeploy = ( const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [LSP25_VERSION, HARDHAT_CHAINID, nonce, validityTimestamps, valueToSend, payload], ); @@ -732,7 +723,7 @@ export const shouldBehaveLikePermissionDeploy = ( const eip191Signer = new EIP191Signer(); const incorrectSignerAddress = eip191Signer.recover( eip191Signer.hashDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, ), ethereumSignature, @@ -753,18 +744,15 @@ export const shouldBehaveLikePermissionDeploy = ( describe("when signing with EIP191Signer '\\x19\\x00'", () => { it('should revert with `NotAuthorised` with correct signer address but missing permission DEPLOY', async () => { const contractBytecodeToDeploy = TargetContract__factory.bytecode; - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const salt = ethers.hexlify(ethers.randomBytes(32)); - const nonce = await context.keyManager.callStatic.getNonce( - addressCannotDeploy.address, - 0, - ); + const nonce = await context.keyManager.getNonce(addressCannotDeploy.address, 0); const validityTimestamps = 0; const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CREATE2, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, contractBytecodeToDeploy + salt.substring(2), ]); @@ -772,7 +760,7 @@ export const shouldBehaveLikePermissionDeploy = ( const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [LSP25_VERSION, HARDHAT_CHAINID, nonce, validityTimestamps, valueToSend, payload], ); @@ -780,7 +768,7 @@ export const shouldBehaveLikePermissionDeploy = ( const lsp6Signer = new EIP191Signer(); const { signature } = lsp6Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT4, ); diff --git a/tests/LSP6KeyManager/Interactions/PermissionStaticCall.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionStaticCall.test.ts similarity index 84% rename from tests/LSP6KeyManager/Interactions/PermissionStaticCall.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionStaticCall.test.ts index fd7e88b3b..e5bffa74a 100644 --- a/tests/LSP6KeyManager/Interactions/PermissionStaticCall.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionStaticCall.test.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { ethers } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { hashMessage, parseEther, toUtf8Bytes } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { TargetContract, @@ -12,14 +12,9 @@ import { } from '../../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - PERMISSIONS, - OPERATION_TYPES, - ERC1271_VALUES, - CALLTYPE, -} from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES, ERC1271_VALUES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -83,7 +78,11 @@ export const shouldBehaveLikePermissionStaticCall = ( combineCallTypes(CALLTYPE.STATICCALL, CALLTYPE.VALUE), combineCallTypes(CALLTYPE.STATICCALL, CALLTYPE.VALUE), ], - [targetContract.address, signatureValidator.address, onERC721ReceivedContract.address], + [ + await targetContract.getAddress(), + await signatureValidator.getAddress(), + await onERC721ReceivedContract.getAddress(), + ], ['0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff'], ), @@ -96,20 +95,20 @@ export const shouldBehaveLikePermissionStaticCall = ( describe('when caller has ALL PERMISSIONS', () => { it('should pass and return a `string`', async () => { - const expectedName = await targetContract.callStatic.getName(); + const expectedName = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('getName'); const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ]); const result = await context.keyManager .connect(context.mainController) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedBytes] = abiCoder.decode(['bytes'], result); @@ -118,7 +117,7 @@ export const shouldBehaveLikePermissionStaticCall = ( }); it('should pass and return an array of number `uint256[]`', async () => { - const expectedNumbers = await targetContract.callStatic.getDynamicArrayOf2Numbers(); + const expectedNumbers = await targetContract.getDynamicArrayOf2Numbers(); const targetContractPayload = targetContract.interface.encodeFunctionData( 'getDynamicArrayOf2Numbers', @@ -126,14 +125,14 @@ export const shouldBehaveLikePermissionStaticCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ]); const result = await context.keyManager .connect(context.mainController) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedBytes] = abiCoder.decode(['bytes'], result); @@ -149,37 +148,37 @@ export const shouldBehaveLikePermissionStaticCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ]); const result = await context.keyManager .connect(addressCanMakeStaticCall) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedBytes] = abiCoder.decode(['bytes'], result); - const expectedName = await targetContract.callStatic.getName(); + const expectedName = await targetContract.getName(); const [decodedResult] = abiCoder.decode(['string'], decodedBytes); expect(decodedResult).to.equal(expectedName); }); it('should revert with error `ERC725X_MsgValueDisallowedInStaticCall` if `value` param is not 0', async () => { - const LyxAmount = ethers.utils.parseEther('3'); + const LyxAmount = parseEther('3'); const targetContractPayload = targetContract.interface.encodeFunctionData('getName'); const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), LyxAmount, targetContractPayload, ]); await expect( - context.keyManager.connect(addressCanMakeStaticCall).callStatic.execute(executePayload), + context.keyManager.connect(addressCanMakeStaticCall).execute.staticCall(executePayload), ).to.be.revertedWithCustomError( context.universalProfile, 'ERC725X_MsgValueDisallowedInStaticCall', @@ -192,7 +191,7 @@ export const shouldBehaveLikePermissionStaticCall = ( it('should pass and return data when `value` param is 0', async () => { const message = 'some message to sign'; const signature = await context.mainController.signMessage(message); - const messageHash = ethers.utils.hashMessage(message); + const messageHash = hashMessage(message); const erc1271ContractPayload = signatureValidator.interface.encodeFunctionData( 'isValidSignature', @@ -201,14 +200,14 @@ export const shouldBehaveLikePermissionStaticCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - signatureValidator.address, + await signatureValidator.getAddress(), 0, erc1271ContractPayload, ]); const result = await context.keyManager .connect(addressCanMakeStaticCall) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedBytes] = abiCoder.decode(['bytes'], result); @@ -217,11 +216,11 @@ export const shouldBehaveLikePermissionStaticCall = ( }); it('should revert with error `ERC725X_MsgValueDisallowedInStaticCall` if `value` param is not 0', async () => { - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = parseEther('3'); const message = 'some message to sign'; const signature = await context.mainController.signMessage(message); - const messageHash = ethers.utils.hashMessage(message); + const messageHash = hashMessage(message); const erc1271ContractPayload = signatureValidator.interface.encodeFunctionData( 'isValidSignature', @@ -230,7 +229,7 @@ export const shouldBehaveLikePermissionStaticCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - signatureValidator.address, + await signatureValidator.getAddress(), lyxAmount, erc1271ContractPayload, ]); @@ -253,24 +252,24 @@ export const shouldBehaveLikePermissionStaticCall = ( context.mainController.address, context.mainController.address, 1, - ethers.utils.toUtf8Bytes('some data'), + toUtf8Bytes('some data'), ], ); // the important part is that the function is `view` and return the correct value const expectedReturnValue = - onERC721ReceivedContract.interface.getSighash('onERC721Received'); + onERC721ReceivedContract.interface.getFunction('onERC721Received').selector; const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - onERC721ReceivedContract.address, + await onERC721ReceivedContract.getAddress(), 0, onERC721Payload, ]); const result = await context.keyManager .connect(addressCanMakeStaticCall) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedBytes] = abiCoder.decode(['bytes'], result); @@ -280,7 +279,7 @@ export const shouldBehaveLikePermissionStaticCall = ( }); it('should revert with error `ERC725X_MsgValueDisallowedInStaticCall` if `value` param is not 0', async () => { - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = parseEther('3'); // the params are not relevant for this test and just used as placeholders. const onERC721Payload = onERC721ReceivedContract.interface.encodeFunctionData( @@ -289,13 +288,13 @@ export const shouldBehaveLikePermissionStaticCall = ( context.mainController.address, context.mainController.address, 1, - ethers.utils.toUtf8Bytes('some data'), + toUtf8Bytes('some data'), ], ); const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - onERC721ReceivedContract.address, + await onERC721ReceivedContract.getAddress(), lyxAmount, onERC721Payload, ]); @@ -311,7 +310,7 @@ export const shouldBehaveLikePermissionStaticCall = ( describe('when calling a state changing function at the target contract', () => { it('should revert (silently) if `value` parameter is 0', async () => { - const initialValue = await targetContract.callStatic.getName(); + const initialValue = await targetContract.getName(); const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ 'modified name', @@ -319,7 +318,7 @@ export const shouldBehaveLikePermissionStaticCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ]); @@ -328,12 +327,12 @@ export const shouldBehaveLikePermissionStaticCall = ( .to.be.reverted; // ensure state hasn't changed. - const newValue = await targetContract.callStatic.getName(); + const newValue = await targetContract.getName(); expect(initialValue).to.equal(newValue); }); it('should revert with error `ERC725X_MsgValueDisallowedInStaticCall` if `value` parameter is not 0', async () => { - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = parseEther('3'); const targetContractPayload = targetContract.interface.encodeFunctionData('setName', [ 'modified name', @@ -341,7 +340,7 @@ export const shouldBehaveLikePermissionStaticCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), lyxAmount, targetContractPayload, ]); @@ -362,7 +361,7 @@ export const shouldBehaveLikePermissionStaticCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ]); @@ -370,7 +369,7 @@ export const shouldBehaveLikePermissionStaticCall = ( await expect( context.keyManager .connect(addressCanMakeStaticCallNoAllowedCalls) - .callStatic.execute(executePayload), + .execute.staticCall(executePayload), ) .to.be.revertedWithCustomError(context.keyManager, 'NoCallsAllowed') .withArgs(addressCanMakeStaticCallNoAllowedCalls.address); @@ -383,7 +382,7 @@ export const shouldBehaveLikePermissionStaticCall = ( const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContractPayload, ]); @@ -417,7 +416,10 @@ export const shouldBehaveLikePermissionStaticCall = ( PERMISSIONS.STATICCALL, combineAllowedCalls( [CALLTYPE.STATICCALL, CALLTYPE.STATICCALL], - [allowedTargetContracts[0].address, allowedTargetContracts[1].address], + [ + await allowedTargetContracts[0].getAddress(), + await allowedTargetContracts[1].getAddress(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -431,17 +433,17 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getName'), + targetContract.interface.getFunction('getName').selector, ]); await expect(context.keyManager.connect(caller).execute(payload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( caller.address, - targetContract.address, - targetContract.interface.getSighash('getName'), + await targetContract.getAddress(), + targetContract.interface.getFunction('getName').selector, ); }); @@ -451,12 +453,12 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getName'), + targetContract.interface.getFunction('getName').selector, ]); - const result = await context.keyManager.connect(caller).callStatic.execute(payload); + const result = await context.keyManager.connect(caller).execute.staticCall(payload); const [decodedResult] = abiCoder.decode(['bytes'], result); @@ -471,12 +473,12 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getNumber'), + targetContract.interface.getFunction('getNumber').selector, ]); - const result = await context.keyManager.connect(caller).callStatic.execute(payload); + const result = await context.keyManager.connect(caller).execute.staticCall(payload); const [decodedResult] = abiCoder.decode(['bytes'], result); @@ -493,12 +495,12 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); - await expect(context.keyManager.connect(caller).callStatic.execute(payload)).to.be.reverted; + await expect(context.keyManager.connect(caller).execute.staticCall(payload)).to.be.reverted; }); it('should revert when calling state changing function -> setNumber(uint256)', async () => { @@ -508,12 +510,12 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); - await expect(context.keyManager.connect(caller).callStatic.execute(payload)).to.be.reverted; + await expect(context.keyManager.connect(caller).execute.staticCall(payload)).to.be.reverted; }); }); @@ -523,12 +525,12 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getName'), + targetContract.interface.getFunction('getName').selector, ]); - const result = await context.keyManager.connect(caller).callStatic.execute(payload); + const result = await context.keyManager.connect(caller).execute.staticCall(payload); const [decodedResult] = abiCoder.decode(['bytes'], result); @@ -543,12 +545,12 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, - targetContract.interface.getSighash('getNumber'), + targetContract.interface.getFunction('getNumber').selector, ]); - const result = await context.keyManager.connect(caller).callStatic.execute(payload); + const result = await context.keyManager.connect(caller).execute.staticCall(payload); const [decodedResult] = abiCoder.decode(['bytes'], result); @@ -565,12 +567,12 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); - await expect(context.keyManager.connect(caller).callStatic.execute(payload)).to.be.reverted; + await expect(context.keyManager.connect(caller).execute.staticCall(payload)).to.be.reverted; }); it('should revert when calling state changing function -> setNumber(uint256)', async () => { @@ -580,12 +582,12 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); - await expect(context.keyManager.connect(caller).callStatic.execute(payload)).to.be.reverted; + await expect(context.keyManager.connect(caller).execute.staticCall(payload)).to.be.reverted; }); }); }); @@ -615,7 +617,10 @@ export const shouldBehaveLikePermissionStaticCall = ( PERMISSIONS.SUPER_STATICCALL, combineAllowedCalls( ['00000004', '00000004'], - [allowedTargetContracts[0].address, allowedTargetContracts[1].address], + [ + await allowedTargetContracts[0].getAddress(), + await allowedTargetContracts[1].getAddress(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -630,14 +635,14 @@ export const shouldBehaveLikePermissionStaticCall = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - randomContract.address, + await randomContract.getAddress(), 0, - randomContract.interface.getSighash('getName'), + randomContract.interface.getFunction('getName').selector, ]); const result = await context.keyManager .connect(addressWithSuperStaticCall) - .callStatic.execute(payload); + .execute.staticCall(payload); const [decodedBytes] = abiCoder.decode(['bytes'], result); @@ -650,13 +655,13 @@ export const shouldBehaveLikePermissionStaticCall = ( it('should revert with error `ERC725X_MsgValueDisallowedInStaticCall` when `value` param is not 0', async () => { const randomContract = await new TargetContract__factory(context.accounts[0]).deploy(); - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = parseEther('3'); const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - randomContract.address, + await randomContract.getAddress(), lyxAmount, - randomContract.interface.getSighash('getName'), + randomContract.interface.getFunction('getName').selector, ]); await expect( @@ -694,7 +699,10 @@ export const shouldBehaveLikePermissionStaticCall = ( PERMISSIONS.SUPER_CALL, combineAllowedCalls( [CALLTYPE.STATICCALL, CALLTYPE.STATICCALL], - [allowedTargetContracts[0].address, allowedTargetContracts[1].address], + [ + await allowedTargetContracts[0].getAddress(), + await allowedTargetContracts[1].getAddress(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -705,11 +713,11 @@ export const shouldBehaveLikePermissionStaticCall = ( describe('when interacting with 1st allowed contract', () => { it('should revert with `NotAuthorised` when using operation type `STATICCALL`', async () => { - const targetPayload = allowedTargetContracts[0].interface.getSighash('getName'); + const targetPayload = allowedTargetContracts[0].interface.getFunction('getName').selector; const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - allowedTargetContracts[0].address, + await allowedTargetContracts[0].getAddress(), 0, targetPayload, ]); @@ -722,11 +730,11 @@ export const shouldBehaveLikePermissionStaticCall = ( describe('when interacting with 2nd allowed contract', () => { it('should revert with `NotAuthorised` when using operation type `STATICCALL`', async () => { - const targetPayload = allowedTargetContracts[1].interface.getSighash('getName'); + const targetPayload = allowedTargetContracts[1].interface.getFunction('getName').selector; const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - allowedTargetContracts[1].address, + await allowedTargetContracts[1].getAddress(), 0, targetPayload, ]); @@ -766,7 +774,10 @@ export const shouldBehaveLikePermissionStaticCall = ( combineCallTypes(CALLTYPE.STATICCALL, CALLTYPE.VALUE), combineCallTypes(CALLTYPE.STATICCALL, CALLTYPE.VALUE), ], - [allowedTargetContracts[0].address, allowedTargetContracts[1].address], + [ + await allowedTargetContracts[0].getAddress(), + await allowedTargetContracts[1].getAddress(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -777,18 +788,18 @@ export const shouldBehaveLikePermissionStaticCall = ( describe('when interacting with `view` function of 1st allowed contract', () => { it('should pass and return data when `value` param is 0', async () => { - const targetPayload = allowedTargetContracts[0].interface.getSighash('getName'); + const targetPayload = allowedTargetContracts[0].interface.getFunction('getName').selector; const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - allowedTargetContracts[0].address, + await allowedTargetContracts[0].getAddress(), 0, targetPayload, ]); const result = await context.keyManager .connect(addressCanMakeStaticCall) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedBytes] = abiCoder.decode(['bytes'], result); @@ -799,12 +810,12 @@ export const shouldBehaveLikePermissionStaticCall = ( }); it('should revert with error `ERC725X_MsgValueDisallowedInStaticCall` when `value` param is not 0', async () => { - const targetPayload = allowedTargetContracts[0].interface.getSighash('getName'); + const targetPayload = allowedTargetContracts[0].interface.getFunction('getName').selector; const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - allowedTargetContracts[0].address, - ethers.utils.parseEther('3'), + await allowedTargetContracts[0].getAddress(), + parseEther('3'), targetPayload, ]); @@ -819,18 +830,18 @@ export const shouldBehaveLikePermissionStaticCall = ( describe('when interacting with `view` function of 2nd allowed contract', () => { it('should pass and return data when `value` param is 0', async () => { - const targetPayload = allowedTargetContracts[1].interface.getSighash('getName'); + const targetPayload = allowedTargetContracts[1].interface.getFunction('getName').selector; const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - allowedTargetContracts[1].address, + await allowedTargetContracts[1].getAddress(), 0, targetPayload, ]); const result = await context.keyManager .connect(addressCanMakeStaticCall) - .callStatic.execute(executePayload); + .execute.staticCall(executePayload); const [decodedResult] = abiCoder.decode(['bytes'], result); @@ -841,12 +852,12 @@ export const shouldBehaveLikePermissionStaticCall = ( }); it('should revert with error `ERC725X_MsgValueDisallowedInStaticCall` when `value` param is not 0', async () => { - const targetPayload = allowedTargetContracts[1].interface.getSighash('getName'); + const targetPayload = allowedTargetContracts[1].interface.getFunction('getName').selector; const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.STATICCALL, - allowedTargetContracts[1].address, - ethers.utils.parseEther('3'), + await allowedTargetContracts[1].getAddress(), + parseEther('3'), targetPayload, ]); diff --git a/tests/LSP6KeyManager/Interactions/PermissionTransferValue.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionTransferValue.test.ts similarity index 80% rename from tests/LSP6KeyManager/Interactions/PermissionTransferValue.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionTransferValue.test.ts index 1d3626f4d..04e4cabad 100644 --- a/tests/LSP6KeyManager/Interactions/PermissionTransferValue.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Interactions/PermissionTransferValue.test.ts @@ -1,34 +1,30 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { EIP191Signer } from '@lukso/eip191-signer.js'; -import { BigNumber } from 'ethers'; -import { FakeContract, smock } from '@defi-wonderland/smock'; import { Executor, Executor__factory, - LSP7Mintable, - LSP7Mintable__factory, TargetContract__factory, TargetPayableContract, TargetPayableContract__factory, - UniversalProfile__factory, - UniversalProfile, GraffitiEventExtension__factory, GraffitiEventExtension, + UniversalProfile__factory, + UniversalProfile, + LSP7Mintable, + LSP7Mintable__factory, + FallbackContract, + FallbackContract__factory, } from '../../../types'; // constants -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - LSP25_VERSION, - PERMISSIONS, - OPERATION_TYPES, - CALLTYPE, - LSP4_TOKEN_TYPES, -} from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; +import { LSP25_VERSION } from '@lukso/lsp25-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -46,7 +42,7 @@ import { const universalProfileInterface = UniversalProfile__factory.createInterface(); export const shouldBehaveLikePermissionTransferValue = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -63,7 +59,7 @@ export const shouldBehaveLikePermissionTransferValue = ( let graffitiExtension: GraffitiEventExtension; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); canTransferValue = context.accounts[1]; canTransferValueAndCall = context.accounts[2]; @@ -84,13 +80,13 @@ export const shouldBehaveLikePermissionTransferValue = ( await recipientUP .connect(context.accounts[0]) - .setData(lsp17ExtensionDataKeyForGraffiti, graffitiExtension.address); + .setData(lsp17ExtensionDataKeyForGraffiti, await graffitiExtension.getAddress()); // CHECK that a LSP17 Extension is was set for graffiti data `bytes4(0)` expect( // checksum address retrieved from storage (stored in lower case with hex) - ethers.utils.getAddress(await recipientUP.getData(lsp17ExtensionDataKeyForGraffiti)), - ).to.equal(graffitiExtension.address); + ethers.getAddress(await recipientUP.getData(lsp17ExtensionDataKeyForGraffiti)), + ).to.equal(await graffitiExtension.getAddress()); // prettier-ignore const permissionsKeys = [ @@ -117,7 +113,7 @@ export const shouldBehaveLikePermissionTransferValue = ( PERMISSIONS.TRANSFERVALUE, combineAllowedCalls( [CALLTYPE.VALUE, CALLTYPE.VALUE], - [recipient.address, recipientUP.address], + [recipient.address, recipientUP.target], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -128,7 +124,7 @@ export const shouldBehaveLikePermissionTransferValue = ( combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), ], - [recipient.address, recipientUP.address], + [recipient.address, recipientUP.target], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -136,7 +132,7 @@ export const shouldBehaveLikePermissionTransferValue = ( PERMISSIONS.CALL, combineAllowedCalls( [CALLTYPE.CALL, CALLTYPE.CALL], - [recipient.address, recipientUP.address], + [recipient.address, recipientUP.target], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -148,7 +144,7 @@ export const shouldBehaveLikePermissionTransferValue = ( combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), ], - [recipient.address, recipientUP.address], + [recipient.address, recipientUP.target], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -163,7 +159,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const data = '0x'; it('should pass when controller has ALL PERMISSIONS', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -179,13 +175,13 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect( context.keyManager.connect(context.mainController).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); it('should pass when controller has permission TRANSFERVALUE only', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -197,13 +193,13 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect( context.keyManager.connect(canTransferValue).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); it('should pass when controller has permission TRANSFERVALUE + CALL', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -215,19 +211,21 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect(() => context.keyManager.connect(canTransferValueAndCall).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); it('should fail when controller has permission CALL only but not TRANSFERVALUE', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); @@ -235,7 +233,9 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canCallOnly.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -244,13 +244,15 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should fail when controller has neither CALL nor TRANSFERVALUE permissions', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); @@ -260,7 +262,9 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canNeitherCallNorTransferValue.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -273,20 +277,24 @@ export const shouldBehaveLikePermissionTransferValue = ( const data = '0xaabbccdd'; it('should pass when controller has ALL PERMISSIONS', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); await context.keyManager.connect(context.mainController).execute(transferPayload); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); expect(newBalanceUP).to.be.lt(initialBalanceUP); const newBalanceRecipient = await provider.getBalance(recipient.address); @@ -294,7 +302,7 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should pass when controller has permission TRANSFERVALUE + CALL', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -306,19 +314,21 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect(() => context.keyManager.connect(canTransferValueAndCall).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); it('should fail when controller has permission TRANSFERVALUE only', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); @@ -326,7 +336,9 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canTransferValue.address, 'CALL'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -335,13 +347,15 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should fail when controller has permission CALL only but not TRANSFERVALUE', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); @@ -349,7 +363,9 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canCallOnly.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -358,13 +374,15 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should fail when controller has neither CALL nor TRANSFERVALUE permissions', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); @@ -374,7 +392,9 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canNeitherCallNorTransferValue.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -387,13 +407,15 @@ export const shouldBehaveLikePermissionTransferValue = ( const data = '0x00000000aabbccdd'; it('should fail when controller has permission TRANSFERVALUE only', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); @@ -403,7 +425,9 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canTransferValue.address, 'CALL'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -412,13 +436,15 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('it should fail when controller has permission CALL only', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); @@ -426,7 +452,9 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canCallOnly.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -435,13 +463,15 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('it should fail when caller has neither permissions CALL nor TRANSFERVALUE', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient.address); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, recipient.address, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), data, ]); @@ -453,7 +483,9 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canNeitherCallNorTransferValue.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const newBalanceRecipient = await provider.getBalance(recipient.address); // verify that native token balances have not changed @@ -462,7 +494,7 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should pass when caller has permission TRANSFERVALUE + CALL', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -476,7 +508,7 @@ export const shouldBehaveLikePermissionTransferValue = ( .connect(canTransferValueAndCall) ['execute(bytes)'](transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); @@ -485,7 +517,7 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('when transferring value via `executeRelayCall(...)`', () => { it('should revert if tx was signed with Eth Signed Message', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const validityTimestamps = 0; @@ -499,7 +531,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -528,7 +560,7 @@ export const shouldBehaveLikePermissionTransferValue = ( it("should pass if tx was signed with EIP191Signer '\\x19\\x00' prefix", async () => { const eip191Signer = new EIP191Signer(); - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const validityTimestamps = 0; @@ -542,7 +574,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -555,7 +587,7 @@ export const shouldBehaveLikePermissionTransferValue = ( ); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT0, ); @@ -567,7 +599,7 @@ export const shouldBehaveLikePermissionTransferValue = ( value: valueToSend, }), ).to.changeEtherBalances( - [context.universalProfile.address, recipient.address], + [await context.universalProfile.getAddress(), recipient.address], [`-${amount}`, amount], ); }); @@ -579,13 +611,15 @@ export const shouldBehaveLikePermissionTransferValue = ( const data = '0x00000000aabbccdd'; it('should fail when controller has permission TRANSFERVALUE only', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); - const initialBalanceRecipient = await provider.getBalance(recipientUP.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const initialBalanceRecipient = await provider.getBalance(recipientUP.target); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - recipientUP.address, - ethers.utils.parseEther('3'), + recipientUP.target, + ethers.parseEther('3'), data, ]); @@ -595,8 +629,10 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canTransferValue.address, 'CALL'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); - const newBalanceRecipient = await provider.getBalance(recipientUP.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const newBalanceRecipient = await provider.getBalance(recipientUP.target); // verify that native token balances have not changed expect(newBalanceUP).to.equal(initialBalanceUP); @@ -604,13 +640,15 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should fail when controller has permission CALL only', async () => { - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); - const initialBalanceRecipient = await provider.getBalance(recipientUP.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const initialBalanceRecipient = await provider.getBalance(recipientUP.target); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - recipientUP.address, - ethers.utils.parseEther('3'), + recipientUP.target, + ethers.parseEther('3'), data, ]); @@ -618,8 +656,10 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') .withArgs(canCallOnly.address, 'TRANSFERVALUE'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); - const newBalanceRecipient = await provider.getBalance(recipientUP.address); + const newBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const newBalanceRecipient = await provider.getBalance(recipientUP.target); // verify that native token balances have not changed expect(newBalanceUP).to.equal(initialBalanceUP); @@ -627,11 +667,11 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should pass when controller has permission TRANSFERVALUE + CALL', async () => { - const amount = ethers.utils.parseEther('3'); + const amount = ethers.parseEther('3'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - recipientUP.address, + recipientUP.target, amount, data, ]); @@ -641,7 +681,7 @@ export const shouldBehaveLikePermissionTransferValue = ( ['execute(bytes)'](transferPayload); expect(tx).to.changeEtherBalances( - [context.universalProfile.address, recipientUP.address], + [await context.universalProfile.getAddress(), recipientUP.target], [`-${amount}`, amount], ); @@ -666,22 +706,22 @@ export const shouldBehaveLikePermissionTransferValue = ( const GAS_PROVIDED = 200_000; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); recipient = context.accounts[1].address; contractCanTransferValue = await new Executor__factory(context.accounts[0]).deploy( - context.universalProfile.address, - context.keyManager.address, + await context.universalProfile.getAddress(), + await context.keyManager.getAddress(), ); const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + context.mainController.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - contractCanTransferValue.address.substring(2), + (await contractCanTransferValue.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - contractCanTransferValue.address.substring(2), + (await contractCanTransferValue.getAddress()).substring(2), ]; const permissionValues = [ @@ -700,14 +740,14 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('> Contract calls', () => { it('Should send 1 LYX to an address hardcoded in Executor (`sendOneLyxHardcoded`)', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => contractCanTransferValue.sendOneLyxHardcoded({ gasLimit: GAS_PROVIDED, }), ).to.changeEtherBalances( - [context.universalProfile.address, hardcodedRecipient], + [await context.universalProfile.getAddress(), hardcodedRecipient], [ `-${amount}`, // UP balance should have gone down amount, // recipient balance should have gone up @@ -716,14 +756,14 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('Should send 1 LYX to an address provided to Executor (`sendOneLyxToRecipient`)', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => contractCanTransferValue.sendOneLyxToRecipient(recipient, { gasLimit: GAS_PROVIDED, }), ).to.changeEtherBalances( - [context.universalProfile.address, recipient], + [await context.universalProfile.getAddress(), recipient], [`-${amount}`, amount], ); }); @@ -731,27 +771,27 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('> Low-level calls', () => { it('Should send 1 LYX to an address hardcoded in Executor (`sendOneLyxHardcodedRawCall`)', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => contractCanTransferValue.sendOneLyxHardcodedRawCall({ gasLimit: GAS_PROVIDED, }), ).to.changeEtherBalances( - [context.universalProfile.address, hardcodedRecipient], + [await context.universalProfile.getAddress(), hardcodedRecipient], [`-${amount}`, amount], ); }); it('Should send 1 LYX to an address provided to Executor (`sendOneLyxToRecipientRawCall`)', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); await expect(() => contractCanTransferValue.sendOneLyxToRecipientRawCall(recipient, { gasLimit: GAS_PROVIDED, }), ).to.changeEtherBalances( - [context.universalProfile.address, recipient], + [await context.universalProfile.getAddress(), recipient], [`-${amount}`, amount], ); }); @@ -768,10 +808,10 @@ export const shouldBehaveLikePermissionTransferValue = ( let bobContext: LSP6TestContext; before(async () => { - aliceContext = await buildContext(ethers.utils.parseEther('50')); + aliceContext = await buildContext(ethers.parseEther('50')); alice = aliceContext.accounts[0]; - bobContext = await buildContext(ethers.utils.parseEther('50')); + bobContext = await buildContext(ethers.parseEther('50')); bob = bobContext.accounts[1]; const alicePermissionKeys = [ @@ -782,9 +822,9 @@ export const shouldBehaveLikePermissionTransferValue = ( const bobPermissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + bob.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - aliceContext.universalProfile.address.substring(2), + (await aliceContext.universalProfile.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - aliceContext.universalProfile.address.substring(2), + (await aliceContext.universalProfile.getAddress()).substring(2), ]; const bobPermissionValues = [ @@ -792,7 +832,7 @@ export const shouldBehaveLikePermissionTransferValue = ( PERMISSIONS.TRANSFERVALUE, combineAllowedCalls( [CALLTYPE.VALUE], - [aliceContext.universalProfile.address], + [await aliceContext.universalProfile.getAddress()], ['0xffffffff'], ['0xffffffff'], ), @@ -821,18 +861,18 @@ export const shouldBehaveLikePermissionTransferValue = ( it("Alice's UP should have permission TRANSFERVALUE on Bob's UP", async () => { const key = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - aliceContext.universalProfile.address.substring(2); + (await aliceContext.universalProfile.getAddress()).substring(2); const result = await bobContext.universalProfile.getData(key); expect(result).to.equal(PERMISSIONS.TRANSFERVALUE); }); it("Alice should be able to send 5 LYX from Bob's UP to her UP", async () => { - const amount = ethers.utils.parseEther('5'); + const amount = ethers.parseEther('5'); const finalTransferLyxPayload = bobContext.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, aliceContext.universalProfile.address, amount, '0x'], + [OPERATION_TYPES.CALL, await aliceContext.universalProfile.getAddress(), amount, '0x'], ); const bobKeyManagerPayload = bobContext.keyManager.interface.encodeFunctionData('execute', [ @@ -842,7 +882,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const aliceUniversalProfilePayload = aliceContext.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - bobContext.keyManager.address, + await bobContext.keyManager.getAddress(), 0, bobKeyManagerPayload, ]); @@ -850,7 +890,10 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect(() => aliceContext.keyManager.connect(alice).execute(aliceUniversalProfilePayload), ).to.changeEtherBalances( - [bobContext.universalProfile.address, aliceContext.universalProfile.address], + [ + await bobContext.universalProfile.getAddress(), + await aliceContext.universalProfile.getAddress(), + ], [`-${amount}`, amount], ); }); @@ -862,7 +905,7 @@ export const shouldBehaveLikePermissionTransferValue = ( let targetContract: TargetPayableContract; let lyxRecipientEOA: string; - let lyxRecipientContract: FakeContract; + let lyxRecipientContract: FallbackContract; const recipientsEOA: string[] = [ ethers.Wallet.createRandom().address, @@ -875,7 +918,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const recipientUPs: string[] = []; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); caller = context.accounts[1]; @@ -892,17 +935,11 @@ export const shouldBehaveLikePermissionTransferValue = ( lyxRecipientEOA = ethers.Wallet.createRandom().address; // this contract has a payable fallback function and can receive native tokens - lyxRecipientContract = await smock.fake([ - { - stateMutability: 'payable', - type: 'fallback', - }, - ]); - lyxRecipientContract.fallback.returns(); + lyxRecipientContract = await new FallbackContract__factory(context.accounts[0]).deploy(); await lsp7Token .connect(context.accounts[0]) - .mint(context.universalProfile.address, 100, false, '0x'); + .mint(await context.universalProfile.getAddress(), 100, false, '0x'); const permissionsKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + caller.address.substring(2), @@ -922,10 +959,10 @@ export const shouldBehaveLikePermissionTransferValue = ( combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), ], [ - lsp7Token.address, - targetContract.address, + lsp7Token.target as string, + await targetContract.getAddress(), lyxRecipientEOA, - lyxRecipientContract.address, + lyxRecipientContract.target as string, ], ['0xffffffff', '0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff', '0xffffffff'], @@ -938,14 +975,14 @@ export const shouldBehaveLikePermissionTransferValue = ( const newUP = await new UniversalProfile__factory(context.accounts[0]).deploy( context.accounts[0].address, ); - recipientUPs.push(newUP.address); + recipientUPs.push(await newUP.getAddress()); } }); describe('when sending native tokens without `data`', () => { recipientsEOA.forEach((recipient) => { it(`should allow to send LYX to any EOA (e.g; at address -> ${recipient})`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -957,7 +994,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect(() => context.keyManager.connect(caller).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, recipient], + [await context.universalProfile.getAddress(), recipient], [`-${amount}`, amount], ); }); @@ -965,7 +1002,7 @@ export const shouldBehaveLikePermissionTransferValue = ( recipientUPs.forEach((recipientUP) => { it(`should allow to send LYX to any UP contract (e.g: at address -> ${recipientUP})`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -977,7 +1014,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect(() => context.keyManager.connect(caller).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, recipientUP], + [await context.universalProfile.getAddress(), recipientUP], [`-${amount}`, amount], ); }); @@ -987,7 +1024,7 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('when sending native tokens with `data`', () => { recipientsEOA.forEach((recipient) => { it(`should not allow to send LYX with some \`data\` to a random EOA (e.g: at address -> ${recipient})`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; const transferLyxPayload = universalProfileInterface.encodeFunctionData('execute', [ @@ -1005,7 +1042,7 @@ export const shouldBehaveLikePermissionTransferValue = ( recipientUPs.forEach((recipientUP) => { it(`should not allow to send LYX with some \`data\` to a random UP (e.g: at address -> ${recipientUP})`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; const transferLyxPayload = universalProfileInterface.encodeFunctionData('execute', [ @@ -1022,7 +1059,7 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should allow to send LYX with some `data` to an EOA listed in the AllowedCalls', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; const transferLyxPayload = universalProfileInterface.encodeFunctionData('execute', [ @@ -1035,18 +1072,18 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect( context.keyManager.connect(caller).execute(transferLyxPayload), ).to.changeEtherBalances( - [context.universalProfile.address, lyxRecipientEOA], + [await context.universalProfile.getAddress(), lyxRecipientEOA], [`-${amount}`, amount], ); }); it('should allow to send LYX with some `data` to a contract listed in the AllowedCalls', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; const transferLyxPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lyxRecipientContract.address, + lyxRecipientContract.target, amount, data, ]); @@ -1054,7 +1091,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect( context.keyManager.connect(caller).execute(transferLyxPayload), ).to.changeEtherBalances( - [context.universalProfile.address, lyxRecipientContract.address], + [await context.universalProfile.getAddress(), lyxRecipientContract.target], [`-${amount}`, amount], ); }); @@ -1071,7 +1108,7 @@ export const shouldBehaveLikePermissionTransferValue = ( ); const lsp7TransferPayload = newLSP7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), context.accounts[5].address, 10, true, // sending to an EOA @@ -1080,7 +1117,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const executePayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - newLSP7Token.address, + newLSP7Token.target, 5, lsp7TransferPayload, ]); @@ -1089,21 +1126,23 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( caller.address, - newLSP7Token.address, - newLSP7Token.interface.getSighash('transfer'), + newLSP7Token.target, + newLSP7Token.interface.getFunction('transfer').selector, ); }); it('should be allowed to interact with an allowed LSP7 contract', async () => { const recipient = context.accounts[5].address; - const tokenAmount = ethers.BigNumber.from(10); + const tokenAmount = ethers.toBigInt(10); - const lsp7SenderBalanceBefore = await lsp7Token.balanceOf(context.universalProfile.address); + const lsp7SenderBalanceBefore = await lsp7Token.balanceOf( + await context.universalProfile.getAddress(), + ); const lsp7RecipientBalanceBefore = await lsp7Token.balanceOf(recipient); const lsp7TransferPayload = lsp7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), recipient, tokenAmount, true, // sending to an EOA @@ -1112,20 +1151,22 @@ export const shouldBehaveLikePermissionTransferValue = ( const executePayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp7Token.address, + lsp7Token.target, 0, lsp7TransferPayload, ]); await context.keyManager.connect(caller).execute(executePayload); - const lsp7SenderBalanceAfter = await lsp7Token.balanceOf(context.universalProfile.address); + const lsp7SenderBalanceAfter = await lsp7Token.balanceOf( + await context.universalProfile.getAddress(), + ); const lsp7RecipientBalanceAfter = await lsp7Token.balanceOf(recipient); - expect(lsp7SenderBalanceAfter).to.equal(lsp7SenderBalanceBefore.sub(tokenAmount)); + expect(lsp7SenderBalanceAfter).to.equal(lsp7SenderBalanceBefore - tokenAmount); - expect(lsp7RecipientBalanceAfter).to.equal(lsp7RecipientBalanceBefore.add(tokenAmount)); + expect(lsp7RecipientBalanceAfter).to.equal(lsp7RecipientBalanceBefore + tokenAmount); }); it('should be allowed to interact with an allowed contract', async () => { @@ -1137,7 +1178,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const payload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetPayload, ]); @@ -1150,7 +1191,7 @@ export const shouldBehaveLikePermissionTransferValue = ( it('should be allowed to interact with an allowed contract + send some LYX while calling the function', async () => { const newValue = 358; - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = ethers.parseEther('3'); const targetContractPayload = targetContract.interface.encodeFunctionData('updateState', [ newValue, @@ -1158,7 +1199,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const executePayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), lyxAmount, targetContractPayload, ]); @@ -1166,7 +1207,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect( context.keyManager.connect(caller).execute(executePayload), ).to.changeEtherBalances( - [context.universalProfile.address, targetContract.address], + [await context.universalProfile.getAddress(), await targetContract.getAddress()], [`-${lyxAmount}`, lyxAmount], ); @@ -1176,7 +1217,7 @@ export const shouldBehaveLikePermissionTransferValue = ( it('should not be allowed to interact with a not allowed contract + send some LYX while calling the function', async () => { const newValue = 8910; - const lyxAmount = ethers.utils.parseEther('3'); + const lyxAmount = ethers.parseEther('3'); const randomTargetContract = await new TargetPayableContract__factory( context.accounts[0], @@ -1189,7 +1230,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const executePayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - randomTargetContract.address, + await randomTargetContract.getAddress(), lyxAmount, targetContractPayload, ]); @@ -1198,8 +1239,8 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( caller.address, - randomTargetContract.address, - randomTargetContract.interface.getSighash('updateState'), + await randomTargetContract.getAddress(), + randomTargetContract.interface.getFunction('updateState').selector, ); }); }); @@ -1210,7 +1251,7 @@ export const shouldBehaveLikePermissionTransferValue = ( let allowedAddress: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); caller = context.accounts[1]; allowedAddress = context.accounts[2]; @@ -1238,9 +1279,11 @@ export const shouldBehaveLikePermissionTransferValue = ( describe('when transferring LYX without `data`', () => { it('should not be allowed to transfer LYX to a non-allowed address', async () => { const recipient = context.accounts[3].address; - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); - const initialBalanceUP = await provider.getBalance(context.universalProfile.address); + const initialBalanceUP = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const initialBalanceRecipient = await provider.getBalance(recipient); @@ -1255,7 +1298,7 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs(caller.address, recipient, '0x00000000'); - const newBalanceUP = await provider.getBalance(context.universalProfile.address); + const newBalanceUP = await provider.getBalance(await context.universalProfile.getAddress()); expect(newBalanceUP).to.equal(initialBalanceUP); const newBalanceRecipient = await provider.getBalance(recipient); @@ -1263,7 +1306,7 @@ export const shouldBehaveLikePermissionTransferValue = ( }); it('should be allowed to transfer LYX to an allowed address', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -1275,7 +1318,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect(() => context.keyManager.connect(caller).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, allowedAddress.address], + [await context.universalProfile.getAddress(), allowedAddress.address], [`-${amount}`, amount], ); }); @@ -1284,7 +1327,7 @@ export const shouldBehaveLikePermissionTransferValue = ( // TODO: this test overlaps with the one above and pass, but the expected behaviour is not clear describe('when transferring LYX with `data`', () => { it('should be allowed to transfer LYX to an allowed address while sending some `data`', async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const data = '0x12345678'; const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ @@ -1297,7 +1340,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect(() => context.keyManager.connect(caller).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, allowedAddress.address], + [await context.universalProfile.getAddress(), allowedAddress.address], [`-${amount}`, amount], ); }); @@ -1315,7 +1358,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const executePayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, payload, ]); @@ -1340,20 +1383,20 @@ export const shouldBehaveLikePermissionTransferValue = ( ); // give some tokens to the UP - await lsp7Token.mint(context.universalProfile.address, 100, false, '0x'); + await lsp7Token.mint(await context.universalProfile.getAddress(), 100, false, '0x'); const tokenRecipient = context.accounts[5].address; - const tokenAmount = 10; + const tokenAmount = BigInt(10); const senderTokenBalanceBefore = await lsp7Token.balanceOf( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const recipientTokenBalanceBefore = await lsp7Token.balanceOf(tokenRecipient); expect(senderTokenBalanceBefore).to.equal(100); expect(recipientTokenBalanceBefore).to.equal(0); const tokenTransferPayload = lsp7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), tokenRecipient, tokenAmount, true, @@ -1362,7 +1405,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const executePayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp7Token.address, + lsp7Token.target, 0, tokenTransferPayload, ]); @@ -1370,20 +1413,18 @@ export const shouldBehaveLikePermissionTransferValue = ( await context.keyManager.connect(caller).execute(executePayload); const senderTokenBalanceAfter = await lsp7Token.balanceOf( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const recipientTokenBalanceAfter = await lsp7Token.balanceOf(tokenRecipient); - expect(senderTokenBalanceAfter).to.equal(senderTokenBalanceBefore.sub(tokenAmount)); - expect(recipientTokenBalanceAfter).to.equal( - recipientTokenBalanceBefore.add(tokenAmount), - ); + expect(senderTokenBalanceAfter).to.equal(senderTokenBalanceBefore - tokenAmount); + expect(recipientTokenBalanceAfter).to.equal(recipientTokenBalanceBefore + tokenAmount); }); } }); }); describe('should not be allowed to interact with any contract if sending LYX along the call', () => { - const lyxAmount = ethers.utils.parseEther('1'); + const lyxAmount = ethers.parseEther('1'); for (let ii = 1; ii <= 5; ii++) { it(`Target Payable Contract nb ${ii}`, async () => { @@ -1391,15 +1432,19 @@ export const shouldBehaveLikePermissionTransferValue = ( context.accounts[0], ).deploy(); - const upLyxBalanceBefore = await provider.getBalance(context.universalProfile.address); - const targetContractLyxBalanceBefore = await provider.getBalance(targetContract.address); + const upLyxBalanceBefore = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const targetContractLyxBalanceBefore = await provider.getBalance( + await targetContract.getAddress(), + ); expect(targetContractLyxBalanceBefore).to.equal(0); const targetPayload = targetContract.interface.encodeFunctionData('updateState', [35]); const payload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), lyxAmount, targetPayload, ]); @@ -1408,15 +1453,19 @@ export const shouldBehaveLikePermissionTransferValue = ( .to.be.revertedWithCustomError(context.keyManager, 'NotAllowedCall') .withArgs( caller.address, - targetContract.address, - targetContract.interface.getSighash('updateState'), + await targetContract.getAddress(), + targetContract.interface.getFunction('updateState').selector, ); // verify LYX (native tokens) balances have not changed - const upLyxBalanceAfter = await provider.getBalance(context.universalProfile.address); + const upLyxBalanceAfter = await provider.getBalance( + await context.universalProfile.getAddress(), + ); expect(upLyxBalanceAfter).to.equal(upLyxBalanceBefore); - const targetContractLyxBalanceAfter = await provider.getBalance(targetContract.address); + const targetContractLyxBalanceAfter = await provider.getBalance( + await targetContract.getAddress(), + ); expect(targetContractLyxBalanceAfter).to.equal(0); }); } @@ -1428,7 +1477,7 @@ export const shouldBehaveLikePermissionTransferValue = ( let allowedAddress: SignerWithAddress; before(async () => { - context = await buildContext(ethers.utils.parseEther('100')); + context = await buildContext(ethers.parseEther('100')); caller = context.accounts[1]; allowedAddress = context.accounts[2]; @@ -1465,7 +1514,7 @@ export const shouldBehaveLikePermissionTransferValue = ( recipients.forEach((recipient) => { it(`should send LYX to EOA -> ${recipient}`, async () => { - const amount = ethers.utils.parseEther('1'); + const amount = ethers.parseEther('1'); const transferPayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -1477,7 +1526,7 @@ export const shouldBehaveLikePermissionTransferValue = ( await expect(() => context.keyManager.connect(caller).execute(transferPayload), ).to.changeEtherBalances( - [context.universalProfile.address, recipient], + [await context.universalProfile.getAddress(), recipient], [`-${amount}`, amount], ); }); @@ -1496,7 +1545,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const executePayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, payload, ]); @@ -1521,20 +1570,20 @@ export const shouldBehaveLikePermissionTransferValue = ( ); // give some tokens to the UP - await lsp7Token.mint(context.universalProfile.address, 100, false, '0x'); + await lsp7Token.mint(await context.universalProfile.getAddress(), 100, false, '0x'); const tokenRecipient = context.accounts[5].address; - const tokenAmount = 10; + const tokenAmount = BigInt(10); const senderTokenBalanceBefore = await lsp7Token.balanceOf( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const recipientTokenBalanceBefore = await lsp7Token.balanceOf(tokenRecipient); expect(senderTokenBalanceBefore).to.equal(100); expect(recipientTokenBalanceBefore).to.equal(0); const tokenTransferPayload = lsp7Token.interface.encodeFunctionData('transfer', [ - context.universalProfile.address, + await context.universalProfile.getAddress(), tokenRecipient, tokenAmount, true, @@ -1543,7 +1592,7 @@ export const shouldBehaveLikePermissionTransferValue = ( const executePayload = universalProfileInterface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - lsp7Token.address, + lsp7Token.target, 0, tokenTransferPayload, ]); @@ -1551,13 +1600,11 @@ export const shouldBehaveLikePermissionTransferValue = ( await context.keyManager.connect(caller).execute(executePayload); const senderTokenBalanceAfter = await lsp7Token.balanceOf( - context.universalProfile.address, + await context.universalProfile.getAddress(), ); const recipientTokenBalanceAfter = await lsp7Token.balanceOf(tokenRecipient); - expect(senderTokenBalanceAfter).to.equal(senderTokenBalanceBefore.sub(tokenAmount)); - expect(recipientTokenBalanceAfter).to.equal( - recipientTokenBalanceBefore.add(tokenAmount), - ); + expect(senderTokenBalanceAfter).to.equal(senderTokenBalanceBefore - tokenAmount); + expect(recipientTokenBalanceAfter).to.equal(recipientTokenBalanceBefore + tokenAmount); }); } }); diff --git a/tests/LSP6KeyManager/LSP6ControlledToken.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6ControlledToken.test.ts similarity index 92% rename from tests/LSP6KeyManager/LSP6ControlledToken.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6ControlledToken.test.ts index ccd5e6eeb..aa1f1bb5b 100644 --- a/tests/LSP6KeyManager/LSP6ControlledToken.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6ControlledToken.test.ts @@ -1,25 +1,22 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { BytesLike } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { + LSP7Tester__factory, + LSP0ERC725Account__factory, LSP6KeyManager, LSP6KeyManager__factory, LSP7Mintable, LSP7Mintable__factory, - LSP7Tester__factory, LSP8Mintable, - LSP0ERC725Account__factory, } from '../../types'; -import { - ERC725YDataKeys, - ALL_PERMISSIONS, - PERMISSIONS, - ERC1271_VALUES, - LSP4_TOKEN_TYPES, -} from '../../constants'; +import { ERC725YDataKeys } from '../../constants'; +import { ERC1271_VALUES } from '@lukso/lsp0-contracts'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; import { ARRAY_LENGTH, encodeCompactBytesArray } from '../utils/helpers'; export type LSP6ControlledToken = { @@ -40,7 +37,7 @@ const buildContext = async () => { true, ); - const keyManager = await new LSP6KeyManager__factory(accounts[0]).deploy(lsp7.address); + const keyManager = await new LSP6KeyManager__factory(accounts[0]).deploy(lsp7.target); const keys = [ ERC725YDataKeys.LSP6['AddressPermissions[]'].length, @@ -51,7 +48,7 @@ const buildContext = async () => { const values = [ARRAY_LENGTH.ONE, accounts[0].address, ALL_PERMISSIONS]; await lsp7.connect(accounts[0]).setDataBatch(keys, values); - await lsp7.connect(accounts[0]).transferOwnership(keyManager.address); + await lsp7.connect(accounts[0]).transferOwnership(await keyManager.getAddress()); return { accounts, @@ -107,7 +104,7 @@ describe('When deploying LSP7 with LSP6 as owner', () => { }); it('should have lsp6 as owner of the lsp7', async () => { - expect(await context.token.owner()).to.equal(context.keyManager.address); + expect(await context.token.owner()).to.equal(await context.keyManager.getAddress()); }); it('should set the necessary controller permissions correctly', async () => { @@ -146,7 +143,7 @@ describe('When deploying LSP7 with LSP6 as owner', () => { await context.keyManager.connect(context.mainController).execute(renounceOwnershipPayload); - expect(await context.token.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.token.owner()).to.equal(ethers.ZeroAddress); }); }); @@ -167,8 +164,8 @@ describe('When deploying LSP7 with LSP6 as owner', () => { }); it("`setData(...)` -> should revert with 'caller is not the owner' error.", async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString')); - const value = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SecondRandomString')); + const key = ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString')); + const value = ethers.keccak256(ethers.toUtf8Bytes('SecondRandomString')); const payload = context.token.interface.encodeFunctionData('setData', [key, value]); await expect( @@ -177,8 +174,8 @@ describe('When deploying LSP7 with LSP6 as owner', () => { }); it('should allow the new owner to call setData(..)', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString')); - const value = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SecondRandomString')); + const key = ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString')); + const value = ethers.keccak256(ethers.toUtf8Bytes('SecondRandomString')); await context.token.connect(newOwner).setData(key, value); @@ -236,7 +233,7 @@ describe('When deploying LSP7 with LSP6 as owner', () => { it('should allow the new owner to call renounceOwnership(..)', async () => { await context.token.connect(anotherNewOwner).renounceOwnership(); - expect(await context.token.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.token.owner()).to.equal(ethers.ZeroAddress); }); }); @@ -305,7 +302,7 @@ describe('When deploying LSP7 with LSP6 as owner', () => { after(async () => { await context.token .connect(addressCanChangeOwner) - .transferOwnership(context.keyManager.address); + .transferOwnership(await context.keyManager.getAddress()); }); }); @@ -463,15 +460,9 @@ describe('When deploying LSP7 with LSP6 as owner', () => { }); describe('testing SETDATA permission', () => { - const firstRandomSringKey = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('FirstRandomString'), - ); - const secondRandomSringKey = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('SecondRandomString'), - ); - const notAllowedKey = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('Not Allowed ERC725Y data key'), - ); + const firstRandomSringKey = ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString')); + const secondRandomSringKey = ethers.keccak256(ethers.toUtf8Bytes('SecondRandomString')); + const notAllowedKey = ethers.keccak256(ethers.toUtf8Bytes('Not Allowed ERC725Y data key')); before(async () => { await addControllerWithPermission( @@ -552,10 +543,10 @@ describe('When deploying LSP7 with LSP6 as owner', () => { ]; const values = [ ARRAY_LENGTH.FOUR, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString0')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString1')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString2')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString3')), + ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString0')), + ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString1')), + ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString2')), + ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString3')), ]; const payload = context.token.interface.encodeFunctionData('setDataBatch', [keys, values]); @@ -574,10 +565,10 @@ describe('When deploying LSP7 with LSP6 as owner', () => { ]; const values = [ ARRAY_LENGTH.FOUR, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString0')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString1')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString2')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('FirstRandomString3')), + ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString0')), + ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString1')), + ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString2')), + ethers.keccak256(ethers.toUtf8Bytes('FirstRandomString3')), ]; const payload = context.token.interface.encodeFunctionData('setDataBatch', [keys, values]); @@ -616,7 +607,7 @@ describe('When deploying LSP7 with LSP6 as owner', () => { const payload = LSP0ERC725Account__factory.createInterface().encodeFunctionData('execute', [ 0, - newTokenContract.address, + await newTokenContract.getAddress(), 0, mintPayload, ]); @@ -681,7 +672,7 @@ describe('When deploying LSP7 with LSP6 as owner', () => { }); it('should be allowed to sign messages for the token contract', async () => { - const dataHash = ethers.utils.hashMessage('Some random message'); + const dataHash = ethers.hashMessage('Some random message'); const signature = await addressCanSign.signMessage('Some random message'); const validityOfTheSig = await context.keyManager.isValidSignature(dataHash, signature); @@ -689,7 +680,7 @@ describe('When deploying LSP7 with LSP6 as owner', () => { }); it('should not be allowed to sign messages for the token contract', async () => { - const dataHash = ethers.utils.hashMessage('Some random message'); + const dataHash = ethers.hashMessage('Some random message'); const signature = await addressCanChangeOwner.signMessage('Some random message'); const validityOfTheSig = await context.keyManager.isValidSignature(dataHash, signature); diff --git a/tests/LSP6KeyManager/LSP6KeyManager.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManager.behaviour.ts similarity index 95% rename from tests/LSP6KeyManager/LSP6KeyManager.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManager.behaviour.ts index 237a1cd7f..c3fdac0a5 100644 --- a/tests/LSP6KeyManager/LSP6KeyManager.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManager.behaviour.ts @@ -1,5 +1,4 @@ import { expect } from 'chai'; -import { BigNumber } from 'ethers'; import { LSP6TestContext, LSP6InternalsTestContext } from '../utils/context'; import { INTERFACE_IDS } from '../../constants'; @@ -47,7 +46,7 @@ import { } from './index'; export const shouldBehaveLikeLSP6 = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { describe('CHANGEOWNER', () => { shouldBehaveLikePermissionChangeOwner(buildContext); @@ -155,8 +154,8 @@ export const shouldInitializeLikeLSP6 = (buildContext: () => Promise { - const account = await context.keyManager.target(); - expect(account).to.equal(context.universalProfile.address); + const account = await context.keyManager['target()'].staticCall(); + expect(account).to.equal(await context.universalProfile.getAddress()); }); }); }; diff --git a/tests/LSP6KeyManager/LSP6KeyManager.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManager.test.ts similarity index 89% rename from tests/LSP6KeyManager/LSP6KeyManager.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManager.test.ts index d01ea7192..261fba951 100644 --- a/tests/LSP6KeyManager/LSP6KeyManager.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManager.test.ts @@ -1,10 +1,9 @@ -import { BigNumber } from 'ethers'; import { ethers } from 'hardhat'; import { + KeyManagerInternalTester__factory, UniversalProfile__factory, LSP6KeyManager__factory, - KeyManagerInternalTester__factory, } from '../../types'; import { LSP6TestContext } from '../utils/context'; @@ -16,7 +15,7 @@ import { } from './LSP6KeyManager.behaviour'; describe('LSP6KeyManager with constructor', () => { - const buildTestContext = async (initialFunding?: BigNumber): Promise => { + const buildTestContext = async (initialFunding?: bigint): Promise => { const accounts = await ethers.getSigners(); const mainController = accounts[0]; @@ -28,7 +27,7 @@ describe('LSP6KeyManager with constructor', () => { ); const keyManager = await new LSP6KeyManager__factory(mainController).deploy( - universalProfile.address, + universalProfile.target, ); return { accounts, mainController, universalProfile, keyManager, initialFunding }; @@ -54,7 +53,7 @@ describe('LSP6KeyManager with constructor', () => { ); const keyManagerInternalTester = await new KeyManagerInternalTester__factory( mainController, - ).deploy(universalProfile.address); + ).deploy(universalProfile.target); return { mainController, accounts, universalProfile, keyManagerInternalTester }; }); diff --git a/tests/LSP6KeyManager/LSP6KeyManagerInit.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManagerInit.test.ts similarity index 78% rename from tests/LSP6KeyManager/LSP6KeyManagerInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManagerInit.test.ts index 25af6a003..4ff2a9285 100644 --- a/tests/LSP6KeyManager/LSP6KeyManagerInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/LSP6KeyManagerInit.test.ts @@ -1,6 +1,5 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { BigNumber } from 'ethers'; import { LSP6TestContext } from '../utils/context'; import { LSP6KeyManagerInit__factory, UniversalProfileInit__factory } from '../../types'; import { deployProxy } from '../utils/fixtures'; @@ -9,17 +8,17 @@ import { shouldBehaveLikeLSP6, shouldInitializeLikeLSP6 } from './LSP6KeyManager describe('LSP6KeyManager with proxy', () => { let context: LSP6TestContext; - const buildProxyTestContext = async (initialFunding?: BigNumber): Promise => { + const buildProxyTestContext = async (initialFunding?: bigint): Promise => { const accounts = await ethers.getSigners(); const mainController = accounts[0]; const baseUP = await new UniversalProfileInit__factory(mainController).deploy(); - const upProxy = await deployProxy(baseUP.address, mainController); - const universalProfile = await baseUP.attach(upProxy); + const upProxy = await deployProxy(baseUP.target as string, mainController); + const universalProfile = baseUP.attach(upProxy) as UniversalProfileInit; const baseKM = await new LSP6KeyManagerInit__factory(mainController).deploy(); - const kmProxy = await deployProxy(baseKM.address, mainController); - const keyManager = await baseKM.attach(kmProxy); + const kmProxy = await deployProxy(await baseKM.getAddress(), mainController); + const keyManager = baseKM.attach(kmProxy) as unknown as LSP6KeyManagerInit; return { accounts, mainController, universalProfile, keyManager, initialFunding }; }; @@ -29,7 +28,7 @@ describe('LSP6KeyManager with proxy', () => { value: context.initialFunding, }); - await context.keyManager['initialize(address)'](context.universalProfile.address); + await context.keyManager['initialize(address)'](await context.universalProfile.getAddress()); return context; }; @@ -39,8 +38,8 @@ describe('LSP6KeyManager with proxy', () => { const accounts = await ethers.getSigners(); const keyManagerBaseContract = await new LSP6KeyManagerInit__factory(accounts[0]).deploy(); - const linkedTarget = await keyManagerBaseContract.target(); - expect(linkedTarget).to.equal(ethers.constants.AddressZero); + const linkedTarget = await keyManagerBaseContract['target()'].staticCall(); + expect(linkedTarget).to.equal(ethers.ZeroAddress); }); it('should prevent any address from calling the `initialize(...)` function on the base contract', async () => { @@ -74,7 +73,7 @@ describe('LSP6KeyManager with proxy', () => { }); describe('when testing the deployed proxy', () => { - shouldBehaveLikeLSP6(async (initialFunding?: BigNumber) => { + shouldBehaveLikeLSP6(async (initialFunding?: bigint) => { const context = await buildProxyTestContext(initialFunding); await initializeProxies(context); return context; diff --git a/tests/LSP6KeyManager/Relay/ExecuteRelayCall.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Relay/ExecuteRelayCall.test.ts similarity index 87% rename from tests/LSP6KeyManager/Relay/ExecuteRelayCall.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Relay/ExecuteRelayCall.test.ts index 34d7cc193..357f471a2 100644 --- a/tests/LSP6KeyManager/Relay/ExecuteRelayCall.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Relay/ExecuteRelayCall.test.ts @@ -1,28 +1,22 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; import { time } from '@nomicfoundation/hardhat-network-helpers'; -import { BigNumber } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { EIP191Signer } from '@lukso/eip191-signer.js'; import { - LSP7Mintable, - LSP7Mintable__factory, TargetContract, TargetContract__factory, + LSP7Mintable, + LSP7Mintable__factory, } from '../../../types'; // constants -import { - ALL_PERMISSIONS, - ERC725YDataKeys, - OPERATION_TYPES, - LSP25_VERSION, - PERMISSIONS, - CALLTYPE, - INTERFACE_IDS, - LSP4_TOKEN_TYPES, -} from '../../../constants'; +import { ERC725YDataKeys, INTERFACE_IDS } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; +import { LSP25_VERSION } from '@lukso/lsp25-contracts'; // helpers import { @@ -39,7 +33,7 @@ import { setupKeyManager } from '../../utils/fixtures'; import { provider, LOCAL_PRIVATE_KEYS, combineCallTypes } from '../../utils/helpers'; export const shouldBehaveLikeExecuteRelayCall = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { let context: LSP6TestContext; @@ -76,10 +70,10 @@ export const shouldBehaveLikeExecuteRelayCall = ( signerWithoutExecuteRelayCall.address.substring(2), ]; - const allPermissionsWithoutExecuteRelayCall = ethers.utils.hexZeroPad( - BigNumber.from(ALL_PERMISSIONS) - .sub(BigNumber.from(PERMISSIONS.EXECUTE_RELAY_CALL)) - .toHexString(), + const allPermissionsWithoutExecuteRelayCall = ethers.zeroPadValue( + ethers.toBeHex( + ethers.toBigInt(ALL_PERMISSIONS) - ethers.toBigInt(PERMISSIONS.EXECUTE_RELAY_CALL), + ), 32, ); @@ -95,7 +89,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), ], - [random.address, targetContract.address], + [random.address, await targetContract.getAddress()], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -117,7 +111,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( [OPERATION_TYPES.CALL, random.address, 0, '0x'], ); - const latestNonce = await context.keyManager.callStatic.getNonce( + const latestNonce = await context.keyManager.getNonce( signerWithoutExecuteRelayCall.address, 0, ); @@ -133,7 +127,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( payload: executeRelayCallPayload, }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -148,7 +142,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT5, ); @@ -178,7 +172,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( [OPERATION_TYPES.CALL, random.address, 0, '0x'], ); - const latestNonce = await context.keyManager.callStatic.getNonce(signer.address, 0); + const latestNonce = await context.keyManager.getNonce(signer.address, 0); const validityTimestamps = 0; @@ -195,7 +189,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const valueToSendFromRelayer = 10; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -210,7 +204,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT1, ); @@ -236,7 +230,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( [OPERATION_TYPES.CALL, random.address, 0, '0x'], ); - const latestNonce = await context.keyManager.callStatic.getNonce(signer.address, 0); + const latestNonce = await context.keyManager.getNonce(signer.address, 0); const validityTimestamps = 0; @@ -253,7 +247,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const valueToSendFromRelayer = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -268,7 +262,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT1, ); @@ -294,7 +288,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( [OPERATION_TYPES.CALL, random.address, 0, '0x'], ); - const latestNonce = await context.keyManager.callStatic.getNonce(signer.address, 0); + const latestNonce = await context.keyManager.getNonce(signer.address, 0); const validityTimestamps = 0; @@ -309,7 +303,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( payload: executeRelayCallPayload, }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -321,12 +315,14 @@ export const shouldBehaveLikeExecuteRelayCall = ( ], ); - const balanceOfUpBefore = await provider.getBalance(context.universalProfile.address); + const balanceOfUpBefore = await provider.getBalance( + await context.universalProfile.getAddress(), + ); const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT1, ); @@ -346,12 +342,14 @@ export const shouldBehaveLikeExecuteRelayCall = ( .withArgs( context.accounts[1].address, signedMessageParams.msgValue, - context.universalProfile.interface.getSighash('execute'), + context.universalProfile.interface.getFunction('execute').selector, ); - const balanceOfUpAfter = await provider.getBalance(context.universalProfile.address); + const balanceOfUpAfter = await provider.getBalance( + await context.universalProfile.getAddress(), + ); - expect(balanceOfUpAfter).to.equal(balanceOfUpBefore.add(valueToSendFromRelayer)); + expect(balanceOfUpAfter).to.equal(balanceOfUpBefore + BigInt(valueToSendFromRelayer)); }); it('should fail if signer has nothing listed in its allowed calls', async () => { @@ -360,10 +358,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( [OPERATION_TYPES.CALL, random.address, 0, '0x'], ); - const latestNonce = await context.keyManager.callStatic.getNonce( - signerNoAllowedCalls.address, - 0, - ); + const latestNonce = await context.keyManager.getNonce(signerNoAllowedCalls.address, 0); const validityTimestamps = 0; @@ -378,7 +373,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( payload: executeRelayCallPayload, }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -393,7 +388,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT3, ); @@ -425,7 +420,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const requiredValueForExecution = 51; // specified in `setNamePayableMinimumValue(..)` - const latestNonce = await context.keyManager.callStatic.getNonce(signer.address, 0); + const latestNonce = await context.keyManager.getNonce(signer.address, 0); const validityTimestamps = 0; @@ -433,7 +428,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( 'execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), requiredValueForExecution, targetContractPayload, ], @@ -450,7 +445,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( payload: executeRelayCallPayload, }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -465,7 +460,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT1, ); @@ -486,7 +481,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( 'ERC725X_InsufficientBalance', ) .withArgs( - await provider.getBalance(context.universalProfile.address), + await provider.getBalance(await context.universalProfile.getAddress()), requiredValueForExecution, ); }); @@ -502,7 +497,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const requiredValueForExecution = 51; // specified in `setNamePayableMinimumValue(..)` - const latestNonce = await context.keyManager.callStatic.getNonce(signer.address, 0); + const latestNonce = await context.keyManager.getNonce(signer.address, 0); const validityTimestamps = 0; @@ -510,7 +505,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( 'execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), requiredValueForExecution, targetContractPayload, ], @@ -527,7 +522,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( payload: executeRelayCallPayload, }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -542,7 +537,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT1, ); @@ -557,7 +552,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( { value: valueToSendFromRelayer }, ); - const result = await targetContract.callStatic.getName(); + const result = await targetContract.getName(); expect(result).to.equal(nameToSet); }); @@ -570,7 +565,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const requiredValueForExecution = 51; // specified in `setNamePayableMinimumValue(..)` - const latestNonce = await context.keyManager.callStatic.getNonce( + const latestNonce = await context.keyManager.getNonce( signerNoAllowedCalls.address, 0, ); @@ -581,7 +576,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( 'execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), requiredValueForExecution, targetContractPayload, ], @@ -598,7 +593,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( payload: executeRelayCallPayload, }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -613,7 +608,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT3, ); @@ -645,7 +640,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const endingTimestamp = now - 1000; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 1); + const nonce = await context.keyManager.getNonce(signer.address, 1); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -677,7 +672,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const endingTimestamp = now - 2000; const startingTimestamp = now - 1500; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 2); + const nonce = await context.keyManager.getNonce(signer.address, 2); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -703,7 +698,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( describe('`now` is lesser than `startingTimestamp` and `now` is lesser than `endingTimestamp`', () => { it('reverts', async () => { - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 3); + const nonce = await context.keyManager.getNonce(signer.address, 3); const now = await time.latest(); @@ -741,7 +736,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now + 1000; const endingTimestamp = now - 1000; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 4); + const nonce = await context.keyManager.getNonce(signer.address, 4); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -772,7 +767,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now + 1000; const endingTimestamp = now; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 5); + const nonce = await context.keyManager.getNonce(signer.address, 5); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -805,7 +800,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now; const endingTimestamp = now + 1000; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 6); + const nonce = await context.keyManager.getNonce(signer.address, 6); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -813,7 +808,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const randomNumber = 12345; const calldata = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContract.interface.encodeFunctionData('setNumber', [randomNumber]), ]); @@ -842,7 +837,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now + 1000; const endingTimestamp = now + 1500; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 7); + const nonce = await context.keyManager.getNonce(signer.address, 7); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -873,7 +868,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now - 1500; const endingTimestamp = now - 1000; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 8); + const nonce = await context.keyManager.getNonce(signer.address, 8); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -904,7 +899,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now - 1000; const endingTimestamp = now + 1500; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 9); + const nonce = await context.keyManager.getNonce(signer.address, 9); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -912,7 +907,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const randomNumber = 12345; const calldata = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContract.interface.encodeFunctionData('setNumber', [randomNumber]), ]); @@ -941,7 +936,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now - 1000; const endingTimestamp = now; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 10); + const nonce = await context.keyManager.getNonce(signer.address, 10); const validityTimestamps = createValidityTimestamps( startingTimestamp, @@ -950,7 +945,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const randomNumber = 12345; const calldata = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContract.interface.encodeFunctionData('setNumber', [randomNumber]), ]); @@ -983,7 +978,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now - 100; const endingTimestamp = now - 100; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 11); + const nonce = await context.keyManager.getNonce(signer.address, 11); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -1014,7 +1009,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now + 100; const endingTimestamp = now + 100; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 12); + const nonce = await context.keyManager.getNonce(signer.address, 12); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -1045,7 +1040,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now; const endingTimestamp = now; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 13); + const nonce = await context.keyManager.getNonce(signer.address, 13); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -1053,7 +1048,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const randomNumber = 12345; const calldata = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContract.interface.encodeFunctionData('setNumber', [randomNumber]), ]); @@ -1080,12 +1075,12 @@ export const shouldBehaveLikeExecuteRelayCall = ( describe('when `validityTimestamps == 0`', () => { it('passes', async () => { - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 14); + const nonce = await context.keyManager.getNonce(signer.address, 14); const validityTimestamps = 0; const randomNumber = 12345; const calldata = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContract.interface.encodeFunctionData('setNumber', [randomNumber]), ]); @@ -1115,7 +1110,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now - 100; const endingTimestamp = 0; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 14); + const nonce = await context.keyManager.getNonce(signer.address, 14); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -1123,7 +1118,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const randomNumber = 12345; const calldata = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContract.interface.encodeFunctionData('setNumber', [randomNumber]), ]); @@ -1152,7 +1147,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const startingTimestamp = now + 100; const endingTimestamp = 0; - const nonce = await context.keyManager.callStatic.getNonce(signer.address, 14); + const nonce = await context.keyManager.getNonce(signer.address, 14); const validityTimestamps = createValidityTimestamps( startingTimestamp, endingTimestamp, @@ -1160,7 +1155,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const randomNumber = 12345; const calldata = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - targetContract.address, + await targetContract.getAddress(), 0, targetContract.interface.encodeFunctionData('setNumber', [randomNumber]), ]); @@ -1197,18 +1192,23 @@ export const shouldBehaveLikeExecuteRelayCall = ( channelId, ); - const getDynamicArrayOf2NumbersSig = targetContract.interface.getSighash( + const getDynamicArrayOf2NumbersSig = targetContract.interface.getFunction( 'getDynamicArrayOf2Numbers', - ); + ).selector; const erc725xExecutePayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.STATICCALL, targetContract.address, 0, getDynamicArrayOf2NumbersSig], + [ + OPERATION_TYPES.STATICCALL, + await targetContract.getAddress(), + 0, + getDynamicArrayOf2NumbersSig, + ], ); const executeRelayCallSignature = await signLSP6ExecuteRelayCall( context.keyManager, - keyManagerNonce.toHexString(), + ethers.toBeHex(keyManagerNonce), validityTimestamp, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, @@ -1217,7 +1217,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const result = await context.keyManager .connect(context.mainController) - .callStatic.executeRelayCall( + .executeRelayCall.staticCall( executeRelayCallSignature, keyManagerNonce, validityTimestamp, @@ -1250,14 +1250,14 @@ export const shouldBehaveLikeExecuteRelayCall = ( channelId, ); - const getNameSelector = targetContract.interface.getSighash('getName'); - const getNumberSelector = targetContract.interface.getSighash('getNumber'); + const getNameSelector = targetContract.interface.getFunction('getName').selector; + const getNumberSelector = targetContract.interface.getFunction('getNumber').selector; const erc725xExecuteBatchPayload = context.universalProfile.interface.encodeFunctionData( 'executeBatch', [ [OPERATION_TYPES.STATICCALL, OPERATION_TYPES.STATICCALL], - [targetContract.address, targetContract.address], + [await targetContract.getAddress(), await targetContract.getAddress()], [0, 0], [getNameSelector, getNumberSelector], ], @@ -1265,7 +1265,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const executeRelayCallSignature = await signLSP6ExecuteRelayCall( context.keyManager, - keyManagerNonce.toHexString(), + ethers.toBeHex(keyManagerNonce), validityTimestamp, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, @@ -1274,7 +1274,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const result = await context.keyManager .connect(context.mainController) - .callStatic.executeRelayCall( + .executeRelayCall.staticCall( executeRelayCallSignature, keyManagerNonce, validityTimestamp, @@ -1317,7 +1317,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const executeRelayCallSignature = await signLSP6ExecuteRelayCall( context.keyManager, - keyManagerNonce.toHexString(), + ethers.toBeHex(keyManagerNonce), validityTimestamp, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, @@ -1326,7 +1326,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const result = await context.keyManager .connect(context.mainController) - .callStatic.executeRelayCall( + .executeRelayCall.staticCall( executeRelayCallSignature, keyManagerNonce, validityTimestamp, @@ -1353,7 +1353,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( await expect(tx).to.emit(context.keyManager, 'PermissionsVerified').withArgs( context.mainController.address, // signer 0, // value - context.universalProfile.interface.getSighash('transferOwnership'), // selector + context.universalProfile.interface.getFunction('transferOwnership').selector, // selector ); }); }); @@ -1369,7 +1369,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( let tokenContract: LSP7Mintable; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); minter = context.accounts[1]; tokenRecipient = context.accounts[2]; @@ -1378,7 +1378,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( tokenContract = await new LSP7Mintable__factory(context.accounts[0]).deploy( 'My LSP7 Token', 'LSP7', - context.universalProfile.address, + await context.universalProfile.getAddress(), LSP4_TOKEN_TYPES.TOKEN, false, ); @@ -1413,7 +1413,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( it('should revert when we are specifying the same signature twice', async () => { const recipient = context.accounts[1].address; - const amountForRecipient = ethers.utils.parseEther('1'); + const amountForRecipient = ethers.parseEther('1'); const transferLyxPayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, @@ -1428,7 +1428,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const transferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.toHexString(), + ethers.toBeHex(ownerNonce), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, @@ -1454,13 +1454,13 @@ export const shouldBehaveLikeExecuteRelayCall = ( // Therefore, the Key Manager try to verify the nonce of a different address than the one that signed the message, and the nonce is invalid. const eip191 = new EIP191Signer(); - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], - [LSP25_VERSION, 31337, ownerNonce.add(1), validityTimestamps, 0, transferLyxPayload], + [LSP25_VERSION, 31337, ownerNonce + BigInt(1), validityTimestamps, 0, transferLyxPayload], ); const hashedDataWithIntendedValidator = eip191.hashDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, ); @@ -1476,14 +1476,14 @@ export const shouldBehaveLikeExecuteRelayCall = ( .connect(context.mainController) .executeRelayCallBatch( [transferLyxSignature, transferLyxSignature], - [ownerNonce, ownerNonce.add(1)], + [ownerNonce, ownerNonce + BigInt(1)], [validityTimestamps, validityTimestamps], [0, 0], [transferLyxPayload, transferLyxPayload], ), ) .to.be.revertedWithCustomError(context.keyManager, 'InvalidRelayNonce') - .withArgs(incorrectRecoveredAddress, ownerNonce.add(1), transferLyxSignature); + .withArgs(incorrectRecoveredAddress, ownerNonce + BigInt(1), transferLyxSignature); }); it('should 1) give the permission to someone to mint, 2) let the controller mint, 3) remove the permission to the controller to mint', async () => { @@ -1503,9 +1503,9 @@ export const shouldBehaveLikeExecuteRelayCall = ( combinePermissions(PERMISSIONS.CALL, PERMISSIONS.EXECUTE_RELAY_CALL), combineAllowedCalls( [CALLTYPE.CALL], - [tokenContract.address], + [tokenContract.target as string], [INTERFACE_IDS.LSP7DigitalAsset], - [tokenContract.interface.getSighash('mint')], + [tokenContract.interface.getFunction('mint').selector], ), ], ], @@ -1515,7 +1515,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const ownerGivePermissionsSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.toHexString(), + ethers.toBeHex(ownerNonce), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, @@ -1531,7 +1531,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( ]); const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - tokenContract.address, + tokenContract.target, 0, minterMintPayload, ]); @@ -1540,7 +1540,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const minterMintSignature = await signLSP6ExecuteRelayCall( context.keyManager, - minterNonce.toHexString(), + ethers.toBeHex(minterNonce), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT1, 0, @@ -1558,11 +1558,11 @@ export const shouldBehaveLikeExecuteRelayCall = ( ['0x', '0x'], ], ); - const newOwnerNonce = ownerNonce.add(1); + const newOwnerNonce = ownerNonce + BigInt(1); const ownerRemovePermissionsSignature = await signLSP6ExecuteRelayCall( context.keyManager, - newOwnerNonce.toHexString(), + ethers.toBeHex(newOwnerNonce), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, @@ -1604,23 +1604,19 @@ export const shouldBehaveLikeExecuteRelayCall = ( const thirdRecipient = context.accounts[3].address; const transferAmounts = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), ]; - const values = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ]; + const values = [ethers.parseEther('1'), ethers.parseEther('1'), ethers.parseEther('1')]; - const totalValues = values.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const totalValues = values.reduce( + (accumulator, currentValue) => accumulator + BigInt(currentValue), ); // give to much and check that no funds can remain on the Key Manager - const amountToFund = totalValues.sub(1); + const amountToFund = totalValues - BigInt(1); const firstLyxTransfer = context.universalProfile.interface.encodeFunctionData( 'execute', @@ -1643,7 +1639,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const firstTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.toHexString(), + ethers.toBeHex(ownerNonce), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[0], @@ -1651,7 +1647,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( ); const secondTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.add(1).toHexString(), + ethers.toBeHex(ownerNonce + BigInt(1)), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[1], @@ -1659,7 +1655,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( ); const thirdTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.add(2).toHexString(), + ethers.toBeHex(ownerNonce + BigInt(2)), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[2], @@ -1671,7 +1667,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( .connect(context.mainController) .executeRelayCallBatch( [firstTransferLyxSignature, secondTransferLyxSignature, thirdTransferLyxSignature], - [ownerNonce, ownerNonce.add(1), ownerNonce.add(2)], + [ownerNonce, ownerNonce + BigInt(1), ownerNonce + BigInt(2)], [validityTimestamps, validityTimestamps, validityTimestamps], values, [firstLyxTransfer, secondLyxTransfer, thirdLyxTransfer], @@ -1690,23 +1686,19 @@ export const shouldBehaveLikeExecuteRelayCall = ( const thirdRecipient = context.accounts[3].address; const transferAmounts = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), ]; - const values = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ]; + const values = [ethers.parseEther('1'), ethers.parseEther('1'), ethers.parseEther('1')]; - const totalValues = values.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const totalValues = values.reduce( + (accumulator, currentValue) => accumulator + BigInt(currentValue), ); // give to much and check that no funds can remain on the Key Manager - const amountToFund = totalValues.add(1); + const amountToFund = totalValues + BigInt(1); const firstLyxTransfer = context.universalProfile.interface.encodeFunctionData( 'execute', @@ -1729,7 +1721,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const firstTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.toHexString(), + ethers.toBeHex(ownerNonce), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[0], @@ -1737,7 +1729,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( ); const secondTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.add(1).toHexString(), + ethers.toBeHex(ownerNonce + BigInt(1)), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[1], @@ -1745,7 +1737,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( ); const thirdTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.add(2).toHexString(), + ethers.toBeHex(ownerNonce + BigInt(2)), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[2], @@ -1757,7 +1749,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( .connect(context.mainController) .executeRelayCallBatch( [firstTransferLyxSignature, secondTransferLyxSignature, thirdTransferLyxSignature], - [ownerNonce, ownerNonce.add(1), ownerNonce.add(2)], + [ownerNonce, ownerNonce + BigInt(1), ownerNonce + BigInt(2)], [validityTimestamps, validityTimestamps, validityTimestamps], values, [firstLyxTransfer, secondLyxTransfer, thirdLyxTransfer], @@ -1776,19 +1768,15 @@ export const shouldBehaveLikeExecuteRelayCall = ( const thirdRecipient = context.accounts[3].address; const transferAmounts = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), + ethers.parseEther('1'), ]; - const values = [ - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ethers.utils.parseEther('1'), - ]; + const values = [ethers.parseEther('1'), ethers.parseEther('1'), ethers.parseEther('1')]; - const amountToFund = values.reduce((accumulator, currentValue) => - accumulator.add(currentValue), + const amountToFund = values.reduce( + (accumulator, currentValue) => accumulator + BigInt(currentValue), ); const firstLyxTransfer = context.universalProfile.interface.encodeFunctionData( @@ -1812,7 +1800,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( const firstTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.toHexString(), + ethers.toBeHex(ownerNonce), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[0], @@ -1820,7 +1808,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( ); const secondTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.add(1).toHexString(), + ethers.toBeHex(ownerNonce + BigInt(1)), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[1], @@ -1828,7 +1816,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( ); const thirdTransferLyxSignature = await signLSP6ExecuteRelayCall( context.keyManager, - ownerNonce.add(2).toHexString(), + ethers.toBeHex(ownerNonce + BigInt(2)), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, values[2], @@ -1839,7 +1827,7 @@ export const shouldBehaveLikeExecuteRelayCall = ( .connect(context.mainController) .executeRelayCallBatch( [firstTransferLyxSignature, secondTransferLyxSignature, thirdTransferLyxSignature], - [ownerNonce, ownerNonce.add(1), ownerNonce.add(2)], + [ownerNonce, ownerNonce + BigInt(1), ownerNonce + BigInt(2)], [validityTimestamps, validityTimestamps, validityTimestamps], values, [firstLyxTransfer, secondLyxTransfer, thirdLyxTransfer], @@ -1847,7 +1835,12 @@ export const shouldBehaveLikeExecuteRelayCall = ( ); await expect(tx).to.changeEtherBalances( - [context.universalProfile.address, firstRecipient, secondRecipient, thirdRecipient], + [ + await context.universalProfile.getAddress(), + firstRecipient, + secondRecipient, + thirdRecipient, + ], [0, values[0], values[1], values[2]], ); }); @@ -1856,13 +1849,13 @@ export const shouldBehaveLikeExecuteRelayCall = ( describe('when one of the payload reverts', () => { it('should revert the whole transaction if first payload reverts', async () => { - const upBalance = await provider.getBalance(context.universalProfile.address); + const upBalance = await provider.getBalance(await context.universalProfile.getAddress()); - const validAmount = ethers.utils.parseEther('1'); + const validAmount = ethers.parseEther('1'); expect(validAmount).to.be.lt(upBalance); // sanity check // make it revert by sending too much value than the actual balance - const invalidAmount = upBalance.add(10); + const invalidAmount = upBalance + BigInt(10); const randomRecipient = ethers.Wallet.createRandom().address; @@ -1883,30 +1876,30 @@ export const shouldBehaveLikeExecuteRelayCall = ( const ownerNonce = await context.keyManager.getNonce(context.mainController.address, 0); - const nonces = [ownerNonce, ownerNonce.add(1), ownerNonce.add(2)]; + const nonces = [ownerNonce, ownerNonce + BigInt(1), ownerNonce + BigInt(2)]; const validityTimestamps = 0; const signatures = [ - signLSP6ExecuteRelayCall( + await signLSP6ExecuteRelayCall( context.keyManager, - nonces[0].toHexString(), + nonces[0], validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, failingTransferPayload, ), - signLSP6ExecuteRelayCall( + await signLSP6ExecuteRelayCall( context.keyManager, - nonces[1].toHexString(), + nonces[1], validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, firstTransferPayload, ), - signLSP6ExecuteRelayCall( + await signLSP6ExecuteRelayCall( context.keyManager, - nonces[2].toHexString(), + nonces[2], validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, @@ -1931,13 +1924,13 @@ export const shouldBehaveLikeExecuteRelayCall = ( }); it('should revert the whole transaction if last payload reverts', async () => { - const upBalance = await provider.getBalance(context.universalProfile.address); + const upBalance = await provider.getBalance(await context.universalProfile.getAddress()); - const validAmount = ethers.utils.parseEther('1'); + const validAmount = ethers.parseEther('1'); expect(validAmount).to.be.lt(upBalance); // sanity check // make it revert by sending too much value than the actual balance - const invalidAmount = upBalance.add(10); + const invalidAmount = upBalance + BigInt(10); const randomRecipient = ethers.Wallet.createRandom().address; @@ -1958,31 +1951,31 @@ export const shouldBehaveLikeExecuteRelayCall = ( const ownerNonce = await context.keyManager.getNonce(context.mainController.address, 0); - const nonces = [ownerNonce, ownerNonce.add(1), ownerNonce.add(2)]; + const nonces = [ownerNonce, ownerNonce + BigInt(1), ownerNonce + BigInt(2)]; const values = [0, 0, 0]; const validityTimestamps = 0; const signatures = [ - signLSP6ExecuteRelayCall( + await signLSP6ExecuteRelayCall( context.keyManager, - nonces[0].toHexString(), + ethers.toBeHex(nonces[0]), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, firstTransferPayload, ), - signLSP6ExecuteRelayCall( + await signLSP6ExecuteRelayCall( context.keyManager, - nonces[1].toHexString(), + ethers.toBeHex(nonces[1]), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, secondTransferPayload, ), - signLSP6ExecuteRelayCall( + await signLSP6ExecuteRelayCall( context.keyManager, - nonces[2].toHexString(), + ethers.toBeHex(nonces[2]), validityTimestamps, LOCAL_PRIVATE_KEYS.ACCOUNT0, 0, diff --git a/tests/LSP6KeyManager/Relay/MultiChannelNonce.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Relay/MultiChannelNonce.test.ts similarity index 76% rename from tests/LSP6KeyManager/Relay/MultiChannelNonce.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/Relay/MultiChannelNonce.test.ts index cc4cf1050..6513383a7 100644 --- a/tests/LSP6KeyManager/Relay/MultiChannelNonce.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/Relay/MultiChannelNonce.test.ts @@ -1,19 +1,15 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { EIP191Signer } from '@lukso/eip191-signer.js'; import { TargetContract, TargetContract__factory } from '../../../types'; // constants -import { - ALL_PERMISSIONS, - ERC725YDataKeys, - OPERATION_TYPES, - LSP25_VERSION, - PERMISSIONS, - CALLTYPE, -} from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; +import { LSP25_VERSION } from '@lukso/lsp25-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -46,7 +42,7 @@ export const shouldBehaveLikeMultiChannelNonce = (buildContext: () => Promise Promise { it('should revert', async () => { - const channelId = ethers.BigNumber.from(2).pow(129); + const channelId = ethers.toBigInt('0xffffffffffffffffffffffffffffffffff'); await expect(context.keyManager.getNonce(signer.address, channelId)).to.be.revertedWithPanic; }); @@ -74,7 +70,7 @@ export const shouldBehaveLikeMultiChannelNonce = (buildContext: () => Promise { // prettier-ignore it(`${callNb} call > nonce should increment from ${expectedNonce - 1} to ${expectedNonce}`, async () => { - const latestNonce = await context.keyManager.callStatic.getNonce( + const latestNonce = await context.keyManager.getNonce( signer.address, channelId ); @@ -89,7 +85,7 @@ export const shouldBehaveLikeMultiChannelNonce = (buildContext: () => Promise Promise Promise Promise Promise nonce should increment from ${nonces[0]} to ${nonces[0] + 1}`, async () => { - const nonceBefore = await context.keyManager.callStatic.getNonce(signer.address, channelId); + const nonceBefore = await context.keyManager.getNonce(signer.address, channelId); const validityTimestamps = 0; @@ -157,13 +153,13 @@ export const shouldBehaveLikeMultiChannelNonce = (buildContext: () => Promise Promise Promise nonce should increment from ${nonces[1]} to ${nonces[1] + 1}`, async () => { @@ -208,13 +204,13 @@ export const shouldBehaveLikeMultiChannelNonce = (buildContext: () => Promise Promise Promise Promise Promise Promise nonce should increment from ${nonces[1]} to ${nonces[1] + 1}`, async () => { @@ -315,13 +311,13 @@ export const shouldBehaveLikeMultiChannelNonce = (buildContext: () => Promise Promise Promise Promise Promise Promise nonce should increment from ${nonces[1]} to ${nonces[1] + 1}`, async () => { @@ -422,13 +418,13 @@ export const shouldBehaveLikeMultiChannelNonce = (buildContext: () => Promise Promise Promise Promise Promise Promise { let controllerCanSetOneKey: SignerWithAddress, controllerCanSetManyKeys: SignerWithAddress; - const customKey1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey1')); - const customKey2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey2')); - const customKey3 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey3')); - const customKey4 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey4')); + const customKey1 = ethers.keccak256(ethers.toUtf8Bytes('CustomKey1')); + const customKey2 = ethers.keccak256(ethers.toUtf8Bytes('CustomKey2')); + const customKey3 = ethers.keccak256(ethers.toUtf8Bytes('CustomKey3')); + const customKey4 = ethers.keccak256(ethers.toUtf8Bytes('CustomKey4')); before(async () => { context = await buildContext(); @@ -109,7 +110,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting one key', () => { it('should pass when setting the right key', async () => { const key = customKey1; - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const newValue = ethers.hexlify(ethers.toUtf8Bytes('Some data')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -122,8 +123,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( }); it('should fail when setting the wrong key', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NotAllowedKey')); - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const key = ethers.keccak256(ethers.toUtf8Bytes('NotAllowedKey')); + const newValue = ethers.hexlify(ethers.toUtf8Bytes('Some data')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -139,14 +140,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting multiple keys', () => { it('should fail when the list contains none of the allowed keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('ZZZZZZZZZZ')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('ZZZZZZZZZZ')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value ZZZZZZZZ')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Value ZZZZZZZZ')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -162,13 +163,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should fail, even if the list contains the allowed key', async () => { const keys = [ customKey1, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 1')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -187,9 +188,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when the input is all the allowed keys', async () => { const keys = [customKey2, customKey3, customKey4]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 3')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 1')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 2')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 3')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -205,14 +206,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should fail when the input contains none of the allowed keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('ZZZZZZZZZZ')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('ZZZZZZZZZZ')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value ZZZZZZZZ')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Value ZZZZZZZZ')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -228,7 +229,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting one key', () => { it('should pass when trying to set the 1st allowed key', async () => { const key = customKey2; - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const newValue = ethers.hexlify(ethers.toUtf8Bytes('Some data')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -242,7 +243,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when trying to set the 2nd allowed key', async () => { const key = customKey3; - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const newValue = ethers.hexlify(ethers.toUtf8Bytes('Some data')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -256,7 +257,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when trying to set the 3rd allowed key', async () => { const key = customKey4; - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const newValue = ethers.hexlify(ethers.toUtf8Bytes('Some data')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -269,8 +270,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( }); it('should fail when setting a not-allowed Singleton key', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('NotAllowedKey')); - const newValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const key = ethers.keccak256(ethers.toUtf8Bytes('NotAllowedKey')); + const newValue = ethers.hexlify(ethers.toUtf8Bytes('Some data')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -288,8 +289,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('the input is the first two (subset) allowed keys', async () => { const keys = [customKey2, customKey3]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 1')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 2')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -305,8 +306,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('the input is the last two (subset) allowed keys', async () => { const keys = [customKey3, customKey4]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 1')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 2')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -322,8 +323,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('the input is the first + last (subset) allowed keys', async () => { const keys = [customKey2, customKey4]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 1')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 2')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -343,13 +344,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('1st key in input = 1st allowed key. Other 2 keys = not allowed', async () => { const keys = [ customKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -366,14 +367,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('2nd key in input = 1st allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), customKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -390,14 +391,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('3rd key in input = 1st allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), customKey2, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 2')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -415,13 +416,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('1st key in input = 2nd allowed key. Other 2 keys = not allowed', async () => { const keys = [ customKey3, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -438,14 +439,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('2nd key in input = 2nd allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), customKey3, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 3')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -462,14 +463,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('3rd key in input = 2nd allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), customKey3, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 3')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -487,13 +488,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('1st key in input = 3rd allowed key. Other 2 keys = not allowed', async () => { const keys = [ customKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 4')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -510,14 +511,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('2nd key in input = 3rd allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), customKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 4')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -534,14 +535,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('3rd key in input = 3rd allowed key. Other 2 keys = not allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), customKey4, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 4')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 4')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -558,15 +559,15 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('1st key in input = not allowed key. Other 2 keys = allowed', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), customKey2, customKey3, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 3')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -584,13 +585,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('2nd key in input = not allowed key. Other 2 keys = allowed', async () => { const keys = [ customKey2, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), customKey3, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 3')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -609,13 +610,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( const keys = [ customKey2, customKey3, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 3')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -640,13 +641,13 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( customKey2, customKey3, customKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey3')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data for customKey2')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data for customKey3')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data for customKey4')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -666,21 +667,21 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( customKey2, customKey3, customKey4, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('XXXXXXXXXX')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('YYYYYYYYYY')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('ZZZZZZZZZZ')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('AAAAAAAAAA')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('BBBBBBBBBB')), + ethers.keccak256(ethers.toUtf8Bytes('XXXXXXXXXX')), + ethers.keccak256(ethers.toUtf8Bytes('YYYYYYYYYY')), + ethers.keccak256(ethers.toUtf8Bytes('ZZZZZZZZZZ')), + ethers.keccak256(ethers.toUtf8Bytes('AAAAAAAAAA')), + ethers.keccak256(ethers.toUtf8Bytes('BBBBBBBBBB')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 3')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Custom Value 4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value XXXXXXXX')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value YYYYYYYY')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value ZZZZZZZZ')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value AAAAAAAA')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Value BBBBBBBB')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 3')), + ethers.hexlify(ethers.toUtf8Bytes('Custom Value 4')), + ethers.hexlify(ethers.toUtf8Bytes('Value XXXXXXXX')), + ethers.hexlify(ethers.toUtf8Bytes('Value YYYYYYYY')), + ethers.hexlify(ethers.toUtf8Bytes('Value ZZZZZZZZ')), + ethers.hexlify(ethers.toUtf8Bytes('Value AAAAAAAA')), + ethers.hexlify(ethers.toUtf8Bytes('Value BBBBBBBB')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -710,27 +711,15 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( customKey4, ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey4')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some Data for customKey3')), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 1) for customKey2'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 1) for customKey3'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 2) for customKey2'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 1) for customKey4'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 2) for customKey3'), - ), - ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Some Data (override 2) for customKey4'), - ), + ethers.hexlify(ethers.toUtf8Bytes('Some Data for customKey2')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data for customKey4')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data for customKey3')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data (override 1) for customKey2')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data (override 1) for customKey3')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data (override 2) for customKey2')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data (override 1) for customKey4')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data (override 2) for customKey3')), + ethers.hexlify(ethers.toUtf8Bytes('Some Data (override 2) for customKey4')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -761,8 +750,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when address can set any key', () => { describe('when setting one key', () => { it('should pass when setting any random key', async () => { - const key = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data')); + const key = ethers.hexlify(ethers.randomBytes(32)); + const value = ethers.hexlify(ethers.toUtf8Bytes('Some data')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -778,14 +767,14 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting multiple keys', () => { it('should pass when setting any multiple keys', async () => { const keys = [ - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Some data 3')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 1')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 2')), + ethers.hexlify(ethers.toUtf8Bytes('Some data 3')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -844,7 +833,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('when setting one key', () => { it('should pass when setting SupportedStandards:LSPX', async () => { const mappingKey = LSPXKey; - const mappingValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x24ae6f23')); + const mappingValue = ethers.hexlify(ethers.toUtf8Bytes('0x24ae6f23')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ mappingKey, @@ -859,7 +848,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when overriding SupportedStandards:LSPX', async () => { const mappingKey = LSPXKey; - const mappingValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x24ae6f23')); + const mappingValue = ethers.hexlify(ethers.toUtf8Bytes('0x24ae6f23')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ mappingKey, @@ -874,7 +863,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting SupportedStandards:LSPY', async () => { const mappingKey = LSPYKey; - const mappingValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x5e8d18c5')); + const mappingValue = ethers.hexlify(ethers.toUtf8Bytes('0x5e8d18c5')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ mappingKey, @@ -888,7 +877,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting SupportedStandards:LSPZ', async () => { const mappingKey = LSPZKey; - const mappingValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x25b71a36')); + const mappingValue = ethers.hexlify(ethers.toUtf8Bytes('0x25b71a36')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ mappingKey, @@ -996,9 +985,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( '0xcccccccccccccccccccccccccccccccc00000000000000000000000022222222', ]; const randomMappingValues = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 3')), + ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value 1')), + ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value 3')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1021,8 +1010,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( ]; const mappingValues = [ '0x24ae6f23', - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value 1')), + ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value 2')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1044,9 +1033,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting any random Mapping key', async () => { const randomMappingKey = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000011111111'; - const randomMappingValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('Random Mapping Value'), - ); + const randomMappingValue = ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ randomMappingKey, @@ -1068,9 +1055,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( '0xcccccccccccccccccccccccccccccccc00000000000000000000000022222222', ]; const randomMappingValues = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 1')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 2')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random Mapping Value 3')), + ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value 1')), + ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value 2')), + ethers.hexlify(ethers.toUtf8Bytes('Random Mapping Value 3')), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1131,7 +1118,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting array key length MyArray[]', async () => { const key = arrayKeyLength; // eg: MyArray[].length = 10 elements - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0x0a')); + const value = ethers.hexlify(ethers.toUtf8Bytes('0x0a')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1146,7 +1133,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting 1st array element MyArray[0]', async () => { const key = arrayKeyElement1; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xaaaaaaaa')); + const value = ethers.hexlify(ethers.toUtf8Bytes('0xaaaaaaaa')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1161,7 +1148,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting 2nd array element MyArray[1]', async () => { const key = arrayKeyElement2; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xbbbbbbbb')); + const value = ethers.hexlify(ethers.toUtf8Bytes('0xbbbbbbbb')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1176,7 +1163,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting 3rd array element MyArray[3]', async () => { const key = arrayKeyElement3; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xcccccccc')); + const value = ethers.hexlify(ethers.toUtf8Bytes('0xcccccccc')); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1267,8 +1254,8 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( describe('Testing bytes32(0) (= zero key) edge cases', () => { let controllerCanSetSomeKeys: SignerWithAddress; - const customKey1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey1')); - const customKey2 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('CustomKey2')); + const customKey1 = ethers.keccak256(ethers.toUtf8Bytes('CustomKey1')); + const customKey2 = ethers.keccak256(ethers.toUtf8Bytes('CustomKey2')); const zeroKey = '0x0000000000000000000000000000000000000000000000000000000000000000'; @@ -1312,7 +1299,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( [{ allowedDataKey: customKey1 }, { allowedDataKey: customKey2 }].forEach((testCase) => { it(`should pass when setting a data key listed in the allowed ERC725Y data keys: ${testCase.allowedDataKey}`, async () => { const key = testCase.allowedDataKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1328,24 +1315,24 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( [ { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 1')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 1')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 2')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 2')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 3')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 3')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 4')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 4')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 5')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 5')), }, ].forEach((testCase) => { it(`should revert when trying to set any random data key (e.g: ${testCase.datakeyToSet})`, async () => { const key = testCase.datakeyToSet; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1360,7 +1347,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should revert when trying to set bytes31(0) dynamic key, not in AllowedERC725YDataKeys', async () => { const key = bytes31DynamicKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1374,7 +1361,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass and allow to set the bytes32(0) data key', async () => { const key = zeroKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1389,9 +1376,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when trying to set an array of data keys that includes bytes32(0) (= zero data key)', async () => { const keys = [customKey1, customKey2, zeroKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[0])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[1])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[2])), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1407,9 +1394,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should revert when trying to set an array of data keys including a dynamic bytes31(0) data key, not in AllowedERC725YDataKeys', async () => { const keys = [customKey1, customKey2, bytes31DynamicKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[0])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[1])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[2])), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1425,9 +1412,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should revert when trying to set an array of data keys including a dynamic bytes20(0) data key, not in AllowedERC725YDataKeys', async () => { const keys = [customKey1, customKey2, bytes20DynamicKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[0])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[1])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[2])), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1473,7 +1460,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( [{ allowedDataKey: customKey1 }, { allowedDataKey: customKey2 }].forEach((testCase) => { it(`should pass when setting a data key listed in the allowed ERC725Y data keys: ${testCase.allowedDataKey}`, async () => { const key = testCase.allowedDataKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1489,24 +1476,24 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( [ { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 1')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 1')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 2')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 2')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 3')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 3')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 4')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 4')), }, { - datakeyToSet: ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Some random data key 5')), + datakeyToSet: ethers.keccak256(ethers.toUtf8Bytes('Some random data key 5')), }, ].forEach((testCase) => { it(`should revert when trying to set any random data key (e.g: ${testCase.datakeyToSet})`, async () => { const key = testCase.datakeyToSet; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1521,7 +1508,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should allow setting up a key with a prefix of 31 null bytes, as bytes31(0) is part of AllowedERC725YDataKeys', async () => { const key = bytes31DynamicKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1536,7 +1523,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should allow setting up a key with a prefix of 20 null bytes, as bytes20(0) is part of AllowedERC725YDataKeys', async () => { const key = bytes20DynamicKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1551,7 +1538,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass and allow to set the bytes32(0) data key', async () => { const key = zeroKey; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1566,9 +1553,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when setting an array of data keys that includes bytes32(0) (= zero data key)', async () => { const keys = [customKey1, customKey2, zeroKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[0])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[1])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[2])), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1584,9 +1571,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should pass when trying to set an array of data keys including a dynamic bytes24(0) data key, because bytes20(0) dynamic data ke is in AllowedERC725YDataKeys', async () => { const keys = [customKey1, customKey2, bytes24DynamicKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[0])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[1])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[2])), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1602,9 +1589,9 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( it('should revert when trying to set an array of data keys including a dynamic bytes19(0) data key, not in AllowedERC725YDataKeys', async () => { const keys = [customKey1, customKey2, bytes19DynamicKey]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[0])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[1])), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + keys[2])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[0])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[1])), + ethers.hexlify(ethers.toUtf8Bytes('some value for ' + keys[2])), ]; const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -1661,7 +1648,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( ].forEach((testCase) => { it(`e.g: ${testCase.datakeyToSet}`, async () => { const key = testCase.datakeyToSet; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1699,7 +1686,7 @@ export const shouldBehaveLikeAllowedERC725YDataKeys = ( ].forEach((testCase) => { it(`should revert (e.g: ${testCase.datakeyToSet})`, async () => { const key = testCase.datakeyToSet; - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value for ' + key)); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value for ' + key)); const setDataPayload = context.universalProfile.interface.encodeFunctionData( 'setData', diff --git a/tests/LSP6KeyManager/SetData/PermissionSetData.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/SetData/PermissionSetData.test.ts similarity index 72% rename from tests/LSP6KeyManager/SetData/PermissionSetData.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/SetData/PermissionSetData.test.ts index bb0154297..5cf19926e 100644 --- a/tests/LSP6KeyManager/SetData/PermissionSetData.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/SetData/PermissionSetData.test.ts @@ -1,12 +1,14 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { encodeData, ERC725JSONSchema } from '@erc725/erc725.js'; import { Executor, Executor__factory } from '../../../types'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS, OPERATION_TYPES } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -77,12 +79,12 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise { describe('For UP owner', () => { it('should pass', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -103,15 +105,15 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { it('should pass', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -119,15 +121,15 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { it('should revert', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -144,8 +146,8 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { it('should not allow', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -160,8 +162,8 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { it('should pass', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Hello Lukso!!!')); + const key = ethers.keccak256(ethers.toUtf8Bytes('My First Key')); + const value = ethers.hexlify(ethers.toUtf8Bytes('Hello Lukso!!!')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -172,7 +174,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise { it('(should pass): adding 5 singleton keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFourthKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFifthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFourthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFifthKey')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('aaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('bbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('cccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('dddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('eeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('aaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('bbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('cccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('dddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('eeeeeeeeee')), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -224,7 +226,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise Promise Promise { it('(should pass): adding 5 singleton keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFourthKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFifthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFourthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFifthKey')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('aaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('bbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('cccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('dddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('eeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('aaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('bbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('cccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('dddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('eeeeeeeeee')), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -290,7 +294,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise Promise Promise Promise { it('(should revert): adding 5 singleton keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFourthKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFifthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFourthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFifthKey')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('aaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('bbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('cccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('dddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('eeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('aaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('bbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('cccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('dddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('eeeeeeeeee')), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -400,9 +406,11 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise { it('(should fail): adding 5 singleton keys', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFirstKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MySecondKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyThirdKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFourthKey')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('MyFifthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFirstKey')), + ethers.keccak256(ethers.toUtf8Bytes('MySecondKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyThirdKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFourthKey')), + ethers.keccak256(ethers.toUtf8Bytes('MyFifthKey')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('aaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('bbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('cccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('dddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('eeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('aaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('bbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('cccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('dddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('eeeeeeeeee')), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -479,9 +487,11 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise { it('should pass', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Second Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Third Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Fourth Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Fifth Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Second Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Third Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Fourth Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Fifth Key')), ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xaaaaaaaaaa')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xbbbbbbbbbb')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xcccccccccc')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xdddddddddd')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('0xeeeeeeeeee')), + ethers.hexlify(ethers.toUtf8Bytes('0xaaaaaaaaaa')), + ethers.hexlify(ethers.toUtf8Bytes('0xbbbbbbbbbb')), + ethers.hexlify(ethers.toUtf8Bytes('0xcccccccccc')), + ethers.hexlify(ethers.toUtf8Bytes('0xdddddddddd')), + ethers.hexlify(ethers.toUtf8Bytes('0xeeeeeeeeee')), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -531,7 +541,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise Promise Promise contract calls', () => { it('should allow to set a key hardcoded inside a function of the calling contract', async () => { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call await contractCanSetData.setHardcodedKey(); // check that store[key] is now set to value - const newStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const newStorage = await context.universalProfile.getData(hardcodedDataKey); expect(newStorage).to.equal(hardcodedDataValue); }); it('Should allow to set a key computed inside a function of the calling contract', async () => { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call await contractCanSetData.setComputedKey(); // check that store[key] is now set to value - const newStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const newStorage = await context.universalProfile.getData(hardcodedDataKey); expect(newStorage).to.equal(hardcodedDataValue); }); it('Should allow to set a key computed from parameters given to a function of the calling contract', async () => { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call await contractCanSetData.setComputedKeyFromParams(hardcodedDataKey, hardcodedDataValue); // check that store[key] is now set to value - const newStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const newStorage = await context.universalProfile.getData(hardcodedDataKey); expect(newStorage).to.equal(hardcodedDataValue); }); }); @@ -644,13 +642,11 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Low-level calls', () => { it('Should allow to `setHardcodedKeyRawCall` on UP', async () => { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // check if low-level call succeeded - const result = await contractCanSetData.callStatic.setHardcodedKeyRawCall({ + const result = await contractCanSetData.setHardcodedKeyRawCall.staticCall({ gasLimit: GAS_PROVIDED, }); expect(result).to.be.true; @@ -661,17 +657,13 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call @@ -680,17 +672,13 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { // check that nothing is set at store[key] - const initialStorage = await context.universalProfile.callStatic['getData(bytes32)']( - hardcodedDataKey, - ); + const initialStorage = await context.universalProfile.getData(hardcodedDataKey); expect(initialStorage).to.equal('0x'); // make the executor call @@ -703,9 +691,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise Promise { const key = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - aliceContext.universalProfile.address.substring(2); + (await aliceContext.universalProfile.getAddress()).substring(2); const result = await bobContext.universalProfile.getData(key); expect(result).to.equal(PERMISSIONS.SETDATA); }); it("Alice's UP should't be able to `setData(...)` on Bob's UP when it doesn't have any AllowedERC725YDataKeys", async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Alice's Key")); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes("Alice's Value")); + const key = ethers.keccak256(ethers.toUtf8Bytes("Alice's Key")); + const value = ethers.hexlify(ethers.toUtf8Bytes("Alice's Value")); const finalSetDataPayload = bobContext.universalProfile.interface.encodeFunctionData( 'setData', @@ -785,24 +771,24 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Alice's Key")); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes("Alice's Value")); + const key = ethers.keccak256(ethers.toUtf8Bytes("Alice's Key")); + const value = ethers.hexlify(ethers.toUtf8Bytes("Alice's Value")); // Adding `key` to AllowedERC725YDataKeys for Alice const payload = bobContext.universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP6['AddressPermissions:AllowedERC725YDataKeys'] + - aliceContext.universalProfile.address.substring(2), + (await aliceContext.universalProfile.getAddress()).substring(2), encodeCompactBytesArray([key]), ]); await bobContext.keyManager.connect(bob).execute(payload); @@ -819,7 +805,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise Promise { @@ -861,8 +847,8 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { for (let ii = 1; ii <= 5; ii++) { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(`dissallowed key ${ii}`)); - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes(`some value ${ii}`)); + const key = ethers.keccak256(ethers.toUtf8Bytes(`dissallowed key ${ii}`)); + const value = ethers.hexlify(ethers.toUtf8Bytes(`some value ${ii}`)); it(`should be allowed to set a disallowed key: ${key}`, async () => { const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -880,7 +866,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { it('should be allowed to set the 1st allowed key', async () => { - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value 1')); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value 1')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ AllowedERC725YDataKeys[0], @@ -894,7 +880,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value 2')); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value 2')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ AllowedERC725YDataKeys[1], @@ -908,7 +894,7 @@ export const shouldBehaveLikePermissionSetData = (buildContext: () => Promise { - const value = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value 3')); + const value = ethers.hexlify(ethers.toUtf8Bytes('some value 3')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ AllowedERC725YDataKeys[2], diff --git a/tests/LSP6KeyManager/SetPermissions/PermissionChangeAddController.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/PermissionChangeAddController.test.ts similarity index 91% rename from tests/LSP6KeyManager/SetPermissions/PermissionChangeAddController.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/PermissionChangeAddController.test.ts index 4551588f7..fd841cffb 100644 --- a/tests/LSP6KeyManager/SetPermissions/PermissionChangeAddController.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/PermissionChangeAddController.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -200,7 +201,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; permissionArrayValues = [ - ethers.utils.hexZeroPad(ethers.utils.hexlify(6), 16), + ethers.zeroPadValue(ethers.toBeHex(6), 16), context.mainController.address, canOnlyAddController.address, canOnlyEditPermissions.address, @@ -306,9 +307,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).add(1).toNumber(); + const newLength = ethers.toNumber(ethers.toBigInt(currentLength) + BigInt(1)); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -327,9 +328,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).sub(1).toNumber(); + const newLength = ethers.toNumber(ethers.toBigInt(currentLength) - BigInt(1)); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -408,7 +409,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( // prettier-ignore const result = await context.universalProfile.getData(key); - expect(ethers.utils.getAddress(result)).to.equal(value); + expect(ethers.getAddress(result)).to.equal(value); }); it('should revert when setting a random 10 bytes value', async () => { @@ -580,9 +581,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).add(1).toNumber(); + const newLength = ethers.toNumber(ethers.toBigInt(currentLength) + BigInt(1)); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -601,9 +602,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).sub(1).toNumber(); + const newLength = ethers.toNumber(ethers.toBigInt(currentLength) - BigInt(1)); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -837,9 +838,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).add(1).toNumber(); + const newLength = ethers.toNumber(ethers.toBigInt(currentLength) + BigInt(1)); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -856,9 +857,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).sub(1).toNumber(); + const newLength = ethers.toNumber(ethers.toBigInt(currentLength) - BigInt(1)); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -906,7 +907,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( // prettier-ignore const result = await context.universalProfile.getData(key); - expect(ethers.utils.getAddress(result)).to.equal(value); + expect(ethers.getAddress(result)).to.equal(value); }); it('should revert when setting a random 10 bytes value', async () => { @@ -1094,9 +1095,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).add(1).toNumber(); + const newLength = ethers.toNumber(ethers.toBigInt(currentLength) + BigInt(1)); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1113,9 +1114,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const currentLength = await context.universalProfile['getData(bytes32)'](key); - const newLength = ethers.BigNumber.from(currentLength).sub(1).toNumber(); + const newLength = ethers.toNumber(ethers.toBigInt(currentLength) - BigInt(1)); - const value = ethers.utils.hexZeroPad(ethers.utils.hexlify(newLength), 16); + const value = ethers.zeroPadValue(ethers.toBeHex(newLength), 16); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -1208,9 +1209,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( let addressesToEditPermissions: [SignerWithAddress, SignerWithAddress]; const allowedERC725YDataKeys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Second Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Third Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Second Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Third Key')), ]; let permissionKeys: string[]; @@ -1247,7 +1248,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( PERMISSIONS.TRANSFERVALUE, PERMISSIONS.TRANSFERVALUE, // AddressPermissions[].length - ethers.utils.hexZeroPad(ethers.utils.hexlify(5), 16), + ethers.zeroPadValue(ethers.toBeHex(5), 16), ]; }); @@ -1266,8 +1267,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyTwo = ethers.Wallet.createRandom(); const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My SecondKey Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My SecondKey Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + newControllerKeyOne.address.substr(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -1275,8 +1276,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, ]; @@ -1295,8 +1296,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( it('(should pass): 2 x keys + change 2 x existing permissions', async () => { const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My 1st Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My 2nd Key')), + ethers.keccak256(ethers.toUtf8Bytes('My 1st Key')), + ethers.keccak256(ethers.toUtf8Bytes('My 2nd Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + addressesToEditPermissions[0].address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -1304,8 +1305,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1326,8 +1327,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyOne = ethers.Wallet.createRandom(); const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My SecondKey Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My SecondKey Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + newControllerKeyOne.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -1335,8 +1336,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SIGN, combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1378,11 +1379,11 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(5), 16), + ethers.zeroPadValue(ethers.toBeHex(5), 16), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -1406,8 +1407,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1426,8 +1427,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyOne = ethers.Wallet.createRandom(); const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My SecondKey Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My SecondKey Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + newControllerKeyOne.address.substr(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -1435,8 +1436,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SIGN, combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1455,8 +1456,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyOne = ethers.Wallet.createRandom(); const newControllerKeyTwo = ethers.Wallet.createRandom(); - const NotAllowedERC725YDataKey = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('Not Allowed Data Key'), + const NotAllowedERC725YDataKey = ethers.keccak256( + ethers.toUtf8Bytes('Not Allowed Data Key'), ); // prettier-ignore @@ -1471,8 +1472,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( // prettier-ignore const dataValues = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes("My First Value")), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes("Random data for not allowed value")), + ethers.hexlify(ethers.toUtf8Bytes("My First Value")), + ethers.hexlify(ethers.toUtf8Bytes("Random data for not allowed value")), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, ]; @@ -1492,8 +1493,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const newControllerKeyTwo = ethers.Wallet.createRandom(); const keys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Second Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Second Key')), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + newControllerKeyOne.address.substr(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -1501,8 +1502,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, ]; @@ -1522,9 +1523,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ERC725YDataKeys.LSP6['AddressPermissions[]'].length, ); - const newPermissionsArrayLength = ethers.BigNumber.from(currentPermissionsArrayLength) - .add(1) - .toNumber(); + const newPermissionsArrayLength = ethers.toNumber( + ethers.toBigInt(currentPermissionsArrayLength) + BigInt(1), + ); const newControllerKeyOne = ethers.Wallet.createRandom(); const newControllerKeyTwo = ethers.Wallet.createRandom(); @@ -1540,11 +1541,11 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, - ethers.utils.hexZeroPad(ethers.utils.hexlify(newPermissionsArrayLength), 16), + ethers.zeroPadValue(ethers.toBeHex(newPermissionsArrayLength), 16), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -1581,8 +1582,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SETDATA, PERMISSIONS.SETDATA, ]; @@ -1602,7 +1603,7 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ERC725YDataKeys.LSP6['AddressPermissions[]'].length, ); - const newArrayLength = ethers.BigNumber.from(currentArrayLength).add(1).toNumber(); + const newArrayLength = ethers.toNumber(ethers.toBigInt(currentArrayLength) + BigInt(1)); const keys = [ allowedERC725YDataKeys[0], @@ -1611,9 +1612,9 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), - ethers.utils.hexZeroPad(ethers.utils.hexlify(newArrayLength), 16), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), + ethers.zeroPadValue(ethers.toBeHex(newArrayLength), 16), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -1639,8 +1640,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), PERMISSIONS.SIGN, combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1656,8 +1657,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( }); it('(should fail): edit permissions of 2 x existing controllers + (set 1 x allowed data key) + (set 1 x NOT allowed data key)', async () => { - const NotAllowedERC725YDataKey = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('Not Allowed Data Key'), + const NotAllowedERC725YDataKey = ethers.keccak256( + ethers.toUtf8Bytes('Not Allowed Data Key'), ); const keys = [ @@ -1672,8 +1673,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( const values = [ combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('Random data for not allowed value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('Random data for not allowed value')), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ @@ -1697,8 +1698,8 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.TRANSFERVALUE), ]; @@ -1725,11 +1726,11 @@ export const shouldBehaveLikePermissionChangeOrAddController = ( ]; const values = [ - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My First Value')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('My Second Value')), + ethers.hexlify(ethers.toUtf8Bytes('My First Value')), + ethers.hexlify(ethers.toUtf8Bytes('My Second Value')), '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', - ethers.utils.hexZeroPad(ethers.utils.hexlify(4), 16), + ethers.zeroPadValue(ethers.toBeHex(4), 16), ]; const payload = context.universalProfile.interface.encodeFunctionData('setDataBatch', [ diff --git a/tests/LSP6KeyManager/SetPermissions/SetAllowedCalls.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/SetAllowedCalls.test.ts similarity index 99% rename from tests/LSP6KeyManager/SetPermissions/SetAllowedCalls.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/SetAllowedCalls.test.ts index 3ad8fbfa2..22479b88f 100644 --- a/tests/LSP6KeyManager/SetPermissions/SetAllowedCalls.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/SetAllowedCalls.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, PERMISSIONS, INTERFACE_IDS, CALLTYPE } from '../../../constants'; +import { ERC725YDataKeys, INTERFACE_IDS } from '../../../constants'; +import { PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // helpers import { combineAllowedCalls } from '../../utils/helpers'; diff --git a/tests/LSP6KeyManager/SetPermissions/SetAllowedERC725YDataKeys.test.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/SetAllowedERC725YDataKeys.test.ts similarity index 91% rename from tests/LSP6KeyManager/SetPermissions/SetAllowedERC725YDataKeys.test.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/SetAllowedERC725YDataKeys.test.ts index f39dcccad..ae4d44e31 100644 --- a/tests/LSP6KeyManager/SetPermissions/SetAllowedERC725YDataKeys.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/SetPermissions/SetAllowedERC725YDataKeys.test.ts @@ -1,9 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // constants -import { ERC725YDataKeys, PERMISSIONS } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { PERMISSIONS } from '@lukso/lsp6-contracts'; // helpers import { encodeCompactBytesArray } from '../../utils/helpers'; @@ -61,11 +62,11 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( encodeCompactBytesArray([ ERC725YDataKeys.LSP3['LSP3Profile'], // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Some Custom Profile Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Some Custom Profile Data Key")), ]), encodeCompactBytesArray([ - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), ]), '0x11223344', '0x0000000000000000000000000000000000000000000000000000000000000000', @@ -86,9 +87,9 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( const value = encodeCompactBytesArray([ ERC725YDataKeys.LSP3['LSP3Profile'], // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Some Custom Profile Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Some Custom Profile Data Key")), // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Another Custom Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Another Custom Data Key")), ]); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -166,9 +167,9 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( const value = encodeCompactBytesArray([ // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("My Custom Profile Key 1")), + ethers.keccak256(ethers.toUtf8Bytes("My Custom Profile Key 1")), // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("My Custom Profile Key 2")), + ethers.keccak256(ethers.toUtf8Bytes("My Custom Profile Key 2")), ]); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -216,9 +217,9 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( const value = encodeCompactBytesArray([ ERC725YDataKeys.LSP3['LSP3Profile'], // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Some Custom Profile Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Some Custom Profile Data Key")), // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Another Custom Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Another Custom Data Key")), ]); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -244,9 +245,9 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( const value = encodeCompactBytesArray([ ERC725YDataKeys.LSP3['LSP3Profile'], // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Some Custom Profile Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Some Custom Profile Data Key")), // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Another Custom Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Another Custom Data Key")), ]); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -329,8 +330,8 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( newController.address.substr(2); const value = encodeCompactBytesArray([ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Custom Key 1')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Custom Key 2')), + ethers.keccak256(ethers.toUtf8Bytes('My Custom Key 1')), + ethers.keccak256(ethers.toUtf8Bytes('My Custom Key 2')), ]); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ @@ -376,9 +377,9 @@ export const shouldBehaveLikeSetAllowedERC725YDataKeys = ( const value = encodeCompactBytesArray([ ERC725YDataKeys.LSP3['LSP3Profile'], // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Some Custom Profile Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Some Custom Profile Data Key")), // prettier-ignore - ethers.utils.keccak256(ethers.utils.toUtf8Bytes("Another Custom Data Key")), + ethers.keccak256(ethers.toUtf8Bytes("Another Custom Data Key")), ]); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ diff --git a/tests/LSP6KeyManager/index.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/index.ts similarity index 100% rename from tests/LSP6KeyManager/index.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/index.ts diff --git a/tests/LSP6KeyManager/internals/AllowedCalls.internal.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/AllowedCalls.internal.ts similarity index 91% rename from tests/LSP6KeyManager/internals/AllowedCalls.internal.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/AllowedCalls.internal.ts index de2e1b21c..ba5b10a9c 100644 --- a/tests/LSP6KeyManager/internals/AllowedCalls.internal.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/AllowedCalls.internal.ts @@ -1,17 +1,13 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { TargetContract, TargetContract__factory } from '../../../types'; // constants -import { - ALL_PERMISSIONS, - ERC725YDataKeys, - OPERATION_TYPES, - PERMISSIONS, - CALLTYPE, -} from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6InternalsTestContext } from '../../utils/context'; @@ -59,7 +55,7 @@ export const testAllowedCallsInternals = ( }); it('should return `false` if element is not 28 bytes long', async () => { - const allowedCalls = ethers.utils.hexlify(ethers.utils.randomBytes(27)); + const allowedCalls = ethers.hexlify(ethers.randomBytes(27)); const result = await context.keyManagerInternalTester.isCompactBytesArrayOfAllowedCalls( allowedCalls, ); @@ -112,7 +108,7 @@ export const testAllowedCallsInternals = ( [CALLTYPE.VALUE, CALLTYPE.VALUE, CALLTYPE.VALUE], [ context.accounts[5].address, - ethers.utils.hexlify(ethers.utils.randomBytes(27)), + ethers.hexlify(ethers.randomBytes(27)), context.accounts[7].address, ], ['0xffffffff', '0xffffffff', '0xffffffff'], @@ -151,7 +147,10 @@ export const testAllowedCallsInternals = ( combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), ], - [allowedEOA.address.toLowerCase(), allowedTargetContract.address.toLowerCase()], + [ + allowedEOA.address.toLowerCase(), + (await allowedTargetContract.getAddress()).toLowerCase(), + ], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ); @@ -203,7 +202,7 @@ export const testAllowedCallsInternals = ( const executeParams = { operationType: OPERATION_TYPES.CALL, to: allowedEOA.address, - value: ethers.utils.parseEther('1'), + value: ethers.parseEther('1'), data: '0x', }; @@ -221,14 +220,12 @@ export const testAllowedCallsInternals = ( describe('when the ERC725X payload (transfer 1 LYX) is for an address not listed in the allowed calls', () => { it('should revert', async () => { - const disallowedAddress = ethers.utils.getAddress( - '0xdeadbeefdeadbeefdeaddeadbeefdeadbeefdead', - ); + const disallowedAddress = ethers.getAddress('0xdeadbeefdeadbeefdeaddeadbeefdeadbeefdead'); const executeParams = { operationType: OPERATION_TYPES.CALL, to: disallowedAddress, - value: ethers.utils.parseEther('1'), + value: ethers.parseEther('1'), data: '0x', }; @@ -253,7 +250,7 @@ export const testAllowedCallsInternals = ( const executeParams = { operationType: OPERATION_TYPES.CALL, to: randomAddress, - value: ethers.utils.parseEther('1'), + value: ethers.parseEther('1'), data: '0x', }; @@ -300,10 +297,10 @@ export const testAllowedCallsInternals = ( allowedCalls = combineAllowedCalls( [CALLTYPE.VALUE, CALLTYPE.CALL, CALLTYPE.STATICCALL, CALLTYPE.DELEGATECALL], [ - targetContractValue.address, - targetContractCall.address, - targetContractStaticCall.address, - targetContractDelegateCall.address, + await targetContractValue.getAddress(), + await targetContractCall.getAddress(), + await targetContractStaticCall.getAddress(), + await targetContractDelegateCall.getAddress(), ], ['0xffffffff', '0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff', '0xffffffff'], @@ -344,7 +341,7 @@ export const testAllowedCallsInternals = ( it('should fail with `NotAllowedCall` error when the allowed address has `v` permission only (`v` = VALUE)', async () => { const executeParams = { operationType: OPERATION_TYPES.CALL, - to: targetContractValue.address, + to: await targetContractValue.getAddress(), value: 0, data: randomPayload, }; @@ -359,13 +356,13 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractValue.address, randomPayload); + .withArgs(controller.address, await targetContractValue.getAddress(), randomPayload); }); it('should pass when the allowed address has `c` permission only (`c` = CALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.CALL, - to: targetContractCall.address, + to: await targetContractCall.getAddress(), value: 0, data: randomPayload, }; @@ -384,7 +381,7 @@ export const testAllowedCallsInternals = ( it('should fail with `NotAllowedCall` error when the allowed address has `s` permission only (`s` = STATICCALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.CALL, - to: targetContractStaticCall.address, + to: await targetContractStaticCall.getAddress(), value: 0, data: randomPayload, }; @@ -399,13 +396,13 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractStaticCall.address, randomPayload); + .withArgs(controller.address, await targetContractStaticCall.getAddress(), randomPayload); }); it('should fail with `NotAllowedCall` error when the allowed address has `d` permission only (`d` = DELEGATECALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.CALL, - to: targetContractDelegateCall.address, + to: await targetContractDelegateCall.getAddress(), value: 0, data: randomPayload, }; @@ -420,7 +417,11 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractDelegateCall.address, randomPayload); + .withArgs( + controller.address, + await targetContractDelegateCall.getAddress(), + randomPayload, + ); }); }); @@ -455,7 +456,7 @@ export const testAllowedCallsInternals = ( it('should fail with `NotAllowedCall` error when the allowed address has `v` permission only (`v` = VALUE)', async () => { const executeParams = { operationType: OPERATION_TYPES.STATICCALL, - to: targetContractValue.address, + to: await targetContractValue.getAddress(), value: 0, data: randomPayload, }; @@ -470,13 +471,13 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractValue.address, randomPayload); + .withArgs(controller.address, await targetContractValue.getAddress(), randomPayload); }); it('should fail with `NotAllowedCall` error when the allowed address has `c` permission only (`c` = CALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.STATICCALL, - to: targetContractCall.address, + to: await targetContractCall.getAddress(), value: 0, data: randomPayload, }; @@ -491,13 +492,13 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractCall.address, randomPayload); + .withArgs(controller.address, await targetContractCall.getAddress(), randomPayload); }); it('should pass when the allowed address has `s` permission only (`s` = STATICCALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.STATICCALL, - to: targetContractStaticCall.address, + to: await targetContractStaticCall.getAddress(), value: 0, data: randomPayload, }; @@ -516,7 +517,7 @@ export const testAllowedCallsInternals = ( it('should fail with `NotAllowedCall` error when the allowed address has `d` permission only (`d` = DELEGATECALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.STATICCALL, - to: targetContractDelegateCall.address, + to: await targetContractDelegateCall.getAddress(), value: 0, data: randomPayload, }; @@ -531,7 +532,11 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractDelegateCall.address, randomPayload); + .withArgs( + controller.address, + await targetContractDelegateCall.getAddress(), + randomPayload, + ); }); }); @@ -566,7 +571,7 @@ export const testAllowedCallsInternals = ( it('should fail with `NotAllowedCall` error when the allowed address has `v` permission only (`v` = VALUE)', async () => { const executeParams = { operationType: OPERATION_TYPES.DELEGATECALL, - to: targetContractValue.address, + to: await targetContractValue.getAddress(), value: 0, data: randomPayload, }; @@ -581,13 +586,13 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractValue.address, randomPayload); + .withArgs(controller.address, await targetContractValue.getAddress(), randomPayload); }); it('should fail with `NotAllowedCall` error when the allowed address has `c` permission only (`c` = CALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.DELEGATECALL, - to: targetContractCall.address, + to: await targetContractCall.getAddress(), value: 0, data: randomPayload, }; @@ -602,13 +607,13 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractCall.address, randomPayload); + .withArgs(controller.address, await targetContractCall.getAddress(), randomPayload); }); it('should fail with `NotAllowedCall` error when the allowed address has `s` permission only (`s` = STATICCALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.DELEGATECALL, - to: targetContractStaticCall.address, + to: await targetContractStaticCall.getAddress(), value: 0, data: randomPayload, }; @@ -623,13 +628,13 @@ export const testAllowedCallsInternals = ( ), ) .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') - .withArgs(controller.address, targetContractStaticCall.address, randomPayload); + .withArgs(controller.address, await targetContractStaticCall.getAddress(), randomPayload); }); it('should pass when the allowed address has `d` permission only (`d` = DELEGATECALL)', async () => { const executeParams = { operationType: OPERATION_TYPES.DELEGATECALL, - to: targetContractDelegateCall.address, + to: await targetContractDelegateCall.getAddress(), value: 0, data: randomPayload, // random payload }; @@ -710,7 +715,7 @@ export const testAllowedCallsInternals = ( const executeParams = { operationType: OPERATION_TYPES.CALL, to: randomAddress, - value: ethers.utils.parseEther('1'), + value: ethers.parseEther('1'), data: randomData, }; @@ -769,7 +774,7 @@ export const testAllowedCallsInternals = ( const executeParams = { operationType: OPERATION_TYPES.CALL, to: randomAddress, - value: ethers.utils.parseEther('1'), + value: ethers.parseEther('1'), data: randomData, }; @@ -822,7 +827,7 @@ export const testAllowedCallsInternals = ( .to.be.revertedWithCustomError(context.keyManagerInternalTester, 'NotAllowedCall') .withArgs( context.accounts[index + 1].address, - ethers.utils.getAddress(randomAddress), + ethers.getAddress(randomAddress), randomData, ); }); @@ -872,7 +877,7 @@ export const testAllowedCallsInternals = ( const executeParams = { operationType: OPERATION_TYPES.CALL, to: randomAddress, - value: ethers.utils.parseEther('1'), + value: ethers.parseEther('1'), data: randomData, }; diff --git a/tests/LSP6KeyManager/internals/AllowedERC725YDataKeys.internal.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/AllowedERC725YDataKeys.internal.ts similarity index 77% rename from tests/LSP6KeyManager/internals/AllowedERC725YDataKeys.internal.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/AllowedERC725YDataKeys.internal.ts index 82ec9a56b..d2b1d592e 100644 --- a/tests/LSP6KeyManager/internals/AllowedERC725YDataKeys.internal.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/AllowedERC725YDataKeys.internal.ts @@ -152,7 +152,7 @@ export const testAllowedERC725YDataKeysInternals = ( it('should return `true` for a CompactBytesArray containing 2 dynamic keys', async () => { const result = - await context.keyManagerInternalTester.callStatic.isCompactBytesArrayOfAllowedERC725YDataKeys( + await context.keyManagerInternalTester.isCompactBytesArrayOfAllowedERC725YDataKeys( compactBytesArray_2d, ); @@ -161,7 +161,7 @@ export const testAllowedERC725YDataKeysInternals = ( it('should return `true` for a CompactBytesArray containing 2 fixed keys', async () => { const result = - await context.keyManagerInternalTester.callStatic.isCompactBytesArrayOfAllowedERC725YDataKeys( + await context.keyManagerInternalTester.isCompactBytesArrayOfAllowedERC725YDataKeys( compactBytesArray_2f, ); @@ -170,7 +170,7 @@ export const testAllowedERC725YDataKeysInternals = ( it('should return `true` for a CompactBytesArray containing 2 dynamic keys and 2 fixed keys', async () => { const result = - await context.keyManagerInternalTester.callStatic.isCompactBytesArrayOfAllowedERC725YDataKeys( + await context.keyManagerInternalTester.isCompactBytesArrayOfAllowedERC725YDataKeys( compactBytesArray_2d_2f, ); @@ -179,7 +179,7 @@ export const testAllowedERC725YDataKeysInternals = ( it('should return `true` for a CompactBytesArray with mixed dynamic and fixed keys', async () => { const result = - await context.keyManagerInternalTester.callStatic.isCompactBytesArrayOfAllowedERC725YDataKeys( + await context.keyManagerInternalTester.isCompactBytesArrayOfAllowedERC725YDataKeys( compactBytesArray_mixed_d_f, ); @@ -188,46 +188,40 @@ export const testAllowedERC725YDataKeysInternals = ( it('should return `false` if the CompactBytesArray contains a zero length data key', async () => { const data = encodeCompactBytesArray([ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('1st Data Key')), + ethers.keccak256(ethers.toUtf8Bytes('1st Data Key')), '0x', - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('2nd Data Key')), + ethers.keccak256(ethers.toUtf8Bytes('2nd Data Key')), ]); const result = - await context.keyManagerInternalTester.callStatic.isCompactBytesArrayOfAllowedERC725YDataKeys( - data, - ); + await context.keyManagerInternalTester.isCompactBytesArrayOfAllowedERC725YDataKeys(data); expect(result).to.be.false; }); it('should return `false` if the CompactBytesArray contains an entry larger than 32 bytes', async () => { const data = encodeCompactBytesArray([ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('1st Data Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('2nd Data Key')), - ethers.utils.hexlify(ethers.utils.randomBytes(33)), + ethers.keccak256(ethers.toUtf8Bytes('1st Data Key')), + ethers.keccak256(ethers.toUtf8Bytes('2nd Data Key')), + ethers.hexlify(ethers.randomBytes(33)), ]); const result = - await context.keyManagerInternalTester.callStatic.isCompactBytesArrayOfAllowedERC725YDataKeys( - data, - ); + await context.keyManagerInternalTester.isCompactBytesArrayOfAllowedERC725YDataKeys(data); expect(result).to.be.false; }); it('should return `false` if the CompactBytesArray contains a data key with a length byte that does not correspond to the length of its element', async () => { let data = encodeCompactBytesArray([ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('1st Data Key')), - ethers.utils.hexlify(ethers.utils.randomBytes(10)), // <-- replace length byte here - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('3rd Data Key')), + ethers.keccak256(ethers.toUtf8Bytes('1st Data Key')), + ethers.hexlify(ethers.randomBytes(10)), // <-- replace length byte here + ethers.keccak256(ethers.toUtf8Bytes('3rd Data Key')), ]); // replace the length byte of the 2nd data key with a different value data = data.replace(/000a/g, '0030'); const result = - await context.keyManagerInternalTester.callStatic.isCompactBytesArrayOfAllowedERC725YDataKeys( - data, - ); + await context.keyManagerInternalTester.isCompactBytesArrayOfAllowedERC725YDataKeys(data); expect(result).to.be.false; }); }); @@ -237,17 +231,19 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking first dynamic key: should return true', async () => { const checkedDataKey = dataKeys.firstDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.firstDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32) - BigInt(ethers.toNumber(dataKeys.firstDynamicKey.length)), + ), ), ) .substring(2); await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_2d, ), @@ -257,17 +253,19 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking second dynamic key: should return true', async () => { const checkedDataKey = dataKeys.secondDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.secondDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.secondDynamicKey.length)), + ), ), ) .substring(2); await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_2d, ), @@ -280,7 +278,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeyToCheck, compactBytesArray_2d, ), @@ -289,7 +287,7 @@ export const testAllowedERC725YDataKeysInternals = ( context.keyManagerInternalTester, 'NotAllowedERC725YDataKey', ) - .withArgs(context.universalProfile.address, dataKeyToCheck); + .withArgs(await context.universalProfile.getAddress(), dataKeyToCheck); } }); }); @@ -300,7 +298,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_2f, ), @@ -312,7 +310,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_2f, ), @@ -325,7 +323,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeyToCheck, compactBytesArray_2f, ), @@ -334,7 +332,7 @@ export const testAllowedERC725YDataKeysInternals = ( context.keyManagerInternalTester, 'NotAllowedERC725YDataKey', ) - .withArgs(context.universalProfile.address, dataKeyToCheck); + .withArgs(await context.universalProfile.getAddress(), dataKeyToCheck); } }); }); @@ -343,17 +341,19 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking first dynamic key: should return true', async () => { const checkedDataKey = dataKeys.firstDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.firstDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.firstDynamicKey.length)), + ), ), ) .substring(2); await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_2d_2f, ), @@ -363,17 +363,19 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking second dynamic key: should return true', async () => { const checkedDataKey = dataKeys.secondDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.secondDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.secondDynamicKey.length)), + ), ), ) .substring(2); await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_2d_2f, ), @@ -385,7 +387,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_2d_2f, ), @@ -397,7 +399,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_2d_2f, ), @@ -410,7 +412,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeyToCheck, compactBytesArray_2d_2f, ), @@ -419,7 +421,7 @@ export const testAllowedERC725YDataKeysInternals = ( context.keyManagerInternalTester, 'NotAllowedERC725YDataKey', ) - .withArgs(context.universalProfile.address, dataKeyToCheck); + .withArgs(await context.universalProfile.getAddress(), dataKeyToCheck); } }); }); @@ -428,17 +430,19 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking first dynamic key: should return true', async () => { const checkedDataKey = dataKeys.firstDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.firstDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.firstDynamicKey.length)), + ), ), ) .substring(2); await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_mixed_d_f, ), @@ -448,17 +452,19 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking second dynamic key: should return true', async () => { const checkedDataKey = dataKeys.secondDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.secondDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.secondDynamicKey.length)), + ), ), ) .substring(2); await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_mixed_d_f, ), @@ -468,17 +474,19 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking third dynamic key: should return true', async () => { const checkedDataKey = dataKeys.thirdDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.thirdDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.thirdDynamicKey.length)), + ), ), ) .substring(2); await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_mixed_d_f, ), @@ -488,17 +496,19 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking fourth dynamic key: should return true', async () => { const checkedDataKey = dataKeys.fourthDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.fourthDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.fourthDynamicKey.length)), + ), ), ) .substring(2); await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_mixed_d_f, ), @@ -510,7 +520,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_mixed_d_f, ), @@ -522,7 +532,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_mixed_d_f, ), @@ -534,7 +544,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKey, compactBytesArray_mixed_d_f, ), @@ -547,7 +557,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeyToCheck, compactBytesArray_mixed_d_f, ), @@ -556,12 +566,12 @@ export const testAllowedERC725YDataKeysInternals = ( context.keyManagerInternalTester, 'NotAllowedERC725YDataKey', ) - .withArgs(context.universalProfile.address, dataKeyToCheck); + .withArgs(await context.universalProfile.getAddress(), dataKeyToCheck); } }); it('should revert if compactBytesArray length element is superior at 32', async () => { - const dynamicKeyOfLength33 = ethers.utils.hexlify(ethers.utils.randomBytes(33)); + const dynamicKeyOfLength33 = ethers.hexlify(ethers.randomBytes(33)); const compactBytesArray_with_invalid_length = encodeCompactBytesArray([ dataKeys.firstDynamicKey.key, dynamicKeyOfLength33, @@ -570,7 +580,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeys.firstFixedKey.key, compactBytesArray_with_invalid_length, ), @@ -596,7 +606,7 @@ export const testAllowedERC725YDataKeysInternals = ( await expect( context.keyManagerInternalTester.verifyAllowedERC725YSingleKey( - context.universalProfile.address, + await context.universalProfile.getAddress(), inputDataKey, compactBytesArrayOfAllowedERC725YDataKeys, ), @@ -615,18 +625,22 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking an array of valid keys: should return true', async () => { const checkedDataKeys = [ dataKeys.firstDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.firstDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.firstDynamicKey.length)), + ), ), ) .substring(2), dataKeys.secondDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.secondDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.secondDynamicKey.length)), + ), ), ) .substring(2), @@ -634,7 +648,7 @@ export const testAllowedERC725YDataKeysInternals = ( expect( await context.keyManagerInternalTester.verifyAllowedERC725YDataKeys( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKeys, compactBytesArray_2d, [false, false], @@ -646,7 +660,7 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking an array of invalid keys: all should return false', async () => { await expect( context.keyManagerInternalTester.verifyAllowedERC725YDataKeys( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeysToReturn, compactBytesArray_2d, Array(dataKeysToReturn.length).fill(false), @@ -657,7 +671,7 @@ export const testAllowedERC725YDataKeysInternals = ( context.keyManagerInternalTester, 'NotAllowedERC725YDataKey', ) - .withArgs(context.universalProfile.address, dataKeysToReturn[0]); + .withArgs(await context.universalProfile.getAddress(), dataKeysToReturn[0]); }); }); @@ -667,7 +681,7 @@ export const testAllowedERC725YDataKeysInternals = ( expect( await context.keyManagerInternalTester.verifyAllowedERC725YDataKeys( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKeys, compactBytesArray_2f, Array(dataKeysToReturn.length).fill(false), @@ -679,7 +693,7 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking an array of invalid keys: all should return false', async () => { await expect( context.keyManagerInternalTester.verifyAllowedERC725YDataKeys( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeysToReturn, compactBytesArray_2f, Array(dataKeysToReturn.length).fill(false), @@ -690,7 +704,7 @@ export const testAllowedERC725YDataKeysInternals = ( context.keyManagerInternalTester, 'NotAllowedERC725YDataKey', ) - .withArgs(context.universalProfile.address, dataKeysToReturn[0]); + .withArgs(await context.universalProfile.getAddress(), dataKeysToReturn[0]); }); }); @@ -698,18 +712,22 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking an array of valid keys: should return true', async () => { const checkedDataKeys = [ dataKeys.firstDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.firstDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.firstDynamicKey.length)), + ), ), ) .substring(2), dataKeys.secondDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.secondDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.secondDynamicKey.length)), + ), ), ) .substring(2), @@ -719,7 +737,7 @@ export const testAllowedERC725YDataKeysInternals = ( expect( await context.keyManagerInternalTester.verifyAllowedERC725YDataKeys( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKeys, compactBytesArray_2d_2f, Array(checkedDataKeys.length).fill(false), @@ -731,7 +749,7 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking an array of invalid keys: all should return false', async () => { await expect( context.keyManagerInternalTester.verifyAllowedERC725YDataKeys( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeysToReturn, compactBytesArray_2d_2f, Array(dataKeysToReturn.length).fill(false), @@ -742,7 +760,7 @@ export const testAllowedERC725YDataKeysInternals = ( context.keyManagerInternalTester, 'NotAllowedERC725YDataKey', ) - .withArgs(context.universalProfile.address, dataKeysToReturn[0]); + .withArgs(await context.universalProfile.getAddress(), dataKeysToReturn[0]); }); }); @@ -750,36 +768,44 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking an array of valid keys: should return true', async () => { const checkedDataKeys = [ dataKeys.firstDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.firstDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.firstDynamicKey.length)), + ), ), ) .substring(2), dataKeys.firstFixedKey.key, dataKeys.secondDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.secondDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.secondDynamicKey.length)), + ), ), ) .substring(2), dataKeys.thirdDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.thirdDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.thirdDynamicKey.length)), + ), ), ) .substring(2), dataKeys.secondFixedKey.key, dataKeys.fourthDynamicKey.key + - ethers.utils + ethers .hexlify( - ethers.utils.randomBytes( - ethers.BigNumber.from(32).sub(dataKeys.fourthDynamicKey.length).toNumber(), + ethers.randomBytes( + ethers.toNumber( + ethers.toBigInt(32 - ethers.toNumber(dataKeys.fourthDynamicKey.length)), + ), ), ) .substring(2), @@ -788,7 +814,7 @@ export const testAllowedERC725YDataKeysInternals = ( expect( await context.keyManagerInternalTester.verifyAllowedERC725YDataKeys( - context.universalProfile.address, + await context.universalProfile.getAddress(), checkedDataKeys, compactBytesArray_mixed_d_f, Array(checkedDataKeys.length).fill(false), @@ -800,7 +826,7 @@ export const testAllowedERC725YDataKeysInternals = ( it('checking an array of invalid keys: all should return false', async () => { await expect( context.keyManagerInternalTester.verifyAllowedERC725YDataKeys( - context.universalProfile.address, + await context.universalProfile.getAddress(), dataKeysToReturn, compactBytesArray_mixed_d_f, Array(dataKeysToReturn.length).fill(false), @@ -811,7 +837,7 @@ export const testAllowedERC725YDataKeysInternals = ( context.keyManagerInternalTester, 'NotAllowedERC725YDataKey', ) - .withArgs(context.universalProfile.address, dataKeysToReturn[0]); + .withArgs(await context.universalProfile.getAddress(), dataKeysToReturn[0]); }); }); }); diff --git a/tests/LSP6KeyManager/internals/Execute.internal.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/Execute.internal.ts similarity index 91% rename from tests/LSP6KeyManager/internals/Execute.internal.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/Execute.internal.ts index df5ebc240..d8bc07bcc 100644 --- a/tests/LSP6KeyManager/internals/Execute.internal.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/Execute.internal.ts @@ -4,7 +4,9 @@ import { ethers } from 'hardhat'; // setup import { LSP6InternalsTestContext } from '../../utils/context'; import { setupKeyManagerHelper } from '../../utils/fixtures'; -import { ALL_PERMISSIONS, ERC725YDataKeys, OPERATION_TYPES } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS } from '@lukso/lsp6-contracts'; import { abiCoder } from '../../utils/helpers'; export const testExecuteInternals = (buildContext: () => Promise) => { @@ -28,7 +30,7 @@ export const testExecuteInternals = (buildContext: () => Promise Promise { let result = await context.universalProfile.getData(permissionArrayKeys[ii]); // raw bytes are stored lower case, so we need to checksum the address retrieved - result = ethers.utils.getAddress(result); + result = ethers.getAddress(result); expect(result).to.equal(permissionArrayValues[ii]); }); } diff --git a/tests/LSP6KeyManager/internals/SetData.internal.ts b/packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/SetData.internal.ts similarity index 70% rename from tests/LSP6KeyManager/internals/SetData.internal.ts rename to packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/SetData.internal.ts index b252504bf..4d691e136 100644 --- a/tests/LSP6KeyManager/internals/SetData.internal.ts +++ b/packages/lsp-smart-contracts/tests/LSP6KeyManager/internals/SetData.internal.ts @@ -4,7 +4,8 @@ import { ethers } from 'hardhat'; // setup import { LSP6InternalsTestContext } from '../../utils/context'; import { setupKeyManagerHelper } from '../../utils/fixtures'; -import { ALL_PERMISSIONS, ERC725YDataKeys } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS } from '@lukso/lsp6-contracts'; export const testSetDataInternals = (buildContext: () => Promise) => { let context: LSP6InternalsTestContext; @@ -27,14 +28,14 @@ export const testSetDataInternals = (buildContext: () => Promise { it('should revert with error `...` if the dataValues is < (less than) dataKeys', async () => { const dataKeys = [ - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), ]; const dataValues = [ - ethers.utils.hexlify(ethers.utils.randomBytes(10)), - ethers.utils.hexlify(ethers.utils.randomBytes(10)), - ethers.utils.hexlify(ethers.utils.randomBytes(10)), + ethers.hexlify(ethers.randomBytes(10)), + ethers.hexlify(ethers.randomBytes(10)), + ethers.hexlify(ethers.randomBytes(10)), ]; await expect( @@ -52,14 +53,14 @@ export const testSetDataInternals = (buildContext: () => Promise (greater than) dataKeys', async () => { const dataKeys = [ - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), ]; const dataValues = [ - ethers.utils.hexlify(ethers.utils.randomBytes(10)), - ethers.utils.hexlify(ethers.utils.randomBytes(10)), + ethers.hexlify(ethers.randomBytes(10)), + ethers.hexlify(ethers.randomBytes(10)), ]; await expect( @@ -79,15 +80,15 @@ export const testSetDataInternals = (buildContext: () => Promise { it('should pass', async () => { const dataKeys = [ - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - ethers.utils.hexlify(ethers.utils.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), + ethers.hexlify(ethers.randomBytes(32)), ]; const dataValues = [ - ethers.utils.hexlify(ethers.utils.randomBytes(10)), - ethers.utils.hexlify(ethers.utils.randomBytes(10)), - ethers.utils.hexlify(ethers.utils.randomBytes(10)), + ethers.hexlify(ethers.randomBytes(10)), + ethers.hexlify(ethers.randomBytes(10)), + ethers.hexlify(ethers.randomBytes(10)), ]; await expect( diff --git a/tests/LSP7DigitalAsset/LSP7CappedSupply.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/LSP7CappedSupply.behaviour.ts similarity index 82% rename from tests/LSP7DigitalAsset/LSP7CappedSupply.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP7DigitalAsset/LSP7CappedSupply.behaviour.ts index e36a7a9d0..5a7d88f38 100644 --- a/tests/LSP7DigitalAsset/LSP7CappedSupply.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/LSP7CappedSupply.behaviour.ts @@ -1,10 +1,8 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { LSP7CappedSupplyTester } from '../../types'; -import type { BigNumber } from 'ethers'; - export type LSP7CappedSupplyTestAccounts = { owner: SignerWithAddress; tokenReceiver: SignerWithAddress; @@ -22,7 +20,7 @@ export type LSP7CappedSupplyTestContext = { name: string; symbol: string; newOwner: string; - tokenSupplyCap: BigNumber; + tokenSupplyCap: bigint; lsp4TokenType: number; }; }; @@ -47,7 +45,7 @@ export const shouldBehaveLikeLSP7CappedSupply = ( it('should allow minting amount up to tokenSupplyCap', async () => { const preTokenSupplyCap = await context.lsp7CappedSupply.tokenSupplyCap(); const preTotalSupply = await context.lsp7CappedSupply.totalSupply(); - expect(preTokenSupplyCap.sub(preTotalSupply)).to.equal(context.deployParams.tokenSupplyCap); + expect(preTokenSupplyCap - preTotalSupply).to.equal(context.deployParams.tokenSupplyCap); await context.lsp7CappedSupply.mint( context.accounts.tokenReceiver.address, @@ -56,7 +54,7 @@ export const shouldBehaveLikeLSP7CappedSupply = ( const postTokenSupplyCap = await context.lsp7CappedSupply.tokenSupplyCap(); const postTotalSupply = await context.lsp7CappedSupply.totalSupply(); - expect(postTotalSupply.sub(postTokenSupplyCap)).to.equal(ethers.constants.Zero); + expect(postTotalSupply - BigInt(postTokenSupplyCap)).to.equal(ethers.ZeroAddress); }); describe('when cap has been reached', () => { @@ -68,7 +66,7 @@ export const shouldBehaveLikeLSP7CappedSupply = ( const tokenSupplyCap = await context.lsp7CappedSupply.tokenSupplyCap(); const preTotalSupply = await context.lsp7CappedSupply.totalSupply(); - expect(preTotalSupply.sub(tokenSupplyCap)).to.equal(ethers.constants.Zero); + expect(preTotalSupply - BigInt(tokenSupplyCap)).to.equal(ethers.ZeroAddress); await expect( context.lsp7CappedSupply.mint(context.accounts.tokenReceiver.address, 1), @@ -86,19 +84,19 @@ export const shouldBehaveLikeLSP7CappedSupply = ( const tokenSupplyCap = await context.lsp7CappedSupply.tokenSupplyCap(); const preBurnTotalSupply = await context.lsp7CappedSupply.totalSupply(); - expect(preBurnTotalSupply.sub(tokenSupplyCap)).to.equal(ethers.constants.Zero); + expect(preBurnTotalSupply - BigInt(tokenSupplyCap)).to.equal(ethers.ZeroAddress); await context.lsp7CappedSupply .connect(context.accounts.tokenReceiver) .burn(context.accounts.tokenReceiver.address, 1); const postBurnTotalSupply = await context.lsp7CappedSupply.totalSupply(); - expect(postBurnTotalSupply).to.equal(preBurnTotalSupply.sub(1)); + expect(postBurnTotalSupply).to.equal(preBurnTotalSupply - BigInt(1)); await context.lsp7CappedSupply.mint(context.accounts.tokenReceiver.address, 1); const postMintTotalSupply = await context.lsp7CappedSupply.totalSupply(); - expect(postMintTotalSupply.sub(preBurnTotalSupply)).to.equal(ethers.constants.Zero); + expect(postMintTotalSupply - preBurnTotalSupply).to.equal(ethers.ZeroAddress); }); }); }); diff --git a/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts similarity index 60% rename from tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts index dff9137d8..50c557c07 100644 --- a/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/LSP7DigitalAsset.behaviour.ts @@ -1,13 +1,11 @@ import { ethers } from 'hardhat'; import { assert, expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import type { BigNumber, BytesLike } from 'ethers'; -import type { TransactionResponse } from '@ethersproject/abstract-provider'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { toBigInt, type BytesLike, type ContractTransactionResponse } from 'ethers'; // types import { LSP7Tester, - LSP7DigitalAsset, TokenReceiverWithLSP1, TokenReceiverWithLSP1__factory, TokenReceiverWithoutLSP1, @@ -16,6 +14,7 @@ import { UniversalReceiverDelegateRevert__factory, TokenReceiverWithLSP1Revert, TokenReceiverWithLSP1Revert__factory, + LSP7DigitalAsset, } from '../../types'; // constants @@ -64,7 +63,7 @@ export type LSP7TestContext = { accounts: LSP7TestAccounts; lsp7: LSP7Tester; deployParams: LSP7DeployParams; - initialSupply: BigNumber; + initialSupply: bigint; }; export type ExpectedError = { @@ -114,7 +113,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { it('should revert', async () => { const txParams = { - to: ethers.constants.AddressZero, - amount: ethers.BigNumber.from('1'), + to: ethers.ZeroAddress, + amount: ethers.toBigInt('1'), force: true, data: '0x', }; @@ -142,9 +141,9 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { const txParams = { to: context.accounts.tokenReceiver.address, - amount: ethers.BigNumber.from('1'), + amount: ethers.toBigInt('1'), force: true, - data: ethers.utils.toUtf8Bytes('we need more tokens'), + data: ethers.toUtf8Bytes('we need more tokens'), }; // pre-conditions @@ -155,7 +154,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { it('should return zero', async () => { expect(await context.lsp7.balanceOf(context.accounts.anyone.address)).to.equal( - ethers.constants.Zero, + ethers.ZeroAddress, ); }); }); @@ -220,7 +219,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { const operator = context.accounts.operator.address; const tokenOwner = context.accounts.owner.address; - const amount = context.initialSupply.add(1); + const amount = context.initialSupply + BigInt(1); await context.lsp7.authorizeOperator(operator, amount, '0x'); @@ -244,7 +243,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { it('should revert', async () => { - const operator = ethers.constants.AddressZero; + const operator = ethers.ZeroAddress; await expect( context.lsp7.authorizeOperator(operator, context.initialSupply, '0x'), @@ -267,7 +266,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { const tokenReceiverWithLSP1: TokenReceiverWithLSP1 = await new TokenReceiverWithLSP1__factory(context.accounts.owner).deploy(); - const operator = tokenReceiverWithLSP1.address; + const operator = await tokenReceiverWithLSP1.getAddress(); const tokenOwner = context.accounts.owner.address; const amount = context.initialSupply; @@ -287,7 +286,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { const operatorThatReverts: UniversalReceiverDelegateRevert = await new UniversalReceiverDelegateRevert__factory(context.accounts.owner).deploy(); - const operator = operatorThatReverts.address; + const operator = await operatorThatReverts.getAddress(); const tokenOwner = context.accounts.owner.address; const amount = context.initialSupply; @@ -318,7 +317,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { - const addedAmount = ethers.BigNumber.from('1'); + const addedAmount = ethers.toBigInt('1'); beforeEach('pre-checks', async () => { const senderBalance = await context.lsp7.balanceOf(context.accounts.owner.address); @@ -346,7 +345,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { - let addedAmountLargerThanBalance: BigNumber; + let addedAmountLargerThanBalance: bigint; beforeEach('set `addedAmount` larger than balance', async () => { const senderBalance = await context.lsp7.balanceOf(context.accounts.owner.address); - addedAmountLargerThanBalance = senderBalance.add(5); + addedAmountLargerThanBalance = senderBalance + BigInt(5); }); describe('when there was no authorized amount before for the operator (`authorizedAmountFor` operator = 0)', () => { @@ -399,7 +398,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { it('should revert', async () => { - const addedAmount = ethers.BigNumber.from('1'); + const addedAmount = ethers.toBigInt('1'); await expect( context.lsp7.increaseAllowance(context.accounts.owner.address, addedAmount, '0x'), @@ -445,17 +444,12 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { + const tokenOwner = context.accounts.owner.address; it('should revert', async () => { - const tokenOwner = context.accounts.owner.address; - const subtractedAmount = ethers.BigNumber.from('1'); + const subtractedAmount = toBigInt(1); await expect( - context.lsp7.decreaseAllowance( - ethers.constants.AddressZero, - tokenOwner, - subtractedAmount, - '0x', - ), + context.lsp7.decreaseAllowance(AddressZero, tokenOwner, subtractedAmount, '0x'), ).to.be.revertedWithCustomError( context.lsp7, // Since we can never grant allowance for address(0), address(0) will always have 0 allowance @@ -472,7 +466,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise Promise Promise Promise Promise { it('should revert', async () => { const tokenOwner = context.accounts.owner.address; - const subtractedAmount = ethers.BigNumber.from('1'); + const subtractedAmount = ethers.toBigInt('1'); await expect( context.lsp7.decreaseAllowance( @@ -584,7 +578,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise Promise Promise { - it('should revert', async () => { - const tokenOwner = context.accounts.owner.address; - const operator = ethers.constants.AddressZero; + describe('when operator is the zero address', () => { + it('should revert', async () => { + const tokenOwner = context.accounts.owner.address; + const operator = ethers.ZeroAddress; - await expect( - context.lsp7.revokeOperator(operator, tokenOwner, false, '0x'), - ).to.be.revertedWithCustomError(context.lsp7, 'LSP7CannotUseAddressZeroAsOperator'); - }); + await expect( + context.lsp7.revokeOperator(operator, tokenOwner, false, '0x'), + ).to.be.revertedWithCustomError(context.lsp7, 'LSP7CannotUseAddressZeroAsOperator'); }); + }); - describe('when operator is the token owner', () => { - it('should revert', async () => { - const operator = context.accounts.owner.address; + describe('when operator is the token owner', () => { + it('should revert', async () => { + const operator = context.accounts.owner.address; - await expect( - context.lsp7.revokeOperator(operator, operator, false, '0x'), - ).to.be.revertedWithCustomError(context.lsp7, 'LSP7TokenOwnerCannotBeOperator'); - }); + await expect( + context.lsp7.revokeOperator(operator, operator, false, '0x'), + ).to.be.revertedWithCustomError(context.lsp7, 'LSP7TokenOwnerCannotBeOperator'); }); + }); - describe('with sending data and notifying an LSP1 contract', () => { - it('should succeed and inform the operator', async () => { - const tokenReceiverWithLSP1: TokenReceiverWithLSP1 = - await new TokenReceiverWithLSP1__factory(context.accounts.owner).deploy(); - const operator = tokenReceiverWithLSP1.address; - const tokenOwner = context.accounts.owner.address; - - const tx = await context.lsp7.revokeOperator(operator, tokenOwner, true, '0xaabbccdd', { - gasLimit: 2000000, - }); - - await expect(tx) - .to.emit(context.lsp7, 'OperatorRevoked') - .withArgs(operator, tokenOwner, true, '0xaabbccdd'); - - await expect(tx).to.emit(tokenReceiverWithLSP1, 'UniversalReceiver'); + describe('with sending data and notifying an LSP1 contract', () => { + it('should succeed and inform the operator', async () => { + const tokenReceiverWithLSP1: TokenReceiverWithLSP1 = await new TokenReceiverWithLSP1__factory( + context.accounts.owner, + ).deploy(); + const operator = await tokenReceiverWithLSP1.getAddress(); + const tokenOwner = context.accounts.owner.address; - expect(await context.lsp7.authorizedAmountFor(operator, tokenOwner)).to.equal( - ethers.constants.Zero, - ); + const tx = await context.lsp7.revokeOperator(operator, tokenOwner, true, '0xaabbccdd', { + gasLimit: 2000000, }); - it('should inform the operator and revert when the operator universalReceiver revert', async () => { - const operatorThatReverts: TokenReceiverWithLSP1Revert = - await new TokenReceiverWithLSP1Revert__factory(context.accounts.owner).deploy(); + await expect(tx) + .to.emit(context.lsp7, 'OperatorRevoked') + .withArgs(operator, tokenOwner, true, '0xaabbccdd'); - const tokenOwner = context.accounts.owner.address; - const operator = operatorThatReverts.address; + await expect(tx).to.emit(tokenReceiverWithLSP1, 'UniversalReceiver'); - await context.lsp7.authorizeOperator(operator, 1, '0x'); + expect(await context.lsp7.authorizedAmountFor(operator, tokenOwner)).to.equal( + ethers.ZeroAddress, + ); + }); - await operatorThatReverts.addLSP1Support(); + it('should inform the operator and revert when the operator universalReceiver revert', async () => { + const operatorThatReverts: TokenReceiverWithLSP1Revert = + await new TokenReceiverWithLSP1Revert__factory(context.accounts.owner).deploy(); - await expect( - context.lsp7.revokeOperator(operator, tokenOwner, true, '0xaabbccdd'), - ).to.be.revertedWith('I reverted'); - }); + const tokenOwner = context.accounts.owner.address; + const operator = await operatorThatReverts.getAddress(); - it('should inform the operator and revert when the operator universalReceiver revert', async () => { - const operatorThatReverts: TokenReceiverWithLSP1Revert = - await new TokenReceiverWithLSP1Revert__factory(context.accounts.owner).deploy(); + await context.lsp7.authorizeOperator(operator, 1, '0x'); - const tokenOwner = context.accounts.owner.address; - const operator = operatorThatReverts.address; + await operatorThatReverts.addLSP1Support(); - await context.lsp7.authorizeOperator(operator, 1, '0x'); + await expect( + context.lsp7.revokeOperator(operator, tokenOwner, true, '0xaabbccdd'), + ).to.be.revertedWith('I reverted'); + }); - await operatorThatReverts.addLSP1Support(); + it('should inform the operator and revert when the operator universalReceiver revert', async () => { + const operatorThatReverts: TokenReceiverWithLSP1Revert = + await new TokenReceiverWithLSP1Revert__factory(context.accounts.owner).deploy(); - await expect( - context.lsp7.revokeOperator(operator, tokenOwner, false, '0xaabbccdd'), - ).to.emit(context.lsp7, 'OperatorRevoked'); - }); - }); + const tokenOwner = context.accounts.owner.address; + const operator = await operatorThatReverts.getAddress(); - describe('authorizedAmountFor', () => { - describe('when operator is the token owner', () => { - it('should return the balance of the token owner', async () => { - expect( - await context.lsp7.authorizedAmountFor( - context.accounts.owner.address, - context.accounts.owner.address, - ), - ).to.equal(await context.lsp7.balanceOf(context.accounts.owner.address)); - }); - }); + await context.lsp7.authorizeOperator(operator, 1, '0x'); - describe('when operator has not been authorized', () => { - it('should return zero', async () => { - expect( - await context.lsp7.authorizedAmountFor( - context.accounts.operator.address, - context.accounts.owner.address, - ), - ).to.equal(ethers.constants.Zero); - }); - }); + await operatorThatReverts.addLSP1Support(); - describe('when one account have been authorized', () => { - it('should return the authorized amount', async () => { - await context.lsp7.authorizeOperator( - context.accounts.operator.address, - context.initialSupply, - '0x', - ); + await expect(context.lsp7.revokeOperator(operator, tokenOwner, false, '0xaabbccdd')).to.emit( + context.lsp7, + 'OperatorRevoked', + ); + }); + }); - expect( - await context.lsp7.authorizedAmountFor( - context.accounts.operator.address, - context.accounts.owner.address, - ), - ).to.equal(context.initialSupply); - }); + describe('authorizedAmountFor', () => { + describe('when operator is the token owner', () => { + it('should return the balance of the token owner', async () => { + expect( + await context.lsp7.authorizedAmountFor( + context.accounts.owner.address, + context.accounts.owner.address, + ), + ).to.equal(await context.lsp7.balanceOf(context.accounts.owner.address)); }); + }); - describe('when many accounts have been authorized', () => { - it('should return the authorized amount for each operator', async () => { - await context.lsp7.authorizeOperator( + describe('when operator has not been authorized', () => { + it('should return zero', async () => { + expect( + await context.lsp7.authorizedAmountFor( context.accounts.operator.address, - context.initialSupply, - '0x', - ); - await context.lsp7.authorizeOperator( - context.accounts.operatorWithLowAuthorizedAmount.address, - ethers.BigNumber.from('1'), - '0x', - ); - - expect( - await context.lsp7.authorizedAmountFor( - context.accounts.operator.address, - context.accounts.owner.address, - ), - ).to.equal(context.initialSupply); - - expect( - await context.lsp7.authorizedAmountFor( - context.accounts.operatorWithLowAuthorizedAmount.address, - context.accounts.owner.address, - ), - ).to.equal(1); - }); + context.accounts.owner.address, + ), + ).to.equal(ethers.ZeroAddress); }); }); - describe('transfers', () => { - type HelperContracts = { - tokenReceiverWithLSP1: TokenReceiverWithLSP1; - tokenReceiverWithoutLSP1: TokenReceiverWithoutLSP1; - }; - let helperContracts: HelperContracts; + describe('when one account have been authorized', () => { + it('should return the authorized amount', async () => { + await context.lsp7.authorizeOperator( + context.accounts.operator.address, + context.initialSupply, + '0x', + ); - beforeEach(async () => { - helperContracts = { - tokenReceiverWithLSP1: await new TokenReceiverWithLSP1__factory( - context.accounts.owner, - ).deploy(), - tokenReceiverWithoutLSP1: await new TokenReceiverWithoutLSP1__factory( - context.accounts.owner, - ).deploy(), - }; + expect( + await context.lsp7.authorizedAmountFor( + context.accounts.operator.address, + context.accounts.owner.address, + ), + ).to.equal(context.initialSupply); }); + }); - beforeEach(async () => { - // setup so we can observe operator amounts during transfer tests + describe('when many accounts have been authorized', () => { + it('should return the authorized amount for each operator', async () => { await context.lsp7.authorizeOperator( context.accounts.operator.address, context.initialSupply, @@ -849,166 +794,123 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { - type TransferTxParams = { - from: string; - to: string; - amount: BigNumber; - force: boolean; - data: string; - }; - const transferSuccessScenario = async ( - { from, to, amount, force, data }: TransferTxParams, - operator: SignerWithAddress, - ) => { - // pre-conditions - const preFromBalanceOf = await context.lsp7.balanceOf(from); - const preToBalanceOf = await context.lsp7.balanceOf(to); - const preIsOperatorFor = await context.lsp7.authorizedAmountFor(operator.address, from); - - // effect - const tx = await context.lsp7.connect(operator).transfer(from, to, amount, force, data); - await expect(tx) - .to.emit(context.lsp7, 'Transfer') - .withArgs(operator.address, from, to, amount, force, data); + expect( + await context.lsp7.authorizedAmountFor( + context.accounts.operator.address, + context.accounts.owner.address, + ), + ).to.equal(context.initialSupply); - // post-conditions - const postFromBalanceOf = await context.lsp7.balanceOf(from); - expect(postFromBalanceOf).to.equal(preFromBalanceOf.sub(amount)); + expect( + await context.lsp7.authorizedAmountFor( + context.accounts.operatorWithLowAuthorizedAmount.address, + context.accounts.owner.address, + ), + ).to.equal(1); + }); + }); + }); - const postToBalanceOf = await context.lsp7.balanceOf(to); - expect(postToBalanceOf).to.equal(preToBalanceOf.add(amount)); + describe('transfers', () => { + type HelperContracts = { + tokenReceiverWithLSP1: TokenReceiverWithLSP1; + tokenReceiverWithoutLSP1: TokenReceiverWithoutLSP1; + }; + let helperContracts: HelperContracts; + + beforeEach(async () => { + helperContracts = { + tokenReceiverWithLSP1: await new TokenReceiverWithLSP1__factory( + context.accounts.owner, + ).deploy(), + tokenReceiverWithoutLSP1: await new TokenReceiverWithoutLSP1__factory( + context.accounts.owner, + ).deploy(), + }; + }); - if (operator.address !== from) { - const postIsOperatorFor = await context.lsp7.authorizedAmountFor( - operator.address, - from, - ); - expect(postIsOperatorFor).to.equal(preIsOperatorFor.sub(amount)); + beforeEach(async () => { + // setup so we can observe operator amounts during transfer tests + await context.lsp7.authorizeOperator( + context.accounts.operator.address, + context.initialSupply, + '0x', + ); + await context.lsp7.authorizeOperator( + context.accounts.operatorWithLowAuthorizedAmount.address, + ethers.toBigInt('1'), + '0x', + ); + }); - if (postIsOperatorFor.eq('0')) { - await expect(tx) - .to.emit(context.lsp7, 'OperatorRevoked') - .withArgs(context.accounts.operator.address, from, false, '0x'); - } else { - await expect(tx) - .to.emit(context.lsp7, 'OperatorAuthorizationChanged') - .withArgs(context.accounts.operator.address, from, postIsOperatorFor, '0x'); - } - } + describe('transfer', () => { + type TransferTxParams = { + from: string; + to: string; + amount: bigint; + force: boolean; + data: string; + }; - return tx; - }; + const transferSuccessScenario = async ( + { from, to, amount, force, data }: TransferTxParams, + operator: SignerWithAddress, + ) => { + // pre-conditions + const preFromBalanceOf = await context.lsp7.balanceOf(from); + const preToBalanceOf = await context.lsp7.balanceOf(to); + const preIsOperatorFor = await context.lsp7.authorizedAmountFor(operator.address, from); - const sendingTransferTransactions = (getOperator: () => SignerWithAddress) => { - let operator: SignerWithAddress; + // effect + const tx = await context.lsp7.connect(operator).transfer(from, to, amount, force, data); + await expect(tx) + .to.emit(context.lsp7, 'Transfer') + .withArgs(operator.address, from, to, amount, force, data); - beforeEach(() => { - // passed as a thunk since other before hooks setup accounts map - operator = getOperator(); - }); + // post-conditions + const postFromBalanceOf = await context.lsp7.balanceOf(from); + expect(postFromBalanceOf).to.equal(preFromBalanceOf - amount); - describe('when using force=true', () => { - const force = true; - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer with force'), - ); + const postToBalanceOf = await context.lsp7.balanceOf(to); + expect(postToBalanceOf).to.equal(preToBalanceOf + amount); - describe('when `to` is an EOA', () => { - describe('when `to` is not the zero address', () => { - it('should allow transfering', async () => { - const txParams = { - from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, - amount: context.initialSupply, - force, - data, - }; - - await transferSuccessScenario(txParams, operator); - }); - }); + if (operator.address !== from) { + const postIsOperatorFor = await context.lsp7.authorizedAmountFor(operator.address, from); + expect(postIsOperatorFor).to.equal(preIsOperatorFor - amount); - describe('when `to` is the zero address', () => { - it('should revert', async () => { - const txParams: TransferTxParams = { - from: operator.address, - to: ethers.constants.AddressZero, - amount: context.initialSupply, - force: true, - data: '0x', - }; - - await expect( - context.lsp7 - .connect(operator) - .transfer( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ).to.be.revertedWithCustomError(context.lsp7, 'LSP7CannotSendWithAddressZero'); - }); - }); - }); + if (postIsOperatorFor == BigInt(0)) { + await expect(tx) + .to.emit(context.lsp7, 'OperatorRevoked') + .withArgs(context.accounts.operator.address, from, false, '0x'); + } else { + await expect(tx) + .to.emit(context.lsp7, 'OperatorAuthorizationChanged') + .withArgs(context.accounts.operator.address, from, postIsOperatorFor, '0x'); + } + } - describe('when `to` is a contract', () => { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering', async () => { - const txParams = { - from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithLSP1.address, - amount: context.initialSupply, - force, - data, - }; - - const tx = await transferSuccessScenario(txParams, operator); - - const typeId = LSP1_TYPE_IDS.LSP7Tokens_RecipientNotification; - const packedData = abiCoder.encode( - ['address', 'address', 'address', 'uint256', 'bytes'], - [operator.address, txParams.from, txParams.to, txParams.amount, txParams.data], - ); + return tx; + }; - await expect(tx) - .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') - .withArgs(context.lsp7.address, 0, typeId, packedData, '0x'); - }); - }); + const sendingTransferTransactions = (getOperator: () => SignerWithAddress) => { + let operator: SignerWithAddress; - describe('when receiving contract does not support LSP1', () => { - it('should allow transfering', async () => { - const txParams = { - from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithoutLSP1.address, - amount: context.initialSupply, - force, - data, - }; - - await transferSuccessScenario(txParams, operator); - }); - }); - }); - }); + beforeEach(() => { + // passed as a thunk since other before hooks setup accounts map + operator = getOperator(); + }); - describe('when force=false', () => { - const force = false; - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer without force'), - ); + describe('when using force=true', () => { + const force = true; + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer with force')); - describe('when `to` is an EOA', () => { - it('should revert', async () => { + describe('when `to` is an EOA', () => { + describe('when `to` is not the zero address', () => { + it('should allow transfering', async () => { const txParams = { from: context.accounts.owner.address, to: context.accounts.tokenReceiver.address, @@ -1017,6 +919,20 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { + it('should revert', async () => { + const txParams: TransferTxParams = { + from: operator.address, + to: ethers.ZeroAddress, + amount: context.initialSupply, + force: true, + data: '0x', + }; + await expect( context.lsp7 .connect(operator) @@ -1027,82 +943,66 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering', async () => { - const txParams = { - from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithLSP1.address, - amount: context.initialSupply, - force, - data, - }; - - const tx = await transferSuccessScenario(txParams, operator); - - const typeId = LSP1_TYPE_IDS.LSP7Tokens_RecipientNotification; - const packedData = abiCoder.encode( - ['address', 'address', 'address', 'uint256', 'bytes'], - [operator.address, txParams.from, txParams.to, txParams.amount, txParams.data], - ); + describe('when `to` is a contract', () => { + describe('when receiving contract supports LSP1', () => { + it('should allow transfering', async () => { + const txParams = { + from: context.accounts.owner.address, + to: await helperContracts.tokenReceiverWithLSP1.getAddress(), + amount: context.initialSupply, + force, + data, + }; - await expect(tx) - .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') - .withArgs(context.lsp7.address, 0, typeId, packedData, '0x'); - }); + const tx = await transferSuccessScenario(txParams, operator); + + const typeId = LSP1_TYPE_IDS.LSP7Tokens_RecipientNotification; + const packedData = abiCoder.encode( + ['address', 'address', 'address', 'uint256', 'bytes'], + [operator.address, txParams.from, txParams.to, txParams.amount, txParams.data], + ); + + await expect(tx) + .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') + .withArgs(await context.lsp7.getAddress(), 0, typeId, packedData, '0x'); }); + }); - describe('when receiving contract does not support LSP1', () => { - it('should revert', async () => { - const txParams = { - from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithoutLSP1.address, - amount: context.initialSupply, - force, - data, - }; - - await expect( - context.lsp7 - .connect(operator) - .transfer( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError( - context.lsp7, - 'LSP7NotifyTokenReceiverContractMissingLSP1Interface', - ) - .withArgs(txParams.to); - }); + describe('when receiving contract does not support LSP1', () => { + it('should allow transfering', async () => { + const txParams = { + from: context.accounts.owner.address, + to: await helperContracts.tokenReceiverWithoutLSP1.getAddress(), + amount: context.initialSupply, + force, + data, + }; + + await transferSuccessScenario(txParams, operator); }); }); }); + }); - describe('when the given amount is more than balance of tokenOwner', () => { + describe('when force=false', () => { + const force = false; + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer without force')); + + describe('when `to` is an EOA', () => { it('should revert', async () => { const txParams = { from: context.accounts.owner.address, to: context.accounts.tokenReceiver.address, - amount: context.initialSupply.add(1), - force: true, - data: '0x', + amount: context.initialSupply, + force, + data, }; - if (txParams.from !== operator.address) { - await context.lsp7.authorizeOperator(operator.address, txParams.amount, '0x'); - } - await expect( context.lsp7 .connect(operator) @@ -1114,42 +1014,83 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { - sendingTransferTransactions(() => context.accounts.owner); - }); + describe('when `to` is a contract', () => { + describe('when receiving contract supports LSP1', () => { + it('should allow transfering', async () => { + const txParams = { + from: context.accounts.owner.address, + to: await helperContracts.tokenReceiverWithLSP1.getAddress(), + amount: context.initialSupply, + force, + data, + }; - describe('when operator sends tx', () => { - sendingTransferTransactions(() => context.accounts.operator); + const tx = await transferSuccessScenario(txParams, operator); - describe('when `from` and `to` address are the same', () => { - it('should pass', async () => { - const operator = context.accounts.operator; + const typeId = LSP1_TYPE_IDS.LSP7Tokens_RecipientNotification; + const packedData = abiCoder.encode( + ['address', 'address', 'address', 'uint256', 'bytes'], + [operator.address, txParams.from, txParams.to, txParams.amount, txParams.data], + ); - const txParams = { - from: context.accounts.owner.address, - to: context.accounts.owner.address, - amount: ethers.BigNumber.from('1'), - force: true, - data: '0x', - }; + await expect(tx) + .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') + .withArgs(await context.lsp7.getAddress(), 0, typeId, packedData, '0x'); + }); + }); - const preFromBalanceOf = await context.lsp7.balanceOf(txParams.from); - const preOperatorAllowance = await context.lsp7.authorizedAmountFor( - operator.address, - context.accounts.owner.address, - ); + describe('when receiving contract does not support LSP1', () => { + it('should revert', async () => { + const txParams = { + from: context.accounts.owner.address, + to: await helperContracts.tokenReceiverWithoutLSP1.getAddress(), + amount: context.initialSupply, + force, + data, + }; + + await expect( + context.lsp7 + .connect(operator) + .transfer( + txParams.from, + txParams.to, + txParams.amount, + txParams.force, + txParams.data, + ), + ) + .to.be.revertedWithCustomError( + context.lsp7, + 'LSP7NotifyTokenReceiverContractMissingLSP1Interface', + ) + .withArgs(txParams.to); + }); + }); + }); + }); - await context.lsp7 + describe('when the given amount is more than balance of tokenOwner', () => { + it('should revert', async () => { + const txParams = { + from: context.accounts.owner.address, + to: context.accounts.tokenReceiver.address, + amount: context.initialSupply + BigInt(1), + force: true, + data: '0x', + }; + + if (txParams.from !== operator.address) { + await context.lsp7.authorizeOperator(operator.address, txParams.amount, '0x'); + } + + await expect( + context.lsp7 .connect(operator) .transfer( txParams.from, @@ -1157,106 +1098,108 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { - it('should revert with `force == false`', async () => { - const caller = context.accounts.anyone; + describe('when tokenOwner sends tx', () => { + sendingTransferTransactions(() => context.accounts.owner); + }); - const txParams = { - from: context.accounts.anyone.address, - to: context.accounts.anotherTokenReceiver.address, - amount: ethers.BigNumber.from(0), - force: false, - data: '0x', - }; + describe('when operator sends tx', () => { + sendingTransferTransactions(() => context.accounts.operator); - await expect( - context.lsp7 - .connect(caller) - .transfer( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError(context.lsp7, 'LSP7NotifyTokenReceiverIsEOA') - .withArgs(txParams.to); - }); + describe('when `from` and `to` address are the same', () => { + it('should revert', async () => { + const operator = context.accounts.operator; - it('should pass with `force == true`', async () => { - const caller = context.accounts.anyone; + const txParams = { + from: context.accounts.owner.address, + to: context.accounts.owner.address, + amount: ethers.toBigInt('1'), + force: true, + data: '0x', + }; - const txParams = { - from: context.accounts.anyone.address, - to: context.accounts.anotherTokenReceiver.address, - amount: ethers.BigNumber.from(0), - force: true, - data: '0x', - }; + const preFromBalanceOf = await context.lsp7.balanceOf(txParams.from); + const preOperatorAllowance = await context.lsp7.authorizedAmountFor( + operator.address, + context.accounts.owner.address, + ); - await transferSuccessScenario(txParams, caller); - }); + await context.lsp7 + .connect(operator) + .transfer(txParams.from, txParams.to, txParams.amount, txParams.force, txParams.data); + + // token owner balance should not have changed + const postFromBalanceOf = await context.lsp7.balanceOf(txParams.from); + expect(postFromBalanceOf).to.equal(preFromBalanceOf); + + // operator allowance should not have changed + const postOperatorAllowance = await context.lsp7.authorizedAmountFor( + operator.address, + context.accounts.owner.address, + ); + expect(postOperatorAllowance).to.equal(preOperatorAllowance - txParams.amount); }); + }); - describe('when operator does not have enough authorized amount', () => { - it('should revert', async () => { - const operator = context.accounts.operatorWithLowAuthorizedAmount; - const txParams = { - from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithoutLSP1.address, - amount: context.initialSupply, - force: true, - data: '0x', - }; - const operatorAmount = await context.lsp7.authorizedAmountFor( - operator.address, - txParams.from, - ); + describe('when `amount == 0`', () => { + it('should revert with `force == false`', async () => { + const caller = context.accounts.anyone; - await expect( - context.lsp7 - .connect(operator) - .transfer( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError(context.lsp7, 'LSP7AmountExceedsAuthorizedAmount') - .withArgs( + const txParams = { + from: context.accounts.anyone.address, + to: context.accounts.anotherTokenReceiver.address, + amount: ethers.toBigInt(0), + force: false, + data: '0x', + }; + + await expect( + context.lsp7 + .connect(caller) + .transfer( txParams.from, - operatorAmount.toHexString(), - operator.address, - txParams.amount.toHexString(), - ); - }); + txParams.to, + txParams.amount, + txParams.force, + txParams.data, + ), + ) + .to.be.revertedWithCustomError(context.lsp7, 'LSP7NotifyTokenReceiverIsEOA') + .withArgs(txParams.to); + }); + + it('should pass with `force == true`', async () => { + const caller = context.accounts.anyone; + + const txParams = { + from: context.accounts.anyone.address, + to: context.accounts.anotherTokenReceiver.address, + amount: ethers.toBigInt(0), + force: true, + data: '0x', + }; + + await transferSuccessScenario(txParams, caller); }); }); - describe('when the caller is not an operator', () => { + describe('when operator does not have enough authorized amount', () => { it('should revert', async () => { - const operator = context.accounts.anyone; + const operator = context.accounts.operatorWithLowAuthorizedAmount; const txParams = { from: context.accounts.owner.address, - to: context.accounts.tokenReceiver.address, + to: await helperContracts.tokenReceiverWithoutLSP1.getAddress(), amount: context.initialSupply, force: true, data: '0x', @@ -1266,265 +1209,329 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { + it('should revert', async () => { + const operator = context.accounts.anyone; + const txParams = { + from: context.accounts.owner.address, + to: context.accounts.tokenReceiver.address, + amount: context.initialSupply, + force: true, + data: '0x', + }; + const operatorAmount = await context.lsp7.authorizedAmountFor( + operator.address, + txParams.from, + ); + + // pre-conditions + expect(await context.lsp7.authorizedAmountFor(operator.address, txParams.from)).to.equal( + ethers.ZeroAddress, + ); + + // effects + await expect( + context.lsp7 + .connect(operator) + .transfer(txParams.from, txParams.to, txParams.amount, txParams.force, txParams.data), + ) + .to.be.revertedWithCustomError(context.lsp7, 'LSP7AmountExceedsAuthorizedAmount') + .withArgs( + txParams.from, + ethers.toBeHex(operatorAmount), + operator.address, + ethers.toBeHex(txParams.amount), + ); + }); + }); + }); + + describe('transferBatch', () => { + beforeEach(async () => { + // setup so we can observe operator amounts during transferBatch tests + await context.lsp7.authorizeOperator( + context.accounts.operator.address, + context.initialSupply, + '0x', + ); + await context.lsp7.authorizeOperator( + context.accounts.operatorWithLowAuthorizedAmount.address, + ethers.toBigInt('1'), + '0x', + ); + }); + + type TransferBatchTxParams = { + from: string[]; + to: string[]; + amount: bigint[]; + force: boolean[]; + data: string[]; + }; + + const transferBatchSuccessScenario = async ( + { from, to, amount, force, data }: TransferBatchTxParams, + operator: SignerWithAddress, + ) => { + // pre-conditions + await Promise.all( + amount.map((_, index) => async () => { + const preBalanceOf = await context.lsp7.balanceOf(to[index]); + expect(preBalanceOf).to.equal(ethers.ZeroAddress); + }), + ); + + // effect + const tx = await context.lsp7 + .connect(operator) + .transferBatch(from, to, amount, force, data); - // effects - await expect( - context.lsp7 - .connect(operator) - .transfer( - txParams.from, - txParams.to, - txParams.amount, - txParams.force, - txParams.data, - ), - ) - .to.be.revertedWithCustomError(context.lsp7, 'LSP7AmountExceedsAuthorizedAmount') + await Promise.all( + amount.map(async (_, index) => { + await expect(tx) + .to.emit(context.lsp7, 'Transfer') .withArgs( - txParams.from, - operatorAmount.toHexString(), operator.address, - txParams.amount.toHexString(), + from[index], + to[index], + amount[index], + force[index], + data[index], ); - }); - }); - }); + }), + ); - describe('transferBatch', () => { - beforeEach(async () => { - // setup so we can observe operator amounts during transferBatch tests - await context.lsp7.authorizeOperator( - context.accounts.operator.address, - context.initialSupply, - '0x', - ); - await context.lsp7.authorizeOperator( - context.accounts.operatorWithLowAuthorizedAmount.address, - ethers.BigNumber.from('1'), - '0x', - ); - }); + // post-conditions + await Promise.all( + amount.map((_, index) => async () => { + const postBalanceOf = await context.lsp7.balanceOf(to[index]); + expect(postBalanceOf).to.equal(amount[index]); - type TransferBatchTxParams = { - from: string[]; - to: string[]; - amount: BigNumber[]; - force: boolean[]; - data: string[]; - }; + if (operator.address !== from[index]) { + const postIsOperatorFor = await context.lsp7.authorizedAmountFor( + operator.address, + from[index], + ); + expect(postIsOperatorFor).to.equal(postIsOperatorFor - amount[index]); + + if (postIsOperatorFor == BigInt(0)) { + await expect(tx) + .to.emit(context.lsp7, 'OperatorRevoked') + .withArgs( + context.accounts.operator.address, + from[index], + postIsOperatorFor, + false, + '', + ); + } else { + await expect(tx) + .to.emit(context.lsp7, 'OperatorAuthorizationChanged') + .withArgs(context.accounts.operator.address, from, postIsOperatorFor, ''); + } + } + }), + ); - const transferBatchSuccessScenario = async ( - { from, to, amount, force, data }: TransferBatchTxParams, - operator: SignerWithAddress, - ) => { - // pre-conditions - await Promise.all( - amount.map((_, index) => async () => { - const preBalanceOf = await context.lsp7.balanceOf(to[index]); - expect(preBalanceOf).to.equal(ethers.constants.Zero); - }), - ); + return tx; + }; - // effect - const tx = await context.lsp7 - .connect(operator) - .transferBatch(from, to, amount, force, data); + const transferBatchFailScenario = async ( + { from, to, amount, force, data }: TransferBatchTxParams, + operator: SignerWithAddress, + expectedError: ExpectedError, + ) => { + if (expectedError.args.length > 0) + await expect(context.lsp7.connect(operator).transferBatch(from, to, amount, force, data)) + .to.be.revertedWithCustomError(context.lsp7, expectedError.error) + .withArgs(...expectedError.args); + else + await expect( + context.lsp7.connect(operator).transferBatch(from, to, amount, force, data), + ).to.be.revertedWithCustomError(context.lsp7, expectedError.error); + }; - await Promise.all( - amount.map(async (_, index) => { - await expect(tx) - .to.emit(context.lsp7, 'Transfer') - .withArgs( - operator.address, - from[index], - to[index], - amount[index], - force[index], - data[index], - ); - }), - ); + const sendingTransferBatchTransactions = (getOperator: () => SignerWithAddress) => { + let operator: SignerWithAddress; + beforeEach(() => { + // passed as a thunk since other before hooks setup accounts map + operator = getOperator(); + }); - // post-conditions - await Promise.all( - amount.map((_, index) => async () => { - const postBalanceOf = await context.lsp7.balanceOf(to[index]); - expect(postBalanceOf).to.equal(amount[index]); + describe('when force=true', () => { + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer with force')); - if (operator.address !== from[index]) { - const postIsOperatorFor = await context.lsp7.authorizedAmountFor( - operator.address, - from[index], - ); - expect(postIsOperatorFor).to.equal(postIsOperatorFor.sub(amount[index])); - - if (postIsOperatorFor.eq('0')) { - await expect(tx) - .to.emit(context.lsp7, 'OperatorRevoked') - .withArgs( - context.accounts.operator.address, - from[index], - postIsOperatorFor, - false, - '', - ); - } else { - await expect(tx) - .to.emit(context.lsp7, 'OperatorAuthorizationChanged') - .withArgs(context.accounts.operator.address, from, postIsOperatorFor, ''); - } - } - }), - ); + describe('when `to` is an EOA', () => { + describe('when `to` is the zero address', () => { + it('should revert', async () => { + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [context.accounts.tokenReceiver.address, ethers.ZeroAddress], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], + force: [true, true], + data: [data, data], + }; + const expectedError = 'LSP7CannotSendWithAddressZero'; - return tx; - }; + await transferBatchFailScenario(txParams, operator, { + error: expectedError, + args: [], + }); + }); + }); - const transferBatchFailScenario = async ( - { from, to, amount, force, data }: TransferBatchTxParams, - operator: SignerWithAddress, - expectedError: ExpectedError, - ) => { - if (expectedError.args.length > 0) - await expect( - context.lsp7.connect(operator).transferBatch(from, to, amount, force, data), - ) - .to.be.revertedWithCustomError(context.lsp7, expectedError.error) - .withArgs(...expectedError.args); - else - await expect( - context.lsp7.connect(operator).transferBatch(from, to, amount, force, data), - ).to.be.revertedWithCustomError(context.lsp7, expectedError.error); - }; + describe('when `to` is not the zero address', () => { + it('should allow transfering', async () => { + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [ + context.accounts.tokenReceiver.address, + context.accounts.anotherTokenReceiver.address, + ], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], + force: [true, true], + data: [data, data], + }; - const sendingTransferBatchTransactions = (getOperator: () => SignerWithAddress) => { - let operator: SignerWithAddress; - beforeEach(() => { - // passed as a thunk since other before hooks setup accounts map - operator = getOperator(); + await transferBatchSuccessScenario(txParams, operator); + }); + }); }); - describe('when force=true', () => { - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer with force'), - ); + describe('when `to` is a contract', () => { + describe('when receiving contract supports LSP1', () => { + it('should allow transfering', async () => { + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [ + await helperContracts.tokenReceiverWithLSP1.getAddress(), + await helperContracts.tokenReceiverWithLSP1.getAddress(), + ], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], + force: [true, true], + data: [data, data], + }; - describe('when `to` is an EOA', () => { - describe('when `to` is the zero address', () => { - it('should revert', async () => { - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [context.accounts.tokenReceiver.address, ethers.constants.AddressZero], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [true, true], - data: [data, data], - }; - const expectedError = 'LSP7CannotSendWithAddressZero'; - - await transferBatchFailScenario(txParams, operator, { - error: expectedError, - args: [], - }); - }); - }); + const tx = await transferBatchSuccessScenario(txParams, operator); + + await Promise.all( + txParams.amount.map((_, index) => async () => { + const typeId = + '0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895'; + const packedData = abiCoder.encode( + ['address', 'address', 'uint256', 'bytes'], + [ + txParams.from[index], + txParams.to[index], + txParams.amount[index], + txParams.data[index], + ], + ); - describe('when `to` is not the zero address', () => { - it('should allow transfering', async () => { - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [ - context.accounts.tokenReceiver.address, - context.accounts.anotherTokenReceiver.address, - ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [true, true], - data: [data, data], - }; - - await transferBatchSuccessScenario(txParams, operator); - }); + await expect(tx) + .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') + .withArgs(await context.lsp7.getAddress(), 0, typeId, packedData, '0x'); + }), + ); }); }); - describe('when `to` is a contract', () => { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering', async () => { - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [ - helperContracts.tokenReceiverWithLSP1.address, - helperContracts.tokenReceiverWithLSP1.address, - ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [true, true], - data: [data, data], - }; - - const tx = await transferBatchSuccessScenario(txParams, operator); - - await Promise.all( - txParams.amount.map((_, index) => async () => { - const typeId = - '0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895'; - const packedData = abiCoder.encode( - ['address', 'address', 'uint256', 'bytes'], - [ - txParams.from[index], - txParams.to[index], - txParams.amount[index], - txParams.data[index], - ], - ); - - await expect(tx) - .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') - .withArgs(context.lsp7.address, 0, typeId, packedData, '0x'); - }), - ); - }); + describe('when receiving contract does not support LSP1', () => { + it('should allow transfering', async () => { + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [ + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), + ], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], + force: [true, true], + data: [data, data], + }; + + await transferBatchSuccessScenario(txParams, operator); }); + }); + }); + }); - describe('when receiving contract does not support LSP1', () => { - it('should allow transfering', async () => { - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [ - helperContracts.tokenReceiverWithoutLSP1.address, - helperContracts.tokenReceiverWithoutLSP1.address, - ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [true, true], - data: [data, data], - }; - - await transferBatchSuccessScenario(txParams, operator); - }); + describe('when force=false', () => { + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer without force')); + + describe('when `to` is an EOA', () => { + it('should revert', async () => { + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [ + context.accounts.tokenReceiver.address, + context.accounts.anotherTokenReceiver.address, + ], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], + force: [false, false], + data: [data, data], + }; + const expectedError = 'LSP7NotifyTokenReceiverIsEOA'; + + await transferBatchFailScenario(txParams, operator, { + error: expectedError, + args: [txParams.to[0]], }); }); }); - describe('when force=false', () => { - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer without force'), - ); + describe('when `to` is a contract', () => { + describe('when receiving contract supports LSP1', () => { + it('should allow transfering', async () => { + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [ + await helperContracts.tokenReceiverWithLSP1.getAddress(), + await helperContracts.tokenReceiverWithLSP1.getAddress(), + ], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], + force: [false, false], + data: [data, data], + }; + + await transferBatchSuccessScenario(txParams, operator); + }); + }); - describe('when `to` is an EOA', () => { + describe('when receiving contract does not support LSP1', () => { it('should revert', async () => { const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], to: [ - context.accounts.tokenReceiver.address, - context.accounts.anotherTokenReceiver.address, + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], force: [false, false], data: [data, data], }; - const expectedError = 'LSP7NotifyTokenReceiverIsEOA'; + const expectedError = 'LSP7NotifyTokenReceiverContractMissingLSP1Interface'; await transferBatchFailScenario(txParams, operator, { error: expectedError, @@ -1532,66 +1539,48 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { - describe('when receiving contract supports LSP1', () => { - it('should allow transfering', async () => { - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [ - helperContracts.tokenReceiverWithLSP1.address, - helperContracts.tokenReceiverWithLSP1.address, - ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [false, false], - data: [data, data], - }; - - await transferBatchSuccessScenario(txParams, operator); - }); - }); + describe('when force is mixed(true/false) respectively', () => { + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer without force')); - describe('when receiving contract does not support LSP1', () => { - it('should revert', async () => { - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [ - helperContracts.tokenReceiverWithoutLSP1.address, - helperContracts.tokenReceiverWithoutLSP1.address, - ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [false, false], - data: [data, data], - }; - const expectedError = 'LSP7NotifyTokenReceiverContractMissingLSP1Interface'; - - await transferBatchFailScenario(txParams, operator, { - error: expectedError, - args: [txParams.to[0]], - }); - }); + describe('when `to` is an EOA', () => { + it('should revert', async () => { + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [ + context.accounts.tokenReceiver.address, + context.accounts.anotherTokenReceiver.address, + ], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], + force: [true, false], + data: [data, data], + }; + const expectedError = 'LSP7NotifyTokenReceiverIsEOA'; + + await transferBatchFailScenario(txParams, operator, { + error: expectedError, + args: [txParams.to[1]], }); }); }); - describe('when force is mixed(true/false) respectively', () => { - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer without force'), - ); - - describe('when `to` is an EOA', () => { - it('should revert', async () => { + describe('when `to` is a contract', () => { + describe("when first receiving contract support LSP1 but the second doesn't", () => { + it('should allow transfering', async () => { const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], to: [ - context.accounts.tokenReceiver.address, - context.accounts.anotherTokenReceiver.address, + await helperContracts.tokenReceiverWithLSP1.getAddress(), + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], + amount: [context.initialSupply - BigInt(1), ethers.toBigInt(1)], force: [true, false], data: [data, data], }; - const expectedError = 'LSP7NotifyTokenReceiverIsEOA'; + + const expectedError = 'LSP7NotifyTokenReceiverContractMissingLSP1Interface'; await transferBatchFailScenario(txParams, operator, { error: expectedError, @@ -1600,185 +1589,154 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { - describe("when first receiving contract support LSP1 but the second doesn't", () => { - it('should allow transfering', async () => { - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [ - helperContracts.tokenReceiverWithLSP1.address, - helperContracts.tokenReceiverWithoutLSP1.address, - ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [true, false], - data: [data, data], - }; - - const expectedError = 'LSP7NotifyTokenReceiverContractMissingLSP1Interface'; - - await transferBatchFailScenario(txParams, operator, { - error: expectedError, - args: [txParams.to[1]], - }); - }); - }); + describe('when receiving contract both support LSP1', () => { + it('should pass regardless of force params', async () => { + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [ + await helperContracts.tokenReceiverWithLSP1.getAddress(), + await helperContracts.tokenReceiverWithLSP1.getAddress(), + ], + amount: [context.initialSupply - BigInt(1), BigInt(1)], + force: [true, false], + data: [data, data], + }; - describe('when receiving contract both support LSP1', () => { - it('should pass regardless of force params', async () => { - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [ - helperContracts.tokenReceiverWithLSP1.address, - helperContracts.tokenReceiverWithLSP1.address, - ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [true, false], - data: [data, data], - }; - - await transferBatchSuccessScenario(txParams, operator); - }); + await transferBatchSuccessScenario(txParams, operator); }); }); }); + }); - describe('when the given amount is more than balance of tokenOwner', () => { - it('should revert', async () => { - const txParams = { - from: [context.accounts.owner.address], - to: [context.accounts.tokenReceiver.address], - amount: [context.initialSupply.add(1)], - force: [true], - data: ['0x'], - }; - const expectedError = 'LSP7AmountExceedsBalance'; + describe('when the given amount is more than balance of tokenOwner', () => { + it('should revert', async () => { + const txParams = { + from: [context.accounts.owner.address], + to: [context.accounts.tokenReceiver.address], + amount: [context.initialSupply + BigInt(1)], + force: [true], + data: ['0x'], + }; + const expectedError = 'LSP7AmountExceedsBalance'; - if (txParams.from.filter((x) => x !== operator.address).length !== 0) { - const totalAmount = txParams.amount.reduce( - (acc, amount) => acc.add(amount), - ethers.BigNumber.from('0'), - ); - await context.lsp7.authorizeOperator(operator.address, totalAmount, '0x'); - } + if (txParams.from.filter((x) => x !== operator.address).length !== 0) { + const totalAmount = txParams.amount.reduce((acc, amount) => acc + amount, BigInt(0)); + await context.lsp7.authorizeOperator(operator.address, totalAmount, '0x'); + } - await transferBatchFailScenario(txParams, operator, { - error: expectedError, - args: [ - context.initialSupply.toHexString(), - txParams.from[0], - txParams.amount[0].toHexString(), - ], - }); + await transferBatchFailScenario(txParams, operator, { + error: expectedError, + args: [ + ethers.toBeHex(context.initialSupply), + txParams.from[0], + ethers.toBeHex(txParams.amount[0]), + ], }); }); + }); - describe('when function parameters list length does not match', () => { - it('should revert', async () => { - const validTxParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [ - context.accounts.tokenReceiver.address, - context.accounts.tokenReceiver.address, - ], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [true, true], - data: ['0x', '0x'], - }; + describe('when function parameters list length does not match', () => { + it('should revert', async () => { + const validTxParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [context.accounts.tokenReceiver.address, context.accounts.tokenReceiver.address], + amount: [context.initialSupply - BigInt(1), BigInt(1)], + force: [true, true], + data: ['0x', '0x'], + }; - await Promise.all( - ['from', 'to', 'amount', 'data'].map(async (arrayParam) => { - await transferBatchFailScenario( - { - ...validTxParams, - [`${arrayParam}`]: [validTxParams[arrayParam][0]], - }, - operator, - { - error: 'LSP7InvalidTransferBatch', - args: [], - }, - ); - }), - ); - }); + await Promise.all( + ['from', 'to', 'amount', 'data'].map(async (arrayParam) => { + await transferBatchFailScenario( + { + ...validTxParams, + [`${arrayParam}`]: [validTxParams[arrayParam][0]], + }, + operator, + { + error: 'LSP7InvalidTransferBatch', + args: [], + }, + ); + }), + ); }); - }; - - describe('when tokenOwner sends tx', () => { - sendingTransferBatchTransactions(() => context.accounts.owner); }); + }; - describe('when operator sends tx', () => { - sendingTransferBatchTransactions(() => context.accounts.operator); + describe('when tokenOwner sends tx', () => { + sendingTransferBatchTransactions(() => context.accounts.owner); + }); - describe('when `to` and `from` are the same address', () => { - it('should pass', async () => { - const operator = context.accounts.operator; - const txParams = { - from: [context.accounts.owner.address, context.accounts.owner.address], - to: [context.accounts.tokenReceiver.address, context.accounts.owner.address], - amount: [context.initialSupply.sub(1), ethers.BigNumber.from('1')], - force: [true, true], - data: ['0x', '0x'], - }; + describe('when operator sends tx', () => { + sendingTransferBatchTransactions(() => context.accounts.operator); - await transferBatchSuccessScenario(txParams, operator); - }); + describe('when `to` and `from` are the same address', () => { + it('should pass', async () => { + const operator = context.accounts.operator; + const txParams = { + from: [context.accounts.owner.address, context.accounts.owner.address], + to: [context.accounts.tokenReceiver.address, context.accounts.owner.address], + amount: [context.initialSupply - BigInt(1), BigInt(1)], + force: [true, true], + data: ['0x', '0x'], + }; + await transferBatchSuccessScenario(txParams, operator); }); + }); - describe('when operator does not have enough authorized amount', () => { - it('should revert', async () => { - const operator = context.accounts.operatorWithLowAuthorizedAmount; - const txParams = { - from: [context.accounts.owner.address], - to: [context.accounts.tokenReceiver.address], - amount: [context.initialSupply], - force: [true], - data: ['0x'], - }; - const expectedError = 'LSP7AmountExceedsAuthorizedAmount'; - const operatorAmount = await context.lsp7.authorizedAmountFor( - operator.address, - txParams.from[0], - ); + describe('when operator does not have enough authorized amount', () => { + it('should revert', async () => { + const operator = context.accounts.operatorWithLowAuthorizedAmount; + const txParams = { + from: [context.accounts.owner.address], + to: [context.accounts.tokenReceiver.address], + amount: [context.initialSupply], + force: [true], + data: ['0x'], + }; + const expectedError = 'LSP7AmountExceedsAuthorizedAmount'; + const operatorAmount = await context.lsp7.authorizedAmountFor( + operator.address, + txParams.from[0], + ); - await transferBatchFailScenario(txParams, operator, { - error: expectedError, - args: [ - txParams.from[0], - operatorAmount.toHexString(), - operator.address, - txParams.amount[0].toHexString(), - ], - }); + await transferBatchFailScenario(txParams, operator, { + error: expectedError, + args: [ + txParams.from[0], + ethers.toBeHex(operatorAmount), + operator.address, + ethers.toBeHex(txParams.amount[0]), + ], }); }); + }); - describe('when the caller is not an operator', () => { - it('should revert', async () => { - const operator = context.accounts.anyone; - const txParams = { - from: [context.accounts.owner.address], - to: [context.accounts.tokenReceiver.address], - amount: [context.initialSupply], - force: [true], - data: ['0x'], - }; - const expectedError = 'LSP7AmountExceedsAuthorizedAmount'; - const operatorAmount = await context.lsp7.authorizedAmountFor( - operator.address, - txParams.from[0], - ); + describe('when the caller is not an operator', () => { + it('should revert', async () => { + const operator = context.accounts.anyone; + const txParams = { + from: [context.accounts.owner.address], + to: [context.accounts.tokenReceiver.address], + amount: [context.initialSupply], + force: [true], + data: ['0x'], + }; + const expectedError = 'LSP7AmountExceedsAuthorizedAmount'; + const operatorAmount = await context.lsp7.authorizedAmountFor( + operator.address, + txParams.from[0], + ); - await transferBatchFailScenario(txParams, operator, { - error: expectedError, - args: [ - txParams.from[0], - operatorAmount.toHexString(), - operator.address, - txParams.amount[0].toHexString(), - ], - }); + await transferBatchFailScenario(txParams, operator, { + error: expectedError, + args: [ + txParams.from[0], + ethers.toBeHex(operatorAmount), + operator.address, + ethers.toBeHex(txParams.amount[0]), + ], }); }); }); @@ -1798,14 +1756,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise Promise { @@ -1873,14 +1822,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { const caller = context.accounts.owner; const initialBalance = await context.lsp7.balanceOf(caller.address); - const amount = 10; + const amount = BigInt(10); await context.lsp7.connect(caller).burn(caller.address, amount, '0x'); const newBalance = await context.lsp7.balanceOf(caller.address); - expect(newBalance).to.equal(initialBalance.sub(amount)); + expect(newBalance).to.equal(initialBalance - amount); }); it('should have decreased the total supply', async () => { const caller = context.accounts.owner; - const amount = 10; + const amount = BigInt(10); const initialSupply = await context.lsp7.totalSupply(); await context.lsp7.connect(caller).burn(caller.address, amount, '0x'); const newSupply = await context.lsp7.totalSupply(); - expect(newSupply).to.equal(initialSupply.sub(amount)); + expect(newSupply).to.equal(initialSupply - amount); }); it('should emit a Transfer event with address(0) for `to`', async () => { @@ -1913,14 +1855,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { const operator = context.accounts.operator; - const amount = operatorAllowance; + const amount = BigInt(operatorAllowance); const initialBalance = await context.lsp7.balanceOf(context.accounts.owner.address); await context.lsp7.connect(operator).burn(context.accounts.owner.address, amount, '0x'); const newBalance = await context.lsp7.balanceOf(context.accounts.owner.address); - expect(newBalance).to.equal(initialBalance.sub(amount)); + expect(newBalance).to.equal(initialBalance - amount); }); it('should have decreased the total supply', async () => { const operator = context.accounts.operator; - const amount = operatorAllowance; + const amount = BigInt(operatorAllowance); const initialSupply = await context.lsp7.totalSupply(); await context.lsp7.connect(operator).burn(context.accounts.owner.address, amount, '0x'); const newSupply = await context.lsp7.totalSupply(); - expect(newSupply).to.equal(initialSupply.sub(amount)); + expect(newSupply).to.equal(initialSupply - amount); }); it('should emit a Transfer event with address(0) for `to`', async () => { @@ -2031,7 +1966,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { @@ -2096,7 +2031,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { @@ -2109,7 +2044,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { @@ -2125,7 +2060,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key')); - const value = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('value')); + const key = ethers.keccak256(ethers.toUtf8Bytes('key')); + const value = ethers.keccak256(ethers.toUtf8Bytes('value')); await expect( context.lsp7.connect(oldOwner).setData(key, value), ).to.be.revertedWithCustomError(context.lsp7, 'OwnableCallerNotTheOwner'); @@ -2232,12 +2167,12 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { await context.lsp7.connect(newOwner).renounceOwnership(); - expect(await context.lsp7.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.lsp7.owner()).to.equal(ethers.ZeroAddress); }); it('new owner should be allowed to use `setData(..)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key')); - const value = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('value')); + const key = ethers.keccak256(ethers.toUtf8Bytes('key')); + const value = ethers.keccak256(ethers.toUtf8Bytes('value')); await context.lsp7.connect(newOwner).setData(key, value); expect(await context.lsp7.getData(key)).to.equal(value); @@ -2250,7 +2185,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise { await expect( context.accounts.anyone.sendTransaction({ - to: context.lsp7.address, + to: await context.lsp7.getAddress(), }), ) .to.be.revertedWithCustomError(context.lsp7, 'InvalidFunctionSelector') @@ -2263,7 +2198,7 @@ export const shouldBehaveLikeLSP7 = (buildContext: () => Promise Promise { it('should increase the total supply', async () => { - const amountToMint = ethers.BigNumber.from('100'); + const amountToMint = BigInt(100); const preTotalSupply = await context.lsp7Mintable.totalSupply(); await context.lsp7Mintable.mint( @@ -60,11 +64,11 @@ export const shouldBehaveLikeLSP7Mintable = ( ); const postTotalSupply = await context.lsp7Mintable.totalSupply(); - expect(postTotalSupply).to.equal(preTotalSupply.add(amountToMint)); + expect(postTotalSupply).to.equal(preTotalSupply + amountToMint); }); it('should increase the tokenReceiver balance', async () => { - const amountToMint = ethers.BigNumber.from('100'); + const amountToMint = ethers.toBigInt('100'); const tokenReceiverBalance = await context.lsp7Mintable.balanceOf( context.accounts.tokenReceiver.address, @@ -76,7 +80,7 @@ export const shouldBehaveLikeLSP7Mintable = ( describe('when non-owner minting tokens', () => { it('should revert', async () => { - const amountToMint = ethers.BigNumber.from('100'); + const amountToMint = ethers.toBigInt('100'); // use any other account const nonOwner = context.accounts.tokenReceiver; @@ -94,34 +98,34 @@ export const shouldBehaveLikeLSP7Mintable = ( before(async () => { const [UP, KM] = await setupProfileWithKeyManagerWithURD(context.accounts.profileOwner); - universalProfile = UP as UniversalProfile; - lsp6KeyManager = KM as LSP6KeyManager; + universalProfile = UP as UniversalProfileInit; + lsp6KeyManager = KM as LSP6KeyManagerInit; await context.lsp7Mintable .connect(context.accounts.owner) - .transferOwnership(universalProfile.address); + .transferOwnership(await universalProfile.getAddress()); - const URDTokenReentrant = await new UniversalReceiverDelegateTokenReentrant__factory( + const URDTokenReentrant = (await new UniversalReceiverDelegateTokenReentrant__factory( context.accounts.profileOwner, - ).deploy(); + ).deploy()) as UniversalReceiverDelegateTokenReentrant; const setDataPayload = universalProfile.interface.encodeFunctionData('setDataBatch', [ [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - URDTokenReentrant.address.substring(2), + (await URDTokenReentrant.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - URDTokenReentrant.address.substring(2), + (await URDTokenReentrant.getAddress()).substring(2), ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ], [ combinePermissions(PERMISSIONS.CALL, PERMISSIONS.REENTRANCY), combineAllowedCalls( [CALLTYPE.CALL], - [context.lsp7Mintable.address], + [await context.lsp7Mintable.getAddress()], ['0xffffffff'], ['0xffffffff'], ), - URDTokenReentrant.address, + await URDTokenReentrant.getAddress(), ], ]); @@ -131,32 +135,26 @@ export const shouldBehaveLikeLSP7Mintable = ( it('should pass', async () => { const firstAmount = 50; const secondAmount = 150; - const reentrantMintPayload = context.lsp7Mintable.interface.encodeFunctionData('mint', [ - universalProfile.address, + await universalProfile.getAddress(), firstAmount, false, '0x', ]); - const mintPayload = context.lsp7Mintable.interface.encodeFunctionData('mint', [ - universalProfile.address, + await universalProfile.getAddress(), secondAmount, false, reentrantMintPayload, ]); - const executePayload = universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - context.lsp7Mintable.address, + await context.lsp7Mintable.getAddress(), 0, mintPayload, ]); - await lsp6KeyManager.connect(context.accounts.profileOwner).execute(executePayload); - - const balanceOfUP = await context.lsp7Mintable.callStatic.balanceOf(universalProfile.address); - + const balanceOfUP = await context.lsp7Mintable.balanceOf(await universalProfile.getAddress()); expect(balanceOfUP).to.equal(firstAmount + secondAmount); }); }); diff --git a/tests/LSP7DigitalAsset/proxy/LSP7CappedSupplyInit.test.ts b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7CappedSupplyInit.test.ts similarity index 83% rename from tests/LSP7DigitalAsset/proxy/LSP7CappedSupplyInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7CappedSupplyInit.test.ts index d4209cef6..ce125fee2 100644 --- a/tests/LSP7DigitalAsset/proxy/LSP7CappedSupplyInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7CappedSupplyInit.test.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { LSP7CappedSupplyInitTester__factory } from '../../../types'; +import { LSP7CappedSupplyInitTester, LSP7CappedSupplyInitTester__factory } from '../../../types'; import { shouldInitializeLikeLSP7 } from '../LSP7DigitalAsset.behaviour'; import { @@ -11,7 +11,7 @@ import { } from '../LSP7CappedSupply.behaviour'; import { deployProxy } from '../../utils/fixtures'; -import { LSP4_TOKEN_TYPES } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; describe('LSP7CappedSupplyInit with proxy', () => { const buildTestContext = async () => { @@ -21,13 +21,18 @@ describe('LSP7CappedSupplyInit with proxy', () => { symbol: 'CAP', newOwner: accounts.owner.address, lsp4TokenType: LSP4_TOKEN_TYPES.TOKEN, - tokenSupplyCap: ethers.BigNumber.from('2'), + tokenSupplyCap: ethers.toBigInt('2'), }; const lsp7CappedSupplyInit = await new LSP7CappedSupplyInitTester__factory( accounts.owner, ).deploy(); - const lsp7CappedSupplyProxy = await deployProxy(lsp7CappedSupplyInit.address, accounts.owner); - const lsp7CappedSupply = lsp7CappedSupplyInit.attach(lsp7CappedSupplyProxy); + const lsp7CappedSupplyProxy = await deployProxy( + await lsp7CappedSupplyInit.getAddress(), + accounts.owner, + ); + const lsp7CappedSupply = lsp7CappedSupplyInit.attach( + lsp7CappedSupplyProxy, + ) as LSP7CappedSupplyInitTester; return { accounts, lsp7CappedSupply, deployParams }; }; diff --git a/tests/LSP7DigitalAsset/proxy/LSP7DigitalAssetInit.test.ts b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7DigitalAssetInit.test.ts similarity index 90% rename from tests/LSP7DigitalAsset/proxy/LSP7DigitalAssetInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7DigitalAssetInit.test.ts index fbf2b4107..321a785c9 100644 --- a/tests/LSP7DigitalAsset/proxy/LSP7DigitalAssetInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7DigitalAssetInit.test.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { LSP7InitTester__factory, LSP7DigitalAsset } from '../../../types'; +import { LSP7InitTester__factory, LSP7DigitalAsset, LSP7InitTester } from '../../../types'; import { getNamedAccounts, @@ -16,12 +16,12 @@ import { } from '../../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour'; import { deployProxy } from '../../utils/fixtures'; -import { LSP4_TOKEN_TYPES } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; describe('LSP7DigitalAssetInit with proxy', () => { const buildTestContext = async (): Promise => { const accounts = await getNamedAccounts(); - const initialSupply = ethers.BigNumber.from('3'); + const initialSupply = ethers.toBigInt('3'); const deployParams = { name: 'LSP7 - deployed with proxy', symbol: 'TKN', @@ -31,9 +31,9 @@ describe('LSP7DigitalAssetInit with proxy', () => { const lsp7TesterInit = await new LSP7InitTester__factory(accounts.owner).deploy(); - const lsp7Proxy = await deployProxy(lsp7TesterInit.address, accounts.owner); + const lsp7Proxy = await deployProxy(await lsp7TesterInit.getAddress(), accounts.owner); - const lsp7 = lsp7TesterInit.attach(lsp7Proxy); + const lsp7 = lsp7TesterInit.attach(lsp7Proxy) as LSP7InitTester; // mint tokens for the owner await lsp7.mint(accounts.owner.address, initialSupply, true, '0x'); @@ -80,7 +80,7 @@ describe('LSP7DigitalAssetInit with proxy', () => { context.lsp7['initialize(string,string,address,uint256,bool)']( context.deployParams.name, context.deployParams.symbol, - ethers.constants.AddressZero, + ethers.ZeroAddress, 12345, false, ), diff --git a/tests/LSP7DigitalAsset/proxy/LSP7MintableInit.test.ts b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7MintableInit.test.ts similarity index 91% rename from tests/LSP7DigitalAsset/proxy/LSP7MintableInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7MintableInit.test.ts index 0ee2d4782..269bd29b5 100644 --- a/tests/LSP7DigitalAsset/proxy/LSP7MintableInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/proxy/LSP7MintableInit.test.ts @@ -11,7 +11,8 @@ import { } from '../LSP7Mintable.behaviour'; import { deployProxy } from '../../utils/fixtures'; -import { ERC725YDataKeys, LSP4_TOKEN_TYPES } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; describe('LSP7MintableInit with proxy', () => { const buildTestContext = async () => { @@ -29,8 +30,13 @@ describe('LSP7MintableInit with proxy', () => { accounts.owner, ).deploy(); - const lsp7MintableProxy = await deployProxy(LSP7MintableInit.address, accounts.owner); - const lsp7Mintable: LSP7MintableInit = LSP7MintableInit.attach(lsp7MintableProxy); + const lsp7MintableProxy = await deployProxy( + await LSP7MintableInit.getAddress(), + accounts.owner, + ); + const lsp7Mintable: LSP7MintableInit = LSP7MintableInit.attach( + lsp7MintableProxy, + ) as LSP7MintableInit; return { accounts, lsp7Mintable, deployParams }; }; @@ -56,7 +62,7 @@ describe('LSP7MintableInit with proxy', () => { expect(await lsp7MintableInit.getData(ERC725YDataKeys.LSP4.LSP4Metadata)).to.equal('0x'); expect(await lsp7MintableInit.getData(ERC725YDataKeys.LSP4.LSP4TokenType)).to.equal('0x'); - expect(await lsp7MintableInit.owner()).to.equal(ethers.constants.AddressZero); + expect(await lsp7MintableInit.owner()).to.equal(ethers.ZeroAddress); }); it('prevent any address from calling the initialize(...) function on the implementation', async () => { diff --git a/tests/LSP7DigitalAsset/standard/LSP7CappedSupply.test.ts b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7CappedSupply.test.ts similarity index 88% rename from tests/LSP7DigitalAsset/standard/LSP7CappedSupply.test.ts rename to packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7CappedSupply.test.ts index 1c9e546b6..b0008a6de 100644 --- a/tests/LSP7DigitalAsset/standard/LSP7CappedSupply.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7CappedSupply.test.ts @@ -8,7 +8,7 @@ import { LSP7CappedSupplyTestContext, getNamedAccounts, } from '../LSP7CappedSupply.behaviour'; -import { LSP4_TOKEN_TYPES } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; describe('LSP7CappedSupply with constructor', () => { const buildTestContext = async () => { @@ -18,7 +18,7 @@ describe('LSP7CappedSupply with constructor', () => { symbol: 'CAP', newOwner: accounts.owner.address, lsp4TokenType: LSP4_TOKEN_TYPES.TOKEN, - tokenSupplyCap: ethers.BigNumber.from('2'), + tokenSupplyCap: ethers.toBigInt('2'), }; const lsp7CappedSupply = await new LSP7CappedSupplyTester__factory(accounts.owner).deploy( @@ -45,7 +45,7 @@ describe('LSP7CappedSupply with constructor', () => { return { lsp7, deployParams, - initializeTransaction: context.lsp7CappedSupply.deployTransaction, + initializeTransaction: context.lsp7CappedSupply.deploymentTransaction(), }; }); }); diff --git a/tests/LSP7DigitalAsset/standard/LSP7DigitalAsset.test.ts b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7DigitalAsset.test.ts similarity index 94% rename from tests/LSP7DigitalAsset/standard/LSP7DigitalAsset.test.ts rename to packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7DigitalAsset.test.ts index 443d0f39a..efb1658b3 100644 --- a/tests/LSP7DigitalAsset/standard/LSP7DigitalAsset.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7DigitalAsset.test.ts @@ -19,12 +19,12 @@ import { LS4DigitalAssetMetadataTestContext, shouldBehaveLikeLSP4DigitalAssetMetadata, } from '../../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour'; -import { LSP4_TOKEN_TYPES } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; describe('LSP7DigitalAsset with constructor', () => { const buildTestContext = async (): Promise => { const accounts = await getNamedAccounts(); - const initialSupply = ethers.BigNumber.from('3'); + const initialSupply = ethers.toBigInt('3'); const deployParams = { name: 'LSP7 - deployed with constructor', symbol: 'Token', @@ -89,7 +89,7 @@ describe('LSP7DigitalAsset with constructor', () => { const deployParams = { name: 'LSP7 - deployed with constructor', symbol: 'Token', - newOwner: ethers.constants.AddressZero, + newOwner: ethers.ZeroAddress, lsp4TokenType: LSP4_TOKEN_TYPES.TOKEN, }; @@ -117,7 +117,7 @@ describe('LSP7DigitalAsset with constructor', () => { return { lsp7, deployParams, - initializeTransaction: context.lsp7.deployTransaction, + initializeTransaction: context.lsp7.deploymentTransaction(), }; }); }); diff --git a/tests/LSP7DigitalAsset/standard/LSP7Mintable.test.ts b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7Mintable.test.ts similarity index 91% rename from tests/LSP7DigitalAsset/standard/LSP7Mintable.test.ts rename to packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7Mintable.test.ts index c9afcaf9d..aef2799e2 100644 --- a/tests/LSP7DigitalAsset/standard/LSP7Mintable.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP7DigitalAsset/standard/LSP7Mintable.test.ts @@ -1,4 +1,4 @@ -import { LSP4_TOKEN_TYPES } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; import { LSP7Mintable, LSP7Mintable__factory } from '../../../types'; import { shouldInitializeLikeLSP7 } from '../LSP7DigitalAsset.behaviour'; @@ -44,7 +44,7 @@ describe('LSP7Mintable with constructor', () => { return { lsp7, deployParams, - initializeTransaction: context.lsp7Mintable.deployTransaction, + initializeTransaction: context.lsp7Mintable.deploymentTransaction(), }; }); }); diff --git a/tests/LSP8IdentifiableDigitalAsset/LSP8CappedSupply.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8CappedSupply.behaviour.ts similarity index 78% rename from tests/LSP8IdentifiableDigitalAsset/LSP8CappedSupply.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8CappedSupply.behaviour.ts index 716d502e2..b450968d4 100644 --- a/tests/LSP8IdentifiableDigitalAsset/LSP8CappedSupply.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8CappedSupply.behaviour.ts @@ -1,9 +1,9 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { LSP8CappedSupplyTester } from '../../types'; -import type { BigNumber, BytesLike } from 'ethers'; +import type { BytesLike } from 'ethers'; export type LSP8CappedSupplyTestAccounts = { owner: SignerWithAddress; @@ -24,7 +24,7 @@ export type LSP8CappedSupplyTestContext = { newOwner: string; lsp4TokenType: number; lsp8TokenIdFormat: number; - tokenSupplyCap: BigNumber; + tokenSupplyCap: bigint; }; }; @@ -37,9 +37,9 @@ export const shouldBehaveLikeLSP8CappedSupply = ( beforeEach(async () => { context = await buildContext(); - mintedTokenIds = Array(context.deployParams.tokenSupplyCap.toNumber()) + mintedTokenIds = Array(ethers.toNumber(context.deployParams.tokenSupplyCap)) .fill(null) - .map((_, i) => ethers.utils.keccak256(ethers.BigNumber.from(i).toHexString())); + .map((_, i) => ethers.keccak256(ethers.toBeHex(BigInt(i)))); }); describe('tokenSupplyCap', () => { @@ -53,7 +53,7 @@ export const shouldBehaveLikeLSP8CappedSupply = ( it('should allow minting amount up to tokenSupplyCap', async () => { const preTokenSupplyCap = await context.lsp8CappedSupply.tokenSupplyCap(); const preTotalSupply = await context.lsp8CappedSupply.totalSupply(); - expect(preTokenSupplyCap.sub(preTotalSupply)).to.equal(String(mintedTokenIds.length)); + expect(preTokenSupplyCap - preTotalSupply).to.equal(String(mintedTokenIds.length)); for (let i = 0; i < mintedTokenIds.length; i++) { const preMintTotalSupply = await context.lsp8CappedSupply.totalSupply(); @@ -62,16 +62,16 @@ export const shouldBehaveLikeLSP8CappedSupply = ( await context.lsp8CappedSupply.mint(context.accounts.tokenReceiver.address, tokenId); const postMintTotalSupply = await context.lsp8CappedSupply.totalSupply(); - expect(postMintTotalSupply).to.equal(preMintTotalSupply.add(1)); + expect(postMintTotalSupply).to.equal(preMintTotalSupply + BigInt(1)); } const postTokenSupplyCap = await context.lsp8CappedSupply.tokenSupplyCap(); const postTotalSupply = await context.lsp8CappedSupply.totalSupply(); - expect(postTotalSupply.sub(postTokenSupplyCap)).to.equal(ethers.constants.Zero); + expect(postTotalSupply - postTokenSupplyCap).to.equal(ethers.ZeroAddress); }); describe('when cap has been reached', () => { - const anotherTokenId = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('VIP token')); + const anotherTokenId = ethers.keccak256(ethers.toUtf8Bytes('VIP token')); it('should error when minting more than tokenSupplyCapTokens', async () => { await Promise.all( @@ -82,7 +82,7 @@ export const shouldBehaveLikeLSP8CappedSupply = ( const tokenSupplyCap = await context.lsp8CappedSupply.tokenSupplyCap(); const preTotalSupply = await context.lsp8CappedSupply.totalSupply(); - expect(preTotalSupply.sub(tokenSupplyCap)).to.equal(ethers.constants.Zero); + expect(preTotalSupply - tokenSupplyCap).to.equal(ethers.ZeroAddress); await expect( context.lsp8CappedSupply.mint(context.accounts.tokenReceiver.address, anotherTokenId), @@ -101,17 +101,17 @@ export const shouldBehaveLikeLSP8CappedSupply = ( const tokenSupplyCap = await context.lsp8CappedSupply.tokenSupplyCap(); const preBurnTotalSupply = await context.lsp8CappedSupply.totalSupply(); - expect(preBurnTotalSupply.sub(tokenSupplyCap)).to.equal(ethers.constants.Zero); + expect(preBurnTotalSupply - tokenSupplyCap).to.equal(ethers.ZeroAddress); await context.lsp8CappedSupply.burn(mintedTokenIds[0]); const postBurnTotalSupply = await context.lsp8CappedSupply.totalSupply(); - expect(postBurnTotalSupply).to.equal(preBurnTotalSupply.sub(1)); + expect(postBurnTotalSupply).to.equal(preBurnTotalSupply - BigInt(1)); await context.lsp8CappedSupply.mint(context.accounts.tokenReceiver.address, anotherTokenId); const postMintTotalSupply = await context.lsp8CappedSupply.totalSupply(); - expect(postMintTotalSupply.sub(preBurnTotalSupply)).to.equal(ethers.constants.Zero); + expect(postMintTotalSupply - preBurnTotalSupply).to.equal(ethers.ZeroAddress); }); }); }); diff --git a/tests/LSP8IdentifiableDigitalAsset/LSP8Enumerable.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8Enumerable.behaviour.ts similarity index 77% rename from tests/LSP8IdentifiableDigitalAsset/LSP8Enumerable.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8Enumerable.behaviour.ts index 0e9d123ca..d4d38fb61 100644 --- a/tests/LSP8IdentifiableDigitalAsset/LSP8Enumerable.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8Enumerable.behaviour.ts @@ -1,4 +1,4 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; @@ -41,51 +41,49 @@ export const shouldBehaveLikeLSP8Enumerable = ( it('should not get token', async () => { const tokenSupply = await context.lsp8Enumerable.totalSupply(); expect(await context.lsp8Enumerable.tokenAt(tokenSupply)).to.equal( - ethers.utils.hexZeroPad(ethers.BigNumber.from(0).toHexString(), 32), + ethers.zeroPadValue(ethers.toBeHex(BigInt(0)), 32), ); }); }); describe('when minted tokens', () => { - const tokenId = ethers.utils.randomBytes(32); + const tokenId = ethers.randomBytes(32); it('should access by index', async () => { const tokenSupply = await context.lsp8Enumerable.totalSupply(); await context.lsp8Enumerable.mint(context.accounts.tokenReceiver.address, tokenId); - expect(await context.lsp8Enumerable.totalSupply()).to.equal(tokenSupply.add(1)); - expect(await context.lsp8Enumerable.tokenAt(tokenSupply)).to.equal( - ethers.utils.hexlify(tokenId), - ); + expect(await context.lsp8Enumerable.totalSupply()).to.equal(tokenSupply + BigInt(1)); + expect(await context.lsp8Enumerable.tokenAt(tokenSupply)).to.equal(ethers.hexlify(tokenId)); }); it('should not access by index after removed', async () => { const tokenSupply = await context.lsp8Enumerable.totalSupply(); - const anotherTokenId = ethers.utils.randomBytes(32); + const anotherTokenId = ethers.randomBytes(32); await context.lsp8Enumerable.mint(context.accounts.tokenReceiver.address, tokenId); await context.lsp8Enumerable.mint(context.accounts.tokenReceiver.address, anotherTokenId); await context.lsp8Enumerable.burn(tokenId); - expect(await context.lsp8Enumerable.totalSupply()).to.equal(tokenSupply.add(1)); + expect(await context.lsp8Enumerable.totalSupply()).to.equal(tokenSupply + BigInt(1)); expect(await context.lsp8Enumerable.tokenAt(tokenSupply)).to.equal( - ethers.utils.hexlify(anotherTokenId), + ethers.hexlify(anotherTokenId), ); - expect(await context.lsp8Enumerable.tokenAt(tokenSupply.add(1))).to.equal( - ethers.utils.hexZeroPad(ethers.BigNumber.from(0).toHexString(), 32), + expect(await context.lsp8Enumerable.tokenAt(tokenSupply + BigInt(1))).to.equal( + ethers.zeroPadValue(ethers.toBeHex(BigInt(0)), 32), ); }); it('should access by index after removed', async () => { const tokenSupply = await context.lsp8Enumerable.totalSupply(); - const anotherTokenId = ethers.utils.randomBytes(32); + const anotherTokenId = ethers.randomBytes(32); await context.lsp8Enumerable.mint(context.accounts.tokenReceiver.address, tokenId); await context.lsp8Enumerable.mint(context.accounts.tokenReceiver.address, anotherTokenId); await context.lsp8Enumerable.burn(tokenId); await context.lsp8Enumerable.mint(context.accounts.tokenReceiver.address, tokenId); - expect(await context.lsp8Enumerable.totalSupply()).to.equal(tokenSupply.add(2)); + expect(await context.lsp8Enumerable.totalSupply()).to.equal(tokenSupply + BigInt(2)); expect(await context.lsp8Enumerable.tokenAt(tokenSupply)).to.equal( - ethers.utils.hexlify(anotherTokenId), + ethers.hexlify(anotherTokenId), ); - expect(await context.lsp8Enumerable.tokenAt(tokenSupply.add(1))).to.equal( - ethers.utils.hexlify(tokenId), + expect(await context.lsp8Enumerable.tokenAt(tokenSupply + BigInt(1))).to.equal( + ethers.hexlify(tokenId), ); }); }); diff --git a/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts similarity index 92% rename from tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts index 5ecace019..15544b9a5 100644 --- a/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.behaviour.ts @@ -1,8 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import type { BytesLike, ContractTransaction } from 'ethers'; -import type { TransactionResponse } from '@ethersproject/abstract-provider'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import type { BytesLike, ContractTransaction, ContractTransactionResponse } from 'ethers'; // types import { @@ -24,7 +23,7 @@ import { abiCoder } from '../utils/helpers'; // constants import { ERC725YDataKeys, INTERFACE_IDS, LSP1_TYPE_IDS, SupportedStandards } from '../../constants'; -import { keccak256, toUtf8Bytes } from 'ethers/lib/utils'; +import { keccak256, toUtf8Bytes } from 'ethers'; import { AddressZero } from '../LSP17Extensions/helpers/utils'; export type LSP8TestAccounts = { @@ -90,21 +89,21 @@ export const shouldBehaveLikeLSP8 = ( describe('when setting data for a tokenId', () => { const tokenId = tokenIdAsBytes32(42); - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const dataValue = ethers.utils.hexlify(ethers.utils.randomBytes(256)); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const dataValue = ethers.hexlify(ethers.randomBytes(256)); const tokenIds = [tokenIdAsBytes32(42), tokenIdAsBytes32(43), tokenIdAsBytes32(44)]; const dataKeys = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Second Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Third Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Second Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Third Key')), ]; const dataValues = [ - ethers.utils.hexlify(ethers.utils.randomBytes(256)), - ethers.utils.hexlify(ethers.utils.randomBytes(256)), - ethers.utils.hexlify(ethers.utils.randomBytes(256)), + ethers.hexlify(ethers.randomBytes(256)), + ethers.hexlify(ethers.randomBytes(256)), + ethers.hexlify(ethers.randomBytes(256)), ]; it('Token contract owner can set data', async () => { @@ -165,7 +164,7 @@ export const shouldBehaveLikeLSP8 = ( await context.lsp8 .connect(context.accounts.owner) .setDataForTokenId(tokenId, dataKey, dataValue); - const anotherDataValue = ethers.utils.hexlify(ethers.utils.randomBytes(256)); + const anotherDataValue = ethers.hexlify(ethers.randomBytes(256)); await context.lsp8 .connect(context.accounts.owner) @@ -192,8 +191,8 @@ export const shouldBehaveLikeLSP8 = ( const tokenIdsLength3 = [tokenIdAsBytes32(42), tokenIdAsBytes32(43), tokenIdAsBytes32(44)]; const dataKeysLength2 = [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My First Key')), - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Second Key')), + ethers.keccak256(ethers.toUtf8Bytes('My First Key')), + ethers.keccak256(ethers.toUtf8Bytes('My Second Key')), ]; it('should revert when providing arrays of tokenIds and data keys of different length', async () => { @@ -211,7 +210,7 @@ export const shouldBehaveLikeLSP8 = ( context.accounts.owner.address, mintedTokenId, true, - ethers.utils.toUtf8Bytes('mint a token for the owner'), + ethers.toUtf8Bytes('mint a token for the owner'), ); expectedTotalSupply++; @@ -240,7 +239,7 @@ export const shouldBehaveLikeLSP8 = ( describe('when `to` is the zero address', () => { it('should revert', async () => { const txParams = { - to: ethers.constants.AddressZero, + to: ethers.ZeroAddress, tokenId: toBeMintedTokenId, force: true, data: '0x', @@ -258,7 +257,7 @@ export const shouldBehaveLikeLSP8 = ( to: context.accounts.tokenReceiver.address, tokenId: toBeMintedTokenId, force: true, - data: ethers.utils.toUtf8Bytes('we need more tokens'), + data: ethers.toUtf8Bytes('we need more tokens'), }; await context.lsp8.mint(txParams.to, txParams.tokenId, txParams.force, txParams.data); @@ -274,7 +273,7 @@ export const shouldBehaveLikeLSP8 = ( describe('totalSupply', () => { it('should return total token supply', async () => { - expect(await context.lsp8.totalSupply()).to.equal(ethers.BigNumber.from(expectedTotalSupply)); + expect(await context.lsp8.totalSupply()).to.equal(ethers.toBigInt(expectedTotalSupply)); }); }); @@ -282,7 +281,7 @@ export const shouldBehaveLikeLSP8 = ( describe('when the given address owns tokens', () => { it('should return the owned token count', async () => { expect(await context.lsp8.balanceOf(context.accounts.owner.address)).to.equal( - ethers.BigNumber.from('1'), + ethers.toBigInt('1'), ); }); }); @@ -290,7 +289,7 @@ export const shouldBehaveLikeLSP8 = ( describe('when the given address does not own tokens', () => { it('should return zero', async () => { expect(await context.lsp8.balanceOf(context.accounts.anyone.address)).to.equal( - ethers.BigNumber.from('0'), + ethers.toBigInt('0'), ); }); }); @@ -394,7 +393,7 @@ export const shouldBehaveLikeLSP8 = ( describe('when operator is the zero address', () => { it('should revert', async () => { - const operator = ethers.constants.AddressZero; + const operator = ethers.ZeroAddress; const tokenId = mintedTokenId; await expect( @@ -414,7 +413,7 @@ export const shouldBehaveLikeLSP8 = ( it('should succeed and inform the operator', async () => { const tokenReceiverWithLSP1: TokenReceiverWithLSP1 = await new TokenReceiverWithLSP1__factory(context.accounts.owner).deploy(); - const operator = tokenReceiverWithLSP1.address; + const operator = await tokenReceiverWithLSP1.getAddress(); const tokenOwner = context.accounts.owner.address; const tokenId = newMintedTokenId; @@ -434,7 +433,7 @@ export const shouldBehaveLikeLSP8 = ( it('should succeed and inform the operator even if the operator revert', async () => { const operatorThatReverts: UniversalReceiverDelegateRevert = await new UniversalReceiverDelegateRevert__factory(context.accounts.owner).deploy(); - const operator = operatorThatReverts.address; + const operator = await operatorThatReverts.getAddress(); const tokenOwner = context.accounts.owner.address; const tokenId = newMintedTokenId; @@ -514,7 +513,7 @@ export const shouldBehaveLikeLSP8 = ( describe('when operator is the zero address', () => { it('should revert', async () => { - const operator = ethers.constants.AddressZero; + const operator = AddressZero; const tokenId = mintedTokenId; await expect( @@ -545,7 +544,7 @@ export const shouldBehaveLikeLSP8 = ( it('should succeed and inform the operator', async () => { const tokenReceiverWithLSP1: TokenReceiverWithLSP1 = await new TokenReceiverWithLSP1__factory(context.accounts.owner).deploy(); - const operator = tokenReceiverWithLSP1.address; + const operator = await tokenReceiverWithLSP1.getAddress(); const tokenOwner = context.accounts.owner.address; const tokenId = newMintedTokenId; @@ -569,7 +568,7 @@ export const shouldBehaveLikeLSP8 = ( const operatorThatReverts: TokenReceiverWithLSP1Revert = await new TokenReceiverWithLSP1Revert__factory(context.accounts.owner).deploy(); - const operator = operatorThatReverts.address; + const operator = await operatorThatReverts.getAddress(); const tokenId = newMintedTokenId; // pre-condition @@ -773,7 +772,7 @@ export const shouldBehaveLikeLSP8 = ( context.accounts.owner.address, mintedTokenId, true, - ethers.utils.toUtf8Bytes('mint a token for the owner'), + ethers.toUtf8Bytes('mint a token for the owner'), ); // setup so we can observe operators being cleared during transfer tests @@ -845,10 +844,10 @@ export const shouldBehaveLikeLSP8 = ( expect(postToTokenIdsOf.includes(tokenId.toString())).to.be.true; const postFromBalanceOf = await context.lsp8.balanceOf(from); - expect(postFromBalanceOf).to.equal(preFromBalanceOf.sub(1)); + expect(postFromBalanceOf).to.equal(preFromBalanceOf - BigInt(1)); const postToBalanceOf = await context.lsp8.balanceOf(to); - expect(postToBalanceOf).to.equal(preToBalanceOf.add(1)); + expect(postToBalanceOf).to.equal(preToBalanceOf + BigInt(1)); return tx; }; @@ -863,16 +862,14 @@ export const shouldBehaveLikeLSP8 = ( describe('when using force=true', () => { const force = true; - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer with force'), - ); + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer with force')); describe('when `to` is an EOA', () => { describe('when `to` is the zero address', () => { it('should revert', async () => { const txParams = { from: context.accounts.owner.address, - to: ethers.constants.AddressZero, + to: ethers.ZeroAddress, tokenId: mintedTokenId, force, data, @@ -911,7 +908,7 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { operator: context.accounts.owner.address, from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithLSP1.address, + to: await helperContracts.tokenReceiverWithLSP1.getAddress(), tokenId: mintedTokenId, force, data, @@ -927,7 +924,7 @@ export const shouldBehaveLikeLSP8 = ( await expect(tx) .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') - .withArgs(context.lsp8.address, 0, typeId, packedData, '0x'); + .withArgs(await context.lsp8.getAddress(), 0, typeId, packedData, '0x'); }); }); @@ -936,7 +933,7 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { operator: context.accounts.owner.address, from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithoutLSP1.address, + to: await helperContracts.tokenReceiverWithoutLSP1.getAddress(), tokenId: mintedTokenId, force, data, @@ -950,9 +947,7 @@ export const shouldBehaveLikeLSP8 = ( describe('when force=false', () => { const force = false; - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer without force'), - ); + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer without force')); describe('when `to` is an EOA', () => { it('should not allow transfering the tokenId', async () => { @@ -986,7 +981,7 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { operator: context.accounts.owner.address, from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithLSP1.address, + to: await helperContracts.tokenReceiverWithLSP1.getAddress(), tokenId: mintedTokenId, force, data, @@ -1002,7 +997,7 @@ export const shouldBehaveLikeLSP8 = ( await expect(tx) .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') - .withArgs(context.lsp8.address, 0, typeId, packedData, '0x'); + .withArgs(await context.lsp8.getAddress(), 0, typeId, packedData, '0x'); }); }); @@ -1011,7 +1006,7 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { operator: context.accounts.owner.address, from: context.accounts.owner.address, - to: helperContracts.tokenReceiverWithoutLSP1.address, + to: await helperContracts.tokenReceiverWithoutLSP1.getAddress(), tokenId: mintedTokenId, force, data, @@ -1036,30 +1031,6 @@ export const shouldBehaveLikeLSP8 = ( }); }); }); - - describe("when `from == to` address (= sending to tokenId's owner itself)", () => { - it('should revert', async () => { - const txParams = { - from: context.accounts.owner.address, - to: context.accounts.owner.address, - tokenId: mintedTokenId, - force, - data, - }; - - await expect( - context.lsp8 - .connect(operator) - .transfer( - txParams.from, - txParams.to, - txParams.tokenId, - txParams.force, - txParams.data, - ), - ).to.be.revertedWithCustomError(context.lsp8, 'LSP8NotifyTokenReceiverIsEOA'); - }); - }); }); }; @@ -1162,7 +1133,7 @@ export const shouldBehaveLikeLSP8 = ( context.accounts.owner.address, anotherMintedTokenId, true, - ethers.utils.toUtf8Bytes('mint another token for the owner'), + ethers.toUtf8Bytes('mint another token for the owner'), ); // setup so we can observe operators being cleared during transferBatch tests @@ -1288,16 +1259,14 @@ export const shouldBehaveLikeLSP8 = ( }); describe('when force=true', () => { - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer with force'), - ); + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer with force')); describe('when `to` is an EOA', () => { describe('when `to` is the zero address', () => { it('should revert', async () => { const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], - to: [context.accounts.tokenReceiver.address, ethers.constants.AddressZero], + to: [context.accounts.tokenReceiver.address, ethers.ZeroAddress], tokenId: [mintedTokenId, anotherMintedTokenId], force: [true, true], data: [data, data], @@ -1333,8 +1302,8 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], to: [ - helperContracts.tokenReceiverWithLSP1.address, - helperContracts.tokenReceiverWithLSP1.address, + await helperContracts.tokenReceiverWithLSP1.getAddress(), + await helperContracts.tokenReceiverWithLSP1.getAddress(), ], tokenId: [mintedTokenId, anotherMintedTokenId], force: [true, true], @@ -1359,7 +1328,7 @@ export const shouldBehaveLikeLSP8 = ( await expect(tx) .to.emit(helperContracts.tokenReceiverWithLSP1, 'UniversalReceiver') - .withArgs(context.lsp8.address, 0, typeId, packedData, '0x'); + .withArgs(await context.lsp8.getAddress(), 0, typeId, packedData, '0x'); }), ); }); @@ -1370,8 +1339,8 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], to: [ - helperContracts.tokenReceiverWithoutLSP1.address, - helperContracts.tokenReceiverWithoutLSP1.address, + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), ], tokenId: [mintedTokenId, anotherMintedTokenId], force: [true, true], @@ -1385,9 +1354,7 @@ export const shouldBehaveLikeLSP8 = ( }); describe('when force=false', () => { - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer without force'), - ); + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer without force')); describe('when `to` is an EOA', () => { it('should not allow transfering the tokenId', async () => { @@ -1395,7 +1362,7 @@ export const shouldBehaveLikeLSP8 = ( from: [context.accounts.owner.address, context.accounts.owner.address], to: [ context.accounts.tokenReceiver.address, - helperContracts.tokenReceiverWithLSP1.address, + await helperContracts.tokenReceiverWithLSP1.getAddress(), ], tokenId: [mintedTokenId, anotherMintedTokenId], force: [false, false], @@ -1416,8 +1383,8 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], to: [ - helperContracts.tokenReceiverWithLSP1.address, - helperContracts.tokenReceiverWithLSP1.address, + await helperContracts.tokenReceiverWithLSP1.getAddress(), + await helperContracts.tokenReceiverWithLSP1.getAddress(), ], tokenId: [mintedTokenId, anotherMintedTokenId], force: [false, false], @@ -1433,8 +1400,8 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], to: [ - helperContracts.tokenReceiverWithoutLSP1.address, - helperContracts.tokenReceiverWithLSP1.address, + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), + await helperContracts.tokenReceiverWithLSP1.getAddress(), ], tokenId: [mintedTokenId, anotherMintedTokenId], force: [false, false], @@ -1452,9 +1419,7 @@ export const shouldBehaveLikeLSP8 = ( }); describe('when force is mixed(true/false) respectively', () => { - const data = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('doing a transfer without force'), - ); + const data = ethers.hexlify(ethers.toUtf8Bytes('doing a transfer without force')); describe('when `to` is an EOA', () => { it('should revert', async () => { @@ -1483,8 +1448,8 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], to: [ - helperContracts.tokenReceiverWithLSP1.address, - helperContracts.tokenReceiverWithoutLSP1.address, + await helperContracts.tokenReceiverWithLSP1.getAddress(), + await helperContracts.tokenReceiverWithoutLSP1.getAddress(), ], tokenId: [mintedTokenId, anotherMintedTokenId], force: [true, false], @@ -1505,8 +1470,8 @@ export const shouldBehaveLikeLSP8 = ( const txParams = { from: [context.accounts.owner.address, context.accounts.owner.address], to: [ - helperContracts.tokenReceiverWithLSP1.address, - helperContracts.tokenReceiverWithLSP1.address, + await helperContracts.tokenReceiverWithLSP1.getAddress(), + await helperContracts.tokenReceiverWithLSP1.getAddress(), ], tokenId: [mintedTokenId, anotherMintedTokenId], force: [true, false], @@ -1625,7 +1590,7 @@ export const shouldBehaveLikeLSP8 = ( context.accounts.owner.address, mintedTokenId, true, - ethers.utils.toUtf8Bytes('mint a token for the owner'), + ethers.toUtf8Bytes('mint a token for the owner'), ); }); @@ -1655,7 +1620,7 @@ export const shouldBehaveLikeLSP8 = ( const totalSupplyAfter = await context.lsp8.totalSupply(); - expect(totalSupplyAfter).to.equal(totalSupplyBefore.sub(1)); + expect(totalSupplyAfter).to.equal(totalSupplyBefore - BigInt(1)); }); it('should have emitted a Transfer event with address(0) as `to` param', async () => { @@ -1664,7 +1629,7 @@ export const shouldBehaveLikeLSP8 = ( .withArgs( context.accounts.owner.address, context.accounts.owner.address, - ethers.constants.AddressZero, + ethers.ZeroAddress, mintedTokenId, false, '0x', @@ -1746,7 +1711,7 @@ export const shouldBehaveLikeLSP8 = ( const totalSupplyAfter = await context.lsp8.totalSupply(); - expect(totalSupplyAfter).to.equal(totalSupplyBefore.sub(1)); + expect(totalSupplyAfter).to.equal(totalSupplyBefore - BigInt(1)); }); it('should have emitted a Transfer event with address(0) as `to` param', async () => { @@ -1755,7 +1720,7 @@ export const shouldBehaveLikeLSP8 = ( .withArgs( context.accounts.operator.address, context.accounts.owner.address, - ethers.constants.AddressZero, + ethers.ZeroAddress, mintedTokenId, false, '0x', @@ -1859,8 +1824,8 @@ export const shouldBehaveLikeLSP8 = ( }); it('old owner should not be allowed to use `setData(..)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key')); - const value = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('value')); + const key = ethers.keccak256(ethers.toUtf8Bytes('key')); + const value = ethers.keccak256(ethers.toUtf8Bytes('value')); await expect( context.lsp8.connect(oldOwner).setData(key, value), ).to.be.revertedWithCustomError(context.lsp8, 'OwnableCallerNotTheOwner'); @@ -1877,12 +1842,12 @@ export const shouldBehaveLikeLSP8 = ( it('new owner should be allowed to use `renounceOwnership(..)`', async () => { await context.lsp8.connect(newOwner).renounceOwnership(); - expect(await context.lsp8.owner()).to.equal(ethers.constants.AddressZero); + expect(await context.lsp8.owner()).to.equal(ethers.ZeroAddress); }); it('new owner should be allowed to use `setData(..)`', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('key')); - const value = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('value')); + const key = ethers.keccak256(ethers.toUtf8Bytes('key')); + const value = ethers.keccak256(ethers.toUtf8Bytes('value')); await context.lsp8.connect(newOwner).setData(key, value); expect(await context.lsp8.getData(key)).to.equal(value); @@ -1895,7 +1860,7 @@ export const shouldBehaveLikeLSP8 = ( it('should revert', async () => { await expect( context.accounts.anyone.sendTransaction({ - to: context.lsp8.address, + to: await context.lsp8.getAddress(), }), ) .to.be.revertedWithCustomError(context.lsp8, 'InvalidFunctionSelector') @@ -1908,7 +1873,7 @@ export const shouldBehaveLikeLSP8 = ( const amountSent = 200; await expect( context.accounts.anyone.sendTransaction({ - to: context.lsp8.address, + to: await context.lsp8.getAddress(), value: amountSent, }), ).to.be.revertedWithCustomError(context.lsp8, 'LSP8TokenContractCannotHoldValue'); @@ -2232,7 +2197,7 @@ export const shouldBehaveLikeLSP8 = ( export type LSP8InitializeTestContext = { lsp8: LSP8IdentifiableDigitalAsset; - initializeTransaction: TransactionResponse; + initializeTransaction: ContractTransactionResponse; deployParams: LSP8DeployParams; }; @@ -2274,18 +2239,14 @@ export const shouldInitializeLikeLSP8 = ( ); const nameKey = ERC725YDataKeys.LSP4['LSP4TokenName']; - const expectedNameValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(context.deployParams.name), - ); + const expectedNameValue = ethers.hexlify(ethers.toUtf8Bytes(context.deployParams.name)); await expect(context.initializeTransaction) .to.emit(context.lsp8, 'DataChanged') .withArgs(nameKey, expectedNameValue); expect(await context.lsp8.getData(nameKey)).to.equal(expectedNameValue); const symbolKey = ERC725YDataKeys.LSP4['LSP4TokenSymbol']; - const expectedSymbolValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(context.deployParams.symbol), - ); + const expectedSymbolValue = ethers.hexlify(ethers.toUtf8Bytes(context.deployParams.symbol)); await expect(context.initializeTransaction) .to.emit(context.lsp8, 'DataChanged') .withArgs(symbolKey, expectedSymbolValue); diff --git a/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts similarity index 79% rename from tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts index fe97b05f2..b1477a821 100644 --- a/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/LSP8Mintable.behaviour.ts @@ -1,17 +1,19 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { - LSP8Mintable, LSP8TransferOwnerChange, UniversalProfile, LSP6KeyManager, UniversalReceiverDelegateTokenReentrant__factory, + LSP8Mintable, } from '../../types'; import { setupProfileWithKeyManagerWithURD } from '../utils/fixtures'; -import { PERMISSIONS, ERC725YDataKeys, OPERATION_TYPES, CALLTYPE } from '../../constants'; +import { ERC725YDataKeys } from '../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; import { combineAllowedCalls, combinePermissions } from '../utils/helpers'; export type LSP8MintableTestAccounts = { @@ -50,7 +52,7 @@ export const shouldBehaveLikeLSP8Mintable = ( describe('when owner minting tokens', () => { it('total supply should have increased', async () => { - const randomTokenId = ethers.utils.randomBytes(32); + const randomTokenId = ethers.randomBytes(32); const preMintTotalSupply = await context.lsp8Mintable.totalSupply(); @@ -62,7 +64,7 @@ export const shouldBehaveLikeLSP8Mintable = ( ); const postMintTotalSupply = await context.lsp8Mintable.totalSupply(); - expect(postMintTotalSupply).to.equal(preMintTotalSupply.add(1)); + expect(postMintTotalSupply).to.equal(preMintTotalSupply + BigInt(1)); }); it('tokenReceiver balance should have increased', async () => { @@ -76,7 +78,7 @@ export const shouldBehaveLikeLSP8Mintable = ( describe('when non-owner minting tokens', () => { it('should revert', async () => { - const randomTokenId = ethers.utils.randomBytes(32); + const randomTokenId = ethers.randomBytes(32); // use any other account const nonOwner = context.accounts.tokenReceiver; @@ -101,7 +103,7 @@ export const shouldBehaveLikeLSP8Mintable = ( await context.lsp8Mintable .connect(context.accounts.owner) - .transferOwnership(universalProfile.address); + .transferOwnership(await universalProfile.getAddress()); const URDTokenReentrant = await new UniversalReceiverDelegateTokenReentrant__factory( context.accounts.profileOwner, @@ -110,38 +112,38 @@ export const shouldBehaveLikeLSP8Mintable = ( const setDataPayload = universalProfile.interface.encodeFunctionData('setDataBatch', [ [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - URDTokenReentrant.address.substring(2), + (await URDTokenReentrant.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - URDTokenReentrant.address.substring(2), + (await URDTokenReentrant.getAddress()).substring(2), ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ], [ combinePermissions(PERMISSIONS.CALL, PERMISSIONS.REENTRANCY), combineAllowedCalls( [CALLTYPE.CALL], - [context.lsp8Mintable.address], + [await context.lsp8Mintable.getAddress()], ['0xffffffff'], ['0xffffffff'], ), - URDTokenReentrant.address, + await URDTokenReentrant.getAddress(), ], ]); await lsp6KeyManager.connect(context.accounts.profileOwner).execute(setDataPayload); }); it('should pass', async () => { - const randomTokenId = ethers.utils.randomBytes(32); - const secondRandomTokenId = ethers.utils.randomBytes(32); + const randomTokenId = ethers.randomBytes(32); + const secondRandomTokenId = ethers.randomBytes(32); const reentrantMintPayload = context.lsp8Mintable.interface.encodeFunctionData('mint', [ - universalProfile.address, + universalProfile.target, secondRandomTokenId, false, '0x', ]); const mintPayload = context.lsp8Mintable.interface.encodeFunctionData('mint', [ - universalProfile.address, + universalProfile.target, randomTokenId, false, reentrantMintPayload, @@ -149,22 +151,20 @@ export const shouldBehaveLikeLSP8Mintable = ( const executePayload = universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - context.lsp8Mintable.address, + await context.lsp8Mintable.getAddress(), 0, mintPayload, ]); await lsp6KeyManager.connect(context.accounts.profileOwner).execute(executePayload); - const balanceOfUP = await context.lsp8Mintable.callStatic.balanceOf(universalProfile.address); + const balanceOfUP = await context.lsp8Mintable.balanceOf(universalProfile.target); - const tokenIdsOfUP = await context.lsp8Mintable.callStatic.tokenIdsOf( - universalProfile.address, - ); + const tokenIdsOfUP = await context.lsp8Mintable.tokenIdsOf(universalProfile.target); expect(balanceOfUP).to.equal(2); - expect(tokenIdsOfUP[0]).to.equal(ethers.utils.hexlify(randomTokenId)); - expect(tokenIdsOfUP[1]).to.equal(ethers.utils.hexlify(secondRandomTokenId)); + expect(tokenIdsOfUP[0]).to.equal(ethers.hexlify(randomTokenId)); + expect(tokenIdsOfUP[1]).to.equal(ethers.hexlify(secondRandomTokenId)); }); }); describe('when there is an owner change in the _beforeTokenTransfer hook', () => { @@ -177,9 +177,9 @@ export const shouldBehaveLikeLSP8Mintable = ( context.accounts.owner.address, 0, // token type 0, // token id format - )) as LSP8TransferOwnerChange; + )) as unknown as LSP8TransferOwnerChange; - const randomTokenId = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const randomTokenId = ethers.hexlify(ethers.randomBytes(32)); // // mint a token tokenReceiver await lsp8TransferOwnerChange.connect(context.accounts.owner).mint( @@ -205,7 +205,7 @@ export const shouldBehaveLikeLSP8Mintable = ( .withArgs( randomTokenId, context.accounts.tokenReceiver.address, - lsp8TransferOwnerChange.address, + await lsp8TransferOwnerChange.getAddress(), ); }); }); diff --git a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8BurnableInit.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8BurnableInit.test.ts similarity index 83% rename from tests/LSP8IdentifiableDigitalAsset/proxy/LSP8BurnableInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8BurnableInit.test.ts index 31259cc07..334b57121 100644 --- a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8BurnableInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8BurnableInit.test.ts @@ -1,13 +1,14 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { LSP8BurnableInitTester, LSP8BurnableInitTester__factory } from '../../../types'; import { shouldInitializeLikeLSP8 } from '../LSP8IdentifiableDigitalAsset.behaviour'; import { deployProxy } from '../../utils/fixtures'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; type LSP8BurnableInitTestContext = { accounts: SignerWithAddress[]; @@ -35,8 +36,13 @@ describe('LSP8BurnableInit with proxy', () => { const lsp8BurnableImplementation = await new LSP8BurnableInitTester__factory( accounts[0], ).deploy(); - const lsp8BurnableProxy = await deployProxy(lsp8BurnableImplementation.address, accounts[0]); - const lsp8Burnable = lsp8BurnableImplementation.attach(lsp8BurnableProxy); + const lsp8BurnableProxy = await deployProxy( + await lsp8BurnableImplementation.getAddress(), + accounts[0], + ); + const lsp8Burnable = lsp8BurnableImplementation.attach( + lsp8BurnableProxy, + ) as LSP8BurnableInitTester; return { accounts, lsp8Burnable, deployParams }; }; diff --git a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CappedSupplyInit.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CappedSupplyInit.test.ts similarity index 82% rename from tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CappedSupplyInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CappedSupplyInit.test.ts index 1ea8ddf26..0e9a4787b 100644 --- a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CappedSupplyInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8CappedSupplyInit.test.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { LSP8CappedSupplyInitTester__factory } from '../../../types'; +import { LSP8CappedSupplyInitTester, LSP8CappedSupplyInitTester__factory } from '../../../types'; import { shouldInitializeLikeLSP8 } from '../LSP8IdentifiableDigitalAsset.behaviour'; import { @@ -10,7 +10,8 @@ import { } from '../LSP8CappedSupply.behaviour'; import { deployProxy } from '../../utils/fixtures'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; describe('LSP8CappedSupplyInit with proxy', () => { const buildTestContext = async () => { @@ -21,13 +22,18 @@ describe('LSP8CappedSupplyInit with proxy', () => { newOwner: accounts.owner.address, lsp4TokenType: LSP4_TOKEN_TYPES.NFT, lsp8TokenIdFormat: LSP8_TOKEN_ID_FORMAT.NUMBER, - tokenSupplyCap: ethers.BigNumber.from('2'), + tokenSupplyCap: ethers.toBigInt('2'), }; const lsp8CappedSupplyInit = await new LSP8CappedSupplyInitTester__factory( accounts.owner, ).deploy(); - const lsp8CappedSupplyProxy = await deployProxy(lsp8CappedSupplyInit.address, accounts.owner); - const lsp8CappedSupply = lsp8CappedSupplyInit.attach(lsp8CappedSupplyProxy); + const lsp8CappedSupplyProxy = await deployProxy( + await lsp8CappedSupplyInit.getAddress(), + accounts.owner, + ); + const lsp8CappedSupply = lsp8CappedSupplyInit.attach( + lsp8CappedSupplyProxy, + ) as LSP8CappedSupplyInitTester; return { accounts, lsp8CappedSupply, deployParams }; }; diff --git a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8EnumerableInit.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8EnumerableInit.test.ts similarity index 88% rename from tests/LSP8IdentifiableDigitalAsset/proxy/LSP8EnumerableInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8EnumerableInit.test.ts index 0704123d5..0f17109aa 100644 --- a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8EnumerableInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8EnumerableInit.test.ts @@ -9,7 +9,8 @@ import { } from '../LSP8Enumerable.behaviour'; import { deployProxy } from '../../utils/fixtures'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; describe('LSP8EnumerableInit with proxy', () => { const buildTestContext = async () => { @@ -25,8 +26,13 @@ describe('LSP8EnumerableInit with proxy', () => { const LSP8EnumerableInit: LSP8EnumerableInitTester = await new LSP8EnumerableInitTester__factory(accounts.owner).deploy(); - const lsp8EnumerableProxy = await deployProxy(LSP8EnumerableInit.address, accounts.owner); - const lsp8Enumerable: LSP8EnumerableInitTester = LSP8EnumerableInit.attach(lsp8EnumerableProxy); + const lsp8EnumerableProxy = await deployProxy( + await LSP8EnumerableInit.getAddress(), + accounts.owner, + ); + const lsp8Enumerable: LSP8EnumerableInitTester = LSP8EnumerableInit.attach( + lsp8EnumerableProxy, + ) as LSP8EnumerableInitTester; return { accounts, lsp8Enumerable, deployParams }; }; diff --git a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8IdentifiableDigitalAssetInit.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8IdentifiableDigitalAssetInit.test.ts similarity index 91% rename from tests/LSP8IdentifiableDigitalAsset/proxy/LSP8IdentifiableDigitalAssetInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8IdentifiableDigitalAssetInit.test.ts index f70ea27e4..a593d8fc3 100644 --- a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8IdentifiableDigitalAssetInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8IdentifiableDigitalAssetInit.test.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { LSP8InitTester__factory, LSP8IdentifiableDigitalAsset } from '../../../types'; +import { LSP8InitTester__factory, LSP8IdentifiableDigitalAsset, LSP8Tester } from '../../../types'; import { getNamedAccounts, @@ -16,7 +16,7 @@ import { } from '../../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour'; import { deployProxy } from '../../utils/fixtures'; -import { LSP4_TOKEN_TYPES } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; describe('LSP8IdentifiableDigitalAssetInit with proxy', () => { const buildTestContext = async (nftType: number): Promise => { @@ -30,8 +30,8 @@ describe('LSP8IdentifiableDigitalAssetInit with proxy', () => { }; const lsp8TesterInit = await new LSP8InitTester__factory(accounts.owner).deploy(); - const lsp8Proxy = await deployProxy(lsp8TesterInit.address, accounts.owner); - const lsp8 = lsp8TesterInit.attach(lsp8Proxy); + const lsp8Proxy = await deployProxy(await lsp8TesterInit.getAddress(), accounts.owner); + const lsp8 = lsp8TesterInit.attach(lsp8Proxy) as LSP8Tester; return { accounts, lsp8, deployParams }; }; @@ -75,7 +75,7 @@ describe('LSP8IdentifiableDigitalAssetInit with proxy', () => { context.lsp8['initialize(string,string,address,uint256,uint256)']( context.deployParams.name, context.deployParams.symbol, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, context.deployParams.lsp4TokenType, ), diff --git a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8MintableInit.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8MintableInit.test.ts similarity index 90% rename from tests/LSP8IdentifiableDigitalAsset/proxy/LSP8MintableInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8MintableInit.test.ts index 4068d37fe..101701d7f 100644 --- a/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8MintableInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/proxy/LSP8MintableInit.test.ts @@ -10,7 +10,9 @@ import { } from '../LSP8Mintable.behaviour'; import { deployProxy } from '../../utils/fixtures'; -import { ERC725YDataKeys, LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; describe('LSP8MintableInit with proxy', () => { const buildTestContext = async () => { @@ -27,8 +29,13 @@ describe('LSP8MintableInit with proxy', () => { accounts.owner, ).deploy(); - const lsp8MintableProxy = await deployProxy(LSP8MintableInit.address, accounts.owner); - const lsp8Mintable: LSP8MintableInit = LSP8MintableInit.attach(lsp8MintableProxy); + const lsp8MintableProxy = await deployProxy( + await LSP8MintableInit.getAddress(), + accounts.owner, + ); + const lsp8Mintable: LSP8MintableInit = LSP8MintableInit.attach( + lsp8MintableProxy, + ) as LSP8MintableInit; return { accounts, lsp8Mintable, deployParams }; }; @@ -55,7 +62,7 @@ describe('LSP8MintableInit with proxy', () => { expect(await lsp8MintableInit.getData(ERC725YDataKeys.LSP4.LSP4TokenType)).to.equal('0x'); expect(await lsp8MintableInit.getData(ERC725YDataKeys.LSP8.LSP8TokenIdFormat)).to.equal('0x'); - expect(await lsp8MintableInit.owner()).to.equal(ethers.constants.AddressZero); + expect(await lsp8MintableInit.owner()).to.equal(ethers.ZeroAddress); }); it('prevent any address from calling the initialize(...) function on the implementation', async () => { diff --git a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Burnable.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Burnable.test.ts similarity index 84% rename from tests/LSP8IdentifiableDigitalAsset/standard/LSP8Burnable.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Burnable.test.ts index b30fdde24..7e0c8f1b2 100644 --- a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Burnable.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Burnable.test.ts @@ -1,10 +1,11 @@ import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { LSP8BurnableTester, LSP8BurnableTester__factory } from '../../../types'; import { shouldInitializeLikeLSP8 } from '../LSP8IdentifiableDigitalAsset.behaviour'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; type LSP8BurnableTestContext = { accounts: SignerWithAddress[]; @@ -53,7 +54,7 @@ describe('LSP8Burnable with constructor', () => { return { lsp8, deployParams, - initializeTransaction: context.lsp8Burnable.deployTransaction, + initializeTransaction: context.lsp8Burnable.deploymentTransaction(), }; }); }); diff --git a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8CappedSupply.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8CappedSupply.test.ts similarity index 86% rename from tests/LSP8IdentifiableDigitalAsset/standard/LSP8CappedSupply.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8CappedSupply.test.ts index fd8dc4f9f..687244673 100644 --- a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8CappedSupply.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8CappedSupply.test.ts @@ -8,7 +8,8 @@ import { LSP8CappedSupplyTestContext, getNamedAccounts, } from '../LSP8CappedSupply.behaviour'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; describe('LSP8CappedSupply with constructor', () => { const buildTestContext = async () => { @@ -19,7 +20,7 @@ describe('LSP8CappedSupply with constructor', () => { newOwner: accounts.owner.address, lsp4TokenType: LSP4_TOKEN_TYPES.NFT, lsp8TokenIdFormat: LSP8_TOKEN_ID_FORMAT.NUMBER, - tokenSupplyCap: ethers.BigNumber.from('2'), + tokenSupplyCap: ethers.toBigInt('2'), }; const lsp8CappedSupply = await new LSP8CappedSupplyTester__factory(accounts.owner).deploy( deployParams.name, @@ -46,7 +47,7 @@ describe('LSP8CappedSupply with constructor', () => { return { lsp8, deployParams, - initializeTransaction: context.lsp8CappedSupply.deployTransaction, + initializeTransaction: context.lsp8CappedSupply.deploymentTransaction(), }; }); }); diff --git a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Enumerable.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Enumerable.test.ts similarity index 88% rename from tests/LSP8IdentifiableDigitalAsset/standard/LSP8Enumerable.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Enumerable.test.ts index 8d46626bb..5147b873a 100644 --- a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Enumerable.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Enumerable.test.ts @@ -6,7 +6,8 @@ import { LSP8EnumerableTestContext, getNamedAccounts, } from '../LSP8Enumerable.behaviour'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; describe('LSP8Enumerable with constructor', () => { const buildTestContext = async () => { @@ -45,7 +46,7 @@ describe('LSP8Enumerable with constructor', () => { return { lsp8, deployParams, - initializeTransaction: context.lsp8Enumerable.deployTransaction, + initializeTransaction: context.lsp8Enumerable.deploymentTransaction(), }; }); }); diff --git a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8IdentifiableDigitalAsset.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8IdentifiableDigitalAsset.test.ts similarity index 93% rename from tests/LSP8IdentifiableDigitalAsset/standard/LSP8IdentifiableDigitalAsset.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8IdentifiableDigitalAsset.test.ts index d816c045d..7946782ce 100644 --- a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8IdentifiableDigitalAsset.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8IdentifiableDigitalAsset.test.ts @@ -19,7 +19,8 @@ import { LS4DigitalAssetMetadataTestContext, shouldBehaveLikeLSP4DigitalAssetMetadata, } from '../../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.behaviour'; -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; describe('LSP8IdentifiableDigitalAsset with constructor', () => { const buildTestContext = async (nftType: number): Promise => { @@ -87,7 +88,7 @@ describe('LSP8IdentifiableDigitalAsset with constructor', () => { const deployParams = { name: 'LSP8 - deployed with constructor', symbol: 'NFT', - newOwner: ethers.constants.AddressZero, + newOwner: ethers.ZeroAddress, lsp4TokenType: LSP4_TOKEN_TYPES.NFT, }; @@ -97,7 +98,7 @@ describe('LSP8IdentifiableDigitalAsset with constructor', () => { contractToDeploy.deploy( deployParams.name, deployParams.symbol, - ethers.constants.AddressZero, + ethers.ZeroAddress, deployParams.lsp4TokenType, LSP8_TOKEN_ID_FORMAT.NUMBER, ), @@ -117,7 +118,7 @@ describe('LSP8IdentifiableDigitalAsset with constructor', () => { return { lsp8, deployParams, - initializeTransaction: context.lsp8.deployTransaction, + initializeTransaction: context.lsp8.deploymentTransaction(), }; }); }); diff --git a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Mintable.test.ts b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Mintable.test.ts similarity index 88% rename from tests/LSP8IdentifiableDigitalAsset/standard/LSP8Mintable.test.ts rename to packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Mintable.test.ts index 33c998448..656a72d24 100644 --- a/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Mintable.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP8IdentifiableDigitalAsset/standard/LSP8Mintable.test.ts @@ -1,4 +1,5 @@ -import { LSP4_TOKEN_TYPES, LSP8_TOKEN_ID_FORMAT } from '../../../constants'; +import { LSP4_TOKEN_TYPES } from '@lukso/lsp4-contracts'; +import { LSP8_TOKEN_ID_FORMAT } from '@lukso/lsp8-contracts'; import { LSP8Mintable, LSP8Mintable__factory } from '../../../types'; import { shouldInitializeLikeLSP8 } from '../LSP8IdentifiableDigitalAsset.behaviour'; @@ -44,7 +45,7 @@ describe('LSP8Mintable with constructor', () => { return { lsp8, deployParams, - initializeTransaction: context.lsp8Mintable.deployTransaction, + initializeTransaction: context.lsp8Mintable.deploymentTransaction(), }; }); }); diff --git a/tests/LSP9Vault/LSP9Vault.behaviour.ts b/packages/lsp-smart-contracts/tests/LSP9Vault/LSP9Vault.behaviour.ts similarity index 78% rename from tests/LSP9Vault/LSP9Vault.behaviour.ts rename to packages/lsp-smart-contracts/tests/LSP9Vault/LSP9Vault.behaviour.ts index 0901ffd82..5959a7f6c 100644 --- a/tests/LSP9Vault/LSP9Vault.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/LSP9Vault/LSP9Vault.behaviour.ts @@ -1,17 +1,16 @@ import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import type { TransactionResponse } from '@ethersproject/abstract-provider'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { expect } from 'chai'; // types import { LSP6KeyManager, - LSP9Vault, UniversalProfile, UniversalReceiverDelegateVaultSetter__factory, UniversalReceiverDelegateVaultReentrantA__factory, UniversalReceiverDelegateVaultReentrantB__factory, UniversalReceiverDelegateVaultMalicious__factory, + LSP9Vault, } from '../../types'; // helpers @@ -21,16 +20,9 @@ import { ARRAY_LENGTH, abiCoder, combineAllowedCalls } from '../utils/helpers'; import { callPayload } from '../utils/fixtures'; // constants -import { - ERC725YDataKeys, - INTERFACE_IDS, - SupportedStandards, - PERMISSIONS, - OPERATION_TYPES, - LSP1_TYPE_IDS, - CALLTYPE, -} from '../../constants'; -import { BigNumber } from 'ethers'; +import { ERC725YDataKeys, INTERFACE_IDS, SupportedStandards, LSP1_TYPE_IDS } from '../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; export type LSP9TestAccounts = { owner: SignerWithAddress; @@ -46,7 +38,7 @@ export const getNamedAccounts = async (): Promise => { export type LSP9DeployParams = { newOwner: string; - initialFunding?: number | BigNumber; + initialFunding?: number | bigint; }; export type LSP9TestContext = { @@ -68,18 +60,18 @@ export const shouldBehaveLikeLSP9 = ( describe('when testing setting data', () => { it('owner should be able to setData', async () => { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('some data key')); - const dataValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value')); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('some data key')); + const dataValue = ethers.hexlify(ethers.toUtf8Bytes('some value')); await context.lsp9Vault.connect(context.accounts.owner).setData(dataKey, dataValue); - const result = await context.lsp9Vault.callStatic.getData(dataKey); + const result = await context.lsp9Vault.getData(dataKey); expect(result).to.equal(dataValue); }); it("non-owner shouldn't be able to setData", async () => { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('some data key')); - const dataValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value')); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('some data key')); + const dataValue = ethers.hexlify(ethers.toUtf8Bytes('some value')); await expect( context.lsp9Vault.connect(context.accounts.random).setData(dataKey, dataValue), @@ -95,16 +87,16 @@ export const shouldBehaveLikeLSP9 = ( .connect(context.accounts.owner) .setData( ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, - lsp1UniversalReceiverDelegateVaultSetter.address, + await lsp1UniversalReceiverDelegateVaultSetter.getAddress(), ); - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('some data key')); - const dataValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value')); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('some data key')); + const dataValue = ethers.hexlify(ethers.toUtf8Bytes('some value')); await expect( lsp1UniversalReceiverDelegateVaultSetter .connect(context.accounts.anyone) - .universalReceiverDelegate(context.lsp9Vault.address, dataKey, dataValue), + .universalReceiverDelegate(await context.lsp9Vault.getAddress(), dataKey, dataValue), ).to.be.revertedWith('Only Owner or reentered Universal Receiver Delegate allowed'); }); @@ -119,11 +111,11 @@ export const shouldBehaveLikeLSP9 = ( .connect(context.accounts.owner) .setData( ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, - lsp1UniversalReceiverDelegateVaultReentrantA.address, + await lsp1UniversalReceiverDelegateVaultReentrantA.getAddress(), ); - const typeId = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const data = ethers.utils.hexlify(ethers.utils.randomBytes(64)); + const typeId = ethers.hexlify(ethers.randomBytes(32)); + const data = ethers.hexlify(ethers.randomBytes(64)); const resultBefore = await context.lsp9Vault.getData(data.substring(0, 66)); expect(resultBefore).to.equal('0x'); @@ -144,14 +136,14 @@ export const shouldBehaveLikeLSP9 = ( context.accounts.anyone, ).deploy(); - const typeId = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const data = ethers.utils.hexlify(ethers.utils.randomBytes(64)); + const typeId = ethers.hexlify(ethers.randomBytes(32)); + const data = ethers.hexlify(ethers.randomBytes(64)); await context.lsp9Vault .connect(context.accounts.owner) .setData( ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + typeId.substring(2, 42), - lsp1UniversalReceiverDelegateVaultReentrantB.address, + await lsp1UniversalReceiverDelegateVaultReentrantB.getAddress(), ); const resultBefore = await context.lsp9Vault.getData(data.substring(0, 66)); @@ -179,7 +171,7 @@ export const shouldBehaveLikeLSP9 = ( .connect(context.accounts.owner) .setData( ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, - lsp1UniversalReceiverDelegateVaultMalicious.address, + await lsp1UniversalReceiverDelegateVaultMalicious.getAddress(), ); }); describe('when testing LSP1 Keys', () => { @@ -188,34 +180,34 @@ export const shouldBehaveLikeLSP9 = ( it('should pass', async () => { const key = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = '0xaabbccdd'; await context.lsp9Vault.connect(context.accounts.owner).setData(key, value); - const result = await context.lsp9Vault.callStatic['getData(bytes32)'](key); + const result = await context.lsp9Vault.getData(key); expect(result).to.equal(value); }); }); describe('using setData Array', () => { it('should pass', async () => { - const key1 = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const value1 = ethers.utils.hexlify(ethers.utils.randomBytes(5)); + const key1 = ethers.hexlify(ethers.randomBytes(32)); + const value1 = ethers.hexlify(ethers.randomBytes(5)); const key2 = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); - const value2 = ethers.utils.hexlify(ethers.utils.randomBytes(5)); + const value2 = ethers.hexlify(ethers.randomBytes(5)); const keys = [key1, key2]; const values = [value1, value2]; await context.lsp9Vault.connect(context.accounts.owner).setDataBatch(keys, values); - const result = await context.lsp9Vault.callStatic.getDataBatch(keys); + const result = await context.lsp9Vault.getDataBatch(keys); expect(result).to.deep.equal(values); }); @@ -225,7 +217,7 @@ export const shouldBehaveLikeLSP9 = ( describe('when the URD is setting data', () => { describe('using setData', () => { it('should revert', async () => { - const typeId = ethers.utils.solidityKeccak256(['string'], ['setData']); + const typeId = ethers.solidityPackedKeccak256(['string'], ['setData']); const data = '0x00'; // To set MappedUniversalReceiverDelegate Key @@ -241,7 +233,7 @@ export const shouldBehaveLikeLSP9 = ( }); describe('using setData Array', () => { it('should revert', async () => { - const typeId = ethers.utils.solidityKeccak256(['string'], ['setData[]']); + const typeId = ethers.solidityPackedKeccak256(['string'], ['setData[]']); const data = '0x00'; // To set MappedUniversalReceiverDelegate Key @@ -264,34 +256,34 @@ export const shouldBehaveLikeLSP9 = ( it('should pass', async () => { const key = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = '0xaabbccdd'; await context.lsp9Vault.connect(context.accounts.owner).setData(key, value); - const result = await context.lsp9Vault.callStatic['getData(bytes32)'](key); + const result = await context.lsp9Vault.getData(key); expect(result).to.equal(value); }); }); describe('using setData Array', () => { it('should pass', async () => { - const key1 = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const value1 = ethers.utils.hexlify(ethers.utils.randomBytes(5)); + const key1 = ethers.hexlify(ethers.randomBytes(32)); + const value1 = ethers.hexlify(ethers.randomBytes(5)); const key2 = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); - const value2 = ethers.utils.hexlify(ethers.utils.randomBytes(5)); + const value2 = ethers.hexlify(ethers.randomBytes(5)); const keys = [key1, key2]; const values = [value1, value2]; await context.lsp9Vault.connect(context.accounts.owner).setDataBatch(keys, values); - const result = await context.lsp9Vault.callStatic.getDataBatch(keys); + const result = await context.lsp9Vault.getDataBatch(keys); expect(result).to.deep.equal(values); }); @@ -301,7 +293,7 @@ export const shouldBehaveLikeLSP9 = ( describe('when the URD is setting data', () => { describe('using setData', () => { it('should revert', async () => { - const typeId = ethers.utils.solidityKeccak256(['string'], ['setData']); + const typeId = ethers.solidityPackedKeccak256(['string'], ['setData']); const data = '0x01'; // To set LSP6Permission Key @@ -315,7 +307,7 @@ export const shouldBehaveLikeLSP9 = ( }); describe('using setData Array', () => { it('should revert', async () => { - const typeId = ethers.utils.solidityKeccak256(['string'], ['setData[]']); + const typeId = ethers.solidityPackedKeccak256(['string'], ['setData[]']); const data = '0x01'; // To set LSP6Permission Key @@ -336,34 +328,34 @@ export const shouldBehaveLikeLSP9 = ( it('should pass', async () => { const key = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); const value = '0xaabbccdd'; await context.lsp9Vault.connect(context.accounts.owner).setData(key, value); - const result = await context.lsp9Vault.callStatic['getData(bytes32)'](key); + const result = await context.lsp9Vault.getData(key); expect(result).to.equal(value); }); }); describe('using setData Array', () => { it('should pass', async () => { - const key1 = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const value1 = ethers.utils.hexlify(ethers.utils.randomBytes(5)); + const key1 = ethers.hexlify(ethers.randomBytes(32)); + const value1 = ethers.hexlify(ethers.randomBytes(5)); const key2 = ERC725YDataKeys.LSP17.LSP17ExtensionPrefix + - ethers.utils.hexlify(ethers.utils.randomBytes(20)).substring(2); + ethers.hexlify(ethers.randomBytes(20)).substring(2); - const value2 = ethers.utils.hexlify(ethers.utils.randomBytes(5)); + const value2 = ethers.hexlify(ethers.randomBytes(5)); const keys = [key1, key2]; const values = [value1, value2]; await context.lsp9Vault.connect(context.accounts.owner).setDataBatch(keys, values); - const result = await context.lsp9Vault.callStatic.getDataBatch(keys); + const result = await context.lsp9Vault.getDataBatch(keys); expect(result).to.deep.equal(values); }); @@ -373,7 +365,7 @@ export const shouldBehaveLikeLSP9 = ( describe('when the URD is setting data', () => { describe('using setData', () => { it('should revert', async () => { - const typeId = ethers.utils.solidityKeccak256(['string'], ['setData']); + const typeId = ethers.solidityPackedKeccak256(['string'], ['setData']); const data = '0x02'; // To set LSP17Extension Key @@ -387,7 +379,7 @@ export const shouldBehaveLikeLSP9 = ( }); describe('using setData Array', () => { it('should revert', async () => { - const typeId = ethers.utils.solidityKeccak256(['string'], ['setData[]']); + const typeId = ethers.solidityPackedKeccak256(['string'], ['setData[]']); const data = '0x02'; // To set LSP17Extension Key @@ -405,8 +397,8 @@ export const shouldBehaveLikeLSP9 = ( describe('when setting a data key with a value less than 256 bytes', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(200)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(200)); await expect(context.lsp9Vault.setData(key, value)) .to.emit(context.lsp9Vault, 'DataChanged') @@ -419,8 +411,8 @@ export const shouldBehaveLikeLSP9 = ( describe('when setting a data key with a value more than 256 bytes', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect(context.lsp9Vault.setData(key, value)) .to.emit(context.lsp9Vault, 'DataChanged') @@ -439,18 +431,17 @@ export const shouldBehaveLikeLSP9 = ( // prettier-ignore await expect( sender.sendTransaction({ - to: context.lsp9Vault.address, + to: await context.lsp9Vault.getAddress(), value: amount, }) - ).to.not.be.reverted - .to.not.emit(context.lsp9Vault, "UniversalReceiver"); + ).to.not.emit(context.lsp9Vault, "UniversalReceiver"); }); }); describe('when setting a data key with a value exactly 256 bytes long', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(256)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(256)); await expect(context.lsp9Vault.setData(key, value)) .to.emit(context.lsp9Vault, 'DataChanged') @@ -463,9 +454,9 @@ export const shouldBehaveLikeLSP9 = ( describe('When sending value to setData', () => { it('should revert when sending value to setData(..)', async () => { - const value = ethers.utils.parseEther('2'); + const value = ethers.parseEther('2'); const txParams = { - dataKey: ethers.utils.solidityKeccak256(['string'], ['FirstDataKey']), + dataKey: ethers.solidityPackedKeccak256(['string'], ['FirstDataKey']), dataValue: '0xaabbccdd', }; @@ -479,9 +470,9 @@ export const shouldBehaveLikeLSP9 = ( }); it('should revert when sending value to setData(..) Array', async () => { - const value = ethers.utils.parseEther('2'); + const value = ethers.parseEther('2'); const txParams = { - dataKey: [ethers.utils.solidityKeccak256(['string'], ['FirstDataKey'])], + dataKey: [ethers.solidityPackedKeccak256(['string'], ['FirstDataKey'])], dataValue: ['0xaabbccdd'], }; @@ -518,25 +509,30 @@ export const shouldBehaveLikeLSP9 = ( before(async () => { await context.lsp9Vault .connect(context.accounts.owner) - .transferOwnership(context.universalProfile.address); + .transferOwnership(context.universalProfile.target); const acceptOwnershipSelector = - context.universalProfile.interface.getSighash('acceptOwnership'); + context.universalProfile.interface.getFunction('acceptOwnership').selector; const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - context.lsp9Vault.address, + context.lsp9Vault.target, 0, acceptOwnershipSelector, ]); - await context.lsp6KeyManager.connect(context.accounts.owner).execute(executePayload); + const tx = await context.lsp6KeyManager + .connect(context.accounts.owner) + .execute(executePayload); + + await tx.wait(); }); it('should register lsp10 keys of the vault on the profile', async () => { - const arrayLength = await context.universalProfile.callStatic['getData(bytes32)']( + const arrayLength = await context.universalProfile.getData( ERC725YDataKeys.LSP10['LSP10Vaults[]'].length, ); + expect(arrayLength).to.equal(ARRAY_LENGTH.ONE); }); }); @@ -545,14 +541,14 @@ export const shouldBehaveLikeLSP9 = ( before(async () => { await context.accounts.friend.sendTransaction({ value: 1000, - to: context.lsp9Vault.address, + to: await context.lsp9Vault.getAddress(), }); }); describe('when non-owner is calling', () => { it('shoud revert', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); const setDataPayload = context.lsp9Vault.interface.encodeFunctionData('setData', [ key, @@ -569,8 +565,8 @@ export const shouldBehaveLikeLSP9 = ( describe('when executing one function', () => { describe('setData', () => { it('should pass', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); const setDataPayload = context.lsp9Vault.interface.encodeFunctionData('setData', [ key, @@ -584,7 +580,7 @@ export const shouldBehaveLikeLSP9 = ( const executePayloadUP = context.universalProfile.interface.encodeFunctionData( 'execute', - [0, context.lsp9Vault.address, 0, multiCallPayload], + [0, await context.lsp9Vault.getAddress(), 0, multiCallPayload], ); await context.lsp6KeyManager @@ -613,13 +609,13 @@ export const shouldBehaveLikeLSP9 = ( const executePayloadUP = context.universalProfile.interface.encodeFunctionData( 'execute', - [0, context.lsp9Vault.address, 0, multiCallPayload], + [0, await context.lsp9Vault.getAddress(), 0, multiCallPayload], ); await expect(() => context.lsp6KeyManager.connect(context.accounts.owner).execute(executePayloadUP), ).to.changeEtherBalances( - [context.lsp9Vault.address, context.accounts.random.address], + [await context.lsp9Vault.getAddress(), context.accounts.random.address], [`-${amount}`, amount], ); }); @@ -637,8 +633,8 @@ export const shouldBehaveLikeLSP9 = ( '0x', ]); - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('A new key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(10)); + const key = ethers.keccak256(ethers.toUtf8Bytes('A new key')); + const value = ethers.hexlify(ethers.randomBytes(10)); const setDataPayload = context.lsp9Vault.interface.encodeFunctionData('setData', [ key, @@ -650,9 +646,7 @@ export const shouldBehaveLikeLSP9 = ( [context.accounts.anyone.address], ); - expect(await context.lsp9Vault.callStatic.pendingOwner()).to.equal( - ethers.constants.AddressZero, - ); + expect(await context.lsp9Vault.pendingOwner()).to.equal(ethers.ZeroAddress); const multiCallPayload = context.lsp9Vault.interface.encodeFunctionData( 'batchCalls', @@ -661,20 +655,20 @@ export const shouldBehaveLikeLSP9 = ( const executePayloadUP = context.universalProfile.interface.encodeFunctionData( 'execute', - [0, context.lsp9Vault.address, 0, multiCallPayload], + [0, await context.lsp9Vault.getAddress(), 0, multiCallPayload], ); await expect(() => context.lsp6KeyManager.connect(context.accounts.owner).execute(executePayloadUP), ).to.changeEtherBalances( - [context.lsp9Vault.address, context.accounts.random.address], + [await context.lsp9Vault.getAddress(), context.accounts.random.address], [`-${amount}`, amount], ); const result = await context.lsp9Vault.getData(key); expect(result).to.equal(value); - expect(await context.lsp9Vault.callStatic.pendingOwner()).to.equal( + expect(await context.lsp9Vault.pendingOwner()).to.equal( context.accounts.anyone.address, ); }); @@ -698,7 +692,7 @@ export const shouldBehaveLikeLSP9 = ( combineAllowedCalls( // TODO: is the bit permission CALL in the allowed call enough for this test? [CALLTYPE.CALL], - [context.lsp9Vault.address], + [await context.lsp9Vault.getAddress()], ['0xffffffff'], ['0xffffffff'], ), @@ -709,8 +703,8 @@ export const shouldBehaveLikeLSP9 = ( }); it('should allow friend to talk to the vault', async () => { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('some data key')); - const dataValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value')); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('some data key')); + const dataValue = ethers.hexlify(ethers.toUtf8Bytes('some value')); const payload = context.lsp9Vault.interface.encodeFunctionData('setData', [ dataKey, @@ -718,35 +712,41 @@ export const shouldBehaveLikeLSP9 = ( ]); await context.lsp6KeyManager .connect(context.accounts.friend) - .execute(callPayload(context.universalProfile, context.lsp9Vault.address, payload)); + .execute( + callPayload(context.universalProfile, await context.lsp9Vault.getAddress(), payload), + ); - const res = await context.lsp9Vault.callStatic.getData(dataKey); + const res = await context.lsp9Vault.getData(dataKey); expect(res).to.equal(dataValue); }); it('should fail when friend is interacting with other contracts', async () => { - const dataKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('some data key')); - const dataValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('some value')); + const dataKey = ethers.keccak256(ethers.toUtf8Bytes('some data key')); + const dataValue = ethers.hexlify(ethers.toUtf8Bytes('some value')); const payload = context.universalProfile.interface.encodeFunctionData('setData', [ dataKey, dataValue, ]); - const disallowedAddress = ethers.utils.getAddress(context.universalProfile.address); + const disallowedAddress = ethers.getAddress(await context.universalProfile.getAddress()); await expect( context.lsp6KeyManager .connect(context.accounts.friend) .execute( - callPayload(context.universalProfile, context.universalProfile.address, payload), + callPayload( + context.universalProfile, + await context.universalProfile.getAddress(), + payload, + ), ), ) .to.be.revertedWithCustomError(context.lsp6KeyManager, 'NotAllowedCall') .withArgs( context.accounts.friend.address, disallowedAddress, - context.universalProfile.interface.getSighash('setData'), + context.universalProfile.interface.getFunction('setData').selector, ); }); }); @@ -759,21 +759,21 @@ export const shouldBehaveLikeLSP9 = ( it('should emit UniversalReceiver event', async () => { const transferOwnership = context.lsp9Vault .connect(context.accounts.owner) - .transferOwnership(context.universalProfile.address); + .transferOwnership(await context.universalProfile.getAddress()); await expect(transferOwnership) .to.emit(context.universalProfile, 'UniversalReceiver') .withArgs( - context.lsp9Vault.address, + await context.lsp9Vault.getAddress(), 0, LSP1_TYPE_IDS.LSP9OwnershipTransferStarted, abiCoder.encode( ['address', 'address'], - [context.accounts.owner.address, context.universalProfile.address], + [context.accounts.owner.address, await context.universalProfile.getAddress()], ), abiCoder.encode( ['bytes', 'bytes'], - [ethers.utils.hexlify(ethers.utils.toUtf8Bytes('LSP1: typeId out of scope')), '0x'], + [ethers.hexlify(ethers.toUtf8Bytes('LSP1: typeId out of scope')), '0x'], ), ); }); @@ -789,10 +789,10 @@ export const shouldBehaveLikeLSP9 = ( context.accounts.random.address, context.accounts.anyone.address, ]; - const values = Array(3).fill(ethers.BigNumber.from('1')); + const values = Array(3).fill(ethers.toBigInt('1')); const datas = Array(3).fill('0x'); - const msgValue = ethers.utils.parseEther('10'); + const msgValue = ethers.parseEther('10'); const tx = await context.lsp9Vault.executeBatch(operationsType, recipients, values, datas, { value: msgValue, @@ -804,7 +804,7 @@ export const shouldBehaveLikeLSP9 = ( context.deployParams.newOwner, msgValue, LSP1_TYPE_IDS.LSP9ValueReceived, - context.universalProfile.interface.getSighash('executeBatch'), + context.universalProfile.interface.getFunction('executeBatch').selector, '0x', ); }); @@ -818,7 +818,7 @@ export const shouldBehaveLikeLSP9 = ( context.accounts.random.address, context.accounts.anyone.address, ]; - const values = Array(3).fill(ethers.BigNumber.from('1')); + const values = Array(3).fill(ethers.toBigInt(1)); const datas = Array(3).fill('0x'); const msgValue = 0; @@ -835,7 +835,7 @@ export const shouldBehaveLikeLSP9 = ( export type LSP9InitializeTestContext = { lsp9Vault: LSP9Vault; - initializeTransaction: TransactionResponse; + initializeTransaction: ContractTransactionResponse; deployParams: LSP9DeployParams; }; diff --git a/tests/LSP9Vault/LSP9Vault.test.ts b/packages/lsp-smart-contracts/tests/LSP9Vault/LSP9Vault.test.ts similarity index 91% rename from tests/LSP9Vault/LSP9Vault.test.ts rename to packages/lsp-smart-contracts/tests/LSP9Vault/LSP9Vault.test.ts index 98d70c3a2..a6f917e32 100644 --- a/tests/LSP9Vault/LSP9Vault.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP9Vault/LSP9Vault.test.ts @@ -6,7 +6,7 @@ import { shouldBehaveLikeLSP14, } from '../LSP14Ownable2Step/LSP14Ownable2Step.behaviour'; -import { LSP9Vault__factory, UniversalProfile, LSP6KeyManager } from '../../types'; +import { UniversalProfile, LSP6KeyManager, LSP9Vault__factory } from '../../types'; import { getNamedAccounts, @@ -22,11 +22,11 @@ import { import { setupProfileWithKeyManagerWithURD } from '../utils/fixtures'; import { provider } from '../utils/helpers'; -import { BigNumber } from 'ethers'; describe('LSP9Vault with constructor', () => { const buildTestContext = async (initialFunding?: number): Promise => { const accounts = await getNamedAccounts(); + const deployParams = { newOwner: accounts.owner.address, initialFunding, @@ -50,7 +50,7 @@ describe('LSP9Vault with constructor', () => { }; const buildLSP14TestContext = async ( - initialFunding?: number | BigNumber, + initialFunding?: number | bigint, ): Promise => { const accounts = await ethers.getSigners(); const deployParams = { owner: accounts[0], initialFunding }; @@ -89,7 +89,7 @@ describe('LSP9Vault with constructor', () => { }); it(`should have deployed with the correct funding amount (${testCase.initialFunding})`, async () => { - const balance = await provider.getBalance(context.lsp9Vault.address); + const balance = await provider.getBalance(await context.lsp9Vault.getAddress()); expect(balance).to.equal(testCase.initialFunding || 0); }); }); @@ -105,7 +105,7 @@ describe('LSP9Vault with constructor', () => { return { lsp9Vault, deployParams, - initializeTransaction: context.lsp9Vault.deployTransaction, + initializeTransaction: context.lsp9Vault.deploymentTransaction(), }; }); }); diff --git a/tests/LSP9Vault/LSP9VaultInit.test.ts b/packages/lsp-smart-contracts/tests/LSP9Vault/LSP9VaultInit.test.ts similarity index 87% rename from tests/LSP9Vault/LSP9VaultInit.test.ts rename to packages/lsp-smart-contracts/tests/LSP9Vault/LSP9VaultInit.test.ts index a0dda37cc..278ef4091 100644 --- a/tests/LSP9Vault/LSP9VaultInit.test.ts +++ b/packages/lsp-smart-contracts/tests/LSP9Vault/LSP9VaultInit.test.ts @@ -3,7 +3,7 @@ import { expect } from 'chai'; import { shouldBehaveLikeLSP14 } from '../LSP14Ownable2Step/LSP14Ownable2Step.behaviour'; -import { LSP9VaultInit__factory, UniversalProfile, LSP6KeyManager } from '../../types'; +import { UniversalProfile, LSP6KeyManager, LSP9VaultInit__factory } from '../../types'; import { getNamedAccounts, @@ -18,12 +18,9 @@ import { } from '../LSP17ContractExtension/LSP17Extendable.behaviour'; import { deployProxy, setupProfileWithKeyManagerWithURD } from '../utils/fixtures'; -import { BigNumber } from 'ethers'; describe('LSP9VaultInit with proxy', () => { - const buildTestContext = async ( - initialFunding?: number | BigNumber, - ): Promise => { + const buildTestContext = async (initialFunding?: number | bigint): Promise => { const accounts = await getNamedAccounts(); const deployParams = { newOwner: accounts.owner.address, @@ -31,8 +28,8 @@ describe('LSP9VaultInit with proxy', () => { }; const lsp9VaultInit = await new LSP9VaultInit__factory(accounts.owner).deploy(); - const lsp9VaultProxy = await deployProxy(lsp9VaultInit.address, accounts.owner); - const lsp9Vault = lsp9VaultInit.attach(lsp9VaultProxy); + const lsp9VaultProxy = await deployProxy(await lsp9VaultInit.getAddress(), accounts.owner); + const lsp9Vault = lsp9VaultInit.attach(lsp9VaultProxy) as LSP9VaultInit; const [UP1, KM1] = await setupProfileWithKeyManagerWithURD(accounts.owner); @@ -56,7 +53,7 @@ describe('LSP9VaultInit with proxy', () => { const lsp9VaultInit = await new LSP9VaultInit__factory(accounts[0]).deploy(); - const lsp9VaultProxy = await deployProxy(lsp9VaultInit.address, accounts[0]); + const lsp9VaultProxy = await deployProxy(await lsp9VaultInit.getAddress(), accounts[0]); const lsp9Vault = lsp9VaultInit.attach(lsp9VaultProxy); @@ -77,7 +74,7 @@ describe('LSP9VaultInit with proxy', () => { const owner = await lsp9VaultInit.owner(); - expect(owner).to.equal(ethers.constants.AddressZero); + expect(owner).to.equal(ethers.ZeroAddress); }); it('prevent any address from calling the initialize(...) function on the implementation', async () => { @@ -131,7 +128,7 @@ describe('LSP9VaultInit with proxy', () => { }), ); - shouldBehaveLikeLSP14(async (initialFunding?: number | BigNumber) => { + shouldBehaveLikeLSP14(async (initialFunding?: number | bigint) => { const context = await buildTestContext(initialFunding); const accounts = await ethers.getSigners(); await initializeProxy(context); diff --git a/tests/Mocks/ABIEncoder.test.ts b/packages/lsp-smart-contracts/tests/Mocks/ABIEncoder.test.ts similarity index 84% rename from tests/Mocks/ABIEncoder.test.ts rename to packages/lsp-smart-contracts/tests/Mocks/ABIEncoder.test.ts index 7cc6febf2..d57b1d76a 100644 --- a/tests/Mocks/ABIEncoder.test.ts +++ b/packages/lsp-smart-contracts/tests/Mocks/ABIEncoder.test.ts @@ -1,4 +1,4 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { ABIEncoder, ABIEncoder__factory } from '../../types'; @@ -13,15 +13,15 @@ describe('ABI Encoder Contract', () => { }); const verifyResult = async (txParameterA, txParameterB) => { - const [c] = await contract.callStatic.encode(txParameterA, txParameterB); - const [a, b] = await contract.callStatic.decode(c); + const [c] = await contract.encode(txParameterA, txParameterB); + const [a, b] = await contract.decode(c); expect(a).to.equal(txParameterA); expect(b).to.equal(txParameterB); }; const checkGasCost = async (txParameterA, txParameterB) => { - const [, gasUsed] = await contract.callStatic.encode(txParameterA, txParameterB); - return gasUsed.toNumber(); + const [, gasUsed] = await contract.encode(txParameterA, txParameterB); + return ethers.toNumber(gasUsed); }; describe('Checking the encoding works', () => { @@ -113,7 +113,7 @@ describe('ABI Encoder Contract', () => { describe('LSP1 Specific Cases', () => { it('Encoding URD response when typeId out of scope with empty bytes', async () => { const txParams = { - a: ethers.utils.hexlify(ethers.utils.toUtf8Bytes('LSP1: typeId out of scope')), + a: ethers.hexlify(ethers.toUtf8Bytes('LSP1: typeId out of scope')), b: '0x', }; @@ -122,9 +122,7 @@ describe('ABI Encoder Contract', () => { it('Encoding URD response when owner is not a KM with empty bytes', async () => { const txParams = { - a: ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('LSP1: account owner is not a LSP6KeyManager'), - ), + a: ethers.hexlify(ethers.toUtf8Bytes('LSP1: account owner is not a LSP6KeyManager')), b: '0x', }; @@ -133,9 +131,7 @@ describe('ABI Encoder Contract', () => { it('Encoding URD response when asset already exist with empty bytes', async () => { const txParams = { - a: ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('LSP1: asset received is already registered'), - ), + a: ethers.hexlify(ethers.toUtf8Bytes('LSP1: asset received is already registered')), b: '0x', }; @@ -144,7 +140,7 @@ describe('ABI Encoder Contract', () => { it('Encoding URD response when asset is not registered with empty bytes', async () => { const txParams = { - a: ethers.utils.hexlify(ethers.utils.toUtf8Bytes('LSP1: asset sent is not registered')), + a: ethers.hexlify(ethers.toUtf8Bytes('LSP1: asset sent is not registered')), b: '0x', }; @@ -153,7 +149,7 @@ describe('ABI Encoder Contract', () => { it('Encoding URD response when full balance was not sent with empty bytes', async () => { const txParams = { - a: ethers.utils.hexlify(ethers.utils.toUtf8Bytes('LSP1: full balance is not sent')), + a: ethers.hexlify(ethers.toUtf8Bytes('LSP1: full balance is not sent')), b: '0x', }; diff --git a/tests/Mocks/ERC165Interfaces.test.ts b/packages/lsp-smart-contracts/tests/Mocks/ERC165Interfaces.test.ts similarity index 98% rename from tests/Mocks/ERC165Interfaces.test.ts rename to packages/lsp-smart-contracts/tests/Mocks/ERC165Interfaces.test.ts index ac898329c..72d10f1d7 100644 --- a/tests/Mocks/ERC165Interfaces.test.ts +++ b/packages/lsp-smart-contracts/tests/Mocks/ERC165Interfaces.test.ts @@ -1,4 +1,4 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { diff --git a/tests/Mocks/KeyManagerExecutionCosts.test.ts b/packages/lsp-smart-contracts/tests/Mocks/KeyManagerExecutionCosts.test.ts similarity index 77% rename from tests/Mocks/KeyManagerExecutionCosts.test.ts rename to packages/lsp-smart-contracts/tests/Mocks/KeyManagerExecutionCosts.test.ts index 995e14bcc..c97664dd1 100644 --- a/tests/Mocks/KeyManagerExecutionCosts.test.ts +++ b/packages/lsp-smart-contracts/tests/Mocks/KeyManagerExecutionCosts.test.ts @@ -2,14 +2,9 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { UniversalProfile__factory, LSP6KeyManager__factory, UniversalProfile } from '../../types'; -import { - ALL_PERMISSIONS, - ERC725YDataKeys, - OPERATION_TYPES, - PERMISSIONS, - INTERFACE_IDS, - CALLTYPE, -} from '../../constants'; +import { ERC725YDataKeys, INTERFACE_IDS } from '../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; import { LSP6TestContext } from '../utils/context'; import { @@ -20,7 +15,7 @@ import { } from '../utils/helpers'; import { setupKeyManager } from '../utils/fixtures'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; describe('Key Manager gas cost interactions', () => { describe('when using LSP6KeyManager with constructor', () => { @@ -32,7 +27,7 @@ describe('Key Manager gas cost interactions', () => { mainController.address, ); const keyManager = await new LSP6KeyManager__factory(mainController).deploy( - universalProfile.address, + await universalProfile.getAddress(), ); return { accounts, mainController, universalProfile, keyManager }; @@ -75,13 +70,13 @@ describe('Key Manager gas cost interactions', () => { combinePermissions(PERMISSIONS.CALL, PERMISSIONS.TRANSFERVALUE), combineAllowedCalls( [combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL)], - [contractImplementsERC1271.address], + [await contractImplementsERC1271.getAddress()], [INTERFACE_IDS.ERC1271], ['0xffffffff'], ), combineAllowedCalls( [combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL)], - [contractImplementsERC1271.address], + [await contractImplementsERC1271.getAddress()], ['0xffffffff'], ['0xffffffff'], ), @@ -90,23 +85,23 @@ describe('Key Manager gas cost interactions', () => { await setupKeyManager(context, permissionKeys, permissionValues); await context.mainController.sendTransaction({ - to: context.universalProfile.address, - value: ethers.utils.parseEther('10'), + to: await context.universalProfile.getAddress(), + value: ethers.parseEther('10'), }); }); describe('display gas cost', () => { it('when caller has any allowed address and standard allowed', async () => { const initialAccountBalance = await provider.getBalance( - contractImplementsERC1271.address, + await contractImplementsERC1271.getAddress(), ); const transferLyxPayload = context.universalProfile.interface.encodeFunctionData( 'execute', [ OPERATION_TYPES.CALL, - contractImplementsERC1271.address, - ethers.utils.parseEther('1'), + await contractImplementsERC1271.getAddress(), + ethers.parseEther('1'), '0x', ], ); @@ -119,23 +114,27 @@ describe('Key Manager gas cost interactions', () => { console.log( 'gas cost LYX transfer - everything allowed: ', - ethers.BigNumber.from(receipt.gasUsed).toNumber(), + ethers.toNumber(receipt.gasUsed), ); - const newAccountBalance = await provider.getBalance(contractImplementsERC1271.address); + const newAccountBalance = await provider.getBalance( + await contractImplementsERC1271.getAddress(), + ); expect(newAccountBalance).to.be.greaterThan(initialAccountBalance); }); }); it('when caller has only 1 x allowed address allowed', async () => { - const initialAccountBalance = await provider.getBalance(contractImplementsERC1271.address); + const initialAccountBalance = await provider.getBalance( + await contractImplementsERC1271.getAddress(), + ); const transferLyxPayload = context.universalProfile.interface.encodeFunctionData( 'execute', [ OPERATION_TYPES.CALL, - contractImplementsERC1271.address, - ethers.utils.parseEther('1'), + await contractImplementsERC1271.getAddress(), + ethers.parseEther('1'), '0x', ], ); @@ -148,22 +147,26 @@ describe('Key Manager gas cost interactions', () => { console.log( 'gas cost LYX transfer - with 1 x allowed address: ', - ethers.BigNumber.from(receipt.gasUsed).toNumber(), + ethers.toNumber(receipt.gasUsed), ); - const newAccountBalance = await provider.getBalance(contractImplementsERC1271.address); + const newAccountBalance = await provider.getBalance( + await contractImplementsERC1271.getAddress(), + ); expect(newAccountBalance).to.be.greaterThan(initialAccountBalance); }); it('when caller has only 1 x allowed address + 1 x allowed standard allowed', async () => { - const initialAccountBalance = await provider.getBalance(contractImplementsERC1271.address); + const initialAccountBalance = await provider.getBalance( + await contractImplementsERC1271.getAddress(), + ); const transferLyxPayload = context.universalProfile.interface.encodeFunctionData( 'execute', [ OPERATION_TYPES.CALL, - contractImplementsERC1271.address, - ethers.utils.parseEther('1'), + await contractImplementsERC1271.getAddress(), + ethers.parseEther('1'), '0x', ], ); @@ -176,10 +179,12 @@ describe('Key Manager gas cost interactions', () => { console.log( 'gas cost LYX transfer - with 1 x allowed address + 1 x allowed standard: ', - ethers.BigNumber.from(receipt.gasUsed).toNumber(), + ethers.toNumber(receipt.gasUsed), ); - const newAccountBalance = await provider.getBalance(contractImplementsERC1271.address); + const newAccountBalance = await provider.getBalance( + await contractImplementsERC1271.getAddress(), + ); expect(newAccountBalance).to.be.greaterThan(initialAccountBalance); }); }); diff --git a/tests/Mocks/LSP1TypeIDs.test.ts b/packages/lsp-smart-contracts/tests/Mocks/LSP1TypeIDs.test.ts similarity index 94% rename from tests/Mocks/LSP1TypeIDs.test.ts rename to packages/lsp-smart-contracts/tests/Mocks/LSP1TypeIDs.test.ts index 3c00401cf..db54ed79a 100644 --- a/tests/Mocks/LSP1TypeIDs.test.ts +++ b/packages/lsp-smart-contracts/tests/Mocks/LSP1TypeIDs.test.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { hexlify, keccak256, toUtf8Bytes } from 'ethers/lib/utils'; +import { hexlify, keccak256, toUtf8Bytes } from 'ethers'; import { LSP1TypeIDsTester, LSP1TypeIDsTester__factory } from '../../types'; import { LSP1_TYPE_IDS } from '../../constants'; diff --git a/tests/README.md b/packages/lsp-smart-contracts/tests/README.md similarity index 100% rename from tests/README.md rename to packages/lsp-smart-contracts/tests/README.md diff --git a/tests/Reentrancy/LSP20/ERC725XBatchExecuteToERC725XExecute.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XBatchExecuteToERC725XExecute.test.ts similarity index 63% rename from tests/Reentrancy/LSP20/ERC725XBatchExecuteToERC725XExecute.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XBatchExecuteToERC725XExecute.test.ts index 083952875..095fc77a4 100644 --- a/tests/Reentrancy/LSP20/ERC725XBatchExecuteToERC725XExecute.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XBatchExecuteToERC725XExecute.test.ts @@ -1,11 +1,12 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; // constants -import { ALL_PERMISSIONS, ERC725YDataKeys } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -26,10 +27,11 @@ import { } from './reentrancyHelpers'; import { LSP20ReentrantContract__factory } from '../../../types'; -import { Interface } from 'ethers/lib/utils'; +import { Interface } from 'ethers'; +import { provider } from '../../utils/helpers'; export const testERC725XBatchExecuteToERC725XExecute = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; @@ -37,7 +39,7 @@ export const testERC725XBatchExecuteToERC725XExecute = ( let reentrantContractInterface: Interface; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); reentrantContractInterface = new LSP20ReentrantContract__factory().interface; }); @@ -61,17 +63,25 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'TRANSFERVALUE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -80,14 +90,19 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'TRANSFERVALUE', transferValueTestCases.NoCallsAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ).to.be.revertedWithCustomError(context.keyManager, 'NoCallsAllowed'); }); @@ -96,27 +111,30 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'TRANSFERVALUE', transferValueTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.reentrantContract.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.reentrantContract.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -139,17 +157,25 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'SETDATA', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -158,14 +184,19 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'SETDATA', setDataTestCases.NoERC725YDataKeysAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ).to.be.revertedWithCustomError(context.keyManager, 'NoERC725YDataKeysAllowed'); }); @@ -174,16 +205,21 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'SETDATA', setDataTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -204,17 +240,25 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'ADDCONTROLLER', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -223,13 +267,18 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'ADDCONTROLLER', addPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); const hardcodedPermissionKey = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -256,17 +305,25 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'EDITPERMISSIONS', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -275,13 +332,18 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'EDITPERMISSIONS', editPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); const hardcodedPermissionKey = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -309,17 +371,25 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -328,13 +398,18 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', addUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); const hardcodedLSP1Key = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + @@ -363,17 +438,25 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -382,13 +465,18 @@ export const testERC725XBatchExecuteToERC725XExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', changeUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); const hardcodedLSP1Key = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + diff --git a/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XBatchExecute.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XBatchExecute.test.ts similarity index 63% rename from tests/Reentrancy/LSP20/ERC725XExecuteToERC725XBatchExecute.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XBatchExecute.test.ts index 58f07617c..ae749dd20 100644 --- a/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XBatchExecute.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XBatchExecute.test.ts @@ -1,11 +1,12 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; // constants -import { ALL_PERMISSIONS, ERC725YDataKeys } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -26,10 +27,11 @@ import { } from './reentrancyHelpers'; import { LSP20ReentrantContractBatch__factory } from '../../../types'; -import { Interface } from 'ethers/lib/utils'; +import { Interface } from 'ethers'; +import { provider } from '../../utils/helpers'; export const testERC725XExecuteToERC725XExecuteBatch = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; @@ -37,7 +39,7 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( let reentrantContractInterface: Interface; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); reentrantContractInterface = new LSP20ReentrantContractBatch__factory().interface; }); @@ -61,17 +63,25 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'TRANSFERVALUE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -80,14 +90,19 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'TRANSFERVALUE', transferValueTestCases.NoCallsAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ).to.be.revertedWithCustomError(context.keyManager, 'NoCallsAllowed'); }); @@ -96,27 +111,30 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'TRANSFERVALUE', transferValueTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.reentrantContract.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.reentrantContract.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -139,17 +157,25 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'SETDATA', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -158,14 +184,19 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'SETDATA', setDataTestCases.NoERC725YDataKeysAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ).to.be.revertedWithCustomError(context.keyManager, 'NoERC725YDataKeysAllowed'); }); @@ -174,16 +205,21 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'SETDATA', setDataTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -204,17 +240,25 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'ADDCONTROLLER', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -223,13 +267,18 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'ADDCONTROLLER', addPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); const hardcodedPermissionKey = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -256,17 +305,25 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'EDITPERMISSIONS', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -275,13 +332,18 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'EDITPERMISSIONS', editPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); const hardcodedPermissionKey = ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + @@ -309,17 +371,25 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'ADDUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -328,13 +398,18 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'ADDUNIVERSALRECEIVERDELEGATE', addUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); const hardcodedLSP1Key = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + @@ -363,17 +438,25 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]), + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -382,13 +465,18 @@ export const testERC725XExecuteToERC725XExecuteBatch = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', changeUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile .connect(reentrancyContext.caller) - .executeBatch([0], [reentrancyContext.reentrantContract.address], [0], [reentrantCall]); + .executeBatch( + [0], + [await reentrancyContext.reentrantContract.getAddress()], + [0], + [reentrantCall], + ); const hardcodedLSP1Key = ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + diff --git a/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XExecute.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XExecute.test.ts similarity index 78% rename from tests/Reentrancy/LSP20/ERC725XExecuteToERC725XExecute.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XExecute.test.ts index c9d399619..1e6f228a2 100644 --- a/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XExecute.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToERC725XExecute.test.ts @@ -1,11 +1,12 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; // constants -import { ALL_PERMISSIONS, ERC725YDataKeys } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -25,16 +26,17 @@ import { loadTestCase, } from './reentrancyHelpers'; import { LSP20ReentrantContract__factory } from '../../../types'; +import { provider } from '../../utils/helpers'; export const testERC725XExecuteToERC725XExecute = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; let reentrancyContext: ReentrancyContext; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); }); @@ -54,7 +56,7 @@ export const testERC725XExecuteToERC725XExecute = ( executeCalldata = { operationType: 0, - to: reentrancyContext.reentrantContract.address, + to: await reentrancyContext.reentrantContract.getAddress(), value: 0, data: reentrantCall, }; @@ -70,8 +72,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'TRANSFERVALUE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -85,7 +87,10 @@ export const testERC725XExecuteToERC725XExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -94,8 +99,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'TRANSFERVALUE', transferValueTestCases.NoCallsAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -115,13 +120,13 @@ export const testERC725XExecuteToERC725XExecute = ( 'TRANSFERVALUE', transferValueTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.universalProfile .connect(reentrancyContext.caller) @@ -132,15 +137,13 @@ export const testERC725XExecuteToERC725XExecute = ( executeCalldata.data, ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.reentrantContract.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.reentrantContract.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -160,7 +163,7 @@ export const testERC725XExecuteToERC725XExecute = ( executeCalldata = { operationType: 0, - to: reentrancyContext.reentrantContract.address, + to: await reentrancyContext.reentrantContract.getAddress(), value: 0, data: reentrantCall, }; @@ -176,8 +179,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'SETDATA', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -191,7 +194,10 @@ export const testERC725XExecuteToERC725XExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -200,8 +206,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'SETDATA', setDataTestCases.NoERC725YDataKeysAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -221,8 +227,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'SETDATA', setDataTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile @@ -234,8 +240,8 @@ export const testERC725XExecuteToERC725XExecute = ( executeCalldata.data, ); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -257,7 +263,7 @@ export const testERC725XExecuteToERC725XExecute = ( executeCalldata = { operationType: 0, - to: reentrancyContext.reentrantContract.address, + to: await reentrancyContext.reentrantContract.getAddress(), value: 0, data: reentrantCall, }; @@ -269,8 +275,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'ADDCONTROLLER', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -284,7 +290,10 @@ export const testERC725XExecuteToERC725XExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -293,8 +302,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'ADDCONTROLLER', addPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile @@ -332,7 +341,7 @@ export const testERC725XExecuteToERC725XExecute = ( executeCalldata = { operationType: 0, - to: reentrancyContext.reentrantContract.address, + to: await reentrancyContext.reentrantContract.getAddress(), value: 0, data: reentrantCall, }; @@ -344,8 +353,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'EDITPERMISSIONS', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -359,7 +368,10 @@ export const testERC725XExecuteToERC725XExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -368,8 +380,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'EDITPERMISSIONS', editPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile @@ -408,7 +420,7 @@ export const testERC725XExecuteToERC725XExecute = ( executeCalldata = { operationType: 0, - to: reentrancyContext.reentrantContract.address, + to: await reentrancyContext.reentrantContract.getAddress(), value: 0, data: reentrantCall, }; @@ -420,8 +432,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -435,7 +447,10 @@ export const testERC725XExecuteToERC725XExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -444,8 +459,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', addUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile @@ -485,7 +500,7 @@ export const testERC725XExecuteToERC725XExecute = ( executeCalldata = { operationType: 0, - to: reentrancyContext.reentrantContract.address, + to: await reentrancyContext.reentrantContract.getAddress(), value: 0, data: reentrantCall, }; @@ -497,8 +512,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -512,7 +527,10 @@ export const testERC725XExecuteToERC725XExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -521,8 +539,8 @@ export const testERC725XExecuteToERC725XExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', changeUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.universalProfile diff --git a/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6BatchExecuteRelayCall.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6BatchExecuteRelayCall.test.ts similarity index 88% rename from tests/Reentrancy/LSP20/ERC725XExecuteToLSP6BatchExecuteRelayCall.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6BatchExecuteRelayCall.test.ts index b784381d3..f2a07018b 100644 --- a/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6BatchExecuteRelayCall.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6BatchExecuteRelayCall.test.ts @@ -1,12 +1,13 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; import { SingleReentrancyRelayer__factory } from '../../../types'; // constants -import { ERC725YDataKeys, OPERATION_TYPES } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -26,9 +27,10 @@ import { generateBatchRelayPayload, loadTestCase, } from './reentrancyHelpers'; +import { provider } from '../../utils/helpers'; export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; @@ -41,17 +43,17 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( }; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); const reentrantCall = new SingleReentrancyRelayer__factory().interface.encodeFunctionData( 'relayCallThatReenters', - [context.keyManager.address], + [await context.keyManager.getAddress()], ); executeCalldata = { operationType: OPERATION_TYPES.CALL, - to: reentrancyContext.batchReentarncyRelayer.address, + to: await reentrancyContext.batchReentarncyRelayer.getAddress(), value: 0, data: reentrantCall, }; @@ -81,7 +83,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -105,7 +107,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( transferValueTestCases.NoCallsAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -126,12 +128,12 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( transferValueTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.universalProfile .connect(reentrancyContext.caller) @@ -142,15 +144,13 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( executeCalldata.data, ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.batchReentarncyRelayer.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.batchReentarncyRelayer.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -178,7 +178,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -202,7 +202,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( setDataTestCases.NoERC725YDataKeysAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -223,7 +223,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( setDataTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.universalProfile @@ -235,8 +235,8 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( executeCalldata.data, ); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -262,7 +262,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -286,7 +286,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( addPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.universalProfile @@ -330,7 +330,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -354,7 +354,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( editPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.universalProfile @@ -397,7 +397,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -421,7 +421,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( addUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.universalProfile @@ -465,7 +465,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -489,7 +489,7 @@ export const testERC725XExecuteToLSP6BatchExecuteRelayCall = ( changeUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.universalProfile diff --git a/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6ExecuteRelayCall.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6ExecuteRelayCall.test.ts similarity index 88% rename from tests/Reentrancy/LSP20/ERC725XExecuteToLSP6ExecuteRelayCall.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6ExecuteRelayCall.test.ts index 4b3b0627c..56688f4f6 100644 --- a/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6ExecuteRelayCall.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/ERC725XExecuteToLSP6ExecuteRelayCall.test.ts @@ -1,12 +1,13 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; import { SingleReentrancyRelayer__factory } from '../../../types'; // constants -import { ERC725YDataKeys, OPERATION_TYPES } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -26,9 +27,10 @@ import { generateSingleRelayPayload, loadTestCase, } from './reentrancyHelpers'; +import { provider } from '../../utils/helpers'; export const testERC725XExecuteToLSP6ExecuteRelayCall = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; @@ -41,17 +43,17 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( }; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); const reentrantCall = new SingleReentrancyRelayer__factory().interface.encodeFunctionData( 'relayCallThatReenters', - [context.keyManager.address], + [await context.keyManager.getAddress()], ); executeCalldata = { operationType: OPERATION_TYPES.CALL, - to: reentrancyContext.singleReentarncyRelayer.address, + to: await reentrancyContext.singleReentarncyRelayer.getAddress(), value: 0, data: reentrantCall, }; @@ -81,7 +83,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -105,7 +107,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( transferValueTestCases.NoCallsAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -126,12 +128,12 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( transferValueTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.universalProfile .connect(reentrancyContext.caller) @@ -142,15 +144,13 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( executeCalldata.data, ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.singleReentarncyRelayer.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.singleReentarncyRelayer.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -178,7 +178,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -202,7 +202,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( setDataTestCases.NoERC725YDataKeysAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -223,7 +223,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( setDataTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.universalProfile @@ -235,8 +235,8 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( executeCalldata.data, ); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -262,7 +262,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -286,7 +286,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( addPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.universalProfile @@ -330,7 +330,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -354,7 +354,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( editPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.universalProfile @@ -397,7 +397,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -421,7 +421,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( addUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.universalProfile @@ -465,7 +465,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -489,7 +489,7 @@ export const testERC725XExecuteToLSP6ExecuteRelayCall = ( changeUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.universalProfile diff --git a/tests/Reentrancy/LSP20/LSP20WithLSP6Reentrancy.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/LSP20WithLSP6Reentrancy.test.ts similarity index 94% rename from tests/Reentrancy/LSP20/LSP20WithLSP6Reentrancy.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP20/LSP20WithLSP6Reentrancy.test.ts index 9aeacf1d2..633c9e518 100644 --- a/tests/Reentrancy/LSP20/LSP20WithLSP6Reentrancy.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/LSP20WithLSP6Reentrancy.test.ts @@ -1,6 +1,3 @@ -// types -import { BigNumber } from 'ethers'; - // setup import { LSP6TestContext } from '../../utils/context'; import { buildReentrancyContext } from './reentrancyHelpers'; @@ -14,7 +11,7 @@ import { testERC725XExecuteToLSP6BatchExecuteRelayCall } from './ERC725XExecuteT import { testERC725XExecuteToERC725XExecuteBatch } from './ERC725XExecuteToERC725XBatchExecute.test'; export const shouldBehaveLikeLSP20WithLSP6ReentrancyScenarios = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { describe('first call through `execute(uint256,address,uint256,bytes)`, second call through `execute(uint256,address,uint256,bytes)`', () => { testERC725XExecuteToERC725XExecute(buildContext, buildReentrancyContext); diff --git a/tests/Reentrancy/LSP20/reentrancyHelpers.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/reentrancyHelpers.ts similarity index 90% rename from tests/Reentrancy/LSP20/reentrancyHelpers.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP20/reentrancyHelpers.ts index 13495a86a..b09c0ceaf 100644 --- a/tests/Reentrancy/LSP20/reentrancyHelpers.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP20/reentrancyHelpers.ts @@ -1,8 +1,8 @@ import { ethers } from 'hardhat'; // types -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, BytesLike, Wallet } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { BytesLike, Wallet } from 'ethers'; import { LSP20ReentrantContract__factory, LSP20ReentrantContract, @@ -16,7 +16,8 @@ import { } from '../../../types'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -340,7 +341,7 @@ export const buildReentrancyContext = async (context: LSP6TestContext) => { const reentrantContract = await new LSP20ReentrantContract__factory(owner).deploy( newControllerAddress, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')), newURDAddress, ); @@ -363,7 +364,11 @@ export const buildReentrancyContext = async (context: LSP6TestContext) => { combineAllowedCalls( // allow controller to call the 3 x addresses listed below [CALLTYPE.CALL, CALLTYPE.CALL, CALLTYPE.CALL], - [reentrantContract.address, singleReentarncyRelayer.address, batchReentarncyRelayer.address], + [ + await reentrantContract.getAddress(), + await singleReentarncyRelayer.getAddress(), + await batchReentarncyRelayer.getAddress(), + ], ['0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff'], ), @@ -371,7 +376,11 @@ export const buildReentrancyContext = async (context: LSP6TestContext) => { combineAllowedCalls( // allow controller to call the 3 x addresses listed below [CALLTYPE.CALL, CALLTYPE.CALL, CALLTYPE.CALL], - [reentrantContract.address, singleReentarncyRelayer.address, batchReentarncyRelayer.address], + [ + await reentrantContract.getAddress(), + await singleReentarncyRelayer.getAddress(), + await batchReentarncyRelayer.getAddress(), + ], ['0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff'], ), @@ -379,7 +388,7 @@ export const buildReentrancyContext = async (context: LSP6TestContext) => { await setupKeyManager(context, permissionKeys, permissionValues); - const randomLSP1TypeId = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')); + const randomLSP1TypeId = ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')); return { owner, @@ -400,7 +409,7 @@ export const generateRelayCall = async ( payload: BytesLike, signer: Wallet, ) => { - const nonce = await keyManager.callStatic.getNonce(signer.address, 1); + const nonce = await keyManager.getNonce(signer.address, 1); const validityTimestamps = 0; @@ -416,7 +425,7 @@ export const generateRelayCall = async ( const relayCallContext: { signature: BytesLike; - nonce: BigNumber; + nonce: bigint; validityTimestamps: BytesLike | number; payload: BytesLike; } = { @@ -443,15 +452,15 @@ export const generateSingleRelayPayload = async ( case 'TRANSFERVALUE': payload = universalProfile.interface.encodeFunctionData('execute', [ 0, - reentrancyRelayer.address, - ethers.utils.parseEther('1'), + await reentrancyRelayer.getAddress(), + ethers.parseEther('1'), '0x', ]); break; case 'SETDATA': payload = universalProfile.interface.encodeFunctionData('setData', [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), + ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')), + ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')), ]); break; case 'ADDCONTROLLER': @@ -469,14 +478,14 @@ export const generateSingleRelayPayload = async ( case 'ADDUNIVERSALRECEIVERDELEGATE': payload = universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), newURDAddress, ]); break; case 'CHANGEUNIVERSALRECEIVERDELEGATE': payload = universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), '0x', ]); break; @@ -485,7 +494,7 @@ export const generateSingleRelayPayload = async ( break; } - const nonce = await keyManager.callStatic.getNonce(reentrantSigner.address, 1); + const nonce = await keyManager.getNonce(reentrantSigner.address, 1); const validityTimestamps = 0; @@ -516,15 +525,15 @@ export const generateBatchRelayPayload = async ( case 'TRANSFERVALUE': payload = universalProfile.interface.encodeFunctionData('execute', [ 0, - reentrancyRelayer.address, - ethers.utils.parseEther('1'), + await reentrancyRelayer.getAddress(), + ethers.parseEther('1'), '0x', ]); break; case 'SETDATA': payload = universalProfile.interface.encodeFunctionData('setData', [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), + ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')), + ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')), ]); break; case 'ADDCONTROLLER': @@ -542,14 +551,14 @@ export const generateBatchRelayPayload = async ( case 'ADDUNIVERSALRECEIVERDELEGATE': payload = universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), newURDAddress, ]); break; case 'CHANGEUNIVERSALRECEIVERDELEGATE': payload = universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), '0x', ]); break; @@ -558,7 +567,7 @@ export const generateBatchRelayPayload = async ( break; } - const nonce = await keyManager.callStatic.getNonce(reentrantSigner.address, 1); + const nonce = await keyManager.getNonce(reentrantSigner.address, 1); const validityTimestamps = 0; @@ -642,9 +651,7 @@ export const loadTestCase = async ( permissionValues = [ testCase.permissions, (testCase as SetDataTestCase).allowedERC725YDataKeys - ? encodeCompactBytesArray([ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), - ]) + ? encodeCompactBytesArray([ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed'))]) : '0x', ]; break; diff --git a/tests/Reentrancy/LSP6/LSP6Reentrancy.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/LSP6Reentrancy.test.ts similarity index 80% rename from tests/Reentrancy/LSP6/LSP6Reentrancy.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP6/LSP6Reentrancy.test.ts index 6b66a6080..0432f25fc 100644 --- a/tests/Reentrancy/LSP6/LSP6Reentrancy.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/LSP6Reentrancy.test.ts @@ -1,6 +1,14 @@ import { expect } from 'chai'; -import { BigNumber, ethers } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { + hexlify, + keccak256, + parseEther, + solidityPacked, + toUtf8Bytes, + ZeroAddress, + ZeroHash, +} from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { EIP191Signer } from '@lukso/eip191-signer.js'; // setup @@ -15,15 +23,10 @@ import { testSingleExecuteRelayCallToSingleExecuteRelayCall } from './SingleExec import { testSingleExecuteToBatchExecute } from './SingleExecuteToBatchExecute.test'; import { testSingleExecuteToBatchExecuteRelayCall } from './SingleExecuteToBatchExecuteRelayCall.test'; -import { - ALL_PERMISSIONS, - CALLTYPE, - ERC725YDataKeys, - LSP1_TYPE_IDS, - LSP25_VERSION, - OPERATION_TYPES, - PERMISSIONS, -} from '../../../constants'; +import { ERC725YDataKeys, LSP1_TYPE_IDS } from '../../../constants'; +import { OPERATION_TYPES } from '@lukso/lsp0-contracts'; +import { ALL_PERMISSIONS, CALLTYPE, PERMISSIONS } from '@lukso/lsp6-contracts'; +import { LSP25_VERSION } from '@lukso/lsp25-contracts'; import { combineAllowedCalls, @@ -47,7 +50,7 @@ import { import { setupKeyManager } from '../../utils/fixtures'; export const shouldBehaveLikeLSP6ReentrancyScenarios = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, ) => { describe('Basic Reentrancy Scenarios', () => { let context: LSP6TestContext; @@ -64,7 +67,7 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( attacker = context.accounts[4]; maliciousContract = await new Reentrancy__factory(attacker).deploy( - context.keyManager.address, + await context.keyManager.getAddress(), ); const permissionKeys = [ @@ -87,7 +90,7 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL), ], - [signer.address, ethers.constants.AddressZero], + [signer.address, ZeroAddress], ['0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff'], ), @@ -97,8 +100,8 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( // Fund Universal Profile with some LYXe await context.mainController.sendTransaction({ - to: context.universalProfile.address, - value: ethers.utils.parseEther('10'), + to: await context.universalProfile.getAddress(), + value: parseEther('10'), }); }); @@ -109,8 +112,8 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( // in the fallback function of the target (= recipient) contract const transferPayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - maliciousContract.address, - ethers.utils.parseEther('1'), + await maliciousContract.getAddress(), + parseEther('1'), '0x', ]); @@ -121,18 +124,26 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( // every time the contract receives LYX await maliciousContract.loadPayload(executePayload); - const initialAccountBalance = await provider.getBalance(context.universalProfile.address); - const initialAttackerContractBalance = await provider.getBalance(maliciousContract.address); + const initialAccountBalance = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const initialAttackerContractBalance = await provider.getBalance( + await maliciousContract.getAddress(), + ); // send LYX to malicious contract // at this point, the malicious contract receive function try to drain funds by re-entering the KeyManager // this should not be possible since it does not have the permission `REENTRANCY` await expect(context.keyManager.connect(context.mainController).execute(transferPayload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(maliciousContract.address, 'REENTRANCY'); + .withArgs(await maliciousContract.getAddress(), 'REENTRANCY'); - const newAccountBalance = await provider.getBalance(context.universalProfile.address); - const newAttackerContractBalance = await provider.getBalance(maliciousContract.address); + const newAccountBalance = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const newAttackerContractBalance = await provider.getBalance( + await maliciousContract.getAddress(), + ); expect(newAccountBalance).to.equal(initialAccountBalance); expect(newAttackerContractBalance).to.equal(initialAttackerContractBalance); @@ -142,19 +153,19 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( const channelId = 0; it('Replay Attack should fail because of invalid nonce', async () => { - const nonce = await context.keyManager.callStatic.getNonce(signer.address, channelId); + const nonce = await context.keyManager.getNonce(signer.address, channelId); const validityTimestamps = 0; const executeRelayCallPayload = context.universalProfile.interface.encodeFunctionData( 'execute', - [OPERATION_TYPES.CALL, signer.address, ethers.utils.parseEther('1'), '0x'], + [OPERATION_TYPES.CALL, signer.address, parseEther('1'), '0x'], ); const HARDHAT_CHAINID = 31337; const valueToSend = 0; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -169,7 +180,7 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - context.keyManager.address, + await context.keyManager.getAddress(), encodedMessage, LOCAL_PRIVATE_KEYS.ACCOUNT1, ); @@ -197,8 +208,8 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( it('should revert if reentered from a random address', async () => { const transferPayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - maliciousContract.address, - ethers.utils.parseEther('1'), + await maliciousContract.getAddress(), + parseEther('1'), '0x', ]); @@ -210,12 +221,12 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( await expect(context.keyManager.connect(context.mainController).execute(transferPayload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(maliciousContract.address, 'REENTRANCY'); + .withArgs(await maliciousContract.getAddress(), 'REENTRANCY'); }); it('should pass when reentered by URD and the URD has REENTRANCY permission', async () => { const URDDummy = await new Reentrancy__factory(context.mainController).deploy( - context.keyManager.address, + await context.keyManager.getAddress(), ); const setDataPayload = context.universalProfile.interface.encodeFunctionData( @@ -224,16 +235,16 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - URDDummy.address.substring(2), + (await URDDummy.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedCalls'] + - URDDummy.address.substring(2), + (await URDDummy.getAddress()).substring(2), ], [ - URDDummy.address, + await URDDummy.getAddress(), combinePermissions(PERMISSIONS.TRANSFERVALUE, PERMISSIONS.REENTRANCY), combineAllowedCalls( [combineCallTypes(CALLTYPE.VALUE, CALLTYPE.CALL)], - [URDDummy.address], + [await URDDummy.getAddress()], ['0xffffffff'], ['0xffffffff'], ), @@ -245,8 +256,8 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( const transferPayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - URDDummy.address, - ethers.utils.parseEther('1'), + await URDDummy.getAddress(), + parseEther('1'), '0x', ]); @@ -256,17 +267,23 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( await URDDummy.loadPayload(executePayload); - const initialAccountBalance = await provider.getBalance(context.universalProfile.address); - const initialAttackerContractBalance = await provider.getBalance(maliciousContract.address); + const initialAccountBalance = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const initialAttackerContractBalance = await provider.getBalance( + await maliciousContract.getAddress(), + ); await context.keyManager.connect(context.mainController).execute(transferPayload); - const newAccountBalance = await provider.getBalance(context.universalProfile.address); - const newAttackerContractBalance = await provider.getBalance(URDDummy.address); + const newAccountBalance = await provider.getBalance( + await context.universalProfile.getAddress(), + ); + const newAttackerContractBalance = await provider.getBalance(await URDDummy.getAddress()); - expect(newAccountBalance).to.equal(initialAccountBalance.sub(ethers.utils.parseEther('2'))); + expect(newAccountBalance).to.equal(initialAccountBalance - parseEther('2')); expect(newAttackerContractBalance).to.equal( - initialAttackerContractBalance.add(ethers.utils.parseEther('2')), + initialAttackerContractBalance + parseEther('2'), ); }); @@ -274,12 +291,8 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( const universalReceiverDelegateDataUpdater = await new UniversalReceiverDelegateDataUpdater__factory(context.mainController).deploy(); - const randomHardcodedKey = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('some random data key'), - ); - const randomHardcodedValue = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes('some random text for the data value'), - ); + const randomHardcodedKey = keccak256(toUtf8Bytes('some random data key')); + const randomHardcodedValue = hexlify(toUtf8Bytes('some random text for the data value')); const setDataPayload = context.universalProfile.interface.encodeFunctionData( 'setDataBatch', @@ -287,12 +300,12 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - universalReceiverDelegateDataUpdater.address.substring(2), + (await universalReceiverDelegateDataUpdater.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:AllowedERC725YDataKeys'] + - universalReceiverDelegateDataUpdater.address.substring(2), + (await universalReceiverDelegateDataUpdater.getAddress()).substring(2), ], [ - universalReceiverDelegateDataUpdater.address, + await universalReceiverDelegateDataUpdater.getAddress(), combinePermissions(PERMISSIONS.SETDATA, PERMISSIONS.REENTRANCY), encodeCompactBytesArray([randomHardcodedKey]), ], @@ -304,18 +317,13 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( const universalReceiverDelegatePayload = universalReceiverDelegateDataUpdater.interface.encodeFunctionData( 'universalReceiverDelegate', - [ - ethers.constants.AddressZero, - 0, - LSP1_TYPE_IDS.LSP7Tokens_SenderNotification, - '0xcafecafecafecafe', - ], + [ZeroAddress, 0, LSP1_TYPE_IDS.LSP7Tokens_SenderNotification, '0xcafecafecafecafe'], ); const executePayload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - universalReceiverDelegateDataUpdater.address, - ethers.utils.parseEther('0'), + await universalReceiverDelegateDataUpdater.getAddress(), + parseEther('0'), universalReceiverDelegatePayload, ]); @@ -333,20 +341,20 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( before(async () => { secondReentrant = await new SecondToCallLSP6__factory(context.accounts[0]).deploy( - context.keyManager.address, + await context.keyManager.getAddress(), ); firstReentrant = await new FirstToCallLSP6__factory(context.accounts[0]).deploy( - context.keyManager.address, - secondReentrant.address, + await context.keyManager.getAddress(), + await secondReentrant.getAddress(), ); const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + context.mainController.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - firstReentrant.address.substring(2), + (await firstReentrant.getAddress()).substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - secondReentrant.address.substring(2), + (await secondReentrant.getAddress()).substring(2), ]; const permissionValues = [ @@ -367,14 +375,14 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - firstReentrant.address, + await firstReentrant.getAddress(), 0, firstTargetSelector, ]); await expect(context.keyManager.connect(context.mainController).execute(payload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(secondReentrant.address, 'REENTRANCY'); + .withArgs(await secondReentrant.getAddress(), 'REENTRANCY'); }); }); @@ -382,7 +390,7 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( before(async () => { const permissionKeys = [ ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - secondReentrant.address.substring(2), + (await secondReentrant.getAddress()).substring(2), ]; const permissionValues = [ @@ -398,16 +406,14 @@ export const shouldBehaveLikeLSP6ReentrancyScenarios = ( const payload = context.universalProfile.interface.encodeFunctionData('execute', [ OPERATION_TYPES.CALL, - firstReentrant.address, + await firstReentrant.getAddress(), 0, firstTargetSelector, ]); await context.keyManager.connect(context.mainController).execute(payload); - const result = await context.universalProfile['getData(bytes32)']( - ethers.constants.HashZero, - ); + const result = await context.universalProfile['getData(bytes32)'](ZeroHash); expect(result).to.equal('0xaabbccdd'); }); diff --git a/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecute.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecute.test.ts similarity index 77% rename from tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecute.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecute.test.ts index 848bcd970..54ed3b634 100644 --- a/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecute.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecute.test.ts @@ -1,9 +1,6 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber } from 'ethers'; - // constants import { ERC725YDataKeys } from '../../../constants'; @@ -27,16 +24,17 @@ import { loadTestCase, RelayCallParams, } from './reentrancyHelpers'; +import { provider } from '../../utils/helpers'; export const testSingleExecuteRelayCallToSingleExecute = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; let reentrancyContext: ReentrancyContext; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); }); @@ -44,8 +42,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( let relayCallParams: RelayCallParams; before(async () => { const executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'TRANSFERVALUE', ); @@ -66,8 +64,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'TRANSFERVALUE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -81,7 +79,10 @@ export const testSingleExecuteRelayCallToSingleExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -90,8 +91,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'TRANSFERVALUE', transferValueTestCases.NoCallsAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -111,13 +112,13 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'TRANSFERVALUE', transferValueTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.keyManager .connect(reentrancyContext.caller) @@ -128,15 +129,13 @@ export const testSingleExecuteRelayCallToSingleExecute = ( relayCallParams.payload, ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.reentrantContract.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.reentrantContract.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -144,8 +143,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( let relayCallParams: RelayCallParams; before(async () => { const executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'SETDATA', ); @@ -166,8 +165,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'SETDATA', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -181,7 +180,10 @@ export const testSingleExecuteRelayCallToSingleExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -190,8 +192,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'SETDATA', setDataTestCases.NoERC725YDataKeysAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -211,8 +213,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'SETDATA', setDataTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager @@ -224,8 +226,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( relayCallParams.payload, ); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -235,8 +237,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( let relayCallParams: RelayCallParams; before(async () => { const executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'ADDCONTROLLER', ); @@ -253,8 +255,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'ADDCONTROLLER', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -268,7 +270,10 @@ export const testSingleExecuteRelayCallToSingleExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -277,8 +282,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'ADDCONTROLLER', addPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager @@ -306,8 +311,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( let relayCallParams: RelayCallParams; before(async () => { const executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'EDITPERMISSIONS', ); @@ -324,8 +329,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'EDITPERMISSIONS', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -339,7 +344,10 @@ export const testSingleExecuteRelayCallToSingleExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -348,8 +356,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'EDITPERMISSIONS', editPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager @@ -376,8 +384,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( let relayCallParams: RelayCallParams; before(async () => { const executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'ADDUNIVERSALRECEIVERDELEGATE', ); @@ -394,8 +402,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -409,7 +417,10 @@ export const testSingleExecuteRelayCallToSingleExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -418,8 +429,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', addUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager @@ -447,8 +458,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( let relayCallParams: RelayCallParams; before(async () => { const executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'CHANGEUNIVERSALRECEIVERDELEGATE', ); @@ -465,8 +476,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -480,7 +491,10 @@ export const testSingleExecuteRelayCallToSingleExecute = ( ), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -489,8 +503,8 @@ export const testSingleExecuteRelayCallToSingleExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', changeUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager diff --git a/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecuteRelayCall.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecuteRelayCall.test.ts similarity index 89% rename from tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecuteRelayCall.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecuteRelayCall.test.ts index 35d4b41ed..73f8a3f64 100644 --- a/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecuteRelayCall.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteRelayCallToSingleExecuteRelayCall.test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; import { SingleReentrancyRelayer__factory, UniversalProfile__factory } from '../../../types'; // constants @@ -28,9 +28,10 @@ import { loadTestCase, RelayCallParams, } from './reentrancyHelpers'; +import { provider } from '../../utils/helpers'; export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; @@ -38,16 +39,16 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( let executePayload: BytesLike; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); const reentrantCallPayload = new SingleReentrancyRelayer__factory().interface.encodeFunctionData('relayCallThatReenters', [ - context.keyManager.address, + await context.keyManager.getAddress(), ]); executePayload = new UniversalProfile__factory().interface.encodeFunctionData('execute', [ 0, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), 0, reentrantCallPayload, ]); @@ -84,7 +85,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -108,7 +109,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( transferValueTestCases.NoCallsAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -129,12 +130,12 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( transferValueTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.keyManager .connect(reentrancyContext.caller) @@ -145,15 +146,13 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( relayCallParams.payload, ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.singleReentarncyRelayer.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.singleReentarncyRelayer.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -188,7 +187,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -212,7 +211,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( setDataTestCases.NoERC725YDataKeysAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -233,7 +232,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( setDataTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager @@ -245,8 +244,8 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( relayCallParams.payload, ); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -279,7 +278,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -303,7 +302,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( addPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager @@ -354,7 +353,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -378,7 +377,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( editPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager @@ -428,7 +427,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -452,7 +451,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( addUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager @@ -503,7 +502,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -527,7 +526,7 @@ export const testSingleExecuteRelayCallToSingleExecuteRelayCall = ( changeUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager diff --git a/tests/Reentrancy/LSP6/SingleExecuteToBatchExecute.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToBatchExecute.test.ts similarity index 72% rename from tests/Reentrancy/LSP6/SingleExecuteToBatchExecute.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToBatchExecute.test.ts index b3c5a6d18..618935544 100644 --- a/tests/Reentrancy/LSP6/SingleExecuteToBatchExecute.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToBatchExecute.test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; // constants import { ERC725YDataKeys } from '../../../constants'; @@ -25,16 +25,17 @@ import { generateExecutePayload, loadTestCase, } from './reentrancyHelpers'; +import { provider } from '../../utils/helpers'; export const testSingleExecuteToBatchExecute = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; let reentrancyContext: ReentrancyContext; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); }); @@ -42,8 +43,8 @@ export const testSingleExecuteToBatchExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'TRANSFERVALUE', ); }); @@ -58,15 +59,18 @@ export const testSingleExecuteToBatchExecute = ( 'TRANSFERVALUE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.keyManager.connect(reentrancyContext.caller).executeBatch([0], [executePayload]), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -75,8 +79,8 @@ export const testSingleExecuteToBatchExecute = ( 'TRANSFERVALUE', transferValueTestCases.NoCallsAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -89,27 +93,25 @@ export const testSingleExecuteToBatchExecute = ( 'TRANSFERVALUE', transferValueTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.keyManager .connect(reentrancyContext.caller) .executeBatch([0], [executePayload]); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.reentrantContract.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.reentrantContract.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -117,8 +119,8 @@ export const testSingleExecuteToBatchExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'SETDATA', ); }); @@ -133,15 +135,18 @@ export const testSingleExecuteToBatchExecute = ( 'SETDATA', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.keyManager.connect(reentrancyContext.caller).executeBatch([0], [executePayload]), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -150,8 +155,8 @@ export const testSingleExecuteToBatchExecute = ( 'SETDATA', setDataTestCases.NoERC725YDataKeysAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -164,16 +169,16 @@ export const testSingleExecuteToBatchExecute = ( 'SETDATA', setDataTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager .connect(reentrancyContext.caller) .executeBatch([0], [executePayload]); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -183,8 +188,8 @@ export const testSingleExecuteToBatchExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'ADDCONTROLLER', ); }); @@ -195,15 +200,18 @@ export const testSingleExecuteToBatchExecute = ( 'ADDCONTROLLER', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.keyManager.connect(reentrancyContext.caller).executeBatch([0], [executePayload]), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -212,8 +220,8 @@ export const testSingleExecuteToBatchExecute = ( 'ADDCONTROLLER', addPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager @@ -236,8 +244,8 @@ export const testSingleExecuteToBatchExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'EDITPERMISSIONS', ); }); @@ -248,15 +256,18 @@ export const testSingleExecuteToBatchExecute = ( 'EDITPERMISSIONS', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.keyManager.connect(reentrancyContext.caller).executeBatch([0], [executePayload]), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -265,8 +276,8 @@ export const testSingleExecuteToBatchExecute = ( 'EDITPERMISSIONS', editPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager @@ -288,8 +299,8 @@ export const testSingleExecuteToBatchExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'ADDUNIVERSALRECEIVERDELEGATE', ); }); @@ -300,15 +311,18 @@ export const testSingleExecuteToBatchExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.keyManager.connect(reentrancyContext.caller).executeBatch([0], [executePayload]), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -317,8 +331,8 @@ export const testSingleExecuteToBatchExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', addUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager @@ -341,8 +355,8 @@ export const testSingleExecuteToBatchExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'CHANGEUNIVERSALRECEIVERDELEGATE', ); }); @@ -353,15 +367,18 @@ export const testSingleExecuteToBatchExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( context.keyManager.connect(reentrancyContext.caller).executeBatch([0], [executePayload]), ) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -370,8 +387,8 @@ export const testSingleExecuteToBatchExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', changeUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager diff --git a/tests/Reentrancy/LSP6/SingleExecuteToBatchExecuteRelayCall.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToBatchExecuteRelayCall.test.ts similarity index 87% rename from tests/Reentrancy/LSP6/SingleExecuteToBatchExecuteRelayCall.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToBatchExecuteRelayCall.test.ts index 6224e6cc4..993208a1a 100644 --- a/tests/Reentrancy/LSP6/SingleExecuteToBatchExecuteRelayCall.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToBatchExecuteRelayCall.test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; import { SingleReentrancyRelayer__factory, UniversalProfile__factory } from '../../../types'; // constants @@ -26,9 +26,10 @@ import { generateBatchRelayPayload, loadTestCase, } from './reentrancyHelpers'; +import { provider } from '../../utils/helpers'; export const testSingleExecuteToBatchExecuteRelayCall = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; @@ -36,16 +37,16 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( let executePayload: BytesLike; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); const reentrantCallPayload = new SingleReentrancyRelayer__factory().interface.encodeFunctionData('relayCallThatReenters', [ - context.keyManager.address, + await context.keyManager.getAddress(), ]); executePayload = new UniversalProfile__factory().interface.encodeFunctionData('execute', [ 0, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), 0, reentrantCallPayload, ]); @@ -75,7 +76,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -90,7 +91,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( transferValueTestCases.NoCallsAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -104,24 +105,22 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( transferValueTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.batchReentarncyRelayer.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.batchReentarncyRelayer.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -149,7 +148,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -164,7 +163,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( setDataTestCases.NoERC725YDataKeysAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect( @@ -178,13 +177,13 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( setDataTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -210,7 +209,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -225,7 +224,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( addPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -262,7 +261,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -277,7 +276,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( editPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -313,7 +312,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -328,7 +327,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( addUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -365,7 +364,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -380,7 +379,7 @@ export const testSingleExecuteToBatchExecuteRelayCall = ( changeUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.batchReentarncyRelayer.address, + await reentrancyContext.batchReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); diff --git a/tests/Reentrancy/LSP6/SingleExecuteToSingleExecute.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToSingleExecute.test.ts similarity index 71% rename from tests/Reentrancy/LSP6/SingleExecuteToSingleExecute.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToSingleExecute.test.ts index 43266d498..91af1a13b 100644 --- a/tests/Reentrancy/LSP6/SingleExecuteToSingleExecute.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToSingleExecute.test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike } from 'ethers'; // constants import { ERC725YDataKeys } from '../../../constants'; @@ -25,16 +25,17 @@ import { generateExecutePayload, loadTestCase, } from './reentrancyHelpers'; +import { provider } from '../../utils/helpers'; export const testSingleExecuteToSingleExecute = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; let reentrancyContext: ReentrancyContext; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(ethers.parseEther('10')); reentrancyContext = await buildReentrancyContext(context); }); @@ -42,8 +43,8 @@ export const testSingleExecuteToSingleExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'TRANSFERVALUE', ); }); @@ -58,13 +59,16 @@ export const testSingleExecuteToSingleExecute = ( 'TRANSFERVALUE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -73,8 +77,8 @@ export const testSingleExecuteToSingleExecute = ( 'TRANSFERVALUE', transferValueTestCases.NoCallsAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -87,25 +91,23 @@ export const testSingleExecuteToSingleExecute = ( 'TRANSFERVALUE', transferValueTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('10'), + ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + ethers.parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.reentrantContract.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.reentrantContract.getAddress()), + ).to.equal(ethers.parseEther('1')); }); }); @@ -113,8 +115,8 @@ export const testSingleExecuteToSingleExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'SETDATA', ); }); @@ -129,13 +131,16 @@ export const testSingleExecuteToSingleExecute = ( 'SETDATA', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -144,8 +149,8 @@ export const testSingleExecuteToSingleExecute = ( 'SETDATA', setDataTestCases.NoERC725YDataKeysAllowed, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect( @@ -158,14 +163,14 @@ export const testSingleExecuteToSingleExecute = ( 'SETDATA', setDataTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -175,8 +180,8 @@ export const testSingleExecuteToSingleExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'ADDCONTROLLER', ); }); @@ -187,13 +192,16 @@ export const testSingleExecuteToSingleExecute = ( 'ADDCONTROLLER', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -202,8 +210,8 @@ export const testSingleExecuteToSingleExecute = ( 'ADDCONTROLLER', addPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -224,8 +232,8 @@ export const testSingleExecuteToSingleExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'EDITPERMISSIONS', ); }); @@ -236,13 +244,16 @@ export const testSingleExecuteToSingleExecute = ( 'EDITPERMISSIONS', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -251,8 +262,8 @@ export const testSingleExecuteToSingleExecute = ( 'EDITPERMISSIONS', editPermissionsTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -272,8 +283,8 @@ export const testSingleExecuteToSingleExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'ADDUNIVERSALRECEIVERDELEGATE', ); }); @@ -284,13 +295,16 @@ export const testSingleExecuteToSingleExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -299,8 +313,8 @@ export const testSingleExecuteToSingleExecute = ( 'ADDUNIVERSALRECEIVERDELEGATE', addUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -321,8 +335,8 @@ export const testSingleExecuteToSingleExecute = ( let executePayload: BytesLike; before(async () => { executePayload = generateExecutePayload( - context.keyManager.address, - reentrancyContext.reentrantContract.address, + await context.keyManager.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), 'CHANGEUNIVERSALRECEIVERDELEGATE', ); }); @@ -333,13 +347,16 @@ export const testSingleExecuteToSingleExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', testCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) .to.be.revertedWithCustomError(context.keyManager, 'NotAuthorised') - .withArgs(reentrancyContext.reentrantContract.address, testCase.missingPermission); + .withArgs( + await reentrancyContext.reentrantContract.getAddress(), + testCase.missingPermission, + ); }); }); @@ -348,8 +365,8 @@ export const testSingleExecuteToSingleExecute = ( 'CHANGEUNIVERSALRECEIVERDELEGATE', changeUniversalReceiverDelegateTestCases.ValidCase, context, - reentrancyContext.reentrantContract.address, - reentrancyContext.reentrantContract.address, + await reentrancyContext.reentrantContract.getAddress(), + await reentrancyContext.reentrantContract.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); diff --git a/tests/Reentrancy/LSP6/SingleExecuteToSingleExecuteRelayCall.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToSingleExecuteRelayCall.test.ts similarity index 87% rename from tests/Reentrancy/LSP6/SingleExecuteToSingleExecuteRelayCall.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToSingleExecuteRelayCall.test.ts index 88101ffcb..51c51ee03 100644 --- a/tests/Reentrancy/LSP6/SingleExecuteToSingleExecuteRelayCall.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/SingleExecuteToSingleExecuteRelayCall.test.ts @@ -1,8 +1,7 @@ import { expect } from 'chai'; -import { ethers } from 'hardhat'; -//types -import { BigNumber, BytesLike } from 'ethers'; +// types +import { BytesLike, hexlify, keccak256, parseEther, toUtf8Bytes } from 'ethers'; import { SingleReentrancyRelayer__factory, UniversalProfile__factory } from '../../../types'; // constants @@ -26,9 +25,10 @@ import { generateSingleRelayPayload, loadTestCase, } from './reentrancyHelpers'; +import { provider } from '../../utils/helpers'; export const testSingleExecuteToSingleExecuteRelayCall = ( - buildContext: (initialFunding?: BigNumber) => Promise, + buildContext: (initialFunding?: bigint) => Promise, buildReentrancyContext: (context: LSP6TestContext) => Promise, ) => { let context: LSP6TestContext; @@ -36,16 +36,16 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( let executePayload: BytesLike; before(async () => { - context = await buildContext(ethers.utils.parseEther('10')); + context = await buildContext(parseEther('10')); reentrancyContext = await buildReentrancyContext(context); const reentrantCallPayload = new SingleReentrancyRelayer__factory().interface.encodeFunctionData('relayCallThatReenters', [ - context.keyManager.address, + await context.keyManager.getAddress(), ]); executePayload = new UniversalProfile__factory().interface.encodeFunctionData('execute', [ 0, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), 0, reentrantCallPayload, ]); @@ -75,7 +75,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -90,7 +90,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( transferValueTestCases.NoCallsAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -104,24 +104,22 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( transferValueTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('10')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + parseEther('10'), + ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); - expect( - await context.universalProfile.provider.getBalance(context.universalProfile.address), - ).to.equal(ethers.utils.parseEther('9')); + expect(await provider.getBalance(await context.universalProfile.getAddress())).to.equal( + parseEther('9'), + ); expect( - await context.universalProfile.provider.getBalance( - reentrancyContext.singleReentarncyRelayer.address, - ), - ).to.equal(ethers.utils.parseEther('1')); + await provider.getBalance(await reentrancyContext.singleReentarncyRelayer.getAddress()), + ).to.equal(parseEther('1')); }); }); @@ -149,7 +147,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -164,7 +162,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( setDataTestCases.NoERC725YDataKeysAllowed, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect( @@ -178,13 +176,13 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( setDataTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); - const hardcodedKey = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); - const hardcodedValue = ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedKey = keccak256(toUtf8Bytes('SomeRandomTextUsed')); + const hardcodedValue = hexlify(toUtf8Bytes('SomeRandomTextUsed')); expect(await context.universalProfile.getData(hardcodedKey)).to.equal(hardcodedValue); }); @@ -210,7 +208,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -225,7 +223,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( addPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -262,7 +260,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -277,7 +275,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( editPermissionsTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -313,7 +311,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -328,7 +326,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( addUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); @@ -365,7 +363,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( testCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await expect(context.keyManager.connect(reentrancyContext.caller).execute(executePayload)) @@ -380,7 +378,7 @@ export const testSingleExecuteToSingleExecuteRelayCall = ( changeUniversalReceiverDelegateTestCases.ValidCase, context, reentrancyContext.reentrantSigner.address, - reentrancyContext.singleReentarncyRelayer.address, + await reentrancyContext.singleReentarncyRelayer.getAddress(), ); await context.keyManager.connect(reentrancyContext.caller).execute(executePayload); diff --git a/tests/Reentrancy/LSP6/reentrancyHelpers.ts b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/reentrancyHelpers.ts similarity index 90% rename from tests/Reentrancy/LSP6/reentrancyHelpers.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/LSP6/reentrancyHelpers.ts index b32efb594..ed2de317e 100644 --- a/tests/Reentrancy/LSP6/reentrancyHelpers.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/LSP6/reentrancyHelpers.ts @@ -1,8 +1,8 @@ import { ethers } from 'hardhat'; -//types -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, BytesLike, Wallet } from 'ethers'; +// types +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { BytesLike, Wallet } from 'ethers'; import { ReentrantContract__factory, ReentrantContract, @@ -16,7 +16,8 @@ import { } from '../../../types'; // constants -import { ERC725YDataKeys, ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '../../../constants'; +import { ERC725YDataKeys } from '../../../constants'; +import { ALL_PERMISSIONS, PERMISSIONS, CALLTYPE } from '@lukso/lsp6-contracts'; // setup import { LSP6TestContext } from '../../utils/context'; @@ -69,7 +70,7 @@ export type ReentrancyContext = { export type RelayCallParams = { signature: BytesLike; - nonce: BigNumber; + nonce: bigint; validityTimestamps: number | BytesLike; payload: BytesLike; }; @@ -347,7 +348,7 @@ export const buildReentrancyContext = async (context: LSP6TestContext) => { const reentrantContract = await new ReentrantContract__factory(owner).deploy( newControllerAddress, - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')), newURDAddress, ); @@ -370,7 +371,11 @@ export const buildReentrancyContext = async (context: LSP6TestContext) => { combineAllowedCalls( // allow controller to call the 3 x addresses listed below [CALLTYPE.CALL, CALLTYPE.CALL, CALLTYPE.CALL], - [reentrantContract.address, singleReentarncyRelayer.address, batchReentarncyRelayer.address], + [ + await reentrantContract.getAddress(), + await singleReentarncyRelayer.getAddress(), + await batchReentarncyRelayer.getAddress(), + ], ['0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff'], ), @@ -378,7 +383,11 @@ export const buildReentrancyContext = async (context: LSP6TestContext) => { combineAllowedCalls( // allow controller to call the 3 x addresses listed below [CALLTYPE.CALL, CALLTYPE.CALL, CALLTYPE.CALL], - [reentrantContract.address, singleReentarncyRelayer.address, batchReentarncyRelayer.address], + [ + await reentrantContract.getAddress(), + await singleReentarncyRelayer.getAddress(), + await batchReentarncyRelayer.getAddress(), + ], ['0xffffffff', '0xffffffff', '0xffffffff'], ['0xffffffff', '0xffffffff', '0xffffffff'], ), @@ -386,7 +395,7 @@ export const buildReentrancyContext = async (context: LSP6TestContext) => { await setupKeyManager(context, permissionKeys, permissionValues); - const randomLSP1TypeId = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')); + const randomLSP1TypeId = ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')); return { owner, @@ -407,7 +416,7 @@ export const generateRelayCall = async ( payload: BytesLike, signer: Wallet, ) => { - const nonce = await keyManager.callStatic.getNonce(signer.address, 1); + const nonce = await keyManager.getNonce(signer.address, 1); const validityTimestamps = 0; @@ -445,15 +454,15 @@ export const generateSingleRelayPayload = async ( case 'TRANSFERVALUE': payload = universalProfile.interface.encodeFunctionData('execute', [ 0, - reentrancyRelayer.address, - ethers.utils.parseEther('1'), + await reentrancyRelayer.getAddress(), + ethers.parseEther('1'), '0x', ]); break; case 'SETDATA': payload = universalProfile.interface.encodeFunctionData('setData', [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), + ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')), + ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')), ]); break; case 'ADDCONTROLLER': @@ -471,14 +480,14 @@ export const generateSingleRelayPayload = async ( case 'ADDUNIVERSALRECEIVERDELEGATE': payload = universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), newURDAddress, ]); break; case 'CHANGEUNIVERSALRECEIVERDELEGATE': payload = universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), '0x', ]); break; @@ -487,7 +496,7 @@ export const generateSingleRelayPayload = async ( break; } - const nonce = await keyManager.callStatic.getNonce(reentrantSigner.address, 1); + const nonce = await keyManager.getNonce(reentrantSigner.address, 1); const validityTimestamps = 0; @@ -518,15 +527,15 @@ export const generateBatchRelayPayload = async ( case 'TRANSFERVALUE': payload = universalProfile.interface.encodeFunctionData('execute', [ 0, - reentrancyRelayer.address, - ethers.utils.parseEther('1'), + await reentrancyRelayer.getAddress(), + ethers.parseEther('1'), '0x', ]); break; case 'SETDATA': payload = universalProfile.interface.encodeFunctionData('setData', [ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), - ethers.utils.hexlify(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), + ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed')), + ethers.hexlify(ethers.toUtf8Bytes('SomeRandomTextUsed')), ]); break; case 'ADDCONTROLLER': @@ -544,14 +553,14 @@ export const generateBatchRelayPayload = async ( case 'ADDUNIVERSALRECEIVERDELEGATE': payload = universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), newURDAddress, ]); break; case 'CHANGEUNIVERSALRECEIVERDELEGATE': payload = universalProfile.interface.encodeFunctionData('setData', [ ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), + ethers.keccak256(ethers.toUtf8Bytes('RandomLSP1TypeId')).substring(2, 42), '0x', ]); break; @@ -560,7 +569,7 @@ export const generateBatchRelayPayload = async ( break; } - const nonce = await keyManager.callStatic.getNonce(reentrantSigner.address, 1); + const nonce = await keyManager.getNonce(reentrantSigner.address, 1); const validityTimestamps = 0; @@ -644,9 +653,7 @@ export const loadTestCase = async ( permissionValues = [ testCase.permissions, (testCase as SetDataTestCase).allowedERC725YDataKeys - ? encodeCompactBytesArray([ - ethers.utils.keccak256(ethers.utils.toUtf8Bytes('SomeRandomTextUsed')), - ]) + ? encodeCompactBytesArray([ethers.keccak256(ethers.toUtf8Bytes('SomeRandomTextUsed'))]) : '0x', ]; break; diff --git a/tests/Reentrancy/Reentrancy.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/Reentrancy.test.ts similarity index 87% rename from tests/Reentrancy/Reentrancy.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/Reentrancy.test.ts index 9ab0f7cb0..ad88f6506 100644 --- a/tests/Reentrancy/Reentrancy.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/Reentrancy.test.ts @@ -1,4 +1,3 @@ -import { BigNumber } from 'ethers'; import { ethers } from 'hardhat'; import { UniversalProfile__factory, LSP6KeyManager__factory } from '../../types'; @@ -9,7 +8,7 @@ import { shouldBehaveLikeLSP6ReentrancyScenarios } from './LSP6/LSP6Reentrancy.t import { shouldBehaveLikeLSP20WithLSP6ReentrancyScenarios } from './LSP20/LSP20WithLSP6Reentrancy.test'; describe('Reentrancy scenarios with constructor', () => { - const buildTestContext = async (initialFunding?: BigNumber): Promise => { + const buildTestContext = async (initialFunding?: bigint): Promise => { const accounts = await ethers.getSigners(); const mainController = accounts[0]; @@ -21,7 +20,7 @@ describe('Reentrancy scenarios with constructor', () => { ); const keyManager = await new LSP6KeyManager__factory(mainController).deploy( - universalProfile.address, + await universalProfile.getAddress(), ); return { accounts, mainController, universalProfile, keyManager, initialFunding }; diff --git a/tests/Reentrancy/ReentrancyInit.test.ts b/packages/lsp-smart-contracts/tests/Reentrancy/ReentrancyInit.test.ts similarity index 73% rename from tests/Reentrancy/ReentrancyInit.test.ts rename to packages/lsp-smart-contracts/tests/Reentrancy/ReentrancyInit.test.ts index 2a3c0a33e..584a043ca 100644 --- a/tests/Reentrancy/ReentrancyInit.test.ts +++ b/packages/lsp-smart-contracts/tests/Reentrancy/ReentrancyInit.test.ts @@ -1,4 +1,3 @@ -import { BigNumber } from 'ethers'; import { ethers } from 'hardhat'; import { UniversalProfileInit__factory, LSP6KeyManagerInit__factory } from '../../types'; @@ -10,17 +9,17 @@ import { shouldBehaveLikeLSP6ReentrancyScenarios } from './LSP6/LSP6Reentrancy.t import { shouldBehaveLikeLSP20WithLSP6ReentrancyScenarios } from './LSP20/LSP20WithLSP6Reentrancy.test'; describe('Reentrancy scenarios with proxy', () => { - const buildProxyTestContext = async (initialFunding?: BigNumber): Promise => { + const buildProxyTestContext = async (initialFunding?: bigint): Promise => { const accounts = await ethers.getSigners(); const mainController = accounts[0]; const baseUP = await new UniversalProfileInit__factory(mainController).deploy(); - const upProxy = await deployProxy(baseUP.address, mainController); - const universalProfile = await baseUP.attach(upProxy); + const upProxy = await deployProxy(await baseUP.getAddress(), mainController); + const universalProfile = (await baseUP.attach(upProxy)) as UniversalProfileInit; const baseKM = await new LSP6KeyManagerInit__factory(mainController).deploy(); - const kmProxy = await deployProxy(baseKM.address, mainController); - const keyManager = await baseKM.attach(kmProxy); + const kmProxy = await deployProxy(await baseKM.getAddress(), mainController); + const keyManager = (await baseKM.attach(kmProxy)) as unknown as LSP6KeyManagerInit; return { accounts, mainController, universalProfile, keyManager, initialFunding }; }; @@ -30,13 +29,13 @@ describe('Reentrancy scenarios with proxy', () => { value: context.initialFunding, }); - await context.keyManager['initialize(address)'](context.universalProfile.address); + await context.keyManager['initialize(address)'](await context.universalProfile.getAddress()); return context; }; describe('when testing Reentrancy scenarios for LSP6', () => { - shouldBehaveLikeLSP6ReentrancyScenarios(async (initialFunding?: BigNumber) => { + shouldBehaveLikeLSP6ReentrancyScenarios(async (initialFunding?: bigint) => { const context = await buildProxyTestContext(initialFunding); await initializeProxies(context); return context; @@ -44,7 +43,7 @@ describe('Reentrancy scenarios with proxy', () => { }); describe('when testing Reentrancy scenarios for LSP20 + LSP6', () => { - shouldBehaveLikeLSP20WithLSP6ReentrancyScenarios(async (initialFunding?: BigNumber) => { + shouldBehaveLikeLSP20WithLSP6ReentrancyScenarios(async (initialFunding?: bigint) => { const context = await buildProxyTestContext(initialFunding); await initializeProxies(context); return context; diff --git a/tests/UniversalProfile.behaviour.ts b/packages/lsp-smart-contracts/tests/UniversalProfile.behaviour.ts similarity index 82% rename from tests/UniversalProfile.behaviour.ts rename to packages/lsp-smart-contracts/tests/UniversalProfile.behaviour.ts index b205b0ce5..6af61f8f8 100644 --- a/tests/UniversalProfile.behaviour.ts +++ b/packages/lsp-smart-contracts/tests/UniversalProfile.behaviour.ts @@ -1,10 +1,9 @@ import { expect } from 'chai'; import { ethers, network } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; // types import { - UniversalProfile, GenericExecutor__factory, ERC1271MaliciousMock__factory, UniversalReceiverDelegateDataLYX__factory, @@ -13,20 +12,15 @@ import { EmitEventExtension__factory, OwnerWithURD__factory, OwnerWithURD, -} from '../types'; + UniversalProfile, +} from '../../../types'; // helpers import { LSP1_HOOK_PLACEHOLDER, abiCoder, getRandomAddresses } from './utils/helpers'; // constants -import { - ERC1271_VALUES, - ERC725YDataKeys, - INTERFACE_IDS, - LSP1_TYPE_IDS, - OPERATION_TYPES, - SupportedStandards, -} from '../constants'; +import { ERC725YDataKeys, INTERFACE_IDS, LSP1_TYPE_IDS, SupportedStandards } from '../constants'; +import { ERC1271_VALUES, OPERATION_TYPES } from '@lukso/lsp0-contracts'; export type LSP3TestContext = { accounts: SignerWithAddress[]; @@ -39,19 +33,24 @@ export const shouldBehaveLikeLSP3 = ( ) => { let context: LSP3TestContext; + let universalProfileAddress: string; + before(async () => { context = await buildContext(100); + universalProfileAddress = await context.universalProfile.getAddress(); }); describe('when using `isValidSignature()` from ERC1271', () => { - afterEach(async () => { + beforeEach(async () => { context = await buildContext(100); + universalProfileAddress = await context.universalProfile.getAddress(); }); + it('should verify signature from owner', async () => { const signer = context.deployParams.owner; const dataToSign = '0xcafecafe'; - const messageHash = ethers.utils.hashMessage(dataToSign); + const messageHash = ethers.hashMessage(dataToSign); const signature = await signer.signMessage(dataToSign); const result = await context.universalProfile.isValidSignature(messageHash, signature); @@ -62,7 +61,7 @@ export const shouldBehaveLikeLSP3 = ( const signer = context.accounts[1]; const dataToSign = '0xcafecafe'; - const messageHash = ethers.utils.hashMessage(dataToSign); + const messageHash = ethers.hashMessage(dataToSign); const signature = await signer.signMessage(dataToSign); const result = await context.universalProfile.isValidSignature(messageHash, signature); @@ -73,18 +72,19 @@ export const shouldBehaveLikeLSP3 = ( const signer = context.accounts[1]; const genericExecutor = await new GenericExecutor__factory(context.accounts[0]).deploy(); + const genericExecutorAddress = await genericExecutor.getAddress(); await context.universalProfile .connect(context.accounts[0]) - .transferOwnership(genericExecutor.address); + .transferOwnership(genericExecutorAddress); const acceptOwnershipPayload = context.universalProfile.interface.encodeFunctionData('acceptOwnership'); - await genericExecutor.call(context.universalProfile.address, 0, acceptOwnershipPayload); + await genericExecutor.call(universalProfileAddress, 0, acceptOwnershipPayload); const dataToSign = '0xcafecafe'; - const messageHash = ethers.utils.hashMessage(dataToSign); + const messageHash = ethers.hashMessage(dataToSign); const signature = await signer.signMessage(dataToSign); const result = await context.universalProfile.isValidSignature(messageHash, signature); @@ -97,22 +97,19 @@ export const shouldBehaveLikeLSP3 = ( const maliciousERC1271Wallet = await new ERC1271MaliciousMock__factory( context.accounts[0], ).deploy(); + const maliciousERC1271WalletAddress = await maliciousERC1271Wallet.getAddress(); await context.universalProfile .connect(context.accounts[0]) - .transferOwnership(maliciousERC1271Wallet.address); + .transferOwnership(maliciousERC1271WalletAddress); const acceptOwnershipPayload = context.universalProfile.interface.encodeFunctionData('acceptOwnership'); - await maliciousERC1271Wallet.call( - context.universalProfile.address, - 0, - acceptOwnershipPayload, - ); + await maliciousERC1271Wallet.call(universalProfileAddress, 0, acceptOwnershipPayload); const dataToSign = '0xcafecafe'; - const messageHash = ethers.utils.hashMessage(dataToSign); + const messageHash = ethers.hashMessage(dataToSign); const signature = await signer.signMessage(dataToSign); const result = await context.universalProfile.isValidSignature(messageHash, signature); @@ -121,7 +118,7 @@ export const shouldBehaveLikeLSP3 = ( it('should return failValue when providing an invalid length signature', async () => { const data = '0xcafecafe'; - const messageHash = ethers.utils.hashMessage(data); + const messageHash = ethers.hashMessage(data); const signature = '0xbadbadbadb'; const result = await context.universalProfile.isValidSignature(messageHash, signature); @@ -176,11 +173,11 @@ export const shouldBehaveLikeLSP3 = ( const expectedValuesLength = lsp12IssuedAssetsValues.length + newIssuedAssets.length; for (let ii = 0; ii < newIssuedAssets.length; ii++) { - const hexIndex = ethers.utils.hexlify(lsp12IssuedAssetsKeys.length); + const hexIndex = ethers.toBeHex(lsp12IssuedAssetsKeys.length); lsp12IssuedAssetsKeys.push( ERC725YDataKeys.LSP12['LSP12IssuedAssets[]'].index + - ethers.utils.hexZeroPad(hexIndex, 16).substring(2), + ethers.zeroPadValue(hexIndex, 16).substring(2), ); lsp12IssuedAssetsValues.push(newIssuedAssets[ii]); @@ -195,7 +192,7 @@ export const shouldBehaveLikeLSP3 = ( const values = [ ...lsp12IssuedAssetsValues, - ethers.utils.hexZeroPad(ethers.utils.hexlify(lsp12IssuedAssetsValues.length), 32), + ethers.zeroPadValue(ethers.toBeHex(lsp12IssuedAssetsValues.length), 32), ]; await context.universalProfile.setDataBatch(keys, values); @@ -206,11 +203,11 @@ export const shouldBehaveLikeLSP3 = ( for (let ii = 1; ii <= 8; ii++) { it('should add +1 LSP12IssuedAssets', async () => { - const hexIndex = ethers.utils.hexlify(lsp12IssuedAssetsKeys.length + 1); + const hexIndex = ethers.toBeHex(lsp12IssuedAssetsKeys.length + 1); lsp12IssuedAssetsKeys.push( ERC725YDataKeys.LSP12['LSP12IssuedAssets[]'].index + - ethers.utils.hexZeroPad(hexIndex, 16).substring(2), + ethers.zeroPadValue(hexIndex, 16).substring(2), ); lsp12IssuedAssetsValues.push(ethers.Wallet.createRandom().address.toLowerCase()); @@ -222,7 +219,7 @@ export const shouldBehaveLikeLSP3 = ( const values = [ ...lsp12IssuedAssetsValues, - ethers.utils.hexZeroPad(ethers.utils.hexlify(lsp12IssuedAssetsValues.length), 32), + ethers.zeroPadValue(ethers.toBeHex(lsp12IssuedAssetsValues.length), 32), ]; await context.universalProfile.setDataBatch(keys, values); @@ -234,8 +231,8 @@ export const shouldBehaveLikeLSP3 = ( describe('when setting a data key with a value less than 256 bytes', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(200)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(200)); await expect(context.universalProfile.setData(key, value)) .to.emit(context.universalProfile, 'DataChanged') @@ -248,8 +245,8 @@ export const shouldBehaveLikeLSP3 = ( describe('when setting a data key with a value more than 256 bytes', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); await expect(context.universalProfile.setData(key, value)) .to.emit(context.universalProfile, 'DataChanged') @@ -262,8 +259,8 @@ export const shouldBehaveLikeLSP3 = ( describe('when setting a data key with a value exactly 256 bytes long', () => { it('should emit DataChanged event with the whole data value', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(256)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(256)); await expect(context.universalProfile.setData(key, value)) .to.emit(context.universalProfile, 'DataChanged') @@ -277,9 +274,9 @@ export const shouldBehaveLikeLSP3 = ( describe('when sending value while setting data', () => { describe('when calling setData(..)', () => { it('should pass and emit the UniversalReceiver event', async () => { - const msgValue = ethers.utils.parseEther('2'); - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(256)); + const msgValue = ethers.parseEther('2'); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(256)); await expect( context.universalProfile @@ -291,7 +288,7 @@ export const shouldBehaveLikeLSP3 = ( context.accounts[0].address, msgValue, LSP1_TYPE_IDS.LSP0ValueReceived, - context.universalProfile.interface.getSighash('setData'), + context.universalProfile.interface.getFunction('setData').selector, '0x', ); @@ -302,9 +299,9 @@ export const shouldBehaveLikeLSP3 = ( describe('when calling setData(..) Array', () => { it('should pass and emit the UniversalReceiver event', async () => { - const msgValue = ethers.utils.parseEther('2'); - const key = [ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key'))]; - const value = [ethers.utils.hexlify(ethers.utils.randomBytes(256))]; + const msgValue = ethers.parseEther('2'); + const key = [ethers.keccak256(ethers.toUtf8Bytes('My Key'))]; + const value = [ethers.hexlify(ethers.randomBytes(256))]; await expect( context.universalProfile @@ -316,7 +313,7 @@ export const shouldBehaveLikeLSP3 = ( context.accounts[0].address, msgValue, LSP1_TYPE_IDS.LSP0ValueReceived, - context.universalProfile.interface.getSighash('setDataBatch'), + context.universalProfile.interface.getFunction('setDataBatch').selector, '0x', ); @@ -335,22 +332,21 @@ export const shouldBehaveLikeLSP3 = ( // prettier-ignore await expect( sender.sendTransaction({ - to: context.universalProfile.address, + to: universalProfileAddress, value: amount, }) - ).to.not.be.reverted - .to.not.emit(context.universalProfile, "UniversalReceiver"); + ).to.not.emit(context.universalProfile, "UniversalReceiver"); }); }); describe('when sending native tokens to the contract', () => { it('should emit the right UniversalReceiver event', async () => { const sender = context.accounts[0]; - const amount = ethers.utils.parseEther('5'); + const amount = ethers.parseEther('5'); await expect( sender.sendTransaction({ - to: context.universalProfile.address, + to: universalProfileAddress, value: amount, }), ) @@ -366,13 +362,13 @@ export const shouldBehaveLikeLSP3 = ( it('should allow to send a random payload as well, and emit the UniversalReceiver event', async () => { const sender = context.accounts[0]; - const amount = ethers.utils.parseEther('5'); + const amount = ethers.parseEther('5'); // The payload must be prepended with bytes4(0) to be interpreted as graffiti // and not as a function selector await expect( sender.sendTransaction({ - to: context.universalProfile.address, + to: universalProfileAddress, value: amount, data: '0x00000000aabbccdd', }), @@ -393,7 +389,7 @@ export const shouldBehaveLikeLSP3 = ( // The payload must be prepended with bytes4(0) to be interpreted as graffiti // and not as a function selector const tx = await context.accounts[0].sendTransaction({ - to: context.universalProfile.address, + to: universalProfileAddress, value: 0, data: '0x00000000aabbccdd', }); @@ -412,10 +408,10 @@ export const shouldBehaveLikeLSP3 = ( context.accounts[2].address, context.accounts[3].address, ]; - const values = Array(3).fill(ethers.BigNumber.from('1')); + const values = Array(3).fill(ethers.toBigInt(1)); const datas = Array(3).fill('0x'); - const msgValue = ethers.utils.parseEther('10'); + const msgValue = ethers.parseEther('10'); const tx = await context.universalProfile.executeBatch( operationsType, @@ -431,7 +427,7 @@ export const shouldBehaveLikeLSP3 = ( context.deployParams.owner.address, msgValue, LSP1_TYPE_IDS.LSP0ValueReceived, - context.universalProfile.interface.getSighash('executeBatch'), + context.universalProfile.interface.getFunction('executeBatch').selector, '0x', ); }); @@ -445,7 +441,7 @@ export const shouldBehaveLikeLSP3 = ( context.accounts[2].address, context.accounts[3].address, ]; - const values = Array(3).fill(ethers.BigNumber.from('1')); + const values = Array(3).fill(ethers.toBigInt(1)); const datas = Array(3).fill('0x'); const msgValue = 0; @@ -466,8 +462,8 @@ export const shouldBehaveLikeLSP3 = ( describe('when using batchCalls function', () => { describe('when non-owner is calling', () => { it('shoud revert', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); const setDataPayload = context.universalProfile.interface.encodeFunctionData('setData', [ key, @@ -486,8 +482,8 @@ export const shouldBehaveLikeLSP3 = ( describe('when executing one function', () => { describe('setData', () => { it('should pass', async () => { - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('My Key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(500)); + const key = ethers.keccak256(ethers.toUtf8Bytes('My Key')); + const value = ethers.hexlify(ethers.randomBytes(500)); const setDataPayload = context.universalProfile.interface.encodeFunctionData( 'setData', @@ -516,7 +512,7 @@ export const shouldBehaveLikeLSP3 = ( .connect(context.deployParams.owner) .batchCalls([executePayload]), ).to.changeEtherBalances( - [context.universalProfile.address, context.accounts[4].address], + [universalProfileAddress, context.accounts[4].address], [`-${amount}`, amount], ); }); @@ -532,8 +528,8 @@ export const shouldBehaveLikeLSP3 = ( [0, context.accounts[5].address, amount, '0x'], ); - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('A new key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(10)); + const key = ethers.keccak256(ethers.toUtf8Bytes('A new key')); + const value = ethers.hexlify(ethers.randomBytes(10)); const setDataPayload = context.universalProfile.interface.encodeFunctionData( 'setData', @@ -545,23 +541,21 @@ export const shouldBehaveLikeLSP3 = ( [context.accounts[8].address], ); - expect(await context.universalProfile.callStatic.pendingOwner()).to.equal( - ethers.constants.AddressZero, - ); + expect(await context.universalProfile.pendingOwner()).to.equal(ethers.ZeroAddress); await expect(() => context.universalProfile .connect(context.deployParams.owner) .batchCalls([executePayload, setDataPayload, transferOwnershipPayload]), ).to.changeEtherBalances( - [context.universalProfile.address, context.accounts[5].address], + [universalProfileAddress, context.accounts[5].address], [`-${amount}`, amount], ); const result = await context.universalProfile.getData(key); expect(result).to.equal(value); - expect(await context.universalProfile.callStatic.pendingOwner()).to.equal( + expect(await context.universalProfile.pendingOwner()).to.equal( context.accounts[8].address, ); }); @@ -575,8 +569,8 @@ export const shouldBehaveLikeLSP3 = ( [3, context.accounts[5].address, amount, '0x'], ); - const key = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('Another key')); - const value = ethers.utils.hexlify(ethers.utils.randomBytes(10)); + const key = ethers.keccak256(ethers.toUtf8Bytes('Another key')); + const value = ethers.hexlify(ethers.randomBytes(10)); const setDataPayload = context.universalProfile.interface.encodeFunctionData( 'setData', @@ -609,21 +603,21 @@ export const shouldBehaveLikeLSP3 = ( .setData( ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegatePrefix + LSP1_TYPE_IDS.LSP0ValueReceived.substring(2, 42), - universalReceiverDelegateLYX.address, + await universalReceiverDelegateLYX.getAddress(), ); }); describe('when sending LYX to the receive function', () => { it('should react on the call and apply the logic of the URD', async () => { const tx = await context.accounts[1].sendTransaction({ - to: context.universalProfile.address, + to: universalProfileAddress, value: 5, }); expect(tx).to.emit(context.universalProfile, 'UniversalReceiver'); const result = await universalReceiverDelegateLYX.lastValueReceived( - context.universalProfile.address, + universalProfileAddress, ); expect(result).to.equal(5); @@ -633,13 +627,13 @@ export const shouldBehaveLikeLSP3 = ( describe('when sending empty call to the receive function', () => { it('should not react on the call and not emit UniversalReceiver', async () => { const tx = await context.accounts[1].sendTransaction({ - to: context.universalProfile.address, + to: universalProfileAddress, }); expect(tx).to.not.emit(context.universalProfile, 'UniversalReceiver'); - const result = await universalReceiverDelegateLYX.callStatic.lastValueReceived( - context.universalProfile.address, + const result = await universalReceiverDelegateLYX.lastValueReceived( + universalProfileAddress, ); expect(result).to.equal(5); @@ -649,15 +643,15 @@ export const shouldBehaveLikeLSP3 = ( describe('when calling the UP with graffiti and value', () => { it('should react on the call and emit UniversalReceiver', async () => { const tx = await context.accounts[1].sendTransaction({ - to: context.universalProfile.address, + to: universalProfileAddress, data: '0x00000000aabbccdd', value: 7, }); expect(tx).to.emit(context.universalProfile, 'UniversalReceiver'); - const result = await universalReceiverDelegateLYX.callStatic.lastValueReceived( - context.universalProfile.address, + const result = await universalReceiverDelegateLYX.lastValueReceived( + universalProfileAddress, ); expect(result).to.equal(7); @@ -680,12 +674,12 @@ export const shouldBehaveLikeLSP3 = ( await context.universalProfile .connect(context.deployParams.owner) - .setData(emitEventFunctionExtensionHandlerKey, emitEventExtension.address); + .setData(emitEventFunctionExtensionHandlerKey, await emitEventExtension.getAddress()); }); it('should react on the call and emit UniversalReceiver and run the extension', async () => { const tx = await context.accounts[1].sendTransaction({ - to: context.universalProfile.address, + to: universalProfileAddress, data: emitEventFunctionSelector, value: 10, }); @@ -693,8 +687,8 @@ export const shouldBehaveLikeLSP3 = ( expect(tx).to.emit(context.universalProfile, 'UniversalReceiver'); expect(tx).to.emit(emitEventExtension, 'EventEmittedInExtension'); - const result = await universalReceiverDelegateLYX.callStatic.lastValueReceived( - context.universalProfile.address, + const result = await universalReceiverDelegateLYX.lastValueReceived( + universalProfileAddress, ); expect(result).to.equal(10); @@ -723,15 +717,15 @@ export const shouldBehaveLikeLSP3 = ( context.accounts[0].address, 15, LSP1_TYPE_IDS.LSP0ValueReceived, - context.universalProfile.interface.getSighash('universalReceiver') + + context.universalProfile.interface.getFunction('universalReceiver') + abiCoder .encode(['bytes32', 'bytes'], [LSP1_HOOK_PLACEHOLDER, '0xaabbccdd']) .substr(2), abiCoder.encode(['bytes', 'bytes'], ['0x', '0x']), ); - const result = await universalReceiverDelegateLYX.callStatic.lastValueReceived( - context.universalProfile.address, + const result = await universalReceiverDelegateLYX.lastValueReceived( + universalProfileAddress, ); expect(result).to.equal(15); @@ -745,12 +739,12 @@ export const shouldBehaveLikeLSP3 = ( before('Use custom owner that implements LSP1', async () => { newContractOwner = await new OwnerWithURD__factory(context.accounts[0]).deploy( - context.universalProfile.address, + universalProfileAddress, ); await context.universalProfile .connect(context.deployParams.owner) - .transferOwnership(newContractOwner.address); + .transferOwnership(await newContractOwner.getAddress()); await newContractOwner.acceptOwnership(); }); @@ -762,19 +756,19 @@ export const shouldBehaveLikeLSP3 = ( it('should renounce ownership of the contract and call the URD of the previous owner', async () => { await newContractOwner.connect(context.accounts[0]).renounceOwnership(); - await network.provider.send('hardhat_mine', [ethers.utils.hexValue(199)]); + await network.provider.send('hardhat_mine', [ethers.toBeHex(199)]); const tx = await newContractOwner.connect(context.accounts[0]).renounceOwnership(); await expect(tx) .to.emit(newContractOwner, 'UniversalReceiver') .withArgs( - context.universalProfile.address, + universalProfileAddress, 0, LSP1_TYPE_IDS.LSP0OwnershipTransferred_SenderNotification, abiCoder.encode( ['address', 'address'], - [newContractOwner.address, ethers.constants.AddressZero], + [await newContractOwner.getAddress(), ethers.ZeroAddress], ), '0x', ); @@ -846,7 +840,7 @@ export const shouldInitializeLikeLSP3 = (buildContext: () => Promise { + it("should have set key 'SupportedStandards:LSP3Profile'", async () => { const result = await context.universalProfile.getData(SupportedStandards.LSP3Profile.key); expect(result).to.equal(SupportedStandards.LSP3Profile.value); diff --git a/tests/UniversalProfile.test.ts b/packages/lsp-smart-contracts/tests/UniversalProfile.test.ts similarity index 93% rename from tests/UniversalProfile.test.ts rename to packages/lsp-smart-contracts/tests/UniversalProfile.test.ts index f22bef997..6c9e3c52d 100644 --- a/tests/UniversalProfile.test.ts +++ b/packages/lsp-smart-contracts/tests/UniversalProfile.test.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { UniversalProfile__factory, UniversalReceiverTester__factory } from '../types'; +import { UniversalReceiverTester__factory, UniversalProfile__factory } from '../../../types'; import { LSP1TestContext, @@ -23,7 +23,6 @@ import { shouldBehaveLikeLSP3, } from './UniversalProfile.behaviour'; import { provider } from './utils/helpers'; -import { BigNumber } from 'ethers'; import { LSP14CombinedWithLSP20TestContext, shouldBehaveLikeLSP14WithLSP20, @@ -43,6 +42,8 @@ describe('UniversalProfile with constructor', () => { }, ); + await universalProfile.waitForDeployment(); + return { accounts, universalProfile, deployParams }; }; @@ -59,7 +60,7 @@ describe('UniversalProfile with constructor', () => { }; const buildLSP14WithLSP20TestContext = async ( - initialFunding?: number | BigNumber, + initialFunding?: number | bigint, ): Promise => { const accounts = await ethers.getSigners(); const deployParams = { @@ -111,7 +112,7 @@ describe('UniversalProfile with constructor', () => { }); it(`should have deployed with the correct funding amount (${testCase.initialFunding})`, async () => { - const balance = await provider.getBalance(context.universalProfile.address); + const balance = await provider.getBalance(await context.universalProfile.getAddress()); expect(balance).to.equal(testCase.initialFunding || 0); }); }); diff --git a/tests/UniversalProfileInit.test.ts b/packages/lsp-smart-contracts/tests/UniversalProfileInit.test.ts similarity index 87% rename from tests/UniversalProfileInit.test.ts rename to packages/lsp-smart-contracts/tests/UniversalProfileInit.test.ts index 42f60cc3c..923054097 100644 --- a/tests/UniversalProfileInit.test.ts +++ b/packages/lsp-smart-contracts/tests/UniversalProfileInit.test.ts @@ -1,10 +1,10 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { - LSP0ERC725Account, - UniversalProfileInit__factory, UniversalReceiverTester__factory, -} from '../types'; + UniversalProfileInit__factory, + LSP0ERC725Account, +} from '../../../types'; import { deployProxy } from './utils/fixtures'; import { @@ -28,7 +28,6 @@ import { shouldBehaveLikeLSP3, } from './UniversalProfile.behaviour'; import { provider } from './utils/helpers'; -import { BigNumber } from 'ethers'; import { LSP14CombinedWithLSP20TestContext, shouldBehaveLikeLSP14WithLSP20, @@ -49,7 +48,10 @@ describe('UniversalProfileInit with proxy', () => { initialFunding, }; - const universalProfileProxy = await deployProxy(universalProfileInit.address, accounts[0]); + const universalProfileProxy = await deployProxy( + await universalProfileInit.getAddress(), + accounts[0], + ); const universalProfile = universalProfileInit.attach(universalProfileProxy); @@ -63,7 +65,10 @@ describe('UniversalProfileInit with proxy', () => { }; const buildLSP1TestContext = async (): Promise => { - const universalProfileProxy = await deployProxy(universalProfileInit.address, accounts[0]); + const universalProfileProxy = await deployProxy( + await universalProfileInit.getAddress(), + accounts[0], + ); const lsp1Implementation = universalProfileInit.attach(universalProfileProxy); @@ -75,14 +80,17 @@ describe('UniversalProfileInit with proxy', () => { }; const buildLSP14WithLSP20TestContext = async ( - initialFunding?: number | BigNumber, + initialFunding?: number | bigint, ): Promise => { const deployParams = { owner: accounts[0], initialFunding: initialFunding, }; - const universalProfileProxy = await deployProxy(universalProfileInit.address, accounts[0]); + const universalProfileProxy = await deployProxy( + await universalProfileInit.getAddress(), + accounts[0], + ); const universalProfile = universalProfileInit.attach(universalProfileProxy); @@ -101,7 +109,10 @@ describe('UniversalProfileInit with proxy', () => { owner: accounts[0], }; - const universalProfileProxy = await deployProxy(universalProfileInit.address, accounts[0]); + const universalProfileProxy = await deployProxy( + await universalProfileInit.getAddress(), + accounts[0], + ); const universalProfile = universalProfileInit.attach(universalProfileProxy); @@ -116,17 +127,20 @@ describe('UniversalProfileInit with proxy', () => { const universalProfileInit = await new UniversalProfileInit__factory(accounts[0]).deploy(); - const universalProfileProxy = await deployProxy(universalProfileInit.address, accounts[0]); + const universalProfileProxy = await deployProxy( + await universalProfileInit.getAddress(), + accounts[0], + ); const universalProfile = universalProfileInit.attach(universalProfileProxy); - return { accounts, universalProfile: universalProfile, deployParams }; + return { accounts, universalProfile: universalProfile as UniversalProfile, deployParams }; }; describe('when deploying the base implementation contract', () => { it('`owner()` of the base contract MUST be `address(0)`', async () => { const owner = await universalProfileInit.owner(); - expect(owner).to.equal(ethers.constants.AddressZero); + expect(owner).to.equal(ethers.ZeroAddress); }); it('prevent any address from calling the initialize(...) function on the implementation', async () => { @@ -144,7 +158,7 @@ describe('UniversalProfileInit with proxy', () => { it(`should have initialized with the correct funding amount (${testCase.initialFunding})`, async () => { const context = await buildLSP3TestContext(testCase.initialFunding); await initializeProxy(context); - const balance = await provider.getBalance(context.universalProfile.address); + const balance = await provider.getBalance(await context.universalProfile.getAddress()); expect(balance).to.equal(testCase.initialFunding || 0); }); }); @@ -185,7 +199,7 @@ describe('UniversalProfileInit with proxy', () => { return lsp1Context; }); - shouldBehaveLikeLSP14WithLSP20(async (initialFunding?: number | BigNumber) => { + shouldBehaveLikeLSP14WithLSP20(async (initialFunding?: number | bigint) => { const claimOwnershipContext = await buildLSP14WithLSP20TestContext(initialFunding); await initializeProxy({ diff --git a/tests/foundry/GasTests/LSP6s/LSP6ExecuteRC.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6ExecuteRC.sol similarity index 94% rename from tests/foundry/GasTests/LSP6s/LSP6ExecuteRC.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6ExecuteRC.sol index 805044d9c..590b9231a 100644 --- a/tests/foundry/GasTests/LSP6s/LSP6ExecuteRC.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6ExecuteRC.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.13; -import "../../../../contracts/LSP6KeyManager/LSP6KeyManager.sol"; +import "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; contract LSP6ExecuteRestrictedController is LSP6KeyManager { constructor(address target_) LSP6KeyManager(target_) {} diff --git a/tests/foundry/GasTests/LSP6s/LSP6ExecuteUC.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6ExecuteUC.sol similarity index 94% rename from tests/foundry/GasTests/LSP6s/LSP6ExecuteUC.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6ExecuteUC.sol index d1fc01615..eb62f0d7f 100644 --- a/tests/foundry/GasTests/LSP6s/LSP6ExecuteUC.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6ExecuteUC.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; -import "../../../../contracts/LSP6KeyManager/LSP6KeyManager.sol"; +import "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; contract LSP6ExecuteUnrestrictedController is LSP6KeyManager { constructor(address target_) LSP6KeyManager(target_) {} diff --git a/tests/foundry/GasTests/LSP6s/LSP6SetDataRC.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6SetDataRC.sol similarity index 89% rename from tests/foundry/GasTests/LSP6s/LSP6SetDataRC.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6SetDataRC.sol index f4f7aaa9d..f1e204617 100644 --- a/tests/foundry/GasTests/LSP6s/LSP6SetDataRC.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6SetDataRC.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; -import "../../../../contracts/LSP6KeyManager/LSP6KeyManager.sol"; +import "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; contract LSP6SetDataRestrictedController is LSP6KeyManager { constructor(address target_) LSP6KeyManager(target_) {} diff --git a/tests/foundry/GasTests/LSP6s/LSP6SetDataUC.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6SetDataUC.sol similarity index 89% rename from tests/foundry/GasTests/LSP6s/LSP6SetDataUC.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6SetDataUC.sol index 9687c69f6..fdbd65faa 100644 --- a/tests/foundry/GasTests/LSP6s/LSP6SetDataUC.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/LSP6s/LSP6SetDataUC.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; -import "../../../../contracts/LSP6KeyManager/LSP6KeyManager.sol"; +import "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; contract LSP6SetDataUnrestrictedController is LSP6KeyManager { constructor(address target_) LSP6KeyManager(target_) {} diff --git a/tests/foundry/GasTests/UniversalProfileTestsHelper.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/UniversalProfileTestsHelper.sol similarity index 90% rename from tests/foundry/GasTests/UniversalProfileTestsHelper.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/UniversalProfileTestsHelper.sol index 3cf8d39e2..0e60e299f 100644 --- a/tests/foundry/GasTests/UniversalProfileTestsHelper.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/UniversalProfileTestsHelper.sol @@ -3,23 +3,26 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; -import "../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; -import "../../../contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; -import "../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; +import { + LSP1UniversalReceiverDelegateUP +} from "@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol"; +import "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; import "../../../contracts/Mocks/Tokens/LSP7Tester.sol"; import "../../../contracts/Mocks/Tokens/LSP8Tester.sol"; import { _LSP1_UNIVERSAL_RECEIVER_DELEGATE_KEY -} from "../../../contracts/LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, + _LSP6KEY_ADDRESSPERMISSIONS_ALLOWEDCALLS_PREFIX, _PERMISSION_SUPER_SETDATA, _PERMISSION_SUPER_CALL, _PERMISSION_REENTRANCY, _PERMISSION_SUPER_TRANSFERVALUE -} from "../../../contracts/LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; -import "../../../contracts/LSP6KeyManager/LSP6Utils.sol"; +import {LSP6Utils} from "@lukso/lsp6-contracts/contracts/LSP6Utils.sol"; contract UniversalProfileTestsHelper is Test { function setURDToUPAndGivePermissions( diff --git a/tests/foundry/GasTests/execute/RestrictedController.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/execute/RestrictedController.sol similarity index 96% rename from tests/foundry/GasTests/execute/RestrictedController.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/execute/RestrictedController.sol index 0ec384603..b1371ecd8 100644 --- a/tests/foundry/GasTests/execute/RestrictedController.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/execute/RestrictedController.sol @@ -2,18 +2,22 @@ pragma solidity ^0.8.13; import "../LSP6s/LSP6ExecuteRC.sol"; -import "../../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; -import "../../../../contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; -import "../../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; +import { + LSP1UniversalReceiverDelegateUP +} from "@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol"; +import "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; import "../../../../contracts/Mocks/Tokens/LSP7Tester.sol"; import "../../../../contracts/Mocks/Tokens/LSP8Tester.sol"; import { _LSP1_UNIVERSAL_RECEIVER_DELEGATE_KEY -} from "../../../../contracts/LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP4_TOKEN_TYPE_TOKEN, _LSP4_TOKEN_TYPE_NFT -} from "../../../../contracts/LSP4DigitalAssetMetadata/LSP4Constants.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4Constants.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, _PERMISSION_SUPER_SETDATA, @@ -22,11 +26,11 @@ import { _PERMISSION_SUPER_TRANSFERVALUE, _PERMISSION_CALL, _PERMISSION_TRANSFERVALUE -} from "../../../../contracts/LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; import { _LSP8_TOKENID_FORMAT_NUMBER -} from "../../../../contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol"; -import "../UniversalProfileTestsHelper.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8Constants.sol"; +import {UniversalProfileTestsHelper} from "../UniversalProfileTestsHelper.sol"; contract ExecuteRestrictedController is UniversalProfileTestsHelper { LSP0ERC725Account public mainUniversalProfile; diff --git a/tests/foundry/GasTests/execute/UnrestrictedController.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/execute/UnrestrictedController.sol similarity index 94% rename from tests/foundry/GasTests/execute/UnrestrictedController.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/execute/UnrestrictedController.sol index 8d84d0b29..e0d7a4a61 100644 --- a/tests/foundry/GasTests/execute/UnrestrictedController.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/execute/UnrestrictedController.sol @@ -2,29 +2,33 @@ pragma solidity ^0.8.13; import "../LSP6s/LSP6ExecuteUC.sol"; -import "../../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; -import "../../../../contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; -import "../../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; +import { + LSP1UniversalReceiverDelegateUP +} from "@lukso/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol"; +import "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; import "../../../../contracts/Mocks/Tokens/LSP7Tester.sol"; import "../../../../contracts/Mocks/Tokens/LSP8Tester.sol"; import { _LSP1_UNIVERSAL_RECEIVER_DELEGATE_KEY -} from "../../../../contracts/LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP4_TOKEN_TYPE_TOKEN, _LSP4_TOKEN_TYPE_NFT -} from "../../../../contracts/LSP4DigitalAssetMetadata/LSP4Constants.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4Constants.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, _PERMISSION_SUPER_SETDATA, _PERMISSION_SUPER_CALL, _PERMISSION_REENTRANCY, _PERMISSION_SUPER_TRANSFERVALUE -} from "../../../../contracts/LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; import { _LSP8_TOKENID_FORMAT_NUMBER -} from "../../../../contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol"; -import "../UniversalProfileTestsHelper.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8Constants.sol"; +import {UniversalProfileTestsHelper} from "../UniversalProfileTestsHelper.sol"; contract ExecuteUnrestrictedController is UniversalProfileTestsHelper { LSP0ERC725Account public mainUniversalProfile; diff --git a/tests/foundry/GasTests/setData/RestrictedController.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/setData/RestrictedController.sol similarity index 94% rename from tests/foundry/GasTests/setData/RestrictedController.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/setData/RestrictedController.sol index f732868e9..416e92c1e 100644 --- a/tests/foundry/GasTests/setData/RestrictedController.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/setData/RestrictedController.sol @@ -1,10 +1,13 @@ pragma solidity ^0.8.13; import "../LSP6s/LSP6SetDataRC.sol"; -import "../../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; -import "../../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; +import "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, + _LSP6KEY_ADDRESSPERMISSIONS_AllowedERC725YDataKeys_PREFIX, _PERMISSION_SUPER_SETDATA, _PERMISSION_SUPER_CALL, _PERMISSION_REENTRANCY, @@ -14,8 +17,8 @@ import { _LSP6KEY_ADDRESSPERMISSIONS_ARRAY, _PERMISSION_ADDCONTROLLER, _PERMISSION_SETDATA -} from "../../../../contracts/LSP6KeyManager/LSP6Constants.sol"; -import "../UniversalProfileTestsHelper.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; +import {UniversalProfileTestsHelper} from "../UniversalProfileTestsHelper.sol"; contract SetDataRestrictedController is UniversalProfileTestsHelper { LSP0ERC725Account public mainUniversalProfile; diff --git a/tests/foundry/GasTests/setData/UnrestrictedController.sol b/packages/lsp-smart-contracts/tests/foundry/GasTests/setData/UnrestrictedController.sol similarity index 94% rename from tests/foundry/GasTests/setData/UnrestrictedController.sol rename to packages/lsp-smart-contracts/tests/foundry/GasTests/setData/UnrestrictedController.sol index 3f5a39755..01499308b 100644 --- a/tests/foundry/GasTests/setData/UnrestrictedController.sol +++ b/packages/lsp-smart-contracts/tests/foundry/GasTests/setData/UnrestrictedController.sol @@ -1,10 +1,13 @@ pragma solidity ^0.8.13; import "../LSP6s/LSP6SetDataUC.sol"; -import "../../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; -import "../../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; +import "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, + _LSP6KEY_ADDRESSPERMISSIONS_AllowedERC725YDataKeys_PREFIX, _PERMISSION_SUPER_SETDATA, _PERMISSION_SUPER_CALL, _PERMISSION_REENTRANCY, @@ -14,8 +17,8 @@ import { _LSP6KEY_ADDRESSPERMISSIONS_ARRAY, _PERMISSION_ADDCONTROLLER, _PERMISSION_SETDATA -} from "../../../../contracts/LSP6KeyManager/LSP6Constants.sol"; -import "../UniversalProfileTestsHelper.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; +import {UniversalProfileTestsHelper} from "../UniversalProfileTestsHelper.sol"; contract SetDataUnrestrictedController is UniversalProfileTestsHelper { LSP0ERC725Account public mainUniversalProfile; diff --git a/tests/foundry/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.t.sol b/packages/lsp-smart-contracts/tests/foundry/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.t.sol similarity index 100% rename from tests/foundry/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.t.sol rename to packages/lsp-smart-contracts/tests/foundry/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.t.sol diff --git a/tests/foundry/LSP11BasicSocialRecovery/LSP11Mock.sol b/packages/lsp-smart-contracts/tests/foundry/LSP11BasicSocialRecovery/LSP11Mock.sol similarity index 100% rename from tests/foundry/LSP11BasicSocialRecovery/LSP11Mock.sol rename to packages/lsp-smart-contracts/tests/foundry/LSP11BasicSocialRecovery/LSP11Mock.sol diff --git a/tests/foundry/LSP14Ownable2Step/AcceptOwnershipCleanState.sol b/packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/AcceptOwnershipCleanState.sol similarity index 94% rename from tests/foundry/LSP14Ownable2Step/AcceptOwnershipCleanState.sol rename to packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/AcceptOwnershipCleanState.sol index 8e1fe7f0c..deed4f10f 100644 --- a/tests/foundry/LSP14Ownable2Step/AcceptOwnershipCleanState.sol +++ b/packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/AcceptOwnershipCleanState.sol @@ -3,11 +3,13 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; import "@erc725/smart-contracts/contracts/constants.sol"; -import "../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; import { LSP20EOACannotVerifyCall -} from "../../../contracts/LSP20CallVerification/LSP20Errors.sol"; +} from "@lukso/lsp20-contracts/contracts/LSP20Errors.sol"; contract LSP0Implementation is LSP0ERC725Account { constructor(address _addr) LSP0ERC725Account(_addr) {} diff --git a/tests/foundry/LSP14Ownable2Step/TwoStepOwnership.sol b/packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/TwoStepOwnership.sol similarity index 94% rename from tests/foundry/LSP14Ownable2Step/TwoStepOwnership.sol rename to packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/TwoStepOwnership.sol index c1e152a47..53a8cac1d 100644 --- a/tests/foundry/LSP14Ownable2Step/TwoStepOwnership.sol +++ b/packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/TwoStepOwnership.sol @@ -3,11 +3,13 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; import "@erc725/smart-contracts/contracts/constants.sol"; -import "../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; import { LSP14MustAcceptOwnershipInSeparateTransaction -} from "../../../contracts/LSP14Ownable2Step/LSP14Errors.sol"; +} from "@lukso/lsp14-contracts/contracts/LSP14Errors.sol"; contract Implementation is LSP0ERC725Account { constructor() LSP0ERC725Account(msg.sender) {} diff --git a/tests/foundry/LSP14Ownable2Step/TwoStepRenounceOwnership.sol b/packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/TwoStepRenounceOwnership.sol similarity index 92% rename from tests/foundry/LSP14Ownable2Step/TwoStepRenounceOwnership.sol rename to packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/TwoStepRenounceOwnership.sol index 1936d494d..f8f741179 100644 --- a/tests/foundry/LSP14Ownable2Step/TwoStepRenounceOwnership.sol +++ b/packages/lsp-smart-contracts/tests/foundry/LSP14Ownable2Step/TwoStepRenounceOwnership.sol @@ -3,11 +3,13 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; import "@erc725/smart-contracts/contracts/constants.sol"; -import "../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; import { LSP20EOACannotVerifyCall -} from "../../../contracts/LSP20CallVerification/LSP20Errors.sol"; +} from "@lukso/lsp20-contracts/contracts/LSP20Errors.sol"; contract Implementation { // _pendingOwner is at slot 3 for LSP0ERC725Account diff --git a/tests/foundry/LSP6KeyManager/LSP6RestrictedController.t.sol b/packages/lsp-smart-contracts/tests/foundry/LSP6KeyManager/LSP6RestrictedController.t.sol similarity index 84% rename from tests/foundry/LSP6KeyManager/LSP6RestrictedController.t.sol rename to packages/lsp-smart-contracts/tests/foundry/LSP6KeyManager/LSP6RestrictedController.t.sol index 550c336ab..82eabbbcc 100644 --- a/tests/foundry/LSP6KeyManager/LSP6RestrictedController.t.sol +++ b/packages/lsp-smart-contracts/tests/foundry/LSP6KeyManager/LSP6RestrictedController.t.sol @@ -1,12 +1,16 @@ pragma solidity ^0.8.13; -import "../../../contracts/LSP6KeyManager/LSP6KeyManager.sol"; -import "../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; -import "../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; -import "../../../contracts/LSP6KeyManager/LSP6Constants.sol"; -import "../GasTests/UniversalProfileTestsHelper.sol"; +import "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; +import "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; +import "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; +import { + UniversalProfileTestsHelper +} from "../GasTests/UniversalProfileTestsHelper.sol"; -import {NotAuthorised} from "../../../contracts/LSP6KeyManager/LSP6Errors.sol"; +import {NotAuthorised} from "@lukso/lsp6-contracts/contracts/LSP6Errors.sol"; import { OPERATION_4_DELEGATECALL diff --git a/tests/utils/context.ts b/packages/lsp-smart-contracts/tests/utils/context.ts similarity index 73% rename from tests/utils/context.ts rename to packages/lsp-smart-contracts/tests/utils/context.ts index 7433a2ea6..0c561184c 100644 --- a/tests/utils/context.ts +++ b/packages/lsp-smart-contracts/tests/utils/context.ts @@ -1,13 +1,12 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber } from 'ethers'; -import { KeyManagerInternalTester, LSP6KeyManager, UniversalProfile } from '../../types'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers.js'; +import { KeyManagerInternalTester, LSP6KeyManager, UniversalProfile } from '../../types/index.js'; export type LSP6TestContext = { accounts: SignerWithAddress[]; mainController: SignerWithAddress; universalProfile: UniversalProfile; keyManager: LSP6KeyManager; - initialFunding?: BigNumber; + initialFunding?: bigint; }; export type LSP6InternalsTestContext = { diff --git a/tests/utils/fixtures.ts b/packages/lsp-smart-contracts/tests/utils/fixtures.ts similarity index 74% rename from tests/utils/fixtures.ts rename to packages/lsp-smart-contracts/tests/utils/fixtures.ts index 772b146d4..bd3cf2f05 100644 --- a/tests/utils/fixtures.ts +++ b/packages/lsp-smart-contracts/tests/utils/fixtures.ts @@ -1,5 +1,6 @@ -import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import hre from 'hardhat'; +const { ethers } = hre; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { LSP1UniversalReceiverDelegateUP__factory, @@ -7,10 +8,11 @@ import { UniversalProfile__factory, } from '../../types'; -import { PERMISSIONS, ERC725YDataKeys, ALL_PERMISSIONS } from '../../constants'; +import { ERC725YDataKeys } from '../../constants'; +import { PERMISSIONS, ALL_PERMISSIONS } from '@lukso/lsp6-contracts'; // helpers -import { combinePermissions } from '../utils/helpers'; +import { combinePermissions } from './helpers'; import { LSP6TestContext, LSP6InternalsTestContext } from './context'; /** @@ -34,7 +36,7 @@ export async function deployProxy( // deploy proxy contract const proxyBytecode = eip1167RuntimeCodeTemplate.replace( 'bebebebebebebebebebebebebebebebebebebebe', - baseContractAddress.substr(2), + baseContractAddress.substring(2), ); const tx = await deployer.sendTransaction({ data: proxyBytecode, @@ -61,11 +63,13 @@ export async function setupKeyManager( [ALL_PERMISSIONS, ..._dataValues], ); + const keyManagerAddress = await _context.keyManager.getAddress(); + await _context.universalProfile .connect(_context.mainController) - .transferOwnership(_context.keyManager.address); + .transferOwnership(keyManagerAddress); - const payload = _context.universalProfile.interface.getSighash('acceptOwnership'); + const payload = _context.universalProfile.interface.getFunction('acceptOwnership').selector; await _context.keyManager.connect(_context.mainController).execute(payload); } @@ -88,9 +92,9 @@ export async function setupKeyManagerHelper( await _context.universalProfile .connect(_context.mainController) - .transferOwnership(_context.keyManagerInternalTester.address); + .transferOwnership(await _context.keyManagerInternalTester.getAddress()); - const payload = _context.universalProfile.interface.getSighash('acceptOwnership'); + const payload = _context.universalProfile.interface.getFunction('acceptOwnership').selector; await _context.keyManagerInternalTester.connect(_context.mainController).execute(payload); } @@ -99,8 +103,15 @@ export async function setupKeyManagerHelper( * Deploy 1 Profile + 1 KeyManager + 1 URD and set all needed permissions */ export async function setupProfileWithKeyManagerWithURD(EOA: SignerWithAddress) { - const universalProfile = await new UniversalProfile__factory(EOA).deploy(EOA.address); - const lsp6KeyManager = await new LSP6KeyManager__factory(EOA).deploy(universalProfile.address); + const universalProfile = await new UniversalProfile__factory(EOA).deploy(EOA.address, { + value: ethers.parseEther('10'), + }); + + const lsp6KeyManager = await new LSP6KeyManager__factory(EOA).deploy( + await universalProfile.getAddress(), + ); + + const lsp6KeyManagerAddress = await lsp6KeyManager.getAddress(); const lsp1universalReceiverDelegateUP = await new LSP1UniversalReceiverDelegateUP__factory( EOA, @@ -115,29 +126,25 @@ export async function setupProfileWithKeyManagerWithURD(EOA: SignerWithAddress) ERC725YDataKeys.LSP6['AddressPermissions[]'].index + '00000000000000000000000000000001', ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + EOA.address.substring(2), ERC725YDataKeys.LSP6['AddressPermissions:Permissions'] + - lsp1universalReceiverDelegateUP.address.substring(2), + (await lsp1universalReceiverDelegateUP.getAddress()).substring(2), ERC725YDataKeys.LSP1.LSP1UniversalReceiverDelegate, ], [ - ethers.utils.hexZeroPad(ethers.utils.hexlify(2), 16), + ethers.zeroPadValue(ethers.toBeHex(2), 16), EOA.address, - lsp1universalReceiverDelegateUP.address, + await lsp1universalReceiverDelegateUP.getAddress(), ALL_PERMISSIONS, combinePermissions(PERMISSIONS.SUPER_SETDATA, PERMISSIONS.REENTRANCY), - lsp1universalReceiverDelegateUP.address, + await lsp1universalReceiverDelegateUP.getAddress(), ], ); - await universalProfile.connect(EOA).transferOwnership(lsp6KeyManager.address); + await universalProfile.connect(EOA).transferOwnership(lsp6KeyManagerAddress); - const claimOwnershipPayload = universalProfile.interface.getSighash('acceptOwnership'); + const claimOwnershipPayload = universalProfile.interface.getFunction('acceptOwnership').selector; await lsp6KeyManager.connect(EOA).execute(claimOwnershipPayload); - await EOA.sendTransaction({ - to: universalProfile.address, - value: ethers.utils.parseEther('10'), - }); return [universalProfile, lsp6KeyManager, lsp1universalReceiverDelegateUP]; } @@ -151,15 +158,15 @@ export async function grantLSP11PermissionViaKeyManager( lsp6KeyManager, addressToGrant, ) { - const rawPermissionArrayLength = await universalProfile.callStatic['getData(bytes32)']( + const rawPermissionArrayLength = await universalProfile.getData( ERC725YDataKeys.LSP6['AddressPermissions[]'].length, ); - const permissionArrayLength = ethers.BigNumber.from(rawPermissionArrayLength).toNumber(); + const permissionArrayLength = ethers.toNumber(ethers.toBigInt(rawPermissionArrayLength)); const newPermissionArrayLength = permissionArrayLength + 1; - const newRawPermissionArrayLength = ethers.utils.hexZeroPad( - ethers.utils.hexValue(newPermissionArrayLength), + const newRawPermissionArrayLength = ethers.zeroPadValue( + ethers.toBeHex(newPermissionArrayLength), 16, ); @@ -193,16 +200,16 @@ export function callPayload(from: any, to: string, abi: string) { */ export async function getLSP5MapAndArrayKeysValue(account, token) { const mapValue = await account.getData( - ethers.utils.hexConcat([ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap, token.address]), + ethers.concat([ERC725YDataKeys.LSP5.LSP5ReceivedAssetsMap, await token.getAddress()]), ); - const indexInHex = '0x' + mapValue.substr(10, mapValue.length); - const interfaceId = mapValue.substr(0, 10); + const indexInHex = '0x' + mapValue.substring(10, mapValue.length); + const interfaceId = mapValue.substring(0, 10); - const indexInNumber = ethers.BigNumber.from(indexInHex).toNumber(); - const rawIndexInArray = ethers.utils.hexZeroPad(ethers.utils.hexValue(indexInNumber), 16); + const indexInNumber = ethers.toNumber(ethers.toBigInt(indexInHex === '0x' ? 0 : indexInHex)); + const rawIndexInArray = ethers.zeroPadValue(ethers.toBeHex(indexInNumber), 16); - const elementInArrayKey = ethers.utils.hexConcat([ + const elementInArrayKey = ethers.concat([ ERC725YDataKeys.LSP5['LSP5ReceivedAssets[]'].index, rawIndexInArray, ]); @@ -213,7 +220,7 @@ export async function getLSP5MapAndArrayKeysValue(account, token) { let elementAddress = _elementAddress; if (elementAddress != '0x') { - elementAddress = ethers.utils.getAddress(elementAddress); + elementAddress = ethers.getAddress(elementAddress); } return [indexInNumber, interfaceId, arrayLength, elementAddress]; } diff --git a/tests/utils/helpers.ts b/packages/lsp-smart-contracts/tests/utils/helpers.ts similarity index 76% rename from tests/utils/helpers.ts rename to packages/lsp-smart-contracts/tests/utils/helpers.ts index a343170d0..56597a2a7 100644 --- a/tests/utils/helpers.ts +++ b/packages/lsp-smart-contracts/tests/utils/helpers.ts @@ -1,13 +1,26 @@ -import { BigNumber, BytesLike } from 'ethers'; -import { ethers } from 'hardhat'; -import { LSP6KeyManager } from '../../types'; +import { + BytesLike, + AbiCoder, + Wallet, + toBigInt, + zeroPadValue, + toBeHex, + getNumber, + concat, + solidityPacked, +} from 'ethers'; +import hre from 'hardhat'; +const { + ethers: { provider: hreProvider }, +} = hre; +import { LSP6KeyManager } from '../../types/index.js'; // constants -import { LSP25_VERSION } from '../../constants'; +import { LSP25_VERSION } from '@lukso/lsp25-contracts'; import { EIP191Signer } from '@lukso/eip191-signer.js'; -export const abiCoder = ethers.utils.defaultAbiCoder; -export const provider = ethers.provider; +export const abiCoder = AbiCoder.defaultAbiCoder(); +export const provider = hreProvider; export const AddressOffset = '000000000000000000000000'; export const EMPTY_PAYLOAD = '0x'; @@ -52,7 +65,7 @@ export function getRandomAddresses(count: number): string[] { for (let ii = 0; ii < count; ii++) { // addresses stored under ERC725Y storage have always lowercases character. // therefore, disable the checksum by converting to lowercase to avoid failing tests - const randomAddress = ethers.Wallet.createRandom().address.toLowerCase(); + const randomAddress = Wallet.createRandom().address.toLowerCase(); addresses.push(randomAddress); } @@ -60,34 +73,33 @@ export function getRandomAddresses(count: number): string[] { } export function combinePermissions(..._permissions: string[]) { - let result: BigNumber = ethers.BigNumber.from(0); + let result: bigint = toBigInt(0); _permissions.forEach((permission) => { - const permissionAsBN = ethers.BigNumber.from(permission); - result = result.add(permissionAsBN); + const permissionAsBN = toBigInt(permission); + result = result | permissionAsBN; }); - return ethers.utils.hexZeroPad(result.toHexString(), 32); + return zeroPadValue(toBeHex(result), 32); } export function combineCallTypes(..._callTypes: string[]) { - let result: BigNumber = ethers.BigNumber.from(0); + let result: bigint = toBigInt(0); _callTypes.forEach((callType) => { - const callTypeAsBN = ethers.BigNumber.from(callType); - result = result.add(callTypeAsBN); + const callTypeAsBN = toBigInt(callType); + result = result | callTypeAsBN; }); - return ethers.utils.hexZeroPad(result.toHexString(), 4); + return zeroPadValue(toBeHex(result), 4); } export function encodeCompactBytesArray(inputKeys: BytesLike[]) { let compactBytesArray = '0x'; for (let i = 0; i < inputKeys.length; i++) { compactBytesArray += - ethers.utils - .hexZeroPad(ethers.utils.hexlify([inputKeys[i].toString().substring(2).length / 2]), 2) - .substring(2) + inputKeys[i].toString().substring(2); + zeroPadValue(toBeHex(inputKeys[i].toString().substring(2).length / 2), 2).substring(2) + + inputKeys[i].toString().substring(2); } return compactBytesArray; @@ -97,9 +109,7 @@ export function decodeCompactBytes(compactBytesArray: BytesLike) { let pointer = 2; const keysToExport: BytesLike[] = []; while (pointer < compactBytesArray.length) { - const length = ethers.BigNumber.from( - '0x' + compactBytesArray.toString().substring(pointer, pointer + 4), - ).toNumber(); + const length = getNumber('0x' + compactBytesArray.toString().substring(pointer, pointer + 4)); keysToExport.push( '0x' + compactBytesArray.toString().substring(pointer + 4, pointer + 2 * (length + 2)), ); @@ -137,19 +147,20 @@ export function combineAllowedCalls( export function createValidityTimestamps( startingTimestamp: number, endingTimestamp: number, -): BytesLike { - return ethers.utils.hexConcat([ - ethers.utils.zeroPad(ethers.utils.hexlify(startingTimestamp), 16), - ethers.utils.zeroPad(ethers.utils.hexlify(endingTimestamp), 16), +): bigint { + const concatenatedHex = concat([ + zeroPadValue(toBeHex(startingTimestamp), 16), + zeroPadValue(toBeHex(endingTimestamp), 16), ]); + return toBigInt(concatenatedHex); } export async function signLSP6ExecuteRelayCall( _keyManager: LSP6KeyManager, - _signerNonce: string, - _signerValidityTimestamps: BytesLike | number, + _signerNonce: string | bigint, + _signerValidityTimestamps: BytesLike | number | bigint, _signerPrivateKey: string, - _msgValue: number | BigNumber | string, + _msgValue: number | bigint | string, _payload: string, ) { const signedMessageParams = { @@ -161,7 +172,7 @@ export async function signLSP6ExecuteRelayCall( payload: _payload, }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ signedMessageParams.lsp25Version, @@ -176,7 +187,7 @@ export async function signLSP6ExecuteRelayCall( const eip191Signer = new EIP191Signer(); const { signature } = await eip191Signer.signDataWithIntendedValidator( - _keyManager.address, + await _keyManager.getAddress(), encodedMessage, _signerPrivateKey, ); diff --git a/tests/utils/tokens.ts b/packages/lsp-smart-contracts/tests/utils/tokens.ts similarity index 52% rename from tests/utils/tokens.ts rename to packages/lsp-smart-contracts/tests/utils/tokens.ts index a9c0bf3b6..49e3bbb0d 100644 --- a/tests/utils/tokens.ts +++ b/packages/lsp-smart-contracts/tests/utils/tokens.ts @@ -1,6 +1,6 @@ -import * as ethers from 'ethers'; +import { zeroPadValue, toBeHex, toBigInt } from 'ethers'; import type { BigNumberish, BytesLike } from 'ethers'; export const tokenIdAsBytes32 = (tokenId: BigNumberish): BytesLike => { - return ethers.utils.hexZeroPad(ethers.BigNumber.from(tokenId).toHexString(), 32); + return zeroPadValue(toBeHex(toBigInt(tokenId)), 32); }; diff --git a/packages/lsp-smart-contracts/tsconfig.json b/packages/lsp-smart-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp-smart-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp0-contracts/.eslintrc.js b/packages/lsp0-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp0-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/.solhint.json b/packages/lsp0-contracts/.solhint.json similarity index 100% rename from .solhint.json rename to packages/lsp0-contracts/.solhint.json diff --git a/packages/lsp0-contracts/README.md b/packages/lsp0-contracts/README.md new file mode 100644 index 000000000..440de54b1 --- /dev/null +++ b/packages/lsp0-contracts/README.md @@ -0,0 +1,3 @@ +# LSP0 ERC725Account · [![npm version](https://img.shields.io/npm/v/@lukso/lsp0-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp0-contracts) + +Package for the LSP0 ERC725Account standard. diff --git a/packages/lsp0-contracts/build.config.ts b/packages/lsp0-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp0-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp0-contracts/constants.ts b/packages/lsp0-contracts/constants.ts new file mode 100644 index 000000000..9fe90d5e5 --- /dev/null +++ b/packages/lsp0-contracts/constants.ts @@ -0,0 +1,44 @@ +// ERC165 Interface ID +// ---------- +export const INTERFACE_ID_LSP0ERC725Account = '0x24871b3d'; + +// ERC1271 +// ---------- + +/** + * @dev values returned by the `isValidSignature` function of the ERC1271 standard. + * Can be used to check if a signature is valid or not. + */ +export const ERC1271_VALUES = { + SUCCESS_VALUE: '0x1626ba7e', + FAIL_VALUE: '0xffffffff', +}; + +/** + * @dev list of ERC725X operation types. + * @see https://github.com/ERC725Alliance/ERC725/blob/develop/docs/ERC-725.md#execute + */ +export const OPERATION_TYPES = { + CALL: 0, + CREATE: 1, + CREATE2: 2, + STATICCALL: 3, + DELEGATECALL: 4, +}; + +export const LSP0_TYPE_IDS = { + // keccak256('LSP0ValueReceived') + LSP0ValueReceived: '0x9c4705229491d365fb5434052e12a386d6771d976bea61070a8c694e8affea3d', + + // keccak256('LSP0OwnershipTransferStarted') + LSP0OwnershipTransferStarted: + '0xe17117c9d2665d1dbeb479ed8058bbebde3c50ac50e2e65619f60006caac6926', + + // keccak256('LSP0OwnershipTransferred_SenderNotification') + LSP0OwnershipTransferred_SenderNotification: + '0xa4e59c931d14f7c8a7a35027f92ee40b5f2886b9fdcdb78f30bc5ecce5a2f814', + + // keccak256('LSP0OwnershipTransferred_RecipientNotification') + LSP0OwnershipTransferred_RecipientNotification: + '0xceca317f109c43507871523e82dc2a3cc64dfa18f12da0b6db14f6e23f995538', +}; diff --git a/contracts/LSP0ERC725Account/ILSP0ERC725Account.sol b/packages/lsp0-contracts/contracts/ILSP0ERC725Account.sol similarity index 100% rename from contracts/LSP0ERC725Account/ILSP0ERC725Account.sol rename to packages/lsp0-contracts/contracts/ILSP0ERC725Account.sol diff --git a/contracts/LSP0ERC725Account/LSP0Constants.sol b/packages/lsp0-contracts/contracts/LSP0Constants.sol similarity index 100% rename from contracts/LSP0ERC725Account/LSP0Constants.sol rename to packages/lsp0-contracts/contracts/LSP0Constants.sol diff --git a/contracts/LSP0ERC725Account/LSP0ERC725Account.sol b/packages/lsp0-contracts/contracts/LSP0ERC725Account.sol similarity index 98% rename from contracts/LSP0ERC725Account/LSP0ERC725Account.sol rename to packages/lsp0-contracts/contracts/LSP0ERC725Account.sol index 10c006c94..9306c3184 100644 --- a/contracts/LSP0ERC725Account/LSP0ERC725Account.sol +++ b/packages/lsp0-contracts/contracts/LSP0ERC725Account.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.4; // modules -import {Version} from "../Version.sol"; +import {Version} from "./Version.sol"; import {LSP0ERC725AccountCore} from "./LSP0ERC725AccountCore.sol"; import { OwnableUnset diff --git a/contracts/LSP0ERC725Account/LSP0ERC725AccountCore.sol b/packages/lsp0-contracts/contracts/LSP0ERC725AccountCore.sol similarity index 97% rename from contracts/LSP0ERC725Account/LSP0ERC725AccountCore.sol rename to packages/lsp0-contracts/contracts/LSP0ERC725AccountCore.sol index 372d31614..e88495751 100644 --- a/contracts/LSP0ERC725Account/LSP0ERC725AccountCore.sol +++ b/packages/lsp0-contracts/contracts/LSP0ERC725AccountCore.sol @@ -6,11 +6,11 @@ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol"; import {ILSP0ERC725Account} from "./ILSP0ERC725Account.sol"; import { ILSP1UniversalReceiver -} from "../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; import { ILSP1UniversalReceiverDelegate as ILSP1Delegate -} from "../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; // libraries import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; @@ -18,8 +18,8 @@ import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; -import {LSP1Utils} from "../LSP1UniversalReceiver/LSP1Utils.sol"; -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP1Utils} from "@lukso/lsp1-contracts/contracts/LSP1Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // modules import {ERC725YCore} from "@erc725/smart-contracts/contracts/ERC725YCore.sol"; @@ -27,11 +27,15 @@ import {ERC725XCore} from "@erc725/smart-contracts/contracts/ERC725XCore.sol"; import { OwnableUnset } from "@erc725/smart-contracts/contracts/custom/OwnableUnset.sol"; -import {LSP14Ownable2Step} from "../LSP14Ownable2Step/LSP14Ownable2Step.sol"; -import {LSP17Extendable} from "../LSP17ContractExtension/LSP17Extendable.sol"; +import { + LSP14Ownable2Step +} from "@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol"; +import { + LSP17Extendable +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol"; import { LSP20CallVerification -} from "../LSP20CallVerification/LSP20CallVerification.sol"; +} from "@lukso/lsp20-contracts/contracts/LSP20CallVerification.sol"; // constants import { @@ -49,15 +53,17 @@ import { _INTERFACEID_LSP1_DELEGATE, _LSP1_UNIVERSAL_RECEIVER_DELEGATE_PREFIX, _LSP1_UNIVERSAL_RECEIVER_DELEGATE_KEY -} from "../LSP1UniversalReceiver/LSP1Constants.sol"; -import {_INTERFACEID_LSP14} from "../LSP14Ownable2Step/LSP14Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; +import { + _INTERFACEID_LSP14 +} from "@lukso/lsp14-contracts/contracts/LSP14Constants.sol"; import { _LSP17_EXTENSION_PREFIX -} from "../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; import { _INTERFACEID_LSP20_CALL_VERIFICATION -} from "../LSP20CallVerification/LSP20Constants.sol"; +} from "@lukso/lsp20-contracts/contracts/LSP20Constants.sol"; // errors import { @@ -66,7 +72,7 @@ import { } from "@erc725/smart-contracts/contracts/errors.sol"; import { NoExtensionFoundForFunctionSelector -} from "../LSP17ContractExtension/LSP17Errors.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Errors.sol"; /** * @title The Core Implementation of [LSP-0-ERC725Account] Standard. diff --git a/contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol b/packages/lsp0-contracts/contracts/LSP0ERC725AccountInit.sol similarity index 98% rename from contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol rename to packages/lsp0-contracts/contracts/LSP0ERC725AccountInit.sol index c0fa0d2ce..5880ce8b9 100644 --- a/contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol +++ b/packages/lsp0-contracts/contracts/LSP0ERC725AccountInit.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.4; // modules -import {Version} from "../Version.sol"; +import {Version} from "./Version.sol"; import { LSP0ERC725AccountInitAbstract } from "./LSP0ERC725AccountInitAbstract.sol"; diff --git a/contracts/LSP0ERC725Account/LSP0ERC725AccountInitAbstract.sol b/packages/lsp0-contracts/contracts/LSP0ERC725AccountInitAbstract.sol similarity index 100% rename from contracts/LSP0ERC725Account/LSP0ERC725AccountInitAbstract.sol rename to packages/lsp0-contracts/contracts/LSP0ERC725AccountInitAbstract.sol diff --git a/contracts/Version.sol b/packages/lsp0-contracts/contracts/Version.sol similarity index 100% rename from contracts/Version.sol rename to packages/lsp0-contracts/contracts/Version.sol diff --git a/packages/lsp0-contracts/hardhat.config.ts b/packages/lsp0-contracts/hardhat.config.ts new file mode 100644 index 000000000..722f3e905 --- /dev/null +++ b/packages/lsp0-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: ['LSP0ERC725Account', 'LSP0ERC725AccountInit'], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp0-contracts/index.ts b/packages/lsp0-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp0-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp0-contracts/package.json b/packages/lsp0-contracts/package.json new file mode 100644 index 000000000..e9c65b0c2 --- /dev/null +++ b/packages/lsp0-contracts/package.json @@ -0,0 +1,57 @@ +{ + "name": "@lukso/lsp0-contracts", + "version": "0.12.1", + "description": "Package for the LSP0ERC725Account standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp2-contracts": "*", + "@lukso/lsp14-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp20-contracts": "*" + } +} diff --git a/packages/lsp0-contracts/tsconfig.json b/packages/lsp0-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp0-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp1-contracts/.eslintrc.js b/packages/lsp1-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp1-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp1-contracts/.solhint.json b/packages/lsp1-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp1-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp1-contracts/README.md b/packages/lsp1-contracts/README.md new file mode 100755 index 000000000..844e82f92 --- /dev/null +++ b/packages/lsp1-contracts/README.md @@ -0,0 +1,3 @@ +# LSP1 Universal Receiver · [![npm version](https://img.shields.io/npm/v/@lukso/lsp1-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp1-contracts) + +Package for the LSP1 Universal Receiver standard. diff --git a/packages/lsp1-contracts/build.config.ts b/packages/lsp1-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp1-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp1-contracts/constants.ts b/packages/lsp1-contracts/constants.ts new file mode 100644 index 000000000..f5d47c5d8 --- /dev/null +++ b/packages/lsp1-contracts/constants.ts @@ -0,0 +1,10 @@ +export const INTERFACE_ID_LSP1 = '0x6bb56a14'; + +export const LSP1DataKeys = { + // bytes10(keccak256('LSP1UniversalReceiverDelegate')) + bytes2(0) + LSP1UniversalReceiverDelegatePrefix: '0x0cfc51aec37c55a4d0b10000', + + // keccak256('LSP1UniversalReceiverDelegate') + LSP1UniversalReceiverDelegate: + '0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47', +}; diff --git a/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiver.sol b/packages/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol similarity index 100% rename from contracts/LSP1UniversalReceiver/ILSP1UniversalReceiver.sol rename to packages/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol diff --git a/contracts/LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol b/packages/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol similarity index 100% rename from contracts/LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol rename to packages/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol diff --git a/contracts/LSP1UniversalReceiver/LSP1Constants.sol b/packages/lsp1-contracts/contracts/LSP1Constants.sol similarity index 100% rename from contracts/LSP1UniversalReceiver/LSP1Constants.sol rename to packages/lsp1-contracts/contracts/LSP1Constants.sol diff --git a/contracts/LSP1UniversalReceiver/LSP1Utils.sol b/packages/lsp1-contracts/contracts/LSP1Utils.sol similarity index 96% rename from contracts/LSP1UniversalReceiver/LSP1Utils.sol rename to packages/lsp1-contracts/contracts/LSP1Utils.sol index 026c3e8e9..6b541115e 100644 --- a/contracts/LSP1UniversalReceiver/LSP1Utils.sol +++ b/packages/lsp1-contracts/contracts/LSP1Utils.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.4; import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // constants import {ILSP1UniversalReceiver as ILSP1} from "./ILSP1UniversalReceiver.sol"; @@ -15,7 +15,7 @@ import { _INTERFACEID_LSP1, _LSP1_UNIVERSAL_RECEIVER_DELEGATE_KEY, _LSP1_UNIVERSAL_RECEIVER_DELEGATE_PREFIX -} from "../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "./LSP1Constants.sol"; /** * @title LSP1 Utility library. diff --git a/packages/lsp1-contracts/hardhat.config.ts b/packages/lsp1-contracts/hardhat.config.ts new file mode 100755 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp1-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp1-contracts/index.ts b/packages/lsp1-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp1-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp1-contracts/package.json b/packages/lsp1-contracts/package.json new file mode 100644 index 000000000..0ca6fb3c7 --- /dev/null +++ b/packages/lsp1-contracts/package.json @@ -0,0 +1,48 @@ +{ + "name": "@lukso/lsp1-contracts", + "version": "0.12.1", + "description": "Package for the LSP1 Universal Receiver standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@openzeppelin/contracts": "^4.9.3", + "@lukso/lsp2-contracts": "*" + } +} diff --git a/packages/lsp1-contracts/tsconfig.json b/packages/lsp1-contracts/tsconfig.json new file mode 100755 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp1-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp10-contracts/.eslintrc.js b/packages/lsp10-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp10-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp10-contracts/.solhint.json b/packages/lsp10-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp10-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp10-contracts/README.md b/packages/lsp10-contracts/README.md new file mode 100755 index 000000000..e3d535d0c --- /dev/null +++ b/packages/lsp10-contracts/README.md @@ -0,0 +1,3 @@ +# LSP10 Received Vaults · [![npm version](https://img.shields.io/npm/v/@lukso/lsp10-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp10-contracts) + +Package for the LSP10 Received Vaults standard. diff --git a/packages/lsp10-contracts/build.config.ts b/packages/lsp10-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp10-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp10-contracts/constants.ts b/packages/lsp10-contracts/constants.ts new file mode 100644 index 000000000..d5b009d48 --- /dev/null +++ b/packages/lsp10-contracts/constants.ts @@ -0,0 +1,12 @@ +import { LSP2ArrayKey } from '@lukso/lsp2-contracts'; + +export const LSP10DataKeys = { + // keccak256('LSP10VaultsMap') + bytes2(0) + LSP10VaultsMap: '0x192448c3c0f88c7f238c0000', + + // keccak256('LSP10Vaults[]') + 'LSP10Vaults[]': { + length: '0x55482936e01da86729a45d2b87a6b1d3bc582bea0ec00e38bdb340e3af6f9f06', + index: '0x55482936e01da86729a45d2b87a6b1d3', + } as LSP2ArrayKey, +}; diff --git a/contracts/LSP10ReceivedVaults/LSP10Constants.sol b/packages/lsp10-contracts/contracts/LSP10Constants.sol similarity index 100% rename from contracts/LSP10ReceivedVaults/LSP10Constants.sol rename to packages/lsp10-contracts/contracts/LSP10Constants.sol diff --git a/contracts/LSP10ReceivedVaults/LSP10Utils.sol b/packages/lsp10-contracts/contracts/LSP10Utils.sol similarity index 97% rename from contracts/LSP10ReceivedVaults/LSP10Utils.sol rename to packages/lsp10-contracts/contracts/LSP10Utils.sol index 0321eec00..7dac06f2c 100644 --- a/contracts/LSP10ReceivedVaults/LSP10Utils.sol +++ b/packages/lsp10-contracts/contracts/LSP10Utils.sol @@ -7,14 +7,17 @@ import { } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; // libraries -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // constants -import {_INTERFACEID_LSP9} from "../LSP9Vault/LSP9Constants.sol"; + +// TODO: add LSP9 as a dependency to this package and import the constant from it +bytes4 constant _INTERFACEID_LSP9 = 0x28af17e6; + import { _LSP10_VAULTS_MAP_KEY_PREFIX, _LSP10_VAULTS_ARRAY_KEY -} from "../LSP10ReceivedVaults/LSP10Constants.sol"; +} from "./LSP10Constants.sol"; /** * @title LSP10 Utility library. diff --git a/packages/lsp10-contracts/hardhat.config.ts b/packages/lsp10-contracts/hardhat.config.ts new file mode 100755 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp10-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp10-contracts/index.ts b/packages/lsp10-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp10-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp10-contracts/package.json b/packages/lsp10-contracts/package.json new file mode 100644 index 000000000..cc8814eae --- /dev/null +++ b/packages/lsp10-contracts/package.json @@ -0,0 +1,48 @@ +{ + "name": "@lukso/lsp10-contracts", + "version": "0.12.1", + "description": "Package for the LSP10 Received Vaults standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^6.0.0", + "@lukso/lsp2-contracts": "*" + } +} diff --git a/packages/lsp10-contracts/tsconfig.json b/packages/lsp10-contracts/tsconfig.json new file mode 100755 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp10-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp12-contracts/.eslintrc.js b/packages/lsp12-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp12-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp12-contracts/.solhint.json b/packages/lsp12-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp12-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp12-contracts/README.md b/packages/lsp12-contracts/README.md new file mode 100644 index 000000000..71c57f54e --- /dev/null +++ b/packages/lsp12-contracts/README.md @@ -0,0 +1,3 @@ +# · [![npm version](https://img.shields.io/npm/v/@lukso/lsp12-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp12-contracts) + +Package for the LSP12 Issued Assets standard. diff --git a/packages/lsp12-contracts/build.config.ts b/packages/lsp12-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp12-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp12-contracts/constants.ts b/packages/lsp12-contracts/constants.ts new file mode 100644 index 000000000..28a5871d8 --- /dev/null +++ b/packages/lsp12-contracts/constants.ts @@ -0,0 +1,12 @@ +import { LSP2ArrayKey } from '@lukso/lsp2-contracts'; + +export const LSP12DataKeys = { + // LSP12IssuedAssetsMap:
+ bytes2(0) + LSP12IssuedAssetsMap: '0x74ac2555c10b9349e78f0000', + + // keccak256('LSP12IssuedAssets[]') + 'LSP12IssuedAssets[]': { + length: '0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd', + index: '0x7c8c3416d6cda87cd42c71ea1843df28', + } as LSP2ArrayKey, +}; diff --git a/packages/lsp12-contracts/contracts/LSP12Constants.sol b/packages/lsp12-contracts/contracts/LSP12Constants.sol new file mode 100644 index 000000000..3ee36cba8 --- /dev/null +++ b/packages/lsp12-contracts/contracts/LSP12Constants.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +// keccak256('LSP12IssuedAssets[]') +bytes32 constant _LSP12_ISSUED_ASSETS_ARRAY_KEY = 0x114bd03b3a46d48759680d81ebb2b414fda7d030a7105a851867accf1c2352e7; + +// bytes10(keccak256('LSP12IssuedAssetsMap')) +bytes10 constant _LSP12_ISSUED_ASSETS_MAP_KEY_PREFIX = 0x6de85eaf5d982b4e5da0; diff --git a/packages/lsp12-contracts/hardhat.config.ts b/packages/lsp12-contracts/hardhat.config.ts new file mode 100644 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp12-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp12-contracts/index.ts b/packages/lsp12-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp12-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp12-contracts/package.json b/packages/lsp12-contracts/package.json new file mode 100644 index 000000000..c5789dce9 --- /dev/null +++ b/packages/lsp12-contracts/package.json @@ -0,0 +1,47 @@ +{ + "name": "@lukso/lsp12-contracts", + "version": "0.12.1", + "description": "Package for the LSP12 Issued Assets standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@lukso/lsp2-contracts": "*" + } +} diff --git a/packages/lsp12-contracts/tsconfig.json b/packages/lsp12-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp12-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp14-contracts/.eslintrc.js b/packages/lsp14-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp14-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp14-contracts/.solhint.json b/packages/lsp14-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp14-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp14-contracts/README.md b/packages/lsp14-contracts/README.md new file mode 100755 index 000000000..6790c77d1 --- /dev/null +++ b/packages/lsp14-contracts/README.md @@ -0,0 +1,3 @@ +# LSP14 Ownable 2 Step · [![npm version](https://img.shields.io/npm/v/@lukso/lsp14-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp14-contracts) + +Package for the LSP14 Ownable 2 Step standard. diff --git a/packages/lsp14-contracts/build.config.ts b/packages/lsp14-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp14-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp14-contracts/constants.ts b/packages/lsp14-contracts/constants.ts new file mode 100644 index 000000000..0220c1497 --- /dev/null +++ b/packages/lsp14-contracts/constants.ts @@ -0,0 +1,15 @@ +export const INTERFACE_ID_LSP14 = '0x94be5999'; + +export const LSP14_TYPE_IDS = { + // keccak256('LSP14OwnershipTransferStarted') + LSP14OwnershipTransferStarted: + '0xee9a7c0924f740a2ca33d59b7f0c2929821ea9837ce043ce91c1823e9c4e52c0', + + // keccak256('LSP14OwnershipTransferred_SenderNotification') + LSP14OwnershipTransferred_SenderNotification: + '0xa124442e1cc7b52d8e2ede2787d43527dc1f3ae0de87f50dd03e27a71834f74c', + + // keccak256('LSP14OwnershipTransferred_RecipientNotification') + LSP14OwnershipTransferred_RecipientNotification: + '0xe32c7debcb817925ba4883fdbfc52797187f28f73f860641dab1a68d9b32902c', +}; diff --git a/contracts/LSP14Ownable2Step/ILSP14Ownable2Step.sol b/packages/lsp14-contracts/contracts/ILSP14Ownable2Step.sol similarity index 100% rename from contracts/LSP14Ownable2Step/ILSP14Ownable2Step.sol rename to packages/lsp14-contracts/contracts/ILSP14Ownable2Step.sol diff --git a/contracts/LSP14Ownable2Step/LSP14Constants.sol b/packages/lsp14-contracts/contracts/LSP14Constants.sol similarity index 100% rename from contracts/LSP14Ownable2Step/LSP14Constants.sol rename to packages/lsp14-contracts/contracts/LSP14Constants.sol diff --git a/contracts/LSP14Ownable2Step/LSP14Errors.sol b/packages/lsp14-contracts/contracts/LSP14Errors.sol similarity index 100% rename from contracts/LSP14Ownable2Step/LSP14Errors.sol rename to packages/lsp14-contracts/contracts/LSP14Errors.sol diff --git a/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol b/packages/lsp14-contracts/contracts/LSP14Ownable2Step.sol similarity index 99% rename from contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol rename to packages/lsp14-contracts/contracts/LSP14Ownable2Step.sol index 561e27c83..5a359bc45 100644 --- a/contracts/LSP14Ownable2Step/LSP14Ownable2Step.sol +++ b/packages/lsp14-contracts/contracts/LSP14Ownable2Step.sol @@ -10,7 +10,7 @@ import { } from "@erc725/smart-contracts/contracts/custom/OwnableUnset.sol"; // libraries -import {LSP1Utils} from "../LSP1UniversalReceiver/LSP1Utils.sol"; +import {LSP1Utils} from "@lukso/lsp1-contracts/contracts/LSP1Utils.sol"; // errors import { diff --git a/packages/lsp14-contracts/hardhat.config.ts b/packages/lsp14-contracts/hardhat.config.ts new file mode 100755 index 000000000..4e12de17e --- /dev/null +++ b/packages/lsp14-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: ['LSP14Ownable2Step'], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp14-contracts/index.ts b/packages/lsp14-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp14-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp14-contracts/package.json b/packages/lsp14-contracts/package.json new file mode 100644 index 000000000..8f0e27a44 --- /dev/null +++ b/packages/lsp14-contracts/package.json @@ -0,0 +1,48 @@ +{ + "name": "@lukso/lsp14-contracts", + "version": "0.12.1", + "description": "Package for the LSP14 Ownable 2 Step standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp1-contracts": "*" + } +} diff --git a/packages/lsp14-contracts/tsconfig.json b/packages/lsp14-contracts/tsconfig.json new file mode 100755 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp14-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp16-contracts/.eslintrc.js b/packages/lsp16-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp16-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp16-contracts/.solhint.json b/packages/lsp16-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp16-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp16-contracts/README.md b/packages/lsp16-contracts/README.md new file mode 100644 index 000000000..291cacccb --- /dev/null +++ b/packages/lsp16-contracts/README.md @@ -0,0 +1,3 @@ +# LSP16 Universal Factory · [![npm version](https://img.shields.io/npm/v/@lukso/lsp16-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp16-contracts) + +Package for the [LSP16-UniversalFactory](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-16-UniversalFactory.md) standard, contains a contract that allows deploying contracts on multiple chains with the same address. diff --git a/contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol b/packages/lsp16-contracts/contracts/LSP16UniversalFactory.sol similarity index 100% rename from contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol rename to packages/lsp16-contracts/contracts/LSP16UniversalFactory.sol diff --git a/packages/lsp16-contracts/contracts/Mocks/Account.sol b/packages/lsp16-contracts/contracts/Mocks/Account.sol new file mode 100644 index 000000000..2f937bae1 --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/Account.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.13; + +import {ERC725} from "@erc725/smart-contracts/contracts/ERC725.sol"; + +contract Account is ERC725 { + // solhint-disable-next-line no-empty-blocks + constructor(address contractOwner) ERC725(contractOwner) {} +} diff --git a/packages/lsp16-contracts/contracts/Mocks/AccountInit.sol b/packages/lsp16-contracts/contracts/Mocks/AccountInit.sol new file mode 100644 index 000000000..2711ba0a6 --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/AccountInit.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.13; + +import { + ERC725InitAbstract +} from "@erc725/smart-contracts/contracts/ERC725InitAbstract.sol"; + +// solhint-disable-next-line no-empty-blocks +contract AccountInit is ERC725InitAbstract { + function initialize(address newOwner) public virtual initializer { + ERC725InitAbstract._initialize(newOwner); + } +} diff --git a/packages/lsp16-contracts/contracts/Mocks/ContractNoConstructor.sol b/packages/lsp16-contracts/contracts/Mocks/ContractNoConstructor.sol new file mode 100644 index 000000000..77f796fe7 --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/ContractNoConstructor.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +contract ContractNoConstructor { + uint256 private _number = 5; + + function getNumber() public view returns (uint256) { + return _number; + } + + function setNumber(uint256 newNumber) public { + _number = newNumber; + } +} diff --git a/packages/lsp16-contracts/contracts/Mocks/FallbackContract.sol b/packages/lsp16-contracts/contracts/Mocks/FallbackContract.sol new file mode 100644 index 000000000..ef9ed20d7 --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/FallbackContract.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @dev sample contract used for testing + */ +contract FallbackContract { + fallback() external payable {} +} diff --git a/packages/lsp16-contracts/contracts/Mocks/FallbackInitializer.sol b/packages/lsp16-contracts/contracts/Mocks/FallbackInitializer.sol new file mode 100644 index 000000000..c74031b9a --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/FallbackInitializer.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @dev sample contract used for testing + */ +contract FallbackInitializer { + address public caller; + + receive() external payable { + _initialize(); + } + + fallback() external payable { + _initialize(); + } + + function _initialize() internal { + caller = msg.sender; + } +} diff --git a/packages/lsp16-contracts/contracts/Mocks/ImplementationTester.sol b/packages/lsp16-contracts/contracts/Mocks/ImplementationTester.sol new file mode 100644 index 000000000..0cd7b6579 --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/ImplementationTester.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import { + Initializable +} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +contract ImplementationTester is Initializable { + address private _owner; + + function initialize(address newOwner) public virtual initializer { + _owner = newOwner; + } + + function owner() public view virtual returns (address) { + return _owner; + } +} diff --git a/packages/lsp16-contracts/contracts/Mocks/NonPayableContract.sol b/packages/lsp16-contracts/contracts/Mocks/NonPayableContract.sol new file mode 100644 index 000000000..8899a127e --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/NonPayableContract.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.13; + +contract NonPayableContract { + address private _owner; + + constructor(address newOwner) { + _owner = newOwner; + } + + function getOwner() public view returns (address) { + return _owner; + } +} diff --git a/packages/lsp16-contracts/contracts/Mocks/NonPayableFallback.sol b/packages/lsp16-contracts/contracts/Mocks/NonPayableFallback.sol new file mode 100644 index 000000000..ba1fb8856 --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/NonPayableFallback.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +contract NonPayableFallback { + // solhint-disable-next-line payable-fallback + fallback() external {} +} diff --git a/packages/lsp16-contracts/contracts/Mocks/PayableContract.sol b/packages/lsp16-contracts/contracts/Mocks/PayableContract.sol new file mode 100644 index 000000000..c638d0c7b --- /dev/null +++ b/packages/lsp16-contracts/contracts/Mocks/PayableContract.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @dev sample contract used for testing + */ +contract PayableContract { + // solhint-disable no-empty-blocks + constructor() payable {} + + // solhint-disable no-empty-blocks + function payableTrue() public payable {} + + // solhint-disable no-empty-blocks + function payableFalse() public {} +} diff --git a/contracts/LSP16UniversalFactory/README.md b/packages/lsp16-contracts/contracts/README.md similarity index 100% rename from contracts/LSP16UniversalFactory/README.md rename to packages/lsp16-contracts/contracts/README.md diff --git a/tests/foundry/LSP16UniversalFactory/LSP16UniversalProfile.t.sol b/packages/lsp16-contracts/foundry/LSP16UniversalFactory.t.sol similarity index 91% rename from tests/foundry/LSP16UniversalFactory/LSP16UniversalProfile.t.sol rename to packages/lsp16-contracts/foundry/LSP16UniversalFactory.t.sol index 48d4c397b..d1b285078 100644 --- a/tests/foundry/LSP16UniversalFactory/LSP16UniversalProfile.t.sol +++ b/packages/lsp16-contracts/foundry/LSP16UniversalFactory.t.sol @@ -6,18 +6,19 @@ import "forge-std/console.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; -import "../../../contracts/LSP16UniversalFactory/LSP16UniversalFactory.sol"; -import "../../../contracts/Mocks/NonPayableFallback.sol"; -import "../../../contracts/Mocks/FallbackInitializer.sol"; -import "../../../contracts/LSP0ERC725Account/LSP0ERC725Account.sol"; -import "../../../contracts/LSP0ERC725Account/LSP0ERC725AccountInit.sol"; +import {LSP16UniversalFactory} from "../contracts/LSP16UniversalFactory.sol"; +import {NonPayableFallback} from "../contracts/Mocks/NonPayableFallback.sol"; +import {FallbackInitializer} from "../contracts/Mocks/FallbackInitializer.sol"; +import {Account} from "../contracts/Mocks/Account.sol"; +import {AccountInit} from "../contracts/Mocks/AccountInit.sol"; contract LSP16UniversalProfileTest is Test { LSP16UniversalFactory public lsp16; NonPayableFallback public nonPayableFallbackContract; FallbackInitializer public fallbackInitializer; - LSP0ERC725Account public lsp0; - LSP0ERC725AccountInit public lsp0Init; + + Account public account; + AccountInit public accountInit; bytes public nonPayableFallbackBytecode = type(NonPayableFallback).creationCode; @@ -35,8 +36,9 @@ contract LSP16UniversalProfileTest is Test { nonPayableFallbackContract = new NonPayableFallback(); fallbackInitializer = new FallbackInitializer(); - lsp0Init = new LSP0ERC725AccountInit(); - lsp0 = new LSP0ERC725Account(address(20)); + + account = new Account(address(20)); + accountInit = new AccountInit(); uniqueInitializableSalt = lsp16.generateSalt( randomBytes32ForSalt, @@ -103,13 +105,13 @@ contract LSP16UniversalProfileTest is Test { assert(salt != uniqueInitializableSalt); } - function testdeployERC1167ProxyWithUPInit() public { + function testdeployERC1167ProxyWithAccountInit() public { bytes32 salt = lsp16.generateSalt(bytes32(++testCounter), false, ""); (bool success, bytes memory returnData) = address(lsp16).call( abi.encodeWithSignature( "deployERC1167Proxy(address,bytes32)", - address(lsp0Init), + address(accountInit), salt ) ); @@ -120,7 +122,7 @@ contract LSP16UniversalProfileTest is Test { ); } - function testdeployERC1167ProxyAndInitializeShouldNotKeepValueWithUPInit( + function testdeployERC1167ProxyAndInitializeShouldNotKeepValueWithAccountInit( uint256 valueToTransfer, bytes memory initializeCalldata ) public { @@ -143,7 +145,7 @@ contract LSP16UniversalProfileTest is Test { }( abi.encodeWithSignature( "deployERC1167ProxyAndInitialize(address,bytes32,bytes)", - address(lsp0Init), + address(accountInit), salt, lsp0Initbytes ) @@ -156,7 +158,7 @@ contract LSP16UniversalProfileTest is Test { assert(address(lsp16).balance == 0); } - function testDeployCreate2ShouldNotKeepValueWithUP( + function testDeployCreate2ShouldNotKeepValueWithAccount( uint256 valueToTransfer ) public { vm.deal(address(this), valueToTransfer); @@ -170,7 +172,7 @@ contract LSP16UniversalProfileTest is Test { abi.encodeWithSignature( "deployCreate2(bytes,bytes32)", abi.encodePacked( - type(LSP0ERC725Account).creationCode, + type(Account).creationCode, abi.encode(address(this)) ), salt @@ -187,7 +189,7 @@ contract LSP16UniversalProfileTest is Test { ); } - function testdeployCreate2AndInitializeShouldNotKeepValueWithUPInit( + function testdeployCreate2AndInitializeShouldNotKeepValueWithAccountInit( uint128 valueForInitializer, bytes4 initilializerBytes ) public { @@ -205,7 +207,7 @@ contract LSP16UniversalProfileTest is Test { }( abi.encodeWithSignature( "deployCreate2AndInitialize(bytes,bytes32,bytes,uint256,uint256)", - type(LSP0ERC725AccountInit).creationCode, + type(AccountInit).creationCode, salt, _removeRandomByteFromBytes4(initilializerBytes), 0, // constructor is not payable @@ -267,7 +269,7 @@ contract LSP16UniversalProfileTest is Test { (bool success, ) = address(lsp16).call{value: valueToTransfer}( abi.encodeWithSignature( "deployERC1167ProxyAndInitialize(address,bytes32,bytes)", - address(lsp0Init), + address(accountInit), salt, initializeCalldata ) @@ -342,7 +344,7 @@ contract LSP16UniversalProfileTest is Test { ); } - function testcomputeAddressShouldReturnCorrectUPAddressWithdeployCreate2AndInitialize( + function testcomputeAddressShouldReturnCorrectAccountAddressWithdeployCreate2AndInitialize( bytes32 providedSalt, uint256 valueForInitializer, bytes4 initilializerBytes @@ -355,7 +357,7 @@ contract LSP16UniversalProfileTest is Test { ); address expectedAddress = lsp16.computeAddress( - keccak256(type(LSP0ERC725AccountInit).creationCode), + keccak256(type(AccountInit).creationCode), providedSalt, true, initializeCallData @@ -365,7 +367,7 @@ contract LSP16UniversalProfileTest is Test { }( abi.encodeWithSignature( "deployCreate2AndInitialize(bytes,bytes32,bytes,uint256,uint256)", - type(LSP0ERC725AccountInit).creationCode, + type(AccountInit).creationCode, providedSalt, initializeCallData, 0, @@ -383,7 +385,7 @@ contract LSP16UniversalProfileTest is Test { assert(expectedAddress == returnedAddress); } - function testcomputeAddressShouldReturnCorrectUPAddressWithDeployCreate2( + function testcomputeAddressShouldReturnCorrectAccountAddressWithDeployCreate2( bytes32 providedSalt, uint256 valueForConstructor ) public { @@ -393,7 +395,7 @@ contract LSP16UniversalProfileTest is Test { address expectedAddress = lsp16.computeAddress( keccak256( abi.encodePacked( - type(LSP0ERC725Account).creationCode, + type(Account).creationCode, abi.encode(address(this)) ) ), @@ -407,7 +409,7 @@ contract LSP16UniversalProfileTest is Test { abi.encodeWithSignature( "deployCreate2(bytes,bytes32)", abi.encodePacked( - type(LSP0ERC725Account).creationCode, + type(Account).creationCode, abi.encode(address(this)) ), providedSalt @@ -436,7 +438,7 @@ contract LSP16UniversalProfileTest is Test { ); address expectedAddress = lsp16.computeERC1167Address( - address(lsp0Init), + address(accountInit), providedSalt, true, initializeCallData @@ -446,7 +448,7 @@ contract LSP16UniversalProfileTest is Test { }( abi.encodeWithSignature( "deployERC1167ProxyAndInitialize(address,bytes32,bytes)", - address(lsp0Init), + address(accountInit), providedSalt, initializeCallData ) @@ -465,7 +467,7 @@ contract LSP16UniversalProfileTest is Test { bytes32 providedSalt ) public { address expectedAddress = lsp16.computeERC1167Address( - address(lsp0), + address(account), providedSalt, false, "" @@ -473,7 +475,7 @@ contract LSP16UniversalProfileTest is Test { (bool success, bytes memory returnedData) = address(lsp16).call( abi.encodeWithSignature( "deployERC1167Proxy(address,bytes32)", - address(lsp0), + address(account), providedSalt ) ); diff --git a/packages/lsp16-contracts/hardhat.config.ts b/packages/lsp16-contracts/hardhat.config.ts new file mode 100644 index 000000000..6a0df5c2a --- /dev/null +++ b/packages/lsp16-contracts/hardhat.config.ts @@ -0,0 +1,134 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 9999999, + }, + metadata: { + // do not include the metadata hash, since this is machine dependent + // and we want all generated code to be deterministic + // https://docs.soliditylang.org/en/v0.7.6/metadata.html + bytecodeHash: 'none', + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: ['LSP16UniversalFactory'], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp16-contracts/package.json b/packages/lsp16-contracts/package.json new file mode 100644 index 000000000..aa449a17f --- /dev/null +++ b/packages/lsp16-contracts/package.json @@ -0,0 +1,51 @@ +{ + "name": "@lukso/lsp16-contracts", + "version": "0.12.1", + "description": "Package for the LSP16 Universal Factory standard", + "license": "Apache-2.0", + "author": "", + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "./README.md" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:foundry": "forge build", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'", + "test": "hardhat test --no-compile tests/*.test.ts", + "test:foundry": "FOUNDRY_PROFILE=lsp16 forge test --no-match-test Skip -vvv", + "test:coverage": "hardhat coverage" + }, + "dependencies": { + "@openzeppelin/contracts": "^4.9.2", + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts-upgradeable": "^4.9.2" + } +} diff --git a/tests/LSP16UniversalFactory/LSP16UniversalFactory.test.ts b/packages/lsp16-contracts/tests/LSP16UniversalFactory.test.ts similarity index 64% rename from tests/LSP16UniversalFactory/LSP16UniversalFactory.test.ts rename to packages/lsp16-contracts/tests/LSP16UniversalFactory.test.ts index fdbe78429..1f023fd3d 100644 --- a/tests/LSP16UniversalFactory/LSP16UniversalFactory.test.ts +++ b/packages/lsp16-contracts/tests/LSP16UniversalFactory.test.ts @@ -1,33 +1,34 @@ +import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { FakeContract, smock } from '@defi-wonderland/smock'; import { - LSP1UniversalReceiverDelegateUP__factory, LSP16UniversalFactory, LSP16UniversalFactory__factory, - UniversalProfileInit, - UniversalProfileInit__factory, - LSP1UniversalReceiverDelegateUP, - UniversalProfile, - UniversalProfile__factory, + Account, + Account__factory, + AccountInit, + AccountInit__factory, PayableContract, PayableContract__factory, + NonPayableContract__factory, ImplementationTester, ImplementationTester__factory, FallbackInitializer, FallbackInitializer__factory, - LSP6KeyManager__factory, -} from '../../types'; - -import web3 from 'web3'; + ContractNoConstructor__factory, + ContractNoConstructor, + FallbackContract, + FallbackContract__factory, +} from '../types'; -import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { UniversalProfile } from '../../../types'; +import { AbiCoder, concat } from 'ethers'; -import { provider, AddressOffset } from '../utils/helpers'; +const abiCoder = new AbiCoder(); -const UniversalProfileBytecode = UniversalProfile__factory.bytecode; -const LSP6KeyManagerBytecode = LSP6KeyManager__factory.bytecode; +const AccountBytecode = Account__factory.bytecode; +const NonPayableConstructorBytecode = NonPayableContract__factory.bytecode; const ImplementationTesterBytecode = ImplementationTester__factory.bytecode; const FallbackInitializerBytecode = FallbackInitializer__factory.bytecode; @@ -60,38 +61,30 @@ describe('UniversalFactory contract', () => { describe('When using LSP16UniversalFactory', () => { let context: UniversalFactoryTestContext; - let universalProfileConstructor: UniversalProfile; - let universalProfileBaseContract: UniversalProfileInit; - let universalReceiverDelegate: LSP1UniversalReceiverDelegateUP; + let accountConstructor: Account; + let accountBaseContract: AccountInit; + let contractNoConstructor: ContractNoConstructor; let payableContract: PayableContract; - let fallbackContract: FakeContract; + let fallbackContract: FallbackContract; let implementationTester: ImplementationTester; let fallbackInitializer: FallbackInitializer; before(async () => { context = await buildTestContext(); - universalProfileConstructor = await new UniversalProfile__factory( - context.accounts.random, - ).deploy(ethers.constants.AddressZero); + accountConstructor = await new Account__factory(context.accounts.random).deploy( + context.accounts.random.address, + ); - universalProfileBaseContract = await new UniversalProfileInit__factory( - context.accounts.random, - ).deploy(); + accountBaseContract = await new AccountInit__factory(context.accounts.random).deploy(); - universalReceiverDelegate = await new LSP1UniversalReceiverDelegateUP__factory( + contractNoConstructor = await new ContractNoConstructor__factory( context.accounts.random, ).deploy(); payableContract = await new PayableContract__factory(context.accounts.random).deploy(); - fallbackContract = await smock.fake([ - { - stateMutability: 'payable', - type: 'fallback', - }, - ]); - fallbackContract.fallback.returns(); + fallbackContract = await new FallbackContract__factory(context.accounts.random).deploy(); implementationTester = await new ImplementationTester__factory( context.accounts.random, @@ -104,35 +97,43 @@ describe('UniversalFactory contract', () => { describe('when using deployCreate2', () => { it('should calculate the address of a non-initializable contract correctly', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); + + const randomAddress = ethers.Wallet.createRandom(); // Set the Owner as the ZeroAddress - const UPBytecode = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode = concat([ + AccountBytecode, + abiCoder.encode(['address'], [randomAddress.address]), + ]); - const bytecodeHash = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode]); + const bytecodeHash = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode]); const calulcatedAddress = await context.universalFactory.computeAddress( bytecodeHash, salt, false, - [], + '0x', ); const contractCreated = await context.universalFactory .connect(context.accounts.deployer1) - .callStatic.deployCreate2(UPBytecode, salt); + .deployCreate2.staticCall(UPBytecode, salt); expect(calulcatedAddress).to.equal(contractCreated); }); it('should calculate the same address of a contract if the initializeCalldata changed and the contract is not initializable', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); + + const randomAddress = ethers.Wallet.createRandom(); - const UPBytecode = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode = concat([ + AccountBytecode, + abiCoder.encode(['address'], [randomAddress.address]), + ]); - const bytecodeHash = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode]); + const bytecodeHash = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode]); const calulcatedAddressSalt1 = await context.universalFactory.computeAddress( bytecodeHash, @@ -154,13 +155,15 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a contract if the salt changed', async () => { - const salt1 = ethers.utils.solidityKeccak256(['string'], ['Salt1']); - const salt2 = ethers.utils.solidityKeccak256(['string'], ['Salt2']); + const salt1 = ethers.solidityPackedKeccak256(['string'], ['Salt1']); + const salt2 = ethers.solidityPackedKeccak256(['string'], ['Salt2']); - const UPBytecode = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode = concat([ + AccountBytecode, + abiCoder.encode(['address'], [ethers.ZeroAddress]), + ]); - const bytecodeHash = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode]); + const bytecodeHash = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode]); const calulcatedAddressSalt1 = await context.universalFactory.computeAddress( bytecodeHash, @@ -182,17 +185,21 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a contract if the bytecode changed', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const UPBytecode1 = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode1 = concat([ + AccountBytecode, + abiCoder.encode(['address'], [ethers.ZeroAddress]), + ]); - const bytecodeHash1 = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode1]); + const bytecodeHash1 = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode1]); - const UPBytecode2 = - UniversalProfileBytecode + AddressOffset + 'cafecafecafecafecafecafecafecafecafecafe'; + const UPBytecode2 = concat([ + AccountBytecode, + abiCoder.encode(['address'], ['0xcafecafecafecafecafecafecafecafecafecafe']), + ]); - const bytecodeHash2 = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode2]); + const bytecodeHash2 = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode2]); const calulcatedAddressBytecode1 = await context.universalFactory.computeAddress( bytecodeHash1, @@ -214,10 +221,14 @@ describe('UniversalFactory contract', () => { }); it('should revert when deploying a non-initializable contract with the same bytecode and salt ', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); + + const randomAddress = ethers.Wallet.createRandom(); - const UPBytecode = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode = concat([ + AccountBytecode, + abiCoder.encode(['address'], [randomAddress.address]), + ]); await context.universalFactory.deployCreate2(UPBytecode, salt); @@ -227,10 +238,12 @@ describe('UniversalFactory contract', () => { }); it('should revert when sending value while deploying a non payable non-initializable contract', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['OtherSalt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['OtherSalt']); - const KMBytecode = - LSP6KeyManagerBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const KMBytecode = concat([ + NonPayableConstructorBytecode, + abiCoder.encode(['address'], [ethers.ZeroAddress]), + ]); await expect( context.universalFactory.deployCreate2(KMBytecode, salt, { @@ -240,11 +253,11 @@ describe('UniversalFactory contract', () => { }); it('should pass when sending value while deploying a payable non-initializable contract', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['OtherSalt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['OtherSalt']); const valueSent = 100; - const contractCreated = await context.universalFactory.callStatic.deployCreate2( + const contractCreated = await context.universalFactory.deployCreate2.staticCall( PayableContract__factory.bytecode, salt, { @@ -256,47 +269,47 @@ describe('UniversalFactory contract', () => { value: valueSent, }); - const balance = (await provider.getBalance(contractCreated)).toNumber(); + const balance = await ethers.provider.getBalance(contractCreated); expect(balance).to.equal(valueSent); }); it('should deploy an un-initializable contract and get the owner successfully', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const UPBytecode = - UniversalProfileBytecode + AddressOffset + context.accounts.deployer3.address.substr(2); + const UPBytecode = concat([ + AccountBytecode, + abiCoder.encode(['address'], [context.accounts.deployer3.address]), + ]); - const contractCreatedAddress = await context.universalFactory.callStatic.deployCreate2( + const contractCreatedAddress = await context.universalFactory.deployCreate2.staticCall( UPBytecode, salt, ); - const generatedSalt = await context.universalFactory.callStatic.generateSalt( - salt, - false, - '0x', - ); + const generatedSalt = await context.universalFactory.generateSalt(salt, false, '0x'); await expect(context.universalFactory.deployCreate2(UPBytecode, salt)) .to.emit(context.universalFactory, 'ContractCreated') .withArgs(contractCreatedAddress, salt, generatedSalt, false, '0x'); - const universalProfile = universalProfileConstructor.attach(contractCreatedAddress); + const universalProfile = accountConstructor.attach( + contractCreatedAddress, + ) as UniversalProfile; - const owner = await universalProfile.callStatic.owner(); + const owner = await universalProfile.owner(); expect(owner).to.equal(context.accounts.deployer3.address); }); }); describe('when using deployCreate2AndInitialize', () => { it('should calculate the address of an initializable contract correctly', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const initializeCallData = implementationTester.interface.encodeFunctionData('initialize', [ - ethers.constants.AddressZero, + ethers.ZeroAddress, ]); - const bytecodeHash = ethers.utils.solidityKeccak256( + const bytecodeHash = ethers.solidityPackedKeccak256( ['bytes'], [ImplementationTester__factory.bytecode], ); @@ -310,7 +323,7 @@ describe('UniversalFactory contract', () => { const contractCreated = await context.universalFactory .connect(context.accounts.deployer1) - .callStatic.deployCreate2AndInitialize( + .deployCreate2AndInitialize.staticCall( ImplementationTesterBytecode, salt, initializeCallData, @@ -322,18 +335,19 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a contract if the salt changed', async () => { - const salt1 = ethers.utils.solidityKeccak256(['string'], ['Salt1']); - const salt2 = ethers.utils.solidityKeccak256(['string'], ['Salt2']); + const salt1 = ethers.solidityPackedKeccak256(['string'], ['Salt1']); + const salt2 = ethers.solidityPackedKeccak256(['string'], ['Salt2']); - const UPBytecode = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode = concat([ + AccountBytecode, + abiCoder.encode(['address'], [ethers.ZeroAddress]), + ]); - const bytecodeHash = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode]); + const bytecodeHash = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode]); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); const calulcatedAddressSalt1 = await context.universalFactory.computeAddress( bytecodeHash, @@ -355,17 +369,18 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a contract if the initializeCalldata changed', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const UPBytecode = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode = concat([ + AccountBytecode, + abiCoder.encode(['address'], [ethers.ZeroAddress]), + ]); - const bytecodeHash = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode]); + const bytecodeHash = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode]); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); const calculatedAddressInitializableFalse = await context.universalFactory.computeAddress( bytecodeHash, @@ -388,22 +403,25 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a contract if the bytecode changed', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const UPBytecode1 = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode1 = concat([ + AccountBytecode, + abiCoder.encode(['address'], [ethers.ZeroAddress]), + ]); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); - const bytecodeHash1 = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode1]); + const bytecodeHash1 = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode1]); - const UPBytecode2 = - UniversalProfileBytecode + AddressOffset + 'cafecafecafecafecafecafecafecafecafecafe'; + const UPBytecode2 = concat([ + AccountBytecode, + abiCoder.encode(['address'], ['0xcafecafecafecafecafecafecafecafecafecafe']), + ]); - const bytecodeHash2 = ethers.utils.solidityKeccak256(['bytes'], [UPBytecode2]); + const bytecodeHash2 = ethers.solidityPackedKeccak256(['bytes'], [UPBytecode2]); const calulcatedAddressBytecode1 = await context.universalFactory.computeAddress( bytecodeHash1, @@ -425,24 +443,23 @@ describe('UniversalFactory contract', () => { }); it('should revert when deploying an initializable contract with the same bytecode and salt ', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salting']); - const UPBytecode = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const fallbackInitializerBytecode = FallbackInitializerBytecode; await context.universalFactory.deployCreate2AndInitialize( - UPBytecode, + fallbackInitializerBytecode, salt, - '0x00000000aabbccdd', // send some random data along prepended with `0x00000000` + '0xaabbccdd', 0, 0, ); await expect( context.universalFactory.deployCreate2AndInitialize( - UPBytecode, + fallbackInitializerBytecode, salt, - '0x00000000aabbccdd', // send some random data along prepended with `0x00000000` + '0xaabbccdd', 0, 0, ), @@ -450,15 +467,16 @@ describe('UniversalFactory contract', () => { }); it('should revert when deploying an initializable contract with sending value unmatched to the msgValue arguments', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const UPBytecode = - UniversalProfileBytecode + AddressOffset + ethers.constants.AddressZero.substr(2); + const UPBytecode = concat([ + AccountBytecode, + abiCoder.encode(['address'], [ethers.ZeroAddress]), + ]); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); await expect( context.universalFactory.deployCreate2AndInitialize( @@ -473,15 +491,15 @@ describe('UniversalFactory contract', () => { }); it('should pass when deploying an initializable contract without passing an initialize calldata', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const fallbackInitializerBytecode = FallbackInitializerBytecode; const contractCreated = - await context.universalFactory.callStatic.deployCreate2AndInitialize( + await context.universalFactory.deployCreate2AndInitialize.staticCall( fallbackInitializerBytecode, salt, - [], // empty initializeCallData + '0x', // empty initializeCallData 0, 0, ); @@ -489,19 +507,21 @@ describe('UniversalFactory contract', () => { await context.universalFactory.deployCreate2AndInitialize( fallbackInitializerBytecode, salt, - [], // empty initializeCallData + '0x', // empty initializeCallData 0, 0, ); - const fallbackInitializerCreated = fallbackInitializer.attach(contractCreated); + const fallbackInitializerCreated = fallbackInitializer.attach( + contractCreated, + ) as FallbackInitializer; - const caller = await fallbackInitializerCreated.callStatic.caller(); - expect(caller).to.equal(context.universalFactory.address); + const caller = await fallbackInitializerCreated.caller(); + expect(caller).to.equal(await context.universalFactory.getAddress()); }); it('should pass when deploying an initializable contract that constructor and initialize function is payable', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const PayableTrueCalldata = payableContract.interface.encodeFunctionData('payableTrue'); @@ -511,7 +531,7 @@ describe('UniversalFactory contract', () => { const contractCreated = await context.universalFactory .connect(context.accounts.deployer1) - .callStatic.deployCreate2AndInitialize( + .deployCreate2AndInitialize.staticCall( PayableContract__factory.bytecode, salt, PayableTrueCalldata, @@ -531,19 +551,19 @@ describe('UniversalFactory contract', () => { { value: sumValueSent }, ); - const balance = (await provider.getBalance(contractCreated)).toNumber(); + const balance = await ethers.provider.getBalance(contractCreated); expect(balance).to.equal(sumValueSent); }); it('should deploy an initializable CREATE2 contract and emit the event and get the owner successfully', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const initializeCallData = implementationTester.interface.encodeFunctionData('initialize', [ context.accounts.deployer1.address, ]); const contractCreatedAddress = - await context.universalFactory.callStatic.deployCreate2AndInitialize( + await context.universalFactory.deployCreate2AndInitialize.staticCall( ImplementationTesterBytecode, salt, initializeCallData, @@ -551,7 +571,7 @@ describe('UniversalFactory contract', () => { 0, ); - const generatedSalt = await context.universalFactory.callStatic.generateSalt( + const generatedSalt = await context.universalFactory.generateSalt( salt, true, initializeCallData, @@ -569,18 +589,20 @@ describe('UniversalFactory contract', () => { .to.emit(context.universalFactory, 'ContractCreated') .withArgs(contractCreatedAddress, salt, generatedSalt, true, initializeCallData); - const factoryTesterContract = implementationTester.attach(contractCreatedAddress); - const owner = await factoryTesterContract.callStatic.owner(); + const factoryTesterContract = implementationTester.attach( + contractCreatedAddress, + ) as ImplementationTester; + const owner = await factoryTesterContract.owner(); expect(owner).to.equal(context.accounts.deployer1.address); }); }); describe('when using deployERC1167Proxy', () => { it("should calculate the address of a proxy correctly if it's not initializable", async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const calculatedAddress = await context.universalFactory.computeERC1167Address( - universalReceiverDelegate.address, + await contractNoConstructor.getAddress(), salt, false, '0x', @@ -588,24 +610,24 @@ describe('UniversalFactory contract', () => { const contractCreated = await context.universalFactory .connect(context.accounts.deployer1) - .callStatic.deployERC1167Proxy(universalReceiverDelegate.address, salt); + .deployERC1167Proxy.staticCall(contractNoConstructor.target, salt); expect(calculatedAddress).to.equal(contractCreated); }); it('should calculate a different address of a proxy if the `salt` changed', async () => { - const salt1 = ethers.utils.solidityKeccak256(['string'], ['Salt1']); - const salt2 = ethers.utils.solidityKeccak256(['string'], ['Salt2']); + const salt1 = ethers.solidityPackedKeccak256(['string'], ['Salt1']); + const salt2 = ethers.solidityPackedKeccak256(['string'], ['Salt2']); const calculatedAddressSalt1 = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt1, false, '0x', ); const calculatedAddressSalt2 = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt2, false, '0x', @@ -617,16 +639,15 @@ describe('UniversalFactory contract', () => { }); it("should calculate the same address of a proxy if the initializeCalldata changed (because it's not initializable)", async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); const calculatedAddressInitializableTrue = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt, false, initializeCallData, @@ -634,7 +655,7 @@ describe('UniversalFactory contract', () => { const calculatedAddressInitializableFalse = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt, false, '0xaabb', @@ -647,17 +668,17 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a proxy if the `baseContract` changed', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const calulcatedAddressBaseContract1 = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt, false, '0x', ); const calulcatedAddressBaseContract2 = await context.universalFactory.computeERC1167Address( - universalReceiverDelegate.address, + await contractNoConstructor.getAddress(), salt, false, '0x', @@ -669,56 +690,48 @@ describe('UniversalFactory contract', () => { }); it('should revert when deploying a proxy contract with the same `baseContract` and salt ', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - await context.universalFactory.deployERC1167Proxy( - universalProfileBaseContract.address, - salt, - ); + await context.universalFactory.deployERC1167Proxy(accountBaseContract.target, salt); await expect( - context.universalFactory.deployERC1167Proxy(universalProfileBaseContract.address, salt), + context.universalFactory.deployERC1167Proxy(accountBaseContract.target, salt), ).to.be.revertedWith('ERC1167: create2 failed'); }); it('should deploy an un-initializable CREATE2 proxy contract and emit the event and get the default owner successfully', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt#2']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt#2']); - const contractCreatedAddress = await context.universalFactory.callStatic.deployERC1167Proxy( - universalProfileBaseContract.address, + const contractCreatedAddress = await context.universalFactory.deployERC1167Proxy.staticCall( + accountBaseContract.target, salt, ); - const generatedSalt = await context.universalFactory.callStatic.generateSalt( - salt, - false, - '0x', - ); + const generatedSalt = await context.universalFactory.generateSalt(salt, false, '0x'); - await expect( - context.universalFactory.deployERC1167Proxy(universalProfileBaseContract.address, salt), - ) + await expect(context.universalFactory.deployERC1167Proxy(accountBaseContract.target, salt)) .to.emit(context.universalFactory, 'ContractCreated') .withArgs(contractCreatedAddress, salt, generatedSalt, false, '0x'); - const universalProfile = universalProfileBaseContract.attach(contractCreatedAddress); + const universalProfile = accountBaseContract.attach( + contractCreatedAddress, + ) as UniversalProfile; - const owner = await universalProfile.callStatic.owner(); - expect(owner).to.equal(ethers.constants.AddressZero); + const owner = await universalProfile.owner(); + expect(owner).to.equal(ethers.ZeroAddress); }); }); describe('when using deployERC1167ProxyAndInitialize', () => { it("should calculate the address of a proxy correctly if it's initializable", async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); const calculatedAddress = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt, true, initializeCallData, @@ -726,8 +739,8 @@ describe('UniversalFactory contract', () => { const contractCreated = await context.universalFactory .connect(context.accounts.deployer1) - .callStatic.deployERC1167ProxyAndInitialize( - universalProfileBaseContract.address, + .deployERC1167ProxyAndInitialize.staticCall( + accountBaseContract.target, salt, initializeCallData, ); @@ -736,23 +749,22 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a proxy if the `salt` changed', async () => { - const salt1 = ethers.utils.solidityKeccak256(['string'], ['Salt1']); - const salt2 = ethers.utils.solidityKeccak256(['string'], ['Salt2']); + const salt1 = ethers.solidityPackedKeccak256(['string'], ['Salt1']); + const salt2 = ethers.solidityPackedKeccak256(['string'], ['Salt2']); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); const calculatedAddressSalt1 = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt1, true, initializeCallData, ); const calculatedAddressSalt2 = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt2, true, initializeCallData, @@ -764,21 +776,19 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a proxy if the `initializeCallData` changed', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const initializeCallData1 = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData1 = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); - const initializeCallData2 = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer2.address], - ); + const initializeCallData2 = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer2.address, + ]); const calulcatedAddressinitializeCallData1 = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt, true, initializeCallData1, @@ -786,7 +796,7 @@ describe('UniversalFactory contract', () => { const calulcatedAddressinitializeCallData2 = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt, true, initializeCallData2, @@ -799,22 +809,21 @@ describe('UniversalFactory contract', () => { }); it('should calculate a different address of a proxy if the `baseContract` changed', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); const calulcatedAddressBaseContract1 = await context.universalFactory.computeERC1167Address( - universalProfileBaseContract.address, + accountBaseContract.target, salt, true, initializeCallData, ); const calulcatedAddressBaseContract2 = await context.universalFactory.computeERC1167Address( - universalReceiverDelegate.address, + await contractNoConstructor.getAddress(), salt, true, initializeCallData, @@ -826,71 +835,77 @@ describe('UniversalFactory contract', () => { }); it('should revert when deploying a proxy contract with the same `baseContract` and salt ', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); + + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); await context.universalFactory.deployERC1167ProxyAndInitialize( - universalProfileBaseContract.address, + accountBaseContract.target, salt, - '0x', + initializeCallData, ); await expect( context.universalFactory.deployERC1167ProxyAndInitialize( - universalProfileBaseContract.address, + accountBaseContract.target, salt, - '0x', + initializeCallData, ), ).to.be.revertedWith('ERC1167: create2 failed'); }); it('should pass and initialize local variable when sending value while deploying a CREATE2 proxy without `initializeCallData`', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const contractCreated = - await context.universalFactory.callStatic.deployERC1167ProxyAndInitialize( - fallbackInitializer.address, + await context.universalFactory.deployERC1167ProxyAndInitialize.staticCall( + fallbackInitializer.target, salt, '0x', { - value: ethers.utils.parseEther('1300'), + value: ethers.parseEther('1300'), }, ); await context.universalFactory .connect(context.accounts.deployer1) - .deployERC1167ProxyAndInitialize(fallbackInitializer.address, salt, '0x', { - value: ethers.utils.parseEther('1300'), + .deployERC1167ProxyAndInitialize(fallbackInitializer.target, salt, '0x', { + value: ethers.parseEther('1300'), }); - const fallbackInitializerCreated = fallbackInitializer.attach(contractCreated); + const fallbackInitializerCreated = fallbackInitializer.attach( + contractCreated, + ) as FallbackInitializer; - const caller = await fallbackInitializerCreated.callStatic.caller(); - expect(caller).to.equal(context.universalFactory.address); + const caller = await fallbackInitializerCreated.caller(); + expect(caller).to.equal(await context.universalFactory.getAddress()); }); it('should revert when deploying a proxy and sending value to a non payable function in deployERC1167Proxy', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const PayableFalseCalldata = payableContract.interface.encodeFunctionData('payableFalse'); await expect( context.universalFactory .connect(context.accounts.deployer1) - .deployERC1167ProxyAndInitialize(payableContract.address, salt, PayableFalseCalldata, { + .deployERC1167ProxyAndInitialize(payableContract.target, salt, PayableFalseCalldata, { value: 100, }), ).to.be.revertedWithCustomError(context.universalFactory, 'ContractInitializationFailed'); }); it('should pass when deploying a proxy and sending value to a payable function in deployERC1167Proxy', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const PayableTrueCalldata = payableContract.interface.encodeFunctionData('payableTrue'); const contractCreated = await context.universalFactory .connect(context.accounts.deployer1) - .callStatic.deployERC1167ProxyAndInitialize( - payableContract.address, + .deployERC1167ProxyAndInitialize.staticCall( + payableContract.target, salt, PayableTrueCalldata, ); @@ -899,54 +914,53 @@ describe('UniversalFactory contract', () => { await context.universalFactory .connect(context.accounts.deployer1) - .deployERC1167ProxyAndInitialize(payableContract.address, salt, PayableTrueCalldata, { + .deployERC1167ProxyAndInitialize(payableContract.target, salt, PayableTrueCalldata, { value: valueSent, }); - const balance = (await provider.getBalance(contractCreated)).toNumber(); + const balance = await ethers.provider.getBalance(contractCreated); expect(balance).to.equal(valueSent); }); it("should revert when deploying a proxy and passing calldata for a non-existing function where fallback function doesn't exist", async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const RandomCalldata = '0xcafecafe'; await expect( context.universalFactory .connect(context.accounts.deployer1) - .deployERC1167ProxyAndInitialize(payableContract.address, salt, RandomCalldata), + .deployERC1167ProxyAndInitialize(payableContract.target, salt, RandomCalldata), ).to.be.revertedWithCustomError(context.universalFactory, 'ContractInitializationFailed'); }); it('should pass when deploying a proxy and passing calldata for a non-existing function where fallback function exist', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt']); const RandomCalldata = '0xcafecafe'; await expect( context.universalFactory .connect(context.accounts.deployer1) - .deployERC1167ProxyAndInitialize(fallbackContract.address, salt, RandomCalldata), + .deployERC1167ProxyAndInitialize(fallbackContract.target, salt, RandomCalldata), ).to.not.be.reverted; }); it('should deploy an initializable CREATE2 proxy contract and emit the event and get the owner successfully', async () => { - const salt = ethers.utils.solidityKeccak256(['string'], ['Salt#3']); + const salt = ethers.solidityPackedKeccak256(['string'], ['Salt#3']); - const initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer4.address], - ); + const initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer4.address, + ]); const contractCreatedAddress = - await context.universalFactory.callStatic.deployERC1167ProxyAndInitialize( - universalProfileBaseContract.address, + await context.universalFactory.deployERC1167ProxyAndInitialize.staticCall( + accountBaseContract.target, salt, initializeCallData, ); - const generatedSalt = await context.universalFactory.callStatic.generateSalt( + const generatedSalt = await context.universalFactory.generateSalt( salt, true, initializeCallData, @@ -954,7 +968,7 @@ describe('UniversalFactory contract', () => { await expect( context.universalFactory.deployERC1167ProxyAndInitialize( - universalProfileBaseContract.address, + accountBaseContract.target, salt, initializeCallData, ), @@ -962,9 +976,11 @@ describe('UniversalFactory contract', () => { .to.emit(context.universalFactory, 'ContractCreated') .withArgs(contractCreatedAddress, salt, generatedSalt, true, initializeCallData); - const universalProfile = universalProfileBaseContract.attach(contractCreatedAddress); + const universalProfile = accountBaseContract.attach( + contractCreatedAddress, + ) as UniversalProfile; - const owner = await universalProfile.callStatic.owner(); + const owner = await universalProfile.owner(); expect(owner).to.equal(context.accounts.deployer4.address); }); }); @@ -975,16 +991,15 @@ describe('UniversalFactory contract', () => { let initializeCallData; let contractCreatedWithdeployERC1167ProxyAndInitialize; before(async () => { - salt = ethers.utils.solidityKeccak256(['string'], ['SaltEdge']); + salt = ethers.solidityPackedKeccak256(['string'], ['SaltEdge']); - initializeCallData = universalProfileBaseContract.interface.encodeFunctionData( - 'initialize', - [context.accounts.deployer1.address], - ); + initializeCallData = accountBaseContract.interface.encodeFunctionData('initialize', [ + context.accounts.deployer1.address, + ]); contractCreatedWithdeployERC1167ProxyAndInitialize = - await context.universalFactory.callStatic.deployERC1167ProxyAndInitialize( - universalProfileBaseContract.address, + await context.universalFactory.deployERC1167ProxyAndInitialize.staticCall( + accountBaseContract.target, salt, initializeCallData, ); @@ -992,8 +1007,8 @@ describe('UniversalFactory contract', () => { it('should result in a different address if deployed without initializing with deployERC1167Proxy function', async () => { const contractCreatedWithdeployERC1167Proxy = - await context.universalFactory.callStatic.deployERC1167Proxy( - universalProfileBaseContract.address, + await context.universalFactory.deployERC1167Proxy.staticCall( + accountBaseContract.target, salt, ); @@ -1011,11 +1026,11 @@ describe('UniversalFactory contract', () => { // deploy proxy contract const proxyBytecode = eip1167RuntimeCodeTemplate.replace( 'bebebebebebebebebebebebebebebebebebebebe', - universalProfileBaseContract.address.substr(2), + (accountBaseContract.target as string).substring(2), ); const contractCreatedWithDeployCreate2 = - await context.universalFactory.callStatic.deployCreate2(proxyBytecode, salt); + await context.universalFactory.deployCreate2.staticCall(proxyBytecode, salt); const equalAddresses = contractCreatedWithdeployERC1167ProxyAndInitialize == contractCreatedWithDeployCreate2; @@ -1029,11 +1044,11 @@ describe('UniversalFactory contract', () => { // deploy proxy contract const proxyBytecode = eip1167RuntimeCodeTemplate.replace( 'bebebebebebebebebebebebebebebebebebebebe', - universalProfileBaseContract.address.substr(2), + (accountBaseContract.target as string).substring(2), ); const contractCreatedWithdeployCreate2AndInitialize = - await context.universalFactory.callStatic.deployCreate2AndInitialize( + await context.universalFactory.deployCreate2AndInitialize.staticCall( proxyBytecode, salt, initializeCallData, @@ -1051,14 +1066,14 @@ describe('UniversalFactory contract', () => { }); describe('`generateSalt(...)`', () => { - it('should generate the same salt as with `ethers.utils.keccak256`', async () => { + it('should generate the same salt as with `ethers.keccak256`', async () => { const providedSalt = '0x7d1f4b76de4cdffc4ebac16883d3a7c9cbd95b6130494c4ad48e6a8e24083572'; const initializeCallData = '0xc4d66de8000000000000000000000000d208a16f18a3bab276dff0b62ef591a846c86cba'; - const generatedSalt = ethers.utils.keccak256( - ethers.utils.solidityPack( + const generatedSalt = ethers.keccak256( + ethers.solidityPacked( ['bool', 'bytes', 'bytes32'], [true, initializeCallData, providedSalt], ), @@ -1069,14 +1084,14 @@ describe('UniversalFactory contract', () => { ).to.equal(generatedSalt); }); - it('should generate the same salt as with `web3.utils.keccak256`', async () => { + it('should generate the same salt as with `web3.keccak256`', async () => { const providedSalt = '0x7d1f4b76de4cdffc4ebac16883d3a7c9cbd95b6130494c4ad48e6a8e24083572'; const initializeCallData = '0xc4d66de8000000000000000000000000d208a16f18a3bab276dff0b62ef591a846c86cba'; - const generatedSalt = web3.utils.keccak256( - ethers.utils.solidityPack( + const generatedSalt = ethers.keccak256( + ethers.solidityPacked( ['bool', 'bytes', 'bytes32'], [true, initializeCallData, providedSalt], ), diff --git a/packages/lsp16-contracts/tsconfig.json b/packages/lsp16-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp16-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp17-contracts/.eslintrc.js b/packages/lsp17-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp17-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp17-contracts/.solhint.json b/packages/lsp17-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp17-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp17-contracts/README.md b/packages/lsp17-contracts/README.md new file mode 100644 index 000000000..e32a04e8e --- /dev/null +++ b/packages/lsp17-contracts/README.md @@ -0,0 +1,6 @@ +# LSP17 Extensions Package · [![npm version](https://img.shields.io/npm/v/@lukso/lsp17-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp17-contracts) + +Package for the LSP17 Extensions, that includes the following extensions: + +- the `Extension4337` extension, which contains the `validateUserOp` function from the [`ERC4337` standard](https://eips.ethereum.org/EIPS/eip-4337). +- the `OnERC721ReceivedExtension` extension that contains the `onERC721Received` function from the [`ERC721` standard](https://eips.ethereum.org/EIPS/eip-721). diff --git a/packages/lsp17-contracts/build.config.ts b/packages/lsp17-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp17-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp17-contracts/constants.ts b/packages/lsp17-contracts/constants.ts new file mode 100644 index 000000000..212ecb5ba --- /dev/null +++ b/packages/lsp17-contracts/constants.ts @@ -0,0 +1 @@ +export const INTERFACE_ID_LSP17Extension = '0xcee78b40'; diff --git a/contracts/LSP17Extensions/Extension4337.sol b/packages/lsp17-contracts/contracts/Extension4337.sol similarity index 93% rename from contracts/LSP17Extensions/Extension4337.sol rename to packages/lsp17-contracts/contracts/Extension4337.sol index 5a8d38cb4..41c4bd2ee 100644 --- a/contracts/LSP17Extensions/Extension4337.sol +++ b/packages/lsp17-contracts/contracts/Extension4337.sol @@ -8,15 +8,19 @@ import { } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; import { ILSP20CallVerifier -} from "../LSP20CallVerification/ILSP20CallVerifier.sol"; +} from "@lukso/lsp20-contracts/contracts/ILSP20CallVerifier.sol"; // modules -import {LSP14Ownable2Step} from "../LSP14Ownable2Step/LSP14Ownable2Step.sol"; -import {LSP17Extension} from "../LSP17ContractExtension/LSP17Extension.sol"; +import { + LSP14Ownable2Step +} from "@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol"; +import { + LSP17Extension +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.sol"; // librairies import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import {LSP6Utils} from "../LSP6KeyManager/LSP6Utils.sol"; +import {LSP6Utils} from "@lukso/lsp6-contracts/contracts/LSP6Utils.sol"; // constants import { diff --git a/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol b/packages/lsp17-contracts/contracts/OnERC721ReceivedExtension.sol similarity index 78% rename from contracts/LSP17Extensions/OnERC721ReceivedExtension.sol rename to packages/lsp17-contracts/contracts/OnERC721ReceivedExtension.sol index 887c39802..31811eab9 100644 --- a/contracts/LSP17Extensions/OnERC721ReceivedExtension.sol +++ b/packages/lsp17-contracts/contracts/OnERC721ReceivedExtension.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.4; import { ERC721Holder } from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; -import {LSP17Extension} from "../LSP17ContractExtension/LSP17Extension.sol"; +import { + LSP17Extension +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.sol"; /** * @dev LSP17 Extension that can be attached to a LSP17Extendable contract * to allow it to receive ERC721 tokens via `safeTransferFrom`. */ // solhint-disable-next-line no-empty-blocks -contract OnERC721ReceivedExtension is ERC721Holder, LSP17Extension { - -} +contract OnERC721ReceivedExtension is ERC721Holder, LSP17Extension {} diff --git a/packages/lsp17-contracts/hardhat.config.ts b/packages/lsp17-contracts/hardhat.config.ts new file mode 100644 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp17-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp17-contracts/index.ts b/packages/lsp17-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp17-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp17-contracts/package.json b/packages/lsp17-contracts/package.json new file mode 100644 index 000000000..3a0f12707 --- /dev/null +++ b/packages/lsp17-contracts/package.json @@ -0,0 +1,52 @@ +{ + "name": "@lukso/lsp17-contracts", + "version": "0.12.1", + "description": "Package for the LSP17 extensions", + "license": "Apache-2.0", + "author": "", + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@account-abstraction/contracts": "^0.6.0", + "@lukso/lsp14-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp20-contracts": "*" + } +} diff --git a/packages/lsp17-contracts/tsconfig.json b/packages/lsp17-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp17-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp17contractextension-contracts/.eslintrc.js b/packages/lsp17contractextension-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp17contractextension-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp17contractextension-contracts/.gitmodules b/packages/lsp17contractextension-contracts/.gitmodules new file mode 100644 index 000000000..3dce69ce0 --- /dev/null +++ b/packages/lsp17contractextension-contracts/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = ../../lib/forge-std + url = https://github.com/foundry-rs/forge-std.git diff --git a/packages/lsp17contractextension-contracts/.solhint.json b/packages/lsp17contractextension-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp17contractextension-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp17contractextension-contracts/README.md b/packages/lsp17contractextension-contracts/README.md new file mode 100644 index 000000000..32174d962 --- /dev/null +++ b/packages/lsp17contractextension-contracts/README.md @@ -0,0 +1,3 @@ +# LSP17 Contract Extension Package · [![npm version](https://img.shields.io/npm/v/@lukso/lsp17contractextension-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp17contractextension-contracts) + +Package for the LSP17 Contract Extension diff --git a/packages/lsp17contractextension-contracts/build.config.ts b/packages/lsp17contractextension-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp17contractextension-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp17contractextension-contracts/constants.ts b/packages/lsp17contractextension-contracts/constants.ts new file mode 100644 index 000000000..3aa1019c7 --- /dev/null +++ b/packages/lsp17contractextension-contracts/constants.ts @@ -0,0 +1,7 @@ +export const INTERFACE_ID_LSP17Extendable = '0xa918fa6b'; +export const INTERFACE_ID_LSP17Extension = '0xcee78b40'; + +export const LSP17DataKeys = { + // bytes10(keccak256('LSP17Extension')) + bytes2(0) + LSP17ExtensionPrefix: '0xcee78b4094da860110960000', +}; diff --git a/contracts/LSP17ContractExtension/LSP17Constants.sol b/packages/lsp17contractextension-contracts/contracts/LSP17Constants.sol similarity index 100% rename from contracts/LSP17ContractExtension/LSP17Constants.sol rename to packages/lsp17contractextension-contracts/contracts/LSP17Constants.sol diff --git a/contracts/LSP17ContractExtension/LSP17Errors.sol b/packages/lsp17contractextension-contracts/contracts/LSP17Errors.sol similarity index 100% rename from contracts/LSP17ContractExtension/LSP17Errors.sol rename to packages/lsp17contractextension-contracts/contracts/LSP17Errors.sol diff --git a/contracts/LSP17ContractExtension/LSP17Extendable.sol b/packages/lsp17contractextension-contracts/contracts/LSP17Extendable.sol similarity index 100% rename from contracts/LSP17ContractExtension/LSP17Extendable.sol rename to packages/lsp17contractextension-contracts/contracts/LSP17Extendable.sol diff --git a/contracts/LSP17ContractExtension/LSP17Extension.sol b/packages/lsp17contractextension-contracts/contracts/LSP17Extension.sol similarity index 97% rename from contracts/LSP17ContractExtension/LSP17Extension.sol rename to packages/lsp17contractextension-contracts/contracts/LSP17Extension.sol index 2a9c3ad74..5f0ae4dea 100644 --- a/contracts/LSP17ContractExtension/LSP17Extension.sol +++ b/packages/lsp17contractextension-contracts/contracts/LSP17Extension.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.4; // modules -import {Version} from "../Version.sol"; +import {Version} from "./Version.sol"; import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; // constants diff --git a/contracts/LSP17ContractExtension/LSP17Utils.sol b/packages/lsp17contractextension-contracts/contracts/LSP17Utils.sol similarity index 100% rename from contracts/LSP17ContractExtension/LSP17Utils.sol rename to packages/lsp17contractextension-contracts/contracts/LSP17Utils.sol diff --git a/packages/lsp17contractextension-contracts/contracts/Version.sol b/packages/lsp17contractextension-contracts/contracts/Version.sol new file mode 100644 index 000000000..58a3f0925 --- /dev/null +++ b/packages/lsp17contractextension-contracts/contracts/Version.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +abstract contract Version { + /** + * @dev Get the version of the contract. + * @notice Contract version. + * + * @return The version of the the contract. + */ + // DO NOT CHANGE + // Comments block below is used by release-please to automatically update the version in this file. + // x-release-please-start-version + string public constant VERSION = "0.14.0"; + + // x-release-please-end +} diff --git a/packages/lsp17contractextension-contracts/foundry.toml b/packages/lsp17contractextension-contracts/foundry.toml new file mode 100644 index 000000000..aac84236b --- /dev/null +++ b/packages/lsp17contractextension-contracts/foundry.toml @@ -0,0 +1,10 @@ +[profile.default] +src = 'contracts' +out = 'out' +libs = ['node_modules','lib'] +cache_path = 'forge-cache' +test = 'foundry' +solc_version = "0.8.17" +[fuzz] +runs = 10_000 +max_test_rejects = 200_000 diff --git a/packages/lsp17contractextension-contracts/hardhat.config.ts b/packages/lsp17contractextension-contracts/hardhat.config.ts new file mode 100644 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp17contractextension-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp17contractextension-contracts/index.ts b/packages/lsp17contractextension-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp17contractextension-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp17contractextension-contracts/package.json b/packages/lsp17contractextension-contracts/package.json new file mode 100644 index 000000000..f3f3d2881 --- /dev/null +++ b/packages/lsp17contractextension-contracts/package.json @@ -0,0 +1,48 @@ +{ + "name": "@lukso/lsp17contractextension-contracts", + "version": "0.14.0", + "description": "Package for the LSP17 Contract Extension standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3" + } +} diff --git a/packages/lsp17contractextension-contracts/tsconfig.json b/packages/lsp17contractextension-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp17contractextension-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp1delegate-contracts/.eslintrc.js b/packages/lsp1delegate-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp1delegate-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp1delegate-contracts/.solhint.json b/packages/lsp1delegate-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp1delegate-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp1delegate-contracts/README.md b/packages/lsp1delegate-contracts/README.md new file mode 100644 index 000000000..0b53ff37e --- /dev/null +++ b/packages/lsp1delegate-contracts/README.md @@ -0,0 +1,12 @@ +# LSP1 Universal Receiver Delegate · [![npm version](https://img.shields.io/npm/v/@lukso/lsp1delegate-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp1delegate-contracts) + +Smart contract implementations of LSP1 Universal Receiver Delegates +to register and manage: + +- LSP5 Received Assets +- LSP10 Vaults + +Currently there are URDs for: + +- [Universal Profile](./contracts/LSP1UniversalReceiverDelegateUP.sol) +- [Vault](./contracts/LSP1UniversalReceiverDelegateVault.sol) diff --git a/packages/lsp1delegate-contracts/build.config.ts b/packages/lsp1delegate-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp1delegate-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp1delegate-contracts/constants.ts b/packages/lsp1delegate-contracts/constants.ts new file mode 100644 index 000000000..2d2831fd4 --- /dev/null +++ b/packages/lsp1delegate-contracts/constants.ts @@ -0,0 +1,3 @@ +// ERC165 Interface ID +// ---------- +export const INTERFACE_ID_LSP1DELEGATE = '0xa245bbda'; diff --git a/contracts/LSP1UniversalReceiver/LSP1Errors.sol b/packages/lsp1delegate-contracts/contracts/LSP1Errors.sol similarity index 100% rename from contracts/LSP1UniversalReceiver/LSP1Errors.sol rename to packages/lsp1delegate-contracts/contracts/LSP1Errors.sol diff --git a/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol b/packages/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol similarity index 94% rename from contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol rename to packages/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol index d2b82a414..b316a6ca3 100644 --- a/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol +++ b/packages/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateUP.sol @@ -7,39 +7,43 @@ import { } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; import { ILSP1UniversalReceiverDelegate -} from "../ILSP1UniversalReceiverDelegate.sol"; -import {ILSP7DigitalAsset} from "../../LSP7DigitalAsset/ILSP7DigitalAsset.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; +import { + ILSP7DigitalAsset +} from "@lukso/lsp7-contracts/contracts/ILSP7DigitalAsset.sol"; // modules import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; -import {Version} from "../../Version.sol"; +import {Version} from "./Version.sol"; // libraries import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import {LSP5Utils} from "../../LSP5ReceivedAssets/LSP5Utils.sol"; -import {LSP10Utils} from "../../LSP10ReceivedVaults/LSP10Utils.sol"; +import {LSP5Utils} from "@lukso/lsp5-contracts/contracts/LSP5Utils.sol"; +import {LSP10Utils} from "@lukso/lsp10-contracts/contracts/LSP10Utils.sol"; // constants -import {_INTERFACEID_LSP1_DELEGATE} from "../LSP1Constants.sol"; +import { + _INTERFACEID_LSP1_DELEGATE +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _TYPEID_LSP7_TOKENSSENDER, _TYPEID_LSP7_TOKENSRECIPIENT, _INTERFACEID_LSP7 -} from "../../LSP7DigitalAsset/LSP7Constants.sol"; +} from "@lukso/lsp7-contracts/contracts/LSP7Constants.sol"; import { _TYPEID_LSP8_TOKENSSENDER, _TYPEID_LSP8_TOKENSRECIPIENT, _INTERFACEID_LSP8 -} from "../../LSP8IdentifiableDigitalAsset/LSP8Constants.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8Constants.sol"; import { _TYPEID_LSP9_OwnershipTransferred_SenderNotification, _TYPEID_LSP9_OwnershipTransferred_RecipientNotification -} from "../../LSP9Vault/LSP9Constants.sol"; +} from "@lukso/lsp9-contracts/contracts/LSP9Constants.sol"; // errors -import {CannotRegisterEOAsAsAssets} from "../LSP1Errors.sol"; +import {CannotRegisterEOAsAsAssets} from "./LSP1Errors.sol"; /** * @title Implementation of a UniversalReceiverDelegate for the [LSP-0-ERC725Account] diff --git a/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol b/packages/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol similarity index 93% rename from contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol rename to packages/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol index 1e0f3eb67..a06d34f77 100644 --- a/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol +++ b/packages/lsp1delegate-contracts/contracts/LSP1UniversalReceiverDelegateVault.sol @@ -7,31 +7,35 @@ import { } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; import { ILSP1UniversalReceiverDelegate -} from "../ILSP1UniversalReceiverDelegate.sol"; -import {ILSP7DigitalAsset} from "../../LSP7DigitalAsset/ILSP7DigitalAsset.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; +import { + ILSP7DigitalAsset +} from "@lukso/lsp7-contracts/contracts/ILSP7DigitalAsset.sol"; // modules import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; -import {Version} from "../../Version.sol"; +import {Version} from "./Version.sol"; // libraries -import {LSP5Utils} from "../../LSP5ReceivedAssets/LSP5Utils.sol"; +import {LSP5Utils} from "@lukso/lsp5-contracts/contracts/LSP5Utils.sol"; // constants -import {_INTERFACEID_LSP1_DELEGATE} from "../LSP1Constants.sol"; +import { + _INTERFACEID_LSP1_DELEGATE +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _TYPEID_LSP7_TOKENSSENDER, _TYPEID_LSP7_TOKENSRECIPIENT, _INTERFACEID_LSP7 -} from "../../LSP7DigitalAsset/LSP7Constants.sol"; +} from "@lukso/lsp7-contracts/contracts/LSP7Constants.sol"; import { _TYPEID_LSP8_TOKENSSENDER, _TYPEID_LSP8_TOKENSRECIPIENT, _INTERFACEID_LSP8 -} from "../../LSP8IdentifiableDigitalAsset/LSP8Constants.sol"; +} from "@lukso/lsp8-contracts/contracts/LSP8Constants.sol"; // errors -import {CannotRegisterEOAsAsAssets} from "../LSP1Errors.sol"; +import {CannotRegisterEOAsAsAssets} from "./LSP1Errors.sol"; /** * @title Implementation of a UniversalReceiverDelegate for the [LSP9Vault] diff --git a/packages/lsp1delegate-contracts/contracts/Version.sol b/packages/lsp1delegate-contracts/contracts/Version.sol new file mode 100644 index 000000000..58a3f0925 --- /dev/null +++ b/packages/lsp1delegate-contracts/contracts/Version.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +abstract contract Version { + /** + * @dev Get the version of the contract. + * @notice Contract version. + * + * @return The version of the the contract. + */ + // DO NOT CHANGE + // Comments block below is used by release-please to automatically update the version in this file. + // x-release-please-start-version + string public constant VERSION = "0.14.0"; + + // x-release-please-end +} diff --git a/packages/lsp1delegate-contracts/hardhat.config.ts b/packages/lsp1delegate-contracts/hardhat.config.ts new file mode 100644 index 000000000..515203eae --- /dev/null +++ b/packages/lsp1delegate-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: ['LSP1UniversalReceiverDelegateUP', 'LSP1UniversalReceiverDelegateVault'], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp1delegate-contracts/index.ts b/packages/lsp1delegate-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp1delegate-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp1delegate-contracts/package.json b/packages/lsp1delegate-contracts/package.json new file mode 100644 index 000000000..9c2adfd26 --- /dev/null +++ b/packages/lsp1delegate-contracts/package.json @@ -0,0 +1,58 @@ +{ + "name": "@lukso/lsp1delegate-contracts", + "version": "0.12.1", + "description": "Package for the LSP1 Universal Receiver Delegate standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp5-contracts": "*", + "@lukso/lsp7-contracts": "*", + "@lukso/lsp8-contracts": "*", + "@lukso/lsp9-contracts": "*", + "@lukso/lsp10-contracts": "*" + } +} diff --git a/packages/lsp1delegate-contracts/tsconfig.json b/packages/lsp1delegate-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp1delegate-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp2-contracts/.eslintrc.js b/packages/lsp2-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp2-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp2-contracts/.gitmodules b/packages/lsp2-contracts/.gitmodules new file mode 100644 index 000000000..f67502a86 --- /dev/null +++ b/packages/lsp2-contracts/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std.git diff --git a/packages/lsp2-contracts/.solhint.json b/packages/lsp2-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp2-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp2-contracts/README.md b/packages/lsp2-contracts/README.md new file mode 100755 index 000000000..a398f1955 --- /dev/null +++ b/packages/lsp2-contracts/README.md @@ -0,0 +1,3 @@ +# LSP2 ERC725Y JSON Schema · [![npm version](https://img.shields.io/npm/v/@lukso/lsp2-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp2-contracts) + +Package for the LSP2 ERC725Y JSON Schema standard. diff --git a/packages/lsp2-contracts/build.config.ts b/packages/lsp2-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp2-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp2-contracts/constants.ts b/packages/lsp2-contracts/constants.ts new file mode 100644 index 000000000..24f7b1527 --- /dev/null +++ b/packages/lsp2-contracts/constants.ts @@ -0,0 +1,7 @@ +export type Verification = { + method: string; + data: string; + source?: string; +}; + +export type LSP2ArrayKey = { length: string; index: string }; diff --git a/contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol b/packages/lsp2-contracts/contracts/LSP2Utils.sol similarity index 100% rename from contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol rename to packages/lsp2-contracts/contracts/LSP2Utils.sol diff --git a/contracts/Mocks/LSP2UtilsLibraryTester.sol b/packages/lsp2-contracts/contracts/Mocks/LSP2UtilsLibraryTester.sol similarity index 79% rename from contracts/Mocks/LSP2UtilsLibraryTester.sol rename to packages/lsp2-contracts/contracts/Mocks/LSP2UtilsLibraryTester.sol index 02e514ff8..933e4aee7 100644 --- a/contracts/Mocks/LSP2UtilsLibraryTester.sol +++ b/packages/lsp2-contracts/contracts/Mocks/LSP2UtilsLibraryTester.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.4; -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "../LSP2Utils.sol"; contract LSP2UtilsLibraryTester { using LSP2Utils for *; diff --git a/tests/foundry/LSP2ERC725YJSONSchema/LSP2Utils.t.sol b/packages/lsp2-contracts/foundry/LSP2Utils.t.sol similarity index 98% rename from tests/foundry/LSP2ERC725YJSONSchema/LSP2Utils.t.sol rename to packages/lsp2-contracts/foundry/LSP2Utils.t.sol index 677e6b409..33868d74e 100644 --- a/tests/foundry/LSP2ERC725YJSONSchema/LSP2Utils.t.sol +++ b/packages/lsp2-contracts/foundry/LSP2Utils.t.sol @@ -5,7 +5,7 @@ import "forge-std/Test.sol"; import {BytesLib} from "solidity-bytes-utils/contracts/BytesLib.sol"; -import "../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import "../contracts/LSP2Utils.sol"; contract LSP2UtilsTests is Test { function testRevertsOnWrongLastBracket(string memory x) public { diff --git a/packages/lsp2-contracts/hardhat.config.ts b/packages/lsp2-contracts/hardhat.config.ts new file mode 100755 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp2-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp2-contracts/index.ts b/packages/lsp2-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp2-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp2-contracts/package.json b/packages/lsp2-contracts/package.json new file mode 100644 index 000000000..003a1a37a --- /dev/null +++ b/packages/lsp2-contracts/package.json @@ -0,0 +1,52 @@ +{ + "name": "@lukso/lsp2-contracts", + "version": "0.12.1", + "description": "Package for the LSP2 ERC725Y JSON Schema standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:foundry": "forge build", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'", + "test": "hardhat test --no-compile tests/*.test.ts", + "test:foundry": "FOUNDRY_PROFILE=lsp2 forge test --no-match-test Skip -vvv", + "test:coverage": "hardhat coverage" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3" + } +} diff --git a/tests/LSP2ERC725YJSONSchema/LSP2UtilsLibrary.test.ts b/packages/lsp2-contracts/tests/LSP2UtilsLibrary.test.ts similarity index 87% rename from tests/LSP2ERC725YJSONSchema/LSP2UtilsLibrary.test.ts rename to packages/lsp2-contracts/tests/LSP2UtilsLibrary.test.ts index 51da0874f..2920a232a 100644 --- a/tests/LSP2ERC725YJSONSchema/LSP2UtilsLibrary.test.ts +++ b/packages/lsp2-contracts/tests/LSP2UtilsLibrary.test.ts @@ -1,9 +1,20 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { LSP2UtilsLibraryTester, LSP2UtilsLibraryTester__factory } from '../../types'; - -import { encodeCompactBytesArray } from '../utils/helpers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { LSP2UtilsLibraryTester, LSP2UtilsLibraryTester__factory } from '../types'; +import { BytesLike } from 'ethers'; + +function encodeCompactBytesArray(inputKeys: BytesLike[]) { + let compactBytesArray = '0x'; + for (let i = 0; i < inputKeys.length; i++) { + compactBytesArray += + ethers + .zeroPadValue(ethers.toBeHex(inputKeys[i].toString().substring(2).length / 2), 2) + .substring(2) + inputKeys[i].toString().substring(2); + } + + return compactBytesArray; +} describe('LSP2Utils', () => { let accounts: SignerWithAddress[]; diff --git a/packages/lsp2-contracts/tsconfig.json b/packages/lsp2-contracts/tsconfig.json new file mode 100755 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp2-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp20-contracts/.eslintrc.js b/packages/lsp20-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp20-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp20-contracts/.solhint.json b/packages/lsp20-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp20-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp20-contracts/README.md b/packages/lsp20-contracts/README.md new file mode 100755 index 000000000..46e76342d --- /dev/null +++ b/packages/lsp20-contracts/README.md @@ -0,0 +1,3 @@ +# LSP20 Call Verification · [![npm version](https://img.shields.io/npm/v/@lukso/lsp20-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp20-contracts) + +Package for the LSP20 Call Verification standard. diff --git a/packages/lsp20-contracts/build.config.ts b/packages/lsp20-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp20-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp20-contracts/constants.ts b/packages/lsp20-contracts/constants.ts new file mode 100644 index 000000000..910e18714 --- /dev/null +++ b/packages/lsp20-contracts/constants.ts @@ -0,0 +1,17 @@ +export const INTERFACE_ID_LSP20CallVerification = '0x1a0eb6a5'; +export const INTERFACE_ID_LSP20CallVerifier = '0x0d6ecac7'; + +/** + * @dev values returned by the `lsp20VerifyCall` and `lsp20VerifyCallResult` functions of the LSP20 standard. + * Can be used to check if a calldata payload was check and verified. + */ +export const LSP20_SUCCESS_VALUES = { + VERIFY_CALL: { + // bytes3(keccak256("lsp20VerifyCall(address,address,address,uint256,bytes)")) + "0x00" + NO_POST_VERIFICATION: '0xde928f00', + // bytes3(keccak256("lsp20VerifyCall(address,address,address,uint256,bytes)")) + "0x01" + WITH_POST_VERIFICATION: '0xde928f01', + }, + // bytes4(keccak256("lsp20VerifyCallResult(bytes32,bytes)")) + VERIFY_CALL_RESULT: '0xd3fc45d3', +}; diff --git a/contracts/LSP20CallVerification/ILSP20CallVerifier.sol b/packages/lsp20-contracts/contracts/ILSP20CallVerifier.sol similarity index 100% rename from contracts/LSP20CallVerification/ILSP20CallVerifier.sol rename to packages/lsp20-contracts/contracts/ILSP20CallVerifier.sol diff --git a/contracts/LSP20CallVerification/LSP20CallVerification.sol b/packages/lsp20-contracts/contracts/LSP20CallVerification.sol similarity index 100% rename from contracts/LSP20CallVerification/LSP20CallVerification.sol rename to packages/lsp20-contracts/contracts/LSP20CallVerification.sol diff --git a/contracts/LSP20CallVerification/LSP20Constants.sol b/packages/lsp20-contracts/contracts/LSP20Constants.sol similarity index 100% rename from contracts/LSP20CallVerification/LSP20Constants.sol rename to packages/lsp20-contracts/contracts/LSP20Constants.sol diff --git a/contracts/LSP20CallVerification/LSP20Errors.sol b/packages/lsp20-contracts/contracts/LSP20Errors.sol similarity index 100% rename from contracts/LSP20CallVerification/LSP20Errors.sol rename to packages/lsp20-contracts/contracts/LSP20Errors.sol diff --git a/packages/lsp20-contracts/hardhat.config.ts b/packages/lsp20-contracts/hardhat.config.ts new file mode 100755 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp20-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp20-contracts/index.ts b/packages/lsp20-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp20-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp20-contracts/package.json b/packages/lsp20-contracts/package.json new file mode 100644 index 000000000..142c4e133 --- /dev/null +++ b/packages/lsp20-contracts/package.json @@ -0,0 +1,44 @@ +{ + "name": "@lukso/lsp20-contracts", + "version": "0.12.1", + "description": "Package for the LSP20 Call Verification standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + } +} diff --git a/packages/lsp20-contracts/tsconfig.json b/packages/lsp20-contracts/tsconfig.json new file mode 100755 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp20-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp23-contracts/.eslintrc.js b/packages/lsp23-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp23-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp23-contracts/.solhint.json b/packages/lsp23-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp23-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp23-contracts/README.md b/packages/lsp23-contracts/README.md new file mode 100644 index 000000000..a2d5d1005 --- /dev/null +++ b/packages/lsp23-contracts/README.md @@ -0,0 +1,3 @@ +# LSP23 Linked Contracts Factory · [![npm version](https://img.shields.io/npm/v/@lukso/lsp23-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp23-contracts) + +Package for the LSP23 Linked Contracts Factory. diff --git a/contracts/LSP23LinkedContractsFactory/ILSP23LinkedContractsFactory.sol b/packages/lsp23-contracts/contracts/ILSP23LinkedContractsFactory.sol similarity index 100% rename from contracts/LSP23LinkedContractsFactory/ILSP23LinkedContractsFactory.sol rename to packages/lsp23-contracts/contracts/ILSP23LinkedContractsFactory.sol diff --git a/contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol b/packages/lsp23-contracts/contracts/IPostDeploymentModule.sol similarity index 100% rename from contracts/LSP23LinkedContractsFactory/IPostDeploymentModule.sol rename to packages/lsp23-contracts/contracts/IPostDeploymentModule.sol diff --git a/contracts/LSP23LinkedContractsFactory/LSP23Errors.sol b/packages/lsp23-contracts/contracts/LSP23Errors.sol similarity index 100% rename from contracts/LSP23LinkedContractsFactory/LSP23Errors.sol rename to packages/lsp23-contracts/contracts/LSP23Errors.sol diff --git a/contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol b/packages/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol similarity index 100% rename from contracts/LSP23LinkedContractsFactory/LSP23LinkedContractsFactory.sol rename to packages/lsp23-contracts/contracts/LSP23LinkedContractsFactory.sol diff --git a/packages/lsp23-contracts/contracts/modules/README.md b/packages/lsp23-contracts/contracts/modules/README.md new file mode 100644 index 000000000..1232d6e66 --- /dev/null +++ b/packages/lsp23-contracts/contracts/modules/README.md @@ -0,0 +1,23 @@ +# LSP23 Linked Contracts Deployment Module + +This folder contains modules related to the deployment of LSP23 Linked Contracts. The modules are essential for initializing and post-deploying actions for Universal Profiles. + +## Modules + +- **UniversalProfileInitPostDeploymentModule**: This module is responsible for the initial setup after the deployment of a Universal Profile Init contract. + + - **Standardized Address**: `0x000000000066093407b6704B89793beFfD0D8F00` + - **Standardized Salt**: `0x12a6712f113536d8b01d99f72ce168c7e10901240d73e80eeb821d01aa4c2b1a` + - [More Details](./deployment-UP-init-module.md) + +- **UniversalProfilePostDeploymentModule**: This module is responsible for the initial setup after the deployment of a Universal Profile contract. + - **Standardized Address**: `0x0000005aD606bcFEF9Ea6D0BbE5b79847054BcD7` + - **Standardized Salt**: `0x42ff55d7957589c62da54a4368b10a2bc549f2038bbb6880ec6b3e0ecae2ba58` + - [More Details](./deployment-UP-module.md) + +## Setup + +Before deploying any of these modules, make sure that the following contracts are already deployed on the same network: + +- [Nick's Factory contract](https://github.com/Arachnid/deterministic-deployment-proxy/tree/master) +- [LSP23 Linked Contracts Factory](https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-23-LinkedContractsFactory.md#lsp23linkedcontractsfactory-deployment) diff --git a/contracts/LSP23LinkedContractsFactory/modules/UniversalProfileInitPostDeploymentModule.sol b/packages/lsp23-contracts/contracts/modules/UniversalProfileInitPostDeploymentModule.sol similarity index 94% rename from contracts/LSP23LinkedContractsFactory/modules/UniversalProfileInitPostDeploymentModule.sol rename to packages/lsp23-contracts/contracts/modules/UniversalProfileInitPostDeploymentModule.sol index 6e94fe845..1628c5faf 100644 --- a/contracts/LSP23LinkedContractsFactory/modules/UniversalProfileInitPostDeploymentModule.sol +++ b/packages/lsp23-contracts/contracts/modules/UniversalProfileInitPostDeploymentModule.sol @@ -5,7 +5,9 @@ import { OPERATION_4_DELEGATECALL } from "@erc725/smart-contracts/contracts/constants.sol"; -import {UniversalProfileInit} from "../../UniversalProfileInit.sol"; +import { + UniversalProfileInit +} from "@lukso/universalprofile-contracts/contracts/UniversalProfileInit.sol"; contract UniversalProfileInitPostDeploymentModule is UniversalProfileInit { constructor() { diff --git a/contracts/LSP23LinkedContractsFactory/modules/UniversalProfilePostDeploymentModule.sol b/packages/lsp23-contracts/contracts/modules/UniversalProfilePostDeploymentModule.sol similarity index 94% rename from contracts/LSP23LinkedContractsFactory/modules/UniversalProfilePostDeploymentModule.sol rename to packages/lsp23-contracts/contracts/modules/UniversalProfilePostDeploymentModule.sol index 7e2f861ff..72c78207d 100644 --- a/contracts/LSP23LinkedContractsFactory/modules/UniversalProfilePostDeploymentModule.sol +++ b/packages/lsp23-contracts/contracts/modules/UniversalProfilePostDeploymentModule.sol @@ -5,7 +5,9 @@ import { OPERATION_4_DELEGATECALL } from "@erc725/smart-contracts/contracts/constants.sol"; -import {UniversalProfile} from "../../UniversalProfile.sol"; +import { + UniversalProfile +} from "@lukso/universalprofile-contracts/contracts/UniversalProfile.sol"; contract UniversalProfilePostDeploymentModule is UniversalProfile { constructor() UniversalProfile(address(0)) {} diff --git a/packages/lsp23-contracts/contracts/modules/deployment-UP-init-module.md b/packages/lsp23-contracts/contracts/modules/deployment-UP-init-module.md new file mode 100644 index 000000000..13c2fc307 --- /dev/null +++ b/packages/lsp23-contracts/contracts/modules/deployment-UP-init-module.md @@ -0,0 +1,92 @@ +# Setup + +Before the deployment of the `UniversalProfileInitPostDeploymentModule` on any network, people should make sure that the [Nick's Factory contract](https://github.com/Arachnid/deterministic-deployment-proxy/tree/master) is deployed on the same network. +You also need to make sure that the LSP23 Linked Contracts Factory is deployed on the same network. Please refer to [LSP23 Linked Contracts Deployment Factory LIP](https://github.com/lukso-network/LIPs/LSPs/LSP-23-LinkedContractsFactory.md#lsp23linkedcontractsfactory-deployment) in order to deploy it. + +# Deployment of the Universal Profile Init Post Deployment Module + +## Standardized Address + +`0x000000000066093407b6704B89793beFfD0D8F00` + +## Standardized Salt + +`0x12a6712f113536d8b01d99f72ce168c7e10901240d73e80eeb821d01aa4c2b1a` + +## Standardized Bytecode + +```solidity +0x60806040523480156200001157600080fd5b506200001c6200002c565b620000266200002c565b620000ed565b600054610100900460ff1615620000995760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000eb576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61497980620000fd6000396000f3fe6080604052600436106101635760003560e01c8063715018a6116100c0578063c4d66de811610074578063e30c397811610059578063e30c397814610451578063ead3fbdf1461020d578063f2fde38b1461047c5761019e565b8063c4d66de81461041e578063dedff9c6146104315761019e565b80637f23690c116100a55780637f23690c146103a65780638da5cb5b146103b9578063979024211461040b5761019e565b8063715018a61461037c57806379ba5097146103915761019e565b806344c028fe1161011757806354f6127f116100fc57806354f6127f146103295780636963d438146103495780636bb56a14146103695761019e565b806344c028fe146102f65780634f04d60a146103165761019e565b80631626ba7e116101485780631626ba7e1461026557806328c4d14e146102b657806331858452146102d65761019e565b806301bfba611461020d57806301ffc9a7146102355761019e565b3661019e57341561019c57604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b005b600036606034156101d757604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60043610156101f55750604080516020810190915260008152610202565b6101ff838361049c565b90505b915050805190602001f35b34801561021957600080fd5b5061022260c881565b6040519081526020015b60405180910390f35b34801561024157600080fd5b50610255610250366004613a93565b610677565b604051901515815260200161022c565b34801561027157600080fd5b50610285610280366004613bca565b61080c565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161022c565b3480156102c257600080fd5b5061019c6102d1366004613c7c565b610ac3565b6102e96102e4366004613de7565b610c2a565b60405161022c9190613fb2565b610309610304366004613fc5565b610cf4565b60405161022c919061401a565b61019c61032436600461402d565b610d95565b34801561033557600080fd5b506103096103443660046140a1565b610f19565b34801561035557600080fd5b506102e96103643660046140ba565b610f24565b61030961037736600461412f565b61109a565b34801561038857600080fd5b5061019c6112a2565b34801561039d57600080fd5b5061019c6113a7565b61019c6103b4366004613bca565b6114b1565b3480156103c557600080fd5b5060005462010000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022c565b61019c61041936600461417b565b611552565b61019c61042c3660046141d5565b611681565b34801561043d57600080fd5b506102e961044c3660046141f0565b611815565b34801561045d57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166103e6565b34801561048857600080fd5b5061019c6104973660046141d5565b6118c0565b606060006104cd6000357fffffffff0000000000000000000000000000000000000000000000000000000016611b4f565b90506000357fffffffff0000000000000000000000000000000000000000000000000000000016158015610515575073ffffffffffffffffffffffffffffffffffffffff8116155b15610530575050604080516020810190915260008152610671565b73ffffffffffffffffffffffffffffffffffffffff81166105a8576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000006000351660048201526024015b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16868633346040516020016105d99493929190614225565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261061191614268565b6000604051808303816000865af19150503d806000811461064e576040519150601f19603f3d011682016040523d82523d6000602084013e610653565b606091505b50915091508115610668579250610671915050565b80518060208301fd5b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f1626ba7e00000000000000000000000000000000000000000000000000000000148061070a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f24871b3d00000000000000000000000000000000000000000000000000000000145b8061075657507fffffffff0000000000000000000000000000000000000000000000000000000082167f6bb56a1400000000000000000000000000000000000000000000000000000000145b806107a257507fffffffff0000000000000000000000000000000000000000000000000000000082167f94be599900000000000000000000000000000000000000000000000000000000145b806107ee57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1a0eb6a500000000000000000000000000000000000000000000000000000000145b806107fd57506107fd82611bbf565b80610671575061067182611c15565b6000805462010000900473ffffffffffffffffffffffffffffffffffffffff16803b156109e0576000808273ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8787604051602401610868929190614284565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516108f19190614268565b600060405180830381855afa9150503d806000811461092c576040519150601f19603f3d011682016040523d82523d6000602084013e610931565b606091505b50915091506000828015610946575081516020145b8015610986575081517f1626ba7e0000000000000000000000000000000000000000000000000000000090610984908401602090810190850161429d565b145b9050806109b3577fffffffff000000000000000000000000000000000000000000000000000000006109d5565b7f1626ba7e000000000000000000000000000000000000000000000000000000005b945050505050610671565b6000806109ed8686611c78565b90925090506000816004811115610a0657610a066142b6565b14610a3757507fffffffff000000000000000000000000000000000000000000000000000000009250610671915050565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a90577fffffffff00000000000000000000000000000000000000000000000000000000610ab2565b7f1626ba7e000000000000000000000000000000000000000000000000000000005b9350505050610671565b5092915050565b600080610ad28385018561417b565b915091508573ffffffffffffffffffffffffffffffffffffffff166344c028fe600430600086868b604051602401610b0c939291906142e5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f04d60a000000000000000000000000000000000000000000000000000000001790525160e086901b7fffffffff00000000000000000000000000000000000000000000000000000000168152610bbc949392919060040161435a565b6000604051808303816000875af1158015610bdb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610c219190810190614395565b50505050505050565b60603415610c6057604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633819003610c9b57610c9386868686611cbd565b915050610cec565b6000610ca682611e4d565b90506000610cb688888888611cbd565b90508115610ce757610ce78382604051602001610cd39190613fb2565b604051602081830303815290604052612060565b925050505b949350505050565b60603415610d2a57604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633819003610d5d57610c9386868686612233565b6000610d6882611e4d565b90506000610d7888888888612233565b90508115610ce757610ce78382604051602001610cd3919061401a565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606860248201527f556e6976657273616c50726f66696c65496e6974506f73744465706c6f796d6560448201527f6e744d6f64756c653a2073657444617461416e645472616e736665724f776e6560648201527f7273686970206f6e6c7920616c6c6f776564207468726f7567682064656c656760848201527f6174652063616c6c00000000000000000000000000000000000000000000000060a482015260c40161059f565b60005b8351811015610f0a57610f02848281518110610edb57610edb614403565b6020026020010151848381518110610ef557610ef5614403565b60200260200101516123d5565b600101610ebd565b50610f1481612449565b505050565b6060610671826124ef565b60608167ffffffffffffffff811115610f3f57610f3f613ab0565b604051908082528060200260200182016040528015610f7257816020015b6060815260200190600190039081610f5d5790505b50905060005b82811015610abc5760008030868685818110610f9657610f96614403565b9050602002810190610fa89190614432565b604051610fb6929190614497565b600060405180830381855af49150503d8060008114610ff1576040519150601f19603f3d011682016040523d82523d6000602084013e610ff6565b606091505b509150915081611072578051156110105780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4c5350303a20626174636843616c6c7320726576657274656400000000000000604482015260640161059f565b8084848151811061108557611085614403565b60209081029190910101525050600101610f78565b606034156110d057604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60006110fb7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b476124ef565b905060606014825110611170576000611113836144a7565b60601c9050611142817f6bb56a1400000000000000000000000000000000000000000000000000000000612591565b1561116e5761116b73ffffffffffffffffffffffffffffffffffffffff82168888883334612660565b91505b505b600061119c7f0cfc51aec37c55a4d0b10000000000000000000000000000000000000000000088612800565b905060006111a9826124ef565b90506060601482511061121e5760006111c1836144a7565b60601c90506111f0817f6bb56a1400000000000000000000000000000000000000000000000000000000612591565b1561121c5761121973ffffffffffffffffffffffffffffffffffffffff82168b8b8b3334612660565b91505b505b83816040516020016112319291906144f7565b604051602081830303815290604052955088343373ffffffffffffffffffffffffffffffffffffffff167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c28b8b8b60405161128e93929190614565565b60405180910390a450505050509392505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16338190036112d4576112d161287c565b50565b60006112df82611e4d565b9050600061130960005473ffffffffffffffffffffffffffffffffffffffff620100009091041690565b905061131361287c565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16611388576040805160208101909152600081526113889073ffffffffffffffffffffffffffffffffffffffff8316907fa4e59c931d14f7c8a7a35027f92ee40b5f2886b9fdcdb78f30bc5ecce5a2f814906129b8565b8115610f1457610f148360405180602001604052806000815250612060565b60035474010000000000000000000000000000000000000000900460ff16156113fc576040517f5758dd0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16611423612aa0565b6040805160208101909152600081526114759073ffffffffffffffffffffffffffffffffffffffff8316907fa4e59c931d14f7c8a7a35027f92ee40b5f2886b9fdcdb78f30bc5ecce5a2f814906129b8565b6040805160208101909152600081526112d19033907fceca317f109c43507871523e82dc2a3cc64dfa18f12da0b6db14f6e23f995538906129b8565b34156114e557604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163381900361151657610f1483836123d5565b600061152182611e4d565b905061152d84846123d5565b801561154c5761154c8260405180602001604052806000815250612060565b50505050565b341561158657604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b80518251146115c1576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16338190036116115760005b835181101561154c57611609848281518110610edb57610edb614403565b6001016115eb565b600061161c82611e4d565b905060005b84518110156116615761165985828151811061163f5761163f614403565b6020026020010151858381518110610ef557610ef5614403565b600101611621565b50801561154c5761154c8260405180602001604052806000815250612060565b600054610100900460ff16158080156116a15750600054600160ff909116105b806116bb5750303b1580156116bb575060005460ff166001145b611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161059f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117a557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6117ae82612b7a565b801561181157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6060815167ffffffffffffffff81111561183157611831613ab0565b60405190808252806020026020018201604052801561186457816020015b606081526020019060019003908161184f5790505b50905060005b82518110156118ba5761189583828151811061188857611888614403565b60200260200101516124ef565b8282815181106118a7576118a7614403565b602090810291909101015260010161186a565b50919050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633819003611a0757600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905561192f82612c7c565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a36040805160208101909152600081526119db9073ffffffffffffffffffffffffffffffffffffffff8416907fe17117c9d2665d1dbeb479ed8058bbebde3c50ac50e2e65619f60006caac6926906129b8565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b6000611a1282611e4d565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559050611a5c83612c7c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a3604080516020810190915260008152611b089073ffffffffffffffffffffffffffffffffffffffff8516907fe17117c9d2665d1dbeb479ed8058bbebde3c50ac50e2e65619f60006caac6926906129b8565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690558015610f1457610f148260405180602001604052806000815250612060565b600080611b9e7fcee78b4094da86011096000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008516612800565b90506000611bab826124ef565b611bb4906144a7565b60601c949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fa918fa6b000000000000000000000000000000000000000000000000000000001480610671575061067182612d17565b600080611c417f01ffc9a700000000000000000000000000000000000000000000000000000000611b4f565b905073ffffffffffffffffffffffffffffffffffffffff8116611c675750600092915050565b611c718184612591565b9392505050565b6000808251604103611cae5760208301516040840151606085015160001a611ca287828585612d6d565b94509450505050611cb6565b506000905060025b9250929050565b606083518551141580611cde575082518451141580611cde57508151835114155b15611d15576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451600003611d50576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000855167ffffffffffffffff811115611d6c57611d6c613ab0565b604051908082528060200260200182016040528015611d9f57816020015b6060815260200190600190039081611d8a5790505b50905060005b8651811015611e4357611e1e878281518110611dc357611dc3614403565b6020026020010151878381518110611ddd57611ddd614403565b6020026020010151878481518110611df757611df7614403565b6020026020010151878581518110611e1157611e11614403565b6020026020010151612233565b828281518110611e3057611e30614403565b6020908102919091010152600101611da5565b5095945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff16639bf04b1160e01b3334600036604051602401611e89949392919061458b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611f129190614268565b6000604051808303816000865af19150503d8060008114611f4f576040519150601f19603f3d011682016040523d82523d6000602084013e611f54565b606091505b5091509150611f6560008383612e5c565b600081806020019051810190611f7b91906145c1565b90507fffffff000000000000000000000000000000000000000000000000000000000081167f9bf04b000000000000000000000000000000000000000000000000000000000014611ffd576000826040517fd088ec4000000000000000000000000000000000000000000000000000000000815260040161059f9291906145de565b7f01000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000600383901a60f81b1614612054576000612057565b60015b95945050505050565b6000808373ffffffffffffffffffffffffffffffffffffffff1663d3fc45d360e01b333460003660405160200161209a94939291906145f9565b60405160208183030381529060405280519060200120856040516024016120c2929190614284565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161214b9190614268565b6000604051808303816000865af19150503d8060008114612188576040519150601f19603f3d011682016040523d82523d6000602084013e61218d565b606091505b509150915061219e60018383612e5c565b80517fd3fc45d300000000000000000000000000000000000000000000000000000000906121d590830160209081019084016145c1565b7fffffffff00000000000000000000000000000000000000000000000000000000161461154c576001816040517fd088ec4000000000000000000000000000000000000000000000000000000000815260040161059f9291906145de565b60608461224c57612245848484612ee5565b9050610cec565b600185036122ac5773ffffffffffffffffffffffffffffffffffffffff8416156122a2576040517f3041824a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612245838361305c565b6002850361230c5773ffffffffffffffffffffffffffffffffffffffff841615612302576040517f3041824a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61224583836131d5565b6003850361235657821561234c576040517f72f2bc6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61224584836132f8565b600485036123a0578215612396576040517f5ac8313500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122458483613420565b6040517f7583b3bc0000000000000000000000000000000000000000000000000000000081526004810186905260240161059f565b60008281526001602052604090206123ed82826146da565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b26101008351111561242e576124298360006101006134fe565b612430565b825b60405161243d919061401a565b60405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff8281166201000090920416146112d1576000805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b600081815260016020526040902080546060919061250c9061463f565b80601f01602080910402602001604051908101604052809291908181526020018280546125389061463f565b80156125855780601f1061255a57610100808354040283529160200191612585565b820191906000526020600020905b81548152906001019060200180831161256857829003601f168201915b50505050509050919050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612649575060208210155b80156126555750600081115b979650505050505050565b60606000636bb56a1460e01b878787604051602401612681939291906147f4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093525161270e92879187910161480e565b60405160208183030381529060405290506000808973ffffffffffffffffffffffffffffffffffffffff16836040516127479190614268565b6000604051808303816000865af19150503d8060008114612784576040519150601f19603f3d011682016040523d82523d6000602084013e612789565b606091505b50915091506127ce82826040518060400160405280602081526020017f43616c6c20746f20756e6976657273616c5265636569766572206661696c6564815250613678565b5080516000036127de57806127f2565b808060200190518101906127f29190614395565b9a9950505050505050505050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008416602c83015291829101604051602081830303815290604052905080610cec90614860565b60025443906000906128909060c8906148d1565b9050600061289f60c8836148d1565b9050808311806128af5750600254155b1561290f576002839055600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e790600090a1505050565b81831015612953576040517f8b9bf507000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161059f565b61295d6000612449565b60006002819055600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1505050565b6129e2837f6bb56a1400000000000000000000000000000000000000000000000000000000612591565b15610f14576040517f6bb56a1400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636bb56a1490612a3b9085908590600401614284565b6000604051808303816000875af1158015612a5a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261154c9190810190614395565b60035473ffffffffffffffffffffffffffffffffffffffff163314612b47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4c535031343a2063616c6c6572206973206e6f74207468652070656e64696e6760448201527f4f776e6572000000000000000000000000000000000000000000000000000000606482015260840161059f565b612b5033612449565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600054610100900460ff16612c11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161059f565b612c1a81613691565b6112d17feafec4d89fa9619884b600005ef83ad9559033e6e941db7d7c495acdce61634760001b6040518060400160405280600481526020017f5ef83ad9000000000000000000000000000000000000000000000000000000008152506123d5565b3073ffffffffffffffffffffffffffffffffffffffff821603612ccb576040517f43b248cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556000600255565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f629aa694000000000000000000000000000000000000000000000000000000001480610671575061067182613765565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612da45750600090506003612e53565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612df8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612e4c57600060019250925050612e53565b9150600090505b94509492505050565b81612e6b57612e6b83826137fc565b602081511080612eaa575060006020612e8383614860565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000911b1614155b15610f145782816040517fd088ec4000000000000000000000000000000000000000000000000000000000815260040161059f9291906145de565b606082471015612f2a576040517f0df9a8f80000000000000000000000000000000000000000000000000000000081524760048201526024810184905260440161059f565b8273ffffffffffffffffffffffffffffffffffffffff851660007f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e612f6e866148e4565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390a46000808573ffffffffffffffffffffffffffffffffffffffff168585604051612fcb9190614268565b60006040518083038185875af1925050503d8060008114613008576040519150601f19603f3d011682016040523d82523d6000602084013e61300d565b606091505b509150915061305282826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250613678565b9695505050505050565b6060824710156130a1576040517f0df9a8f80000000000000000000000000000000000000000000000000000000081524760048201526024810184905260440161059f565b81516000036130dc576040517fb81cd8d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082516020840185f0905073ffffffffffffffffffffffffffffffffffffffff8116613135576040517f0b07489b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b838173ffffffffffffffffffffffffffffffffffffffff1660017fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c36000801b60405161318391815260200190565b60405180910390a46040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b16602082015260340160405160208183030381529060405291505092915050565b60608151600003613212576040517fb81cd8d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061322b83602085516132269190614930565b613842565b90506000613248846000602087516132439190614930565b6134fe565b905060006132578684846138c2565b9050858173ffffffffffffffffffffffffffffffffffffffff1660027fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c3866040516132a491815260200190565b60405180910390a46040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166020820152603401604051602081830303815290604052935050505092915050565b6060600073ffffffffffffffffffffffffffffffffffffffff841660037f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e61333f866148e4565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390a46000808473ffffffffffffffffffffffffffffffffffffffff168460405161339b9190614268565b600060405180830381855afa9150503d80600081146133d6576040519150601f19603f3d011682016040523d82523d6000602084013e6133db565b606091505b509150915061205782826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250613678565b6060600073ffffffffffffffffffffffffffffffffffffffff841660047f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e613467866148e4565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390a46000808473ffffffffffffffffffffffffffffffffffffffff16846040516134c39190614268565b600060405180830381855af49150503d80600081146133d6576040519150601f19603f3d011682016040523d82523d6000602084013e6133db565b60608161350c81601f6148d1565b1015613574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161059f565b61357e82846148d1565b845110156135e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161059f565b606082158015613607576040519150600082526020820160405261366f565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613640578051835260209283019201613628565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60608315613687575081611c71565b611c718383613a21565b600054610100900460ff16613728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161059f565b341561375c57604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b6112d181612449565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7545acac00000000000000000000000000000000000000000000000000000000148061067157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610671565b80511561380c5780518082602001fd5b6040517f8c6a8ae3000000000000000000000000000000000000000000000000000000008152821515600482015260240161059f565b600061384f8260206148d1565b835110156138b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e64730000000000000000000000604482015260640161059f565b50016020015190565b60008347101561392e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161059f565b8151600003613999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161059f565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116611c71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161059f565b815115613a315781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059f919061401a565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146112d157600080fd5b600060208284031215613aa557600080fd5b8135611c7181613a65565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b2657613b26613ab0565b604052919050565b600067ffffffffffffffff821115613b4857613b48613ab0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b8557600080fd5b8135613b98613b9382613b2e565b613adf565b818152846020838601011115613bad57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215613bdd57600080fd5b82359150602083013567ffffffffffffffff811115613bfb57600080fd5b613c0785828601613b74565b9150509250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613c3557600080fd5b919050565b60008083601f840112613c4c57600080fd5b50813567ffffffffffffffff811115613c6457600080fd5b602083019150836020828501011115611cb657600080fd5b60008060008060608587031215613c9257600080fd5b613c9b85613c11565b9350613ca960208601613c11565b9250604085013567ffffffffffffffff811115613cc557600080fd5b613cd187828801613c3a565b95989497509550505050565b600067ffffffffffffffff821115613cf757613cf7613ab0565b5060051b60200190565b600082601f830112613d1257600080fd5b81356020613d22613b9383613cdd565b82815260059290921b84018101918181019086841115613d4157600080fd5b8286015b84811015613d5c5780358352918301918301613d45565b509695505050505050565b600082601f830112613d7857600080fd5b81356020613d88613b9383613cdd565b82815260059290921b84018101918181019086841115613da757600080fd5b8286015b84811015613d5c57803567ffffffffffffffff811115613dcb5760008081fd5b613dd98986838b0101613b74565b845250918301918301613dab565b60008060008060808587031215613dfd57600080fd5b843567ffffffffffffffff80821115613e1557600080fd5b613e2188838901613d01565b9550602091508187013581811115613e3857600080fd5b8701601f81018913613e4957600080fd5b8035613e57613b9382613cdd565b81815260059190911b8201840190848101908b831115613e7657600080fd5b928501925b82841015613e9b57613e8c84613c11565b82529285019290850190613e7b565b97505050506040870135915080821115613eb457600080fd5b613ec088838901613d01565b93506060870135915080821115613ed657600080fd5b50613ee387828801613d67565b91505092959194509250565b60005b83811015613f0a578181015183820152602001613ef2565b50506000910152565b60008151808452613f2b816020860160208601613eef565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613fa5578284038952613f93848351613f13565b98850198935090840190600101613f7b565b5091979650505050505050565b602081526000611c716020830184613f5d565b60008060008060808587031215613fdb57600080fd5b84359350613feb60208601613c11565b925060408501359150606085013567ffffffffffffffff81111561400e57600080fd5b613ee387828801613b74565b602081526000611c716020830184613f13565b60008060006060848603121561404257600080fd5b833567ffffffffffffffff8082111561405a57600080fd5b61406687838801613d01565b9450602086013591508082111561407c57600080fd5b5061408986828701613d67565b92505061409860408501613c11565b90509250925092565b6000602082840312156140b357600080fd5b5035919050565b600080602083850312156140cd57600080fd5b823567ffffffffffffffff808211156140e557600080fd5b818501915085601f8301126140f957600080fd5b81358181111561410857600080fd5b8660208260051b850101111561411d57600080fd5b60209290920196919550909350505050565b60008060006040848603121561414457600080fd5b83359250602084013567ffffffffffffffff81111561416257600080fd5b61416e86828701613c3a565b9497909650939450505050565b6000806040838503121561418e57600080fd5b823567ffffffffffffffff808211156141a657600080fd5b6141b286838701613d01565b935060208501359150808211156141c857600080fd5b50613c0785828601613d67565b6000602082840312156141e757600080fd5b611c7182613c11565b60006020828403121561420257600080fd5b813567ffffffffffffffff81111561421957600080fd5b610cec84828501613d01565b8385823760609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014810191909152603401919050565b6000825161427a818460208701613eef565b9190910192915050565b828152604060208201526000610cec6040830184613f13565b6000602082840312156142af57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b606080825284519082018190526000906020906080840190828801845b8281101561431e57815184529284019290840190600101614302565b505050838103828501526143328187613f5d565b9250505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201528260408201526080606082015260006130526080830184613f13565b6000602082840312156143a757600080fd5b815167ffffffffffffffff8111156143be57600080fd5b8201601f810184136143cf57600080fd5b80516143dd613b9382613b2e565b8181528560208385010111156143f257600080fd5b612057826020830160208601613eef565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261446757600080fd5b83018035915067ffffffffffffffff82111561448257600080fd5b602001915036819003821315611cb657600080fd5b8183823760009101908152919050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156144ef5780818460140360031b1b83161693505b505050919050565b60408152600061450a6040830185613f13565b82810360208401526120578185613f13565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60408152600061457960408301858761451c565b82810360208401526130528185613f13565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061305260608301848661451c565b6000602082840312156145d357600080fd5b8151611c7181613a65565b8215158152604060208201526000610cec6040830184613f13565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008560601b16815283601482015281836034830137600091016034019081529392505050565b600181811c9082168061465357607f821691505b6020821081036118ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610f1457600081815260208120601f850160051c810160208610156146b35750805b601f850160051c820191505b818110156146d2578281556001016146bf565b505050505050565b815167ffffffffffffffff8111156146f4576146f4613ab0565b61470881614702845461463f565b8461468c565b602080601f83116001811461475b57600084156147255750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556146d2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156147a857888601518255948401946001909101908401614789565b50858210156147e457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b83815260406020820152600061205760408301848661451c565b60008451614820818460208901613eef565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b805160208083015191908110156118ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610671576106716148a2565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156144ef5760049290920360031b82901b161692915050565b81810381811115610671576106716148a256fea26469706673582212204c716f85d1145bcbe75de9c2eb2914430942e4f65ea5e7afda664b1551460c7f64736f6c63430008110033 +``` + +## Universal Profile Init Post Deployment Module Source Code + +This is an exact copy of the code of the [`UniversalProfileInitPostDeploymentModule` smart contract]. + +- The source code is generated with `solc` compiler version `0.8.17` and with `9999999` optimization runs. +- The imported contracts are part of the `4.9.2` version of the `@openzeppelin/contracts` package. +- Navigate to [lsp-smart-contract](https://github.com/lukso-network/lsp-smart-contracts) repo and checkout to `b8eca3c5696acf85239130ef67edec9e8c134bfa` commit to obtain the exact copy of the code, change the compiler settings in `hardhat.config.ts` and compile to produce the same bytecode. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +import { OPERATION_4_DELEGATECALL } from "@erc725/smart-contracts/contracts/constants.sol"; + +import { UniversalProfileInit } from "../../UniversalProfileInit.sol"; + +contract UniversalProfileInitPostDeploymentModule is UniversalProfileInit { + constructor() { + _disableInitializers(); + } + + function setDataAndTransferOwnership( + bytes32[] memory dataKeys, + bytes[] memory dataValues, + address newOwner + ) public payable { + // check that the msg.sender is the owner + require( + msg.sender == owner(), + "UniversalProfileInitPostDeploymentModule: setDataAndTransferOwnership only allowed through delegate call" + ); + + // update the dataKeys and dataValues in the UniversalProfile contract + for (uint256 i = 0; i < dataKeys.length; ) { + _setData(dataKeys[i], dataValues[i]); + + unchecked { + ++i; + } + } + + // transfer the ownership of the UniversalProfile contract to the newOwner + _setOwner(newOwner); + } + + function executePostDeployment( + address universalProfile, + address keyManager, + bytes calldata setDataBatchBytes + ) public { + // retrieve the dataKeys and dataValues to setData from the initializationCalldata bytes + (bytes32[] memory dataKeys, bytes[] memory dataValues) = abi.decode( + setDataBatchBytes, + (bytes32[], bytes[]) + ); + + // call the execute function with delegate_call on the universalProfile contract to setData and transferOwnership + UniversalProfileInit(payable(universalProfile)).execute( + OPERATION_4_DELEGATECALL, + address(this), + 0, + abi.encodeWithSignature( + "setDataAndTransferOwnership(bytes32[],bytes[],address)", + dataKeys, + dataValues, + keyManager + ) + ); + } +} +``` diff --git a/packages/lsp23-contracts/contracts/modules/deployment-UP-module.md b/packages/lsp23-contracts/contracts/modules/deployment-UP-module.md new file mode 100644 index 000000000..d046f4a4a --- /dev/null +++ b/packages/lsp23-contracts/contracts/modules/deployment-UP-module.md @@ -0,0 +1,90 @@ +# Setup + +Before the deployment of the `UniversalProfilePostDeploymentModule` on any network, people should make sure that the [Nick's Factory contract](https://github.com/Arachnid/deterministic-deployment-proxy/tree/master) is deployed on the same network. +You also need to make sure that the LSP23 Linked Contracts Factory is deployed on the same network. Please refer to [LSP23 Linked Contracts Deployment Factory LIP](https://github.com/lukso-network/LIPs/LSPs/LSP-23-LinkedContractsFactory.md#lsp23linkedcontractsfactory-deployment) in order to deploy it. + +# Deployment of the Universal Profile Post Deployment Module + +## Standardized Address + +`0x0000005aD606bcFEF9Ea6D0BbE5b79847054BcD7` + +## Standardized Salt + +`0x42ff55d7957589c62da54a4368b10a2bc549f2038bbb6880ec6b3e0ecae2ba58 ` + +## Standardized Bytecode + +```solidity +0x60806040523480156200001157600080fd5b5060008034156200004a57604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b6200006081620000b060201b620019381760201c565b506040805180820190915260048152635ef83ad960e01b6020820152620000a9907feafec4d89fa9619884b600005ef83ad9559033e6e941db7d7c495acdce6163479062000117565b50620004a4565b6000546001600160a01b038281169116146200011457600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a3505b50565b600082815260016020526040902062000131828262000360565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b26101008351111562000181576200017b8360006101006200019e60201b620019cf1760201c565b62000183565b825b6040516200019291906200042c565b60405180910390a25050565b606081620001ae81601f6200047c565b1015620001f35760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064015b60405180910390fd5b620001ff82846200047c565b84511015620002455760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401620001ea565b606082158015620002665760405191506000825260208201604052620002b2565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015620002a157805183526020928301920162000287565b5050858452601f01601f1916604052505b50949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002e657607f821691505b6020821081036200030757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200035b57600081815260208120601f850160051c81016020861015620003365750805b601f850160051c820191505b81811015620003575782815560010162000342565b5050505b505050565b81516001600160401b038111156200037c576200037c620002bb565b62000394816200038d8454620002d1565b846200030d565b602080601f831160018114620003cc5760008415620003b35750858301515b600019600386901b1c1916600185901b17855562000357565b600085815260208120601f198616915b82811015620003fd57888601518255948401946001909101908401620003dc565b50858210156200041c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b818110156200045b578581018301518582016040015282016200043d565b506000604082860101526040601f19601f8301168501019250505092915050565b808201808211156200049e57634e487b7160e01b600052601160045260246000fd5b92915050565b61457880620004b46000396000f3fe6080604052600436106101485760003560e01c80636bb56a14116100c05780639790242111610074578063e30c397811610059578063e30c39781461041d578063ead3fbdf146101f2578063f2fde38b1461044857610183565b806397902421146103ea578063dedff9c6146103fd57610183565b806379ba5097116100a557806379ba5097146103765780637f23690c1461038b5780638da5cb5b1461039e57610183565b80636bb56a141461034e578063715018a61461036157610183565b806331858452116101175780634f04d60a116100fc5780634f04d60a146102fb57806354f6127f1461030e5780636963d4381461032e57610183565b806331858452146102bb57806344c028fe146102db57610183565b806301bfba61146101f257806301ffc9a71461021a5780631626ba7e1461024a57806328c4d14e1461029b57610183565b3661018357341561018157604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b005b600036606034156101bc57604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60043610156101da57506040805160208101909152600081526101e7565b6101e48383610468565b90505b915050805190602001f35b3480156101fe57600080fd5b5061020760c881565b6040519081526020015b60405180910390f35b34801561022657600080fd5b5061023a610235366004613692565b610643565b6040519015158152602001610211565b34801561025657600080fd5b5061026a6102653660046137c9565b6107d8565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610211565b3480156102a757600080fd5b506101816102b636600461387b565b610aa9565b6102ce6102c93660046139e6565b610c10565b6040516102119190613bb1565b6102ee6102e9366004613bc4565b610cd4565b6040516102119190613c19565b610181610309366004613c2c565b610d6f565b34801561031a57600080fd5b506102ee610329366004613ca0565b610ec1565b34801561033a57600080fd5b506102ce610349366004613cb9565b610ecc565b6102ee61035c366004613d2e565b611042565b34801561036d57600080fd5b5061018161124a565b34801561038257600080fd5b5061018161133c565b6101816103993660046137c9565b611440565b3480156103aa57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b6101816103f8366004613d7a565b6114db565b34801561040957600080fd5b506102ce610418366004613dd4565b611604565b34801561042957600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166103c5565b34801561045457600080fd5b50610181610463366004613e09565b6116af565b606060006104996000357fffffffff0000000000000000000000000000000000000000000000000000000016611b4b565b90506000357fffffffff00000000000000000000000000000000000000000000000000000000161580156104e1575073ffffffffffffffffffffffffffffffffffffffff8116155b156104fc57505060408051602081019091526000815261063d565b73ffffffffffffffffffffffffffffffffffffffff8116610574576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000006000351660048201526024015b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16868633346040516020016105a59493929190613e24565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526105dd91613e67565b6000604051808303816000865af19150503d806000811461061a576040519150601f19603f3d011682016040523d82523d6000602084013e61061f565b606091505b5091509150811561063457925061063d915050565b80518060208301fd5b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f1626ba7e0000000000000000000000000000000000000000000000000000000014806106d657507fffffffff0000000000000000000000000000000000000000000000000000000082167f24871b3d00000000000000000000000000000000000000000000000000000000145b8061072257507fffffffff0000000000000000000000000000000000000000000000000000000082167f6bb56a1400000000000000000000000000000000000000000000000000000000145b8061076e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f94be599900000000000000000000000000000000000000000000000000000000145b806107ba57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1a0eb6a500000000000000000000000000000000000000000000000000000000145b806107c957506107c982611bbb565b8061063d575061063d82611c11565b6000806107fa60005473ffffffffffffffffffffffffffffffffffffffff1690565b905073ffffffffffffffffffffffffffffffffffffffff81163b156109c6576000808273ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b878760405160240161084e929190613e83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516108d79190613e67565b600060405180830381855afa9150503d8060008114610912576040519150601f19603f3d011682016040523d82523d6000602084013e610917565b606091505b5091509150600082801561092c575081516020145b801561096c575081517f1626ba7e000000000000000000000000000000000000000000000000000000009061096a9084016020908101908501613e9c565b145b905080610999577fffffffff000000000000000000000000000000000000000000000000000000006109bb565b7f1626ba7e000000000000000000000000000000000000000000000000000000005b94505050505061063d565b6000806109d38686611c6d565b909250905060008160048111156109ec576109ec613eb5565b14610a1d57507fffffffff00000000000000000000000000000000000000000000000000000000925061063d915050565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a76577fffffffff00000000000000000000000000000000000000000000000000000000610a98565b7f1626ba7e000000000000000000000000000000000000000000000000000000005b935050505061063d565b5092915050565b600080610ab883850185613d7a565b915091508573ffffffffffffffffffffffffffffffffffffffff166344c028fe600430600086868b604051602401610af293929190613ee4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f04d60a000000000000000000000000000000000000000000000000000000001790525160e086901b7fffffffff00000000000000000000000000000000000000000000000000000000168152610ba29493929190600401613f59565b6000604051808303816000875af1158015610bc1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610c079190810190613f94565b50505050505050565b60603415610c4657604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60005473ffffffffffffffffffffffffffffffffffffffff1633819003610c7b57610c7386868686611cb2565b915050610ccc565b6000610c8682611e42565b90506000610c9688888888611cb2565b90508115610cc757610cc78382604051602001610cb39190613bb1565b604051602081830303815290604052612055565b925050505b949350505050565b60603415610d0a57604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60005473ffffffffffffffffffffffffffffffffffffffff1633819003610d3757610c7386868686612228565b6000610d4282611e42565b90506000610d5288888888612228565b90508115610cc757610cc78382604051602001610cb39190613c19565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606860248201527f556e6976657273616c50726f66696c65496e6974506f73744465706c6f796d6560448201527f6e744d6f64756c653a2073657444617461416e645472616e736665724f776e6560648201527f7273686970206f6e6c7920616c6c6f776564207468726f7567682064656c656760848201527f6174652063616c6c00000000000000000000000000000000000000000000000060a482015260c40161056b565b60005b8351811015610eb257610eaa848281518110610e8357610e83614002565b6020026020010151848381518110610e9d57610e9d614002565b60200260200101516123ca565b600101610e65565b50610ebc81611938565b505050565b606061063d8261243e565b60608167ffffffffffffffff811115610ee757610ee76136af565b604051908082528060200260200182016040528015610f1a57816020015b6060815260200190600190039081610f055790505b50905060005b82811015610aa25760008030868685818110610f3e57610f3e614002565b9050602002810190610f509190614031565b604051610f5e929190614096565b600060405180830381855af49150503d8060008114610f99576040519150601f19603f3d011682016040523d82523d6000602084013e610f9e565b606091505b50915091508161101a57805115610fb85780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4c5350303a20626174636843616c6c7320726576657274656400000000000000604482015260640161056b565b8084848151811061102d5761102d614002565b60209081029190910101525050600101610f20565b6060341561107857604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60006110a37f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b4761243e565b9050606060148251106111185760006110bb836140a6565b60601c90506110ea817f6bb56a14000000000000000000000000000000000000000000000000000000006124e0565b156111165761111373ffffffffffffffffffffffffffffffffffffffff821688888833346125af565b91505b505b60006111447f0cfc51aec37c55a4d0b1000000000000000000000000000000000000000000008861274f565b905060006111518261243e565b9050606060148251106111c6576000611169836140a6565b60601c9050611198817f6bb56a14000000000000000000000000000000000000000000000000000000006124e0565b156111c4576111c173ffffffffffffffffffffffffffffffffffffffff82168b8b8b33346125af565b91505b505b83816040516020016111d99291906140f6565b604051602081830303815290604052955088343373ffffffffffffffffffffffffffffffffffffffff167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c28b8b8b60405161123693929190614164565b60405180910390a450505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633819003611276576112736127cb565b50565b600061128182611e42565b905060006112a460005473ffffffffffffffffffffffffffffffffffffffff1690565b90506112ae6127cb565b60005473ffffffffffffffffffffffffffffffffffffffff1661131d5760408051602081019091526000815261131d9073ffffffffffffffffffffffffffffffffffffffff8316907fa4e59c931d14f7c8a7a35027f92ee40b5f2886b9fdcdb78f30bc5ecce5a2f81490612907565b8115610ebc57610ebc8360405180602001604052806000815250612055565b60035474010000000000000000000000000000000000000000900460ff1615611391576040517f5758dd0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff166113b26129ef565b6040805160208101909152600081526114049073ffffffffffffffffffffffffffffffffffffffff8316907fa4e59c931d14f7c8a7a35027f92ee40b5f2886b9fdcdb78f30bc5ecce5a2f81490612907565b6040805160208101909152600081526112739033907fceca317f109c43507871523e82dc2a3cc64dfa18f12da0b6db14f6e23f99553890612907565b341561147457604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b60005473ffffffffffffffffffffffffffffffffffffffff163381900361149f57610ebc83836123ca565b60006114aa82611e42565b90506114b684846123ca565b80156114d5576114d58260405180602001604052806000815250612055565b50505050565b341561150f57604051349033907f7e71433ddf847725166244795048ecf3e3f9f35628254ecbf73605666423349390600090a35b805182511461154a576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16338190036115945760005b83518110156114d55761158c848281518110610e8357610e83614002565b60010161156e565b600061159f82611e42565b905060005b84518110156115e4576115dc8582815181106115c2576115c2614002565b6020026020010151858381518110610e9d57610e9d614002565b6001016115a4565b5080156114d5576114d58260405180602001604052806000815250612055565b6060815167ffffffffffffffff811115611620576116206136af565b60405190808252806020026020018201604052801561165357816020015b606081526020019060019003908161163e5790505b50905060005b82518110156116a95761168483828151811061167757611677614002565b602002602001015161243e565b82828151811061169657611696614002565b6020908102919091010152600101611659565b50919050565b60005473ffffffffffffffffffffffffffffffffffffffff16338190036117f057600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905561171882612ac9565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a36040805160208101909152600081526117c49073ffffffffffffffffffffffffffffffffffffffff8416907fe17117c9d2665d1dbeb479ed8058bbebde3c50ac50e2e65619f60006caac692690612907565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b60006117fb82611e42565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055905061184583612ac9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a36040805160208101909152600081526118f19073ffffffffffffffffffffffffffffffffffffffff8516907fe17117c9d2665d1dbeb479ed8058bbebde3c50ac50e2e65619f60006caac692690612907565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690558015610ebc57610ebc8260405180602001604052806000815250612055565b60005473ffffffffffffffffffffffffffffffffffffffff828116911614611273576000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816119dd81601f6141b9565b1015611a45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161056b565b611a4f82846141b9565b84511015611ab9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161056b565b606082158015611ad85760405191506000825260208201604052611b40565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b11578051835260209283019201611af9565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b5090505b9392505050565b600080611b9a7fcee78b4094da86011096000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000851661274f565b90506000611ba78261243e565b611bb0906140a6565b60601c949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fa918fa6b00000000000000000000000000000000000000000000000000000000148061063d575061063d82612b64565b600080611c3d7f01ffc9a700000000000000000000000000000000000000000000000000000000611b4b565b905073ffffffffffffffffffffffffffffffffffffffff8116611c635750600092915050565b611b4481846124e0565b6000808251604103611ca35760208301516040840151606085015160001a611c9787828585612bba565b94509450505050611cab565b506000905060025b9250929050565b606083518551141580611cd3575082518451141580611cd357508151835114155b15611d0a576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451600003611d45576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000855167ffffffffffffffff811115611d6157611d616136af565b604051908082528060200260200182016040528015611d9457816020015b6060815260200190600190039081611d7f5790505b50905060005b8651811015611e3857611e13878281518110611db857611db8614002565b6020026020010151878381518110611dd257611dd2614002565b6020026020010151878481518110611dec57611dec614002565b6020026020010151878581518110611e0657611e06614002565b6020026020010151612228565b828281518110611e2557611e25614002565b6020908102919091010152600101611d9a565b5095945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff16639bf04b1160e01b3334600036604051602401611e7e94939291906141cc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611f079190613e67565b6000604051808303816000865af19150503d8060008114611f44576040519150601f19603f3d011682016040523d82523d6000602084013e611f49565b606091505b5091509150611f5a60008383612ca9565b600081806020019051810190611f709190614202565b90507fffffff000000000000000000000000000000000000000000000000000000000081167f9bf04b000000000000000000000000000000000000000000000000000000000014611ff2576000826040517fd088ec4000000000000000000000000000000000000000000000000000000000815260040161056b92919061421f565b7f01000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000600383901a60f81b161461204957600061204c565b60015b95945050505050565b6000808373ffffffffffffffffffffffffffffffffffffffff1663d3fc45d360e01b333460003660405160200161208f949392919061423a565b60405160208183030381529060405280519060200120856040516024016120b7929190613e83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516121409190613e67565b6000604051808303816000865af19150503d806000811461217d576040519150601f19603f3d011682016040523d82523d6000602084013e612182565b606091505b509150915061219360018383612ca9565b80517fd3fc45d300000000000000000000000000000000000000000000000000000000906121ca9083016020908101908401614202565b7fffffffff0000000000000000000000000000000000000000000000000000000016146114d5576001816040517fd088ec4000000000000000000000000000000000000000000000000000000000815260040161056b92919061421f565b6060846122415761223a848484612d32565b9050610ccc565b600185036122a15773ffffffffffffffffffffffffffffffffffffffff841615612297576040517f3041824a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61223a8383612ea9565b600285036123015773ffffffffffffffffffffffffffffffffffffffff8416156122f7576040517f3041824a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61223a8383613022565b6003850361234b578215612341576040517f72f2bc6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61223a8483613145565b6004850361239557821561238b576040517f5ac8313500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61223a848361326d565b6040517f7583b3bc0000000000000000000000000000000000000000000000000000000081526004810186905260240161056b565b60008281526001602052604090206123e2828261431b565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2610100835111156124235761241e8360006101006119cf565b612425565b825b6040516124329190613c19565b60405180910390a25050565b600081815260016020526040902080546060919061245b90614280565b80601f016020809104026020016040519081016040528092919081815260200182805461248790614280565b80156124d45780601f106124a9576101008083540402835291602001916124d4565b820191906000526020600020905b8154815290600101906020018083116124b757829003601f168201915b50505050509050919050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612598575060208210155b80156125a45750600081115b979650505050505050565b60606000636bb56a1460e01b8787876040516024016125d093929190614435565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093525161265d92879187910161444f565b60405160208183030381529060405290506000808973ffffffffffffffffffffffffffffffffffffffff16836040516126969190613e67565b6000604051808303816000865af19150503d80600081146126d3576040519150601f19603f3d011682016040523d82523d6000602084013e6126d8565b606091505b509150915061271d82826040518060400160405280602081526020017f43616c6c20746f20756e6976657273616c5265636569766572206661696c656481525061334b565b50805160000361272d5780612741565b808060200190518101906127419190613f94565b9a9950505050505050505050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008416602c83015291829101604051602081830303815290604052905080610ccc906144a1565b60025443906000906127df9060c8906141b9565b905060006127ee60c8836141b9565b9050808311806127fe5750600254155b1561285e576002839055600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e790600090a1505050565b818310156128a2576040517f8b9bf507000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161056b565b6128ac6000611938565b60006002819055600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1505050565b612931837f6bb56a14000000000000000000000000000000000000000000000000000000006124e0565b15610ebc576040517f6bb56a1400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636bb56a149061298a9085908590600401613e83565b6000604051808303816000875af11580156129a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526114d59190810190613f94565b60035473ffffffffffffffffffffffffffffffffffffffff163314612a96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4c535031343a2063616c6c6572206973206e6f74207468652070656e64696e6760448201527f4f776e6572000000000000000000000000000000000000000000000000000000606482015260840161056b565b612a9f33611938565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b3073ffffffffffffffffffffffffffffffffffffffff821603612b18576040517f43b248cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556000600255565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f629aa69400000000000000000000000000000000000000000000000000000000148061063d575061063d82613364565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612bf15750600090506003612ca0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c45573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c9957600060019250925050612ca0565b9150600090505b94509492505050565b81612cb857612cb883826133fb565b602081511080612cf7575060006020612cd0836144a1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000911b1614155b15610ebc5782816040517fd088ec4000000000000000000000000000000000000000000000000000000000815260040161056b92919061421f565b606082471015612d77576040517f0df9a8f80000000000000000000000000000000000000000000000000000000081524760048201526024810184905260440161056b565b8273ffffffffffffffffffffffffffffffffffffffff851660007f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e612dbb866144e3565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390a46000808573ffffffffffffffffffffffffffffffffffffffff168585604051612e189190613e67565b60006040518083038185875af1925050503d8060008114612e55576040519150601f19603f3d011682016040523d82523d6000602084013e612e5a565b606091505b5091509150612e9f82826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f720000000000000000000081525061334b565b9695505050505050565b606082471015612eee576040517f0df9a8f80000000000000000000000000000000000000000000000000000000081524760048201526024810184905260440161056b565b8151600003612f29576040517fb81cd8d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082516020840185f0905073ffffffffffffffffffffffffffffffffffffffff8116612f82576040517f0b07489b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b838173ffffffffffffffffffffffffffffffffffffffff1660017fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c36000801b604051612fd091815260200190565b60405180910390a46040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b16602082015260340160405160208183030381529060405291505092915050565b6060815160000361305f576040517fb81cd8d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130788360208551613073919061452f565b613441565b9050600061309584600060208751613090919061452f565b6119cf565b905060006130a48684846134c1565b9050858173ffffffffffffffffffffffffffffffffffffffff1660027fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c3866040516130f191815260200190565b60405180910390a46040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166020820152603401604051602081830303815290604052935050505092915050565b6060600073ffffffffffffffffffffffffffffffffffffffff841660037f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e61318c866144e3565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390a46000808473ffffffffffffffffffffffffffffffffffffffff16846040516131e89190613e67565b600060405180830381855afa9150503d8060008114613223576040519150601f19603f3d011682016040523d82523d6000602084013e613228565b606091505b509150915061204c82826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f720000000000000000000081525061334b565b6060600073ffffffffffffffffffffffffffffffffffffffff841660047f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e6132b4866144e3565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390a46000808473ffffffffffffffffffffffffffffffffffffffff16846040516133109190613e67565b600060405180830381855af49150503d8060008114613223576040519150601f19603f3d011682016040523d82523d6000602084013e613228565b6060831561335a575081611b44565b611b448383613620565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7545acac00000000000000000000000000000000000000000000000000000000148061063d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461063d565b80511561340b5780518082602001fd5b6040517f8c6a8ae3000000000000000000000000000000000000000000000000000000008152821515600482015260240161056b565b600061344e8260206141b9565b835110156134b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e64730000000000000000000000604482015260640161056b565b50016020015190565b60008347101561352d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161056b565b8151600003613598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161056b565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116611b44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161056b565b8151156136305781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056b9190613c19565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461127357600080fd5b6000602082840312156136a457600080fd5b8135611b4481613664565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613725576137256136af565b604052919050565b600067ffffffffffffffff821115613747576137476136af565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261378457600080fd5b81356137976137928261372d565b6136de565b8181528460208386010111156137ac57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156137dc57600080fd5b82359150602083013567ffffffffffffffff8111156137fa57600080fd5b61380685828601613773565b9150509250929050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461383457600080fd5b919050565b60008083601f84011261384b57600080fd5b50813567ffffffffffffffff81111561386357600080fd5b602083019150836020828501011115611cab57600080fd5b6000806000806060858703121561389157600080fd5b61389a85613810565b93506138a860208601613810565b9250604085013567ffffffffffffffff8111156138c457600080fd5b6138d087828801613839565b95989497509550505050565b600067ffffffffffffffff8211156138f6576138f66136af565b5060051b60200190565b600082601f83011261391157600080fd5b81356020613921613792836138dc565b82815260059290921b8401810191818101908684111561394057600080fd5b8286015b8481101561395b5780358352918301918301613944565b509695505050505050565b600082601f83011261397757600080fd5b81356020613987613792836138dc565b82815260059290921b840181019181810190868411156139a657600080fd5b8286015b8481101561395b57803567ffffffffffffffff8111156139ca5760008081fd5b6139d88986838b0101613773565b8452509183019183016139aa565b600080600080608085870312156139fc57600080fd5b843567ffffffffffffffff80821115613a1457600080fd5b613a2088838901613900565b9550602091508187013581811115613a3757600080fd5b8701601f81018913613a4857600080fd5b8035613a56613792826138dc565b81815260059190911b8201840190848101908b831115613a7557600080fd5b928501925b82841015613a9a57613a8b84613810565b82529285019290850190613a7a565b97505050506040870135915080821115613ab357600080fd5b613abf88838901613900565b93506060870135915080821115613ad557600080fd5b50613ae287828801613966565b91505092959194509250565b60005b83811015613b09578181015183820152602001613af1565b50506000910152565b60008151808452613b2a816020860160208601613aee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613ba4578284038952613b92848351613b12565b98850198935090840190600101613b7a565b5091979650505050505050565b602081526000611b446020830184613b5c565b60008060008060808587031215613bda57600080fd5b84359350613bea60208601613810565b925060408501359150606085013567ffffffffffffffff811115613c0d57600080fd5b613ae287828801613773565b602081526000611b446020830184613b12565b600080600060608486031215613c4157600080fd5b833567ffffffffffffffff80821115613c5957600080fd5b613c6587838801613900565b94506020860135915080821115613c7b57600080fd5b50613c8886828701613966565b925050613c9760408501613810565b90509250925092565b600060208284031215613cb257600080fd5b5035919050565b60008060208385031215613ccc57600080fd5b823567ffffffffffffffff80821115613ce457600080fd5b818501915085601f830112613cf857600080fd5b813581811115613d0757600080fd5b8660208260051b8501011115613d1c57600080fd5b60209290920196919550909350505050565b600080600060408486031215613d4357600080fd5b83359250602084013567ffffffffffffffff811115613d6157600080fd5b613d6d86828701613839565b9497909650939450505050565b60008060408385031215613d8d57600080fd5b823567ffffffffffffffff80821115613da557600080fd5b613db186838701613900565b93506020850135915080821115613dc757600080fd5b5061380685828601613966565b600060208284031215613de657600080fd5b813567ffffffffffffffff811115613dfd57600080fd5b610ccc84828501613900565b600060208284031215613e1b57600080fd5b611b4482613810565b8385823760609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014810191909152603401919050565b60008251613e79818460208701613aee565b9190910192915050565b828152604060208201526000610ccc6040830184613b12565b600060208284031215613eae57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b606080825284519082018190526000906020906080840190828801845b82811015613f1d57815184529284019290840190600101613f01565b50505083810382850152613f318187613b5c565b9250505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152826040820152608060608201526000612e9f6080830184613b12565b600060208284031215613fa657600080fd5b815167ffffffffffffffff811115613fbd57600080fd5b8201601f81018413613fce57600080fd5b8051613fdc6137928261372d565b818152856020838501011115613ff157600080fd5b61204c826020830160208601613aee565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261406657600080fd5b83018035915067ffffffffffffffff82111561408157600080fd5b602001915036819003821315611cab57600080fd5b8183823760009101908152919050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156140ee5780818460140360031b1b83161693505b505050919050565b6040815260006141096040830185613b12565b828103602084015261204c8185613b12565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60408152600061417860408301858761411b565b8281036020840152612e9f8185613b12565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561063d5761063d61418a565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000612e9f60608301848661411b565b60006020828403121561421457600080fd5b8151611b4481613664565b8215158152604060208201526000610ccc6040830184613b12565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008560601b16815283601482015281836034830137600091016034019081529392505050565b600181811c9082168061429457607f821691505b6020821081036116a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610ebc57600081815260208120601f850160051c810160208610156142f45750805b601f850160051c820191505b8181101561431357828155600101614300565b505050505050565b815167ffffffffffffffff811115614335576143356136af565b614349816143438454614280565b846142cd565b602080601f83116001811461439c57600084156143665750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614313565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143e9578886015182559484019460019091019084016143ca565b508582101561442557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b83815260406020820152600061204c60408301848661411b565b60008451614461818460208901613aee565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b805160208083015191908110156116a9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156140ee5760049290920360031b82901b161692915050565b8181038181111561063d5761063d61418a56fea2646970667358221220709024acd2bc0a3533c747974ab8f11d519f7708b55eb0107adc4574f225e7d964736f6c63430008110033 +``` + +## Universal Profile Post Deployment Module Source Code + +This is an exact copy of the code of the [`UniversalProfilePostDeploymentModule` smart contract]. + +- The source code is generated with `solc` compiler version `0.8.17` and with `9999999` optimization runs. +- The imported contracts are part of the `4.9.2` version of the `@openzeppelin/contracts` package. +- Navigate to [lsp-smart-contract](https://github.com/lukso-network/lsp-smart-contracts) repo and checkout to `b8eca3c5696acf85239130ef67edec9e8c134bfa` commit to obtain the exact copy of the code, change the compiler settings in `hardhat.config.ts` and compile to produce the same bytecode. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +import { OPERATION_4_DELEGATECALL } from "@erc725/smart-contracts/contracts/constants.sol"; + +import { UniversalProfile } from "../../UniversalProfile.sol"; + +contract UniversalProfilePostDeploymentModule is UniversalProfile { + constructor() UniversalProfile(address(0)) {} + + function setDataAndTransferOwnership( + bytes32[] memory dataKeys, + bytes[] memory dataValues, + address newOwner + ) public payable { + // check that the msg.sender is the owner + require( + msg.sender == owner(), + "UniversalProfilePostDeploymentModule: setDataAndTransferOwnership only allowed through delegate call" + ); + + // update the dataKeys and dataValues in the UniversalProfile contract + for (uint256 i = 0; i < dataKeys.length; ) { + _setData(dataKeys[i], dataValues[i]); + + unchecked { + ++i; + } + } + + // transfer the ownership of the UniversalProfile contract to the newOwner + _setOwner(newOwner); + } + + function executePostDeployment( + address universalProfile, + address keyManager, + bytes calldata setDataBatchBytes + ) public { + // retrieve the dataKeys and dataValues to setData from the initializationCalldata bytes + (bytes32[] memory dataKeys, bytes[] memory dataValues) = abi.decode( + setDataBatchBytes, + (bytes32[], bytes[]) + ); + + // call the execute function with delegate_call on the universalProfile contract to setData and transferOwnership + UniversalProfile(payable(universalProfile)).execute( + OPERATION_4_DELEGATECALL, + address(this), + 0, + abi.encodeWithSignature( + "setDataAndTransferOwnership(bytes32[],bytes[],address)", + dataKeys, + dataValues, + keyManager + ) + ); + } +} +``` diff --git a/packages/lsp23-contracts/hardhat.config.ts b/packages/lsp23-contracts/hardhat.config.ts new file mode 100644 index 000000000..b951b71a4 --- /dev/null +++ b/packages/lsp23-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: ['LSP23LinkedContractsFactory', 'IPostDeploymentModule'], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp23-contracts/package.json b/packages/lsp23-contracts/package.json new file mode 100644 index 000000000..5bf672cd4 --- /dev/null +++ b/packages/lsp23-contracts/package.json @@ -0,0 +1,52 @@ +{ + "name": "@lukso/lsp23-contracts", + "version": "0.12.1", + "description": "Package for the LSP23 Linked Contracts Factory standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@lukso/universalprofile-contracts": "*" + } +} diff --git a/packages/lsp23-contracts/tsconfig.json b/packages/lsp23-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp23-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp25-contracts/.eslintrc.js b/packages/lsp25-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp25-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp25-contracts/.solhint.json b/packages/lsp25-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp25-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp25-contracts/README.md b/packages/lsp25-contracts/README.md new file mode 100644 index 000000000..7f7a5070a --- /dev/null +++ b/packages/lsp25-contracts/README.md @@ -0,0 +1,3 @@ +# LSP25 Execute Relay Call · [![npm version](https://img.shields.io/npm/v/@lukso/lsp25-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp25-contracts) + +Package for the LSP25 Execute Relay Call standard. diff --git a/packages/lsp25-contracts/build.config.ts b/packages/lsp25-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp25-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp25-contracts/constants.ts b/packages/lsp25-contracts/constants.ts new file mode 100644 index 000000000..3669d2c82 --- /dev/null +++ b/packages/lsp25-contracts/constants.ts @@ -0,0 +1,7 @@ +export const INTERFACE_ID_LSP25 = '0x5ac79908'; + +/** + * @dev LSP25 version number for signing `executeRelayCall(...)` transaction using EIP191 + * @see for details see: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-25-ExecuteRelayCall.md#executerelaycall + */ +export const LSP25_VERSION = 25; diff --git a/contracts/LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol b/packages/lsp25-contracts/contracts/ILSP25ExecuteRelayCall.sol similarity index 100% rename from contracts/LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol rename to packages/lsp25-contracts/contracts/ILSP25ExecuteRelayCall.sol diff --git a/contracts/LSP25ExecuteRelayCall/LSP25Constants.sol b/packages/lsp25-contracts/contracts/LSP25Constants.sol similarity index 100% rename from contracts/LSP25ExecuteRelayCall/LSP25Constants.sol rename to packages/lsp25-contracts/contracts/LSP25Constants.sol diff --git a/contracts/LSP25ExecuteRelayCall/LSP25Errors.sol b/packages/lsp25-contracts/contracts/LSP25Errors.sol similarity index 100% rename from contracts/LSP25ExecuteRelayCall/LSP25Errors.sol rename to packages/lsp25-contracts/contracts/LSP25Errors.sol diff --git a/contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol b/packages/lsp25-contracts/contracts/LSP25MultiChannelNonce.sol similarity index 100% rename from contracts/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol rename to packages/lsp25-contracts/contracts/LSP25MultiChannelNonce.sol diff --git a/contracts/Mocks/LSP25MultiChannelNonceTester.sol b/packages/lsp25-contracts/contracts/Mocks/LSP25MultiChannelNonceTester.sol similarity index 92% rename from contracts/Mocks/LSP25MultiChannelNonceTester.sol rename to packages/lsp25-contracts/contracts/Mocks/LSP25MultiChannelNonceTester.sol index c825ea946..a87def96b 100644 --- a/contracts/Mocks/LSP25MultiChannelNonceTester.sol +++ b/packages/lsp25-contracts/contracts/Mocks/LSP25MultiChannelNonceTester.sol @@ -1,9 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.4; -import { - LSP25MultiChannelNonce -} from "../LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol"; +import {LSP25MultiChannelNonce} from "../LSP25MultiChannelNonce.sol"; /** * @dev This contract is used only for testing the internal functions. diff --git a/packages/lsp25-contracts/hardhat.config.ts b/packages/lsp25-contracts/hardhat.config.ts new file mode 100644 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp25-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp25-contracts/index.ts b/packages/lsp25-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp25-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp25-contracts/package.json b/packages/lsp25-contracts/package.json new file mode 100644 index 000000000..bb4e3be3f --- /dev/null +++ b/packages/lsp25-contracts/package.json @@ -0,0 +1,49 @@ +{ + "name": "@lukso/lsp25-contracts", + "version": "0.12.1", + "description": "Package for the LSP25 Execute Relay Call standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'", + "test": "hardhat test --no-compile tests/*.test.ts", + "test:coverage": "hardhat coverage" + }, + "dependencies": { + "@openzeppelin/contracts": "^4.9.3" + } +} diff --git a/tests/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.test.ts b/packages/lsp25-contracts/tests/LSP25MultiChannelNonce.test.ts similarity index 75% rename from tests/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.test.ts rename to packages/lsp25-contracts/tests/LSP25MultiChannelNonce.test.ts index 1d3b9c6cd..01dfc5121 100644 --- a/tests/LSP25ExecuteRelayCall/LSP25MultiChannelNonce.test.ts +++ b/packages/lsp25-contracts/tests/LSP25MultiChannelNonce.test.ts @@ -1,10 +1,28 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { LSP25_VERSION } from '../../constants'; -import { LOCAL_PRIVATE_KEYS } from '../utils/helpers'; +import { LSP25_VERSION } from '../constants'; import { EIP191Signer } from '@lukso/eip191-signer.js'; -import { LSP25MultiChannelNonceTester, LSP25MultiChannelNonceTester__factory } from '../../types'; +import { LSP25MultiChannelNonceTester, LSP25MultiChannelNonceTester__factory } from '../types'; + +/** + * Private keys for the accounts used in the tests. + * These are the private keys for the accounts generated by the hardhat node (local blockchain). + * The private keys are used to sign messages with lsp6-signers.js library. + * + * WARNING! These private keys and their related accounts are publicly known and should never be used in production. + * Any funds sent to them on Mainnet or any other live network WILL BE LOST. + */ +const LOCAL_PRIVATE_KEYS = { + ACCOUNT0: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', + ACCOUNT1: '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d', + ACCOUNT2: '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a', + ACCOUNT3: '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6', + ACCOUNT4: '0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a', + ACCOUNT5: '0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba', + ACCOUNT6: '0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e', + ACCOUNT7: '0x030ab56c9834360e1c0dba6b9a955b6e127f3166cda462c2472f67e1ba773053', +}; describe('LSP25MultiChannelNonce', () => { let contract: LSP25MultiChannelNonceTester; @@ -49,7 +67,7 @@ describe('LSP25MultiChannelNonce', () => { payload: '0xcafecafe', }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ LSP25_VERSION, @@ -62,7 +80,7 @@ describe('LSP25MultiChannelNonce', () => { ); const { signature } = await eip191Signer.signDataWithIntendedValidator( - contract.address, + contract.target as string, encodedMessage, signerPrivateKey, ); @@ -87,7 +105,7 @@ describe('LSP25MultiChannelNonce', () => { payload: '0xcafecafe', }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ 12345, // incorrect version number @@ -100,7 +118,7 @@ describe('LSP25MultiChannelNonce', () => { ); const { signature } = await eip191Signer.signDataWithIntendedValidator( - contract.address, + contract.target as string, encodedMessage, signerPrivateKey, ); @@ -123,7 +141,7 @@ describe('LSP25MultiChannelNonce', () => { payload: '0xcafecafe', }; - const encodedMessage = ethers.utils.solidityPack( + const encodedMessage = ethers.solidityPacked( ['uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], [ 12345, // incorrect version number @@ -136,7 +154,7 @@ describe('LSP25MultiChannelNonce', () => { ); const { signature } = await eip191Signer.signDataWithIntendedValidator( - contract.address, + contract.target as string, encodedMessage, signerPrivateKey, ); diff --git a/packages/lsp25-contracts/tsconfig.json b/packages/lsp25-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp25-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp3-contracts/.eslintrc.cjs b/packages/lsp3-contracts/.eslintrc.cjs new file mode 100644 index 000000000..c8df60750 --- /dev/null +++ b/packages/lsp3-contracts/.eslintrc.cjs @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ["custom"], +}; diff --git a/packages/lsp3-contracts/.solhint.json b/packages/lsp3-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp3-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp3-contracts/README.md b/packages/lsp3-contracts/README.md new file mode 100644 index 000000000..67206545b --- /dev/null +++ b/packages/lsp3-contracts/README.md @@ -0,0 +1,3 @@ +# LSP3 Profile Metadata · [![npm version](https://img.shields.io/npm/v/@lukso/lsp3-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp3-contracts) + +Package for the LSP3 Profile Metadata standard. diff --git a/packages/lsp3-contracts/build.config.ts b/packages/lsp3-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp3-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp3-contracts/constants.ts b/packages/lsp3-contracts/constants.ts new file mode 100644 index 000000000..147cbbe03 --- /dev/null +++ b/packages/lsp3-contracts/constants.ts @@ -0,0 +1,44 @@ +import { Verification } from '@lukso/lsp2-contracts'; + +export type LSP3ProfileMetadataJSON = { + LSP3Profile: LSP3ProfileMetadata; +}; + +export type LSP3ProfileMetadata = { + name: string; + description: string; + profileImage?: ImageMetadata[]; + backgroundImage?: ImageMetadata[]; + tags?: string[]; + links?: LinkMetadata[]; + avatar?: AssetMetadata[]; +}; + +export type ImageMetadata = { + width: number; + height: number; + verification?: Verification; + url: string; +}; + +export type LinkMetadata = { + title: string; + url: string; +}; + +export type AssetMetadata = { + verification?: Verification; + url: string; + fileType: string; +}; + +export const LSP3SupportedStandard = { + key: '0xeafec4d89fa9619884b600005ef83ad9559033e6e941db7d7c495acdce616347', + value: '0x5ef83ad9', +}; + +export const LSP3DataKeys = { + SupportedStandards_LSP3: LSP3SupportedStandard.key, + // keccak256('LSP3Profile') + LSP3Profile: '0x5ef83ad9559033e6e941db7d7c495acdce616347d28e90c7ce47cbfcfcad3bc5', +}; diff --git a/contracts/LSP3ProfileMetadata/LSP3Constants.sol b/packages/lsp3-contracts/contracts/LSP3Constants.sol similarity index 100% rename from contracts/LSP3ProfileMetadata/LSP3Constants.sol rename to packages/lsp3-contracts/contracts/LSP3Constants.sol diff --git a/packages/lsp3-contracts/hardhat.config.ts b/packages/lsp3-contracts/hardhat.config.ts new file mode 100644 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp3-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp3-contracts/index.ts b/packages/lsp3-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp3-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp3-contracts/package.json b/packages/lsp3-contracts/package.json new file mode 100644 index 000000000..b27167061 --- /dev/null +++ b/packages/lsp3-contracts/package.json @@ -0,0 +1,46 @@ +{ + "name": "@lukso/lsp3-contracts", + "version": "0.12.1", + "description": "Package for the LSP3 Profile Metadata standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@lukso/lsp2-contracts": "*" + } +} diff --git a/packages/lsp3-contracts/tsconfig.json b/packages/lsp3-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp3-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp4-contracts/.eslintrc.js b/packages/lsp4-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp4-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp4-contracts/.gitmodules b/packages/lsp4-contracts/.gitmodules new file mode 100644 index 000000000..3dce69ce0 --- /dev/null +++ b/packages/lsp4-contracts/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = ../../lib/forge-std + url = https://github.com/foundry-rs/forge-std.git diff --git a/packages/lsp4-contracts/.solhint.json b/packages/lsp4-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp4-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp4-contracts/README.md b/packages/lsp4-contracts/README.md new file mode 100644 index 000000000..1ad07fe4e --- /dev/null +++ b/packages/lsp4-contracts/README.md @@ -0,0 +1,3 @@ +# LSP4 Digital Asset Metadata · [![npm version](https://img.shields.io/npm/v/@lukso/lsp4-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp4-contracts) + +Package for the LSP4 Digital Asset Metadata standard. diff --git a/packages/lsp4-contracts/build.config.ts b/packages/lsp4-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp4-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp4-contracts/constants.ts b/packages/lsp4-contracts/constants.ts new file mode 100644 index 000000000..cd19eabce --- /dev/null +++ b/packages/lsp4-contracts/constants.ts @@ -0,0 +1,78 @@ +import { Verification, LSP2ArrayKey } from '@lukso/lsp2-contracts'; + +export type LSP4DigitalAssetMetadataJSON = { + LSP4Metadata: LSP4DigitalAssetMetadata; +}; + +export type LSP4DigitalAssetMetadata = { + description: string; + links: LinkMetadata[]; + images: ImageMetadata[][]; + assets: AssetMetadata[]; + icon: ImageMetadata[]; + attributes: AttributeMetadata[]; +}; + +export type LinkMetadata = { + title: string; + url: string; +}; + +export type ImageMetadata = { + width: number; + height: number; + verification?: Verification; + url: string; +}; + +export type AssetMetadata = { + verification?: Verification; + url: string; + fileType: string; +}; + +export type AttributeMetadata = { + key: string; + value: string; + type: string | number | boolean; +}; + +export const LSP4SupportedStandard = { + key: '0xeafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c', + value: '0xa4d96624', +}; + +export const LSP4DataKeys = { + SupportedStandards_LSP4: LSP4SupportedStandard.key, + + // keccak256('LSP4TokenName') + LSP4TokenName: '0xdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af1', + + // keccak256('LSP4TokenSymbol') + LSP4TokenSymbol: '0x2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db932756', + + // keccak256('LSP4TokenType) + LSP4TokenType: '0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3', + + // keccak256('LSP4Metadata') + LSP4Metadata: '0x9afb95cacc9f95858ec44aa8c3b685511002e30ae54415823f406128b85b238e', + + // LSP4CreatorsMap:
+ bytes2(0) + LSP4CreatorsMap: '0x6de85eaf5d982b4e5da00000', + + // keccak256('"LSP4Creators[]') + 'LSP4Creators[]': { + length: '0x114bd03b3a46d48759680d81ebb2b414fda7d030a7105a851867accf1c2352e7', + index: '0x114bd03b3a46d48759680d81ebb2b414', + } as LSP2ArrayKey, +}; + +/** + * @dev List of LSP4 Token types to describe the type of token a digital asset contract represents. + * @see for details see: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-4-DigitalAsset-Metadata.md#lsp4tokentype + */ +export const LSP4_TOKEN_TYPES = { + TOKEN: 0, + NFT: 1, + COLLECTION: 2, +}; diff --git a/contracts/LSP4DigitalAssetMetadata/LSP4Constants.sol b/packages/lsp4-contracts/contracts/LSP4Constants.sol similarity index 100% rename from contracts/LSP4DigitalAssetMetadata/LSP4Constants.sol rename to packages/lsp4-contracts/contracts/LSP4Constants.sol diff --git a/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol b/packages/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol similarity index 100% rename from contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol rename to packages/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol diff --git a/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol b/packages/lsp4-contracts/contracts/LSP4DigitalAssetMetadataCore.sol similarity index 100% rename from contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol rename to packages/lsp4-contracts/contracts/LSP4DigitalAssetMetadataCore.sol diff --git a/contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol b/packages/lsp4-contracts/contracts/LSP4DigitalAssetMetadataInitAbstract.sol similarity index 100% rename from contracts/LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol rename to packages/lsp4-contracts/contracts/LSP4DigitalAssetMetadataInitAbstract.sol diff --git a/contracts/LSP4DigitalAssetMetadata/LSP4Errors.sol b/packages/lsp4-contracts/contracts/LSP4Errors.sol similarity index 100% rename from contracts/LSP4DigitalAssetMetadata/LSP4Errors.sol rename to packages/lsp4-contracts/contracts/LSP4Errors.sol diff --git a/packages/lsp4-contracts/hardhat.config.ts b/packages/lsp4-contracts/hardhat.config.ts new file mode 100644 index 000000000..e2feed09a --- /dev/null +++ b/packages/lsp4-contracts/hardhat.config.ts @@ -0,0 +1,131 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [ + 'LSP4DigitalAssetMetadata', // Standard version + 'LSP4DigitalAssetMetadataInitAbstract', // Proxy version + ], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp4-contracts/index.ts b/packages/lsp4-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp4-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp4-contracts/package.json b/packages/lsp4-contracts/package.json new file mode 100644 index 000000000..66852afe3 --- /dev/null +++ b/packages/lsp4-contracts/package.json @@ -0,0 +1,52 @@ +{ + "name": "@lukso/lsp4-contracts", + "version": "0.12.1", + "description": "Package for the LSP4 Digital Asset Metadata standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp2-contracts": "*" + } +} diff --git a/packages/lsp4-contracts/tsconfig.json b/packages/lsp4-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp4-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp5-contracts/.eslintrc.js b/packages/lsp5-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp5-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp5-contracts/.solhint.json b/packages/lsp5-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp5-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp5-contracts/README.md b/packages/lsp5-contracts/README.md new file mode 100644 index 000000000..377aee038 --- /dev/null +++ b/packages/lsp5-contracts/README.md @@ -0,0 +1,3 @@ +# LSP5 Received Assets · [![npm version](https://img.shields.io/npm/v/@lukso/lsp5-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp5-contracts) + +Package for the LSP5 Received Assets standard. diff --git a/packages/lsp5-contracts/build.config.ts b/packages/lsp5-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp5-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp5-contracts/constants.ts b/packages/lsp5-contracts/constants.ts new file mode 100644 index 000000000..79b72d960 --- /dev/null +++ b/packages/lsp5-contracts/constants.ts @@ -0,0 +1,12 @@ +import { LSP2ArrayKey } from '@lukso/lsp2-contracts'; + +export const LSP5DataKeys = { + // LSP5ReceivedAssetsMap:
+ bytes2(0) + LSP5ReceivedAssetsMap: '0x812c4334633eb816c80d0000', + + // keccak256('LSP5ReceivedAssets[]') + 'LSP5ReceivedAssets[]': { + length: '0x6460ee3c0aac563ccbf76d6e1d07bada78e3a9514e6382b736ed3f478ab7b90b', + index: '0x6460ee3c0aac563ccbf76d6e1d07bada', + } as LSP2ArrayKey, +}; diff --git a/contracts/LSP5ReceivedAssets/LSP5Constants.sol b/packages/lsp5-contracts/contracts/LSP5Constants.sol similarity index 100% rename from contracts/LSP5ReceivedAssets/LSP5Constants.sol rename to packages/lsp5-contracts/contracts/LSP5Constants.sol diff --git a/contracts/LSP5ReceivedAssets/LSP5Utils.sol b/packages/lsp5-contracts/contracts/LSP5Utils.sol similarity index 98% rename from contracts/LSP5ReceivedAssets/LSP5Utils.sol rename to packages/lsp5-contracts/contracts/LSP5Utils.sol index 83ea23d46..8db1efc3d 100644 --- a/contracts/LSP5ReceivedAssets/LSP5Utils.sol +++ b/packages/lsp5-contracts/contracts/LSP5Utils.sol @@ -7,13 +7,13 @@ import { } from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; // libraries -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // constants import { _LSP5_RECEIVED_ASSETS_MAP_KEY_PREFIX, _LSP5_RECEIVED_ASSETS_ARRAY_KEY -} from "../LSP5ReceivedAssets/LSP5Constants.sol"; +} from "./LSP5Constants.sol"; /** * @title LSP5 Utility library. diff --git a/packages/lsp5-contracts/hardhat.config.ts b/packages/lsp5-contracts/hardhat.config.ts new file mode 100644 index 000000000..1f9e172b9 --- /dev/null +++ b/packages/lsp5-contracts/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp5-contracts/index.ts b/packages/lsp5-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp5-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp5-contracts/package.json b/packages/lsp5-contracts/package.json new file mode 100644 index 000000000..0be4de2b0 --- /dev/null +++ b/packages/lsp5-contracts/package.json @@ -0,0 +1,48 @@ +{ + "name": "@lukso/lsp5-contracts", + "version": "0.12.1", + "description": "Package for the LSP5 Received Assets standard", + "license": "Apache-2.0", + "author": "", + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@lukso/lsp2-contracts": "*" + } +} diff --git a/packages/lsp5-contracts/tsconfig.json b/packages/lsp5-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp5-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp6-contracts/.eslintrc.js b/packages/lsp6-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp6-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp6-contracts/.prettierignore b/packages/lsp6-contracts/.prettierignore new file mode 100644 index 000000000..3662b345e --- /dev/null +++ b/packages/lsp6-contracts/.prettierignore @@ -0,0 +1 @@ +/contracts/LSP6Constants.sol diff --git a/packages/lsp6-contracts/.solhint.json b/packages/lsp6-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp6-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp6-contracts/README.md b/packages/lsp6-contracts/README.md new file mode 100644 index 000000000..f0b0afca7 --- /dev/null +++ b/packages/lsp6-contracts/README.md @@ -0,0 +1,3 @@ +# LSP6 Key Manager · [![npm version](https://img.shields.io/npm/v/@lukso/lsp6-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp6-contracts) + +Package for the LSP6 Key Manager standard, to enable granting multiple permissions to controllers. diff --git a/packages/lsp6-contracts/build.config.ts b/packages/lsp6-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp6-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp6-contracts/constants.ts b/packages/lsp6-contracts/constants.ts new file mode 100644 index 000000000..1f6e72493 --- /dev/null +++ b/packages/lsp6-contracts/constants.ts @@ -0,0 +1,78 @@ +import { LSP2ArrayKey } from '@lukso/lsp2-contracts'; + +export const INTERFACE_ID_LSP6KEYMANAGER = '0x23f34c62'; + +/** + * @dev values returned by the `isValidSignature` function of the ERC1271 standard. + * Can be used to check if a signature is valid or not. + */ +export const ERC1271_VALUES = { + SUCCESS_VALUE: '0x1626ba7e', + FAIL_VALUE: '0xffffffff', +}; + +export const LSP6DataKeys = { + // keccak256('AddressPermissions[]') + 'AddressPermissions[]': { + length: '0xdf30dba06db6a30e65354d9a64c609861f089545ca58c6b4dbe31a5f338cb0e3', + index: '0xdf30dba06db6a30e65354d9a64c60986', + } as LSP2ArrayKey, + + AddressPermissionsPrefix: '0x4b80742de2bf', + + // AddressPermissions:Permissions:
+ bytes2(0) + 'AddressPermissions:Permissions': '0x4b80742de2bf82acb3630000', + + // AddressPermissions:AllowedERC725YDataKeys:
+ bytes2(0) + 'AddressPermissions:AllowedERC725YDataKeys': '0x4b80742de2bf866c29110000', + + // AddressPermissions:AllowedCalls:
+ bytes2(0) + 'AddressPermissions:AllowedCalls': '0x4b80742de2bf393a64c70000', +}; + +/** + * @dev The types of calls for an AllowedCall + */ +export const CALLTYPE = { + VALUE: '0x00000001', + CALL: '0x00000002', + STATICCALL: '0x00000004', + DELEGATECALL: '0x00000008', +}; + +/** + * @dev `bytes32` hex value for all the LSP6 permissions excluding REENTRANCY, DELEGATECALL and SUPER_DELEGATECALL for security (these should be set manually) + */ +export const ALL_PERMISSIONS = '0x00000000000000000000000000000000000000000000000000000000007f3f7f'; + +/** + * @dev List of `bytes32` permissions from LSP6 Key Manager Standard + */ +// prettier-ignore +export const PERMISSIONS = { + CHANGEOWNER: '0x0000000000000000000000000000000000000000000000000000000000000001', // .... .... .... .... .... 0001 + ADDCONTROLLER: '0x0000000000000000000000000000000000000000000000000000000000000002', // .... .... .... .... .... 0010 + EDITPERMISSIONS: '0x0000000000000000000000000000000000000000000000000000000000000004', // .... .... .... .... .... 0100 + ADDEXTENSIONS: '0x0000000000000000000000000000000000000000000000000000000000000008', // .... .... .... .... .... 1000 + CHANGEEXTENSIONS: '0x0000000000000000000000000000000000000000000000000000000000000010', // .... .... .... .... 0001 0000 + ADDUNIVERSALRECEIVERDELEGATE: '0x0000000000000000000000000000000000000000000000000000000000000020', // .... .... .... .... 0010 0000 + CHANGEUNIVERSALRECEIVERDELEGATE: '0x0000000000000000000000000000000000000000000000000000000000000040', // .... .... .... .... 0100 0000 + REENTRANCY: '0x0000000000000000000000000000000000000000000000000000000000000080', // .... .... .... .... 1000 0000 + SUPER_TRANSFERVALUE: '0x0000000000000000000000000000000000000000000000000000000000000100', // .... .... .... 0001 0000 0000 + TRANSFERVALUE: '0x0000000000000000000000000000000000000000000000000000000000000200', // .... .... .... 0010 0000 0000 + SUPER_CALL: '0x0000000000000000000000000000000000000000000000000000000000000400', // .... .... .... 0100 0000 0000 + CALL: '0x0000000000000000000000000000000000000000000000000000000000000800', // .... .... .... 1000 0000 0000 + SUPER_STATICCALL: '0x0000000000000000000000000000000000000000000000000000000000001000', // .... .... 0001 0000 0000 0000 + STATICCALL: '0x0000000000000000000000000000000000000000000000000000000000002000', // .... .... 0010 0000 0000 0000 + SUPER_DELEGATECALL: '0x0000000000000000000000000000000000000000000000000000000000004000', // .... .... 0100 0000 0000 0000 + DELEGATECALL: '0x0000000000000000000000000000000000000000000000000000000000008000', // .... .... 1000 0000 0000 0000 + DEPLOY: '0x0000000000000000000000000000000000000000000000000000000000010000', // .... 0001 0000 0000 0000 0000 + SUPER_SETDATA: '0x0000000000000000000000000000000000000000000000000000000000020000', // .... 0010 0000 0000 0000 0000 + SETDATA: '0x0000000000000000000000000000000000000000000000000000000000040000', // .... 0100 0000 0000 0000 0000 + ENCRYPT: '0x0000000000000000000000000000000000000000000000000000000000080000', // .... 1000 0000 0000 0000 0000 + DECRYPT: '0x0000000000000000000000000000000000000000000000000000000000100000', // 0001 0000 0000 0000 0000 0000 + SIGN: '0x0000000000000000000000000000000000000000000000000000000000200000', // 0010 0000 0000 0000 0000 0000 + EXECUTE_RELAY_CALL: '0x0000000000000000000000000000000000000000000000000000000000400000', // 0100 0000 0000 0000 0000 0000 + } + +export type LSP6PermissionName = keyof typeof PERMISSIONS; diff --git a/contracts/LSP6KeyManager/ILSP6KeyManager.sol b/packages/lsp6-contracts/contracts/ILSP6KeyManager.sol similarity index 100% rename from contracts/LSP6KeyManager/ILSP6KeyManager.sol rename to packages/lsp6-contracts/contracts/ILSP6KeyManager.sol diff --git a/packages/lsp6-contracts/contracts/LSP6Constants.sol b/packages/lsp6-contracts/contracts/LSP6Constants.sol new file mode 100644 index 000000000..e40ab4e6a --- /dev/null +++ b/packages/lsp6-contracts/contracts/LSP6Constants.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +// --- ERC165 interface ids +bytes4 constant _INTERFACEID_LSP6 = 0x23f34c62; + +// --- ERC725Y Data Keys + +// PERMISSIONS KEYS + +// keccak256('AddressPermissions[]') +bytes32 constant _LSP6KEY_ADDRESSPERMISSIONS_ARRAY = 0xdf30dba06db6a30e65354d9a64c609861f089545ca58c6b4dbe31a5f338cb0e3; + +// AddressPermissions[index] +bytes16 constant _LSP6KEY_ADDRESSPERMISSIONS_ARRAY_PREFIX = 0xdf30dba06db6a30e65354d9a64c60986; + +// AddressPermissions:... +bytes6 constant _LSP6KEY_ADDRESSPERMISSIONS_PREFIX = 0x4b80742de2bf; + +// bytes6(keccak256('AddressPermissions')) + bytes4(keccak256('Permissions')) +bytes10 constant _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX = 0x4b80742de2bf82acb363; // AddressPermissions:Permissions:
--> bytes32 + +// bytes6(keccak256('AddressPermissions')) + bytes4(keccak256('AllowedERC725YDataKeys')) +bytes10 constant _LSP6KEY_ADDRESSPERMISSIONS_AllowedERC725YDataKeys_PREFIX = 0x4b80742de2bf866c2911; // AddressPermissions:AllowedERC725YDataKeys:
--> bytes[CompactBytesArray] + +// bytes6(keccak256('AddressPermissions')) + bytes4(keccak256('AllowedCalls')) +bytes10 constant _LSP6KEY_ADDRESSPERMISSIONS_ALLOWEDCALLS_PREFIX = 0x4b80742de2bf393a64c7; // AddressPermissions:AllowedCalls:
+ +// DEFAULT PERMISSIONS VALUES +// NB: the SUPER PERMISSIONS allow to not check for: +// - AddressPermissions:AllowedERC725YDataKeys:... +// - AddressPermissions:AllowedCalls +bytes32 constant _PERMISSION_CHANGEOWNER = 0x0000000000000000000000000000000000000000000000000000000000000001; +bytes32 constant _PERMISSION_ADDCONTROLLER = 0x0000000000000000000000000000000000000000000000000000000000000002; +bytes32 constant _PERMISSION_EDITPERMISSIONS = 0x0000000000000000000000000000000000000000000000000000000000000004; +bytes32 constant _PERMISSION_ADDEXTENSIONS = 0x0000000000000000000000000000000000000000000000000000000000000008; +bytes32 constant _PERMISSION_CHANGEEXTENSIONS = 0x0000000000000000000000000000000000000000000000000000000000000010; +bytes32 constant _PERMISSION_ADDUNIVERSALRECEIVERDELEGATE = 0x0000000000000000000000000000000000000000000000000000000000000020; +bytes32 constant _PERMISSION_CHANGEUNIVERSALRECEIVERDELEGATE = 0x0000000000000000000000000000000000000000000000000000000000000040; +bytes32 constant _PERMISSION_REENTRANCY = 0x0000000000000000000000000000000000000000000000000000000000000080; +bytes32 constant _PERMISSION_SUPER_TRANSFERVALUE = 0x0000000000000000000000000000000000000000000000000000000000000100; +bytes32 constant _PERMISSION_TRANSFERVALUE = 0x0000000000000000000000000000000000000000000000000000000000000200; +bytes32 constant _PERMISSION_SUPER_CALL = 0x0000000000000000000000000000000000000000000000000000000000000400; +bytes32 constant _PERMISSION_CALL = 0x0000000000000000000000000000000000000000000000000000000000000800; +bytes32 constant _PERMISSION_SUPER_STATICCALL = 0x0000000000000000000000000000000000000000000000000000000000001000; +bytes32 constant _PERMISSION_STATICCALL = 0x0000000000000000000000000000000000000000000000000000000000002000; +bytes32 constant _PERMISSION_SUPER_DELEGATECALL = 0x0000000000000000000000000000000000000000000000000000000000004000; +bytes32 constant _PERMISSION_DELEGATECALL = 0x0000000000000000000000000000000000000000000000000000000000008000; +bytes32 constant _PERMISSION_DEPLOY = 0x0000000000000000000000000000000000000000000000000000000000010000; +bytes32 constant _PERMISSION_SUPER_SETDATA = 0x0000000000000000000000000000000000000000000000000000000000020000; +bytes32 constant _PERMISSION_SETDATA = 0x0000000000000000000000000000000000000000000000000000000000040000; +bytes32 constant _PERMISSION_ENCRYPT = 0x0000000000000000000000000000000000000000000000000000000000080000; +bytes32 constant _PERMISSION_DECRYPT = 0x0000000000000000000000000000000000000000000000000000000000100000; +bytes32 constant _PERMISSION_SIGN = 0x0000000000000000000000000000000000000000000000000000000000200000; +bytes32 constant _PERMISSION_EXECUTE_RELAY_CALL = 0x0000000000000000000000000000000000000000000000000000000000400000; + +// All Permissions currently exclude REENTRANCY, DELEGATECALL and SUPER_DELEGATECALL for security +bytes32 constant ALL_REGULAR_PERMISSIONS = 0x00000000000000000000000000000000000000000000000000000000007f3f7f; + +// AllowedCalls types +bytes4 constant _ALLOWEDCALLS_TRANSFERVALUE = 0x00000001; // 0000 0001 +bytes4 constant _ALLOWEDCALLS_CALL = 0x00000002; // 0000 0010 +bytes4 constant _ALLOWEDCALLS_STATICCALL = 0x00000004; // 0000 0100 +bytes4 constant _ALLOWEDCALLS_DELEGATECALL = 0x00000008; // 0000 1000 diff --git a/contracts/LSP6KeyManager/LSP6Errors.sol b/packages/lsp6-contracts/contracts/LSP6Errors.sol similarity index 100% rename from contracts/LSP6KeyManager/LSP6Errors.sol rename to packages/lsp6-contracts/contracts/LSP6Errors.sol diff --git a/contracts/LSP6KeyManager/LSP6KeyManager.sol b/packages/lsp6-contracts/contracts/LSP6KeyManager.sol similarity index 96% rename from contracts/LSP6KeyManager/LSP6KeyManager.sol rename to packages/lsp6-contracts/contracts/LSP6KeyManager.sol index f30ce78de..d2dbe050d 100644 --- a/contracts/LSP6KeyManager/LSP6KeyManager.sol +++ b/packages/lsp6-contracts/contracts/LSP6KeyManager.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.5; // modules -import {Version} from "../Version.sol"; +import {Version} from "./Version.sol"; import {LSP6KeyManagerCore} from "./LSP6KeyManagerCore.sol"; import {InvalidLSP6Target} from "./LSP6Errors.sol"; diff --git a/contracts/LSP6KeyManager/LSP6KeyManagerCore.sol b/packages/lsp6-contracts/contracts/LSP6KeyManagerCore.sol similarity index 98% rename from contracts/LSP6KeyManager/LSP6KeyManagerCore.sol rename to packages/lsp6-contracts/contracts/LSP6KeyManagerCore.sol index b7ac0d30e..6021b476c 100644 --- a/contracts/LSP6KeyManager/LSP6KeyManagerCore.sol +++ b/packages/lsp6-contracts/contracts/LSP6KeyManagerCore.sol @@ -12,13 +12,15 @@ import { import {ILSP6KeyManager as ILSP6} from "./ILSP6KeyManager.sol"; import { ILSP20CallVerifier as ILSP20 -} from "../LSP20CallVerification/ILSP20CallVerifier.sol"; +} from "@lukso/lsp20-contracts/contracts/ILSP20CallVerifier.sol"; import { ILSP25ExecuteRelayCall as ILSP25 -} from "../LSP25ExecuteRelayCall/ILSP25ExecuteRelayCall.sol"; +} from "@lukso/lsp25-contracts/contracts/ILSP25ExecuteRelayCall.sol"; // modules -import {ILSP14Ownable2Step} from "../LSP14Ownable2Step/ILSP14Ownable2Step.sol"; +import { + ILSP14Ownable2Step +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; import {ERC725Y} from "@erc725/smart-contracts/contracts/ERC725Y.sol"; import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import {LSP6SetDataModule} from "./LSP6Modules/LSP6SetDataModule.sol"; @@ -29,7 +31,7 @@ import { import {LSP6OwnershipModule} from "./LSP6Modules/LSP6OwnershipModule.sol"; import { LSP25MultiChannelNonce -} from "../LSP25ExecuteRelayCall/LSP25MultiChannelNonce.sol"; +} from "@lukso/lsp25-contracts/contracts/LSP25MultiChannelNonce.sol"; // libraries import {BytesLib} from "solidity-bytes-utils/contracts/BytesLib.sol"; @@ -57,7 +59,7 @@ import { _INTERFACEID_ERC1271, _ERC1271_SUCCESSVALUE, _ERC1271_FAILVALUE -} from "../LSP0ERC725Account/LSP0Constants.sol"; +} from "./constants.sol"; import { _INTERFACEID_LSP6, _PERMISSION_SIGN, @@ -68,8 +70,10 @@ import { _LSP20_VERIFY_CALL_SUCCESS_VALUE_WITHOUT_POST_VERIFICATION, _LSP20_VERIFY_CALL_SUCCESS_VALUE_WITH_POST_VERIFICATION, _LSP20_VERIFY_CALL_RESULT_SUCCESS_VALUE -} from "../LSP20CallVerification/LSP20Constants.sol"; -import {_INTERFACEID_LSP25} from "../LSP25ExecuteRelayCall/LSP25Constants.sol"; +} from "@lukso/lsp20-contracts/contracts/LSP20Constants.sol"; +import { + _INTERFACEID_LSP25 +} from "@lukso/lsp25-contracts/contracts/LSP25Constants.sol"; /** * @title Core implementation of the LSP6 Key Manager standard. diff --git a/contracts/LSP6KeyManager/LSP6KeyManagerInit.sol b/packages/lsp6-contracts/contracts/LSP6KeyManagerInit.sol similarity index 97% rename from contracts/LSP6KeyManager/LSP6KeyManagerInit.sol rename to packages/lsp6-contracts/contracts/LSP6KeyManagerInit.sol index 92570729b..af9b8bf08 100644 --- a/contracts/LSP6KeyManager/LSP6KeyManagerInit.sol +++ b/packages/lsp6-contracts/contracts/LSP6KeyManagerInit.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.5; // modules -import {Version} from "../Version.sol"; +import {Version} from "./Version.sol"; import {LSP6KeyManagerInitAbstract} from "./LSP6KeyManagerInitAbstract.sol"; /** diff --git a/contracts/LSP6KeyManager/LSP6KeyManagerInitAbstract.sol b/packages/lsp6-contracts/contracts/LSP6KeyManagerInitAbstract.sol similarity index 100% rename from contracts/LSP6KeyManager/LSP6KeyManagerInitAbstract.sol rename to packages/lsp6-contracts/contracts/LSP6KeyManagerInitAbstract.sol diff --git a/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteModule.sol b/packages/lsp6-contracts/contracts/LSP6Modules/LSP6ExecuteModule.sol similarity index 100% rename from contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteModule.sol rename to packages/lsp6-contracts/contracts/LSP6Modules/LSP6ExecuteModule.sol diff --git a/contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteRelayCallModule.sol b/packages/lsp6-contracts/contracts/LSP6Modules/LSP6ExecuteRelayCallModule.sol similarity index 100% rename from contracts/LSP6KeyManager/LSP6Modules/LSP6ExecuteRelayCallModule.sol rename to packages/lsp6-contracts/contracts/LSP6Modules/LSP6ExecuteRelayCallModule.sol diff --git a/contracts/LSP6KeyManager/LSP6Modules/LSP6OwnershipModule.sol b/packages/lsp6-contracts/contracts/LSP6Modules/LSP6OwnershipModule.sol similarity index 100% rename from contracts/LSP6KeyManager/LSP6Modules/LSP6OwnershipModule.sol rename to packages/lsp6-contracts/contracts/LSP6Modules/LSP6OwnershipModule.sol diff --git a/contracts/LSP6KeyManager/LSP6Modules/LSP6SetDataModule.sol b/packages/lsp6-contracts/contracts/LSP6Modules/LSP6SetDataModule.sol similarity index 99% rename from contracts/LSP6KeyManager/LSP6Modules/LSP6SetDataModule.sol rename to packages/lsp6-contracts/contracts/LSP6Modules/LSP6SetDataModule.sol index 96c705f88..457f3d2e9 100644 --- a/contracts/LSP6KeyManager/LSP6Modules/LSP6SetDataModule.sol +++ b/packages/lsp6-contracts/contracts/LSP6Modules/LSP6SetDataModule.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.5; // interfaces import { ILSP20CallVerifier as ILSP20 -} from "../../LSP20CallVerification/ILSP20CallVerifier.sol"; +} from "@lukso/lsp20-contracts/contracts/ILSP20CallVerifier.sol"; // modules import {ERC725Y} from "@erc725/smart-contracts/contracts/ERC725Y.sol"; @@ -32,10 +32,10 @@ import { import { _LSP1_UNIVERSAL_RECEIVER_DELEGATE_PREFIX, _LSP1_UNIVERSAL_RECEIVER_DELEGATE_KEY -} from "../../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP17_EXTENSION_PREFIX -} from "../../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; // errors import { diff --git a/contracts/LSP6KeyManager/LSP6Utils.sol b/packages/lsp6-contracts/contracts/LSP6Utils.sol similarity index 99% rename from contracts/LSP6KeyManager/LSP6Utils.sol rename to packages/lsp6-contracts/contracts/LSP6Utils.sol index cb05d6f0a..5ed427a9c 100644 --- a/contracts/LSP6KeyManager/LSP6Utils.sol +++ b/packages/lsp6-contracts/contracts/LSP6Utils.sol @@ -8,7 +8,7 @@ import { import {ILSP6KeyManager} from "./ILSP6KeyManager.sol"; // libraries -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // constants import { diff --git a/packages/lsp6-contracts/contracts/Mocks/FallbackInitializer.sol b/packages/lsp6-contracts/contracts/Mocks/FallbackInitializer.sol new file mode 100644 index 000000000..c74031b9a --- /dev/null +++ b/packages/lsp6-contracts/contracts/Mocks/FallbackInitializer.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @dev sample contract used for testing + */ +contract FallbackInitializer { + address public caller; + + receive() external payable { + _initialize(); + } + + fallback() external payable { + _initialize(); + } + + function _initialize() internal { + caller = msg.sender; + } +} diff --git a/contracts/Mocks/KeyManager/KeyManagerInternalsTester.sol b/packages/lsp6-contracts/contracts/Mocks/KeyManagerInternalsTester.sol similarity index 96% rename from contracts/Mocks/KeyManager/KeyManagerInternalsTester.sol rename to packages/lsp6-contracts/contracts/Mocks/KeyManagerInternalsTester.sol index a6edba89f..e48ccaa55 100644 --- a/contracts/Mocks/KeyManager/KeyManagerInternalsTester.sol +++ b/packages/lsp6-contracts/contracts/Mocks/KeyManagerInternalsTester.sol @@ -2,11 +2,11 @@ pragma solidity ^0.8.4; // libraries -import {LSP6Utils} from "../../LSP6KeyManager/LSP6Utils.sol"; +import {LSP6Utils} from "../LSP6Utils.sol"; // modules import {ERC725Y} from "@erc725/smart-contracts/contracts/ERC725Y.sol"; -import {LSP6KeyManager} from "../../LSP6KeyManager/LSP6KeyManager.sol"; +import {LSP6KeyManager} from "../LSP6KeyManager.sol"; /** * Helper contract to test internal functions of the KeyManager diff --git a/packages/lsp6-contracts/contracts/Mocks/TargetContract.sol b/packages/lsp6-contracts/contracts/Mocks/TargetContract.sol new file mode 100644 index 000000000..e4a01750d --- /dev/null +++ b/packages/lsp6-contracts/contracts/Mocks/TargetContract.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +/** + * @dev sample contract to test interaction + state changes: + * - directly from Universal Profile + * - via KeyManager > UniversalProfile + */ +contract TargetContract { + uint256 private _number = 5; + string private _name = "Simple Contract Name"; + + function getNumber() public view returns (uint256) { + return _number; + } + + function setNumber(uint256 newNumber) public { + _number = newNumber; + } + + function getName() public view returns (string memory) { + return _name; + } + + function setName(string memory name) public { + _name = name; + } + + function setNamePayable(string memory name) public payable { + _name = name; + } + + function setNamePayableMinimumValue(string memory name) public payable { + require(msg.value >= 50, "Not enough value provided"); + _name = name; + } + + function revertCall() public pure { + revert("TargetContract:revertCall: this function has reverted!"); + } + + function getDynamicArrayOf2Numbers() + public + pure + returns (uint256[] memory) + { + uint256[] memory results = new uint256[](2); + results[0] = 10; + results[1] = 20; + return results; + } +} diff --git a/packages/lsp6-contracts/contracts/Version.sol b/packages/lsp6-contracts/contracts/Version.sol new file mode 100644 index 000000000..58a3f0925 --- /dev/null +++ b/packages/lsp6-contracts/contracts/Version.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +abstract contract Version { + /** + * @dev Get the version of the contract. + * @notice Contract version. + * + * @return The version of the the contract. + */ + // DO NOT CHANGE + // Comments block below is used by release-please to automatically update the version in this file. + // x-release-please-start-version + string public constant VERSION = "0.14.0"; + + // x-release-please-end +} diff --git a/packages/lsp6-contracts/contracts/constants.sol b/packages/lsp6-contracts/contracts/constants.sol new file mode 100644 index 000000000..9e38b4ca1 --- /dev/null +++ b/packages/lsp6-contracts/contracts/constants.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.5; + +// --- ERC165 interface ids +bytes4 constant _INTERFACEID_ERC1271 = 0x1626ba7e; + +// ERC1271 - Standard Signature Validation +bytes4 constant _ERC1271_SUCCESSVALUE = 0x1626ba7e; +bytes4 constant _ERC1271_FAILVALUE = 0xffffffff; diff --git a/tests/foundry/LSP6KeyManager/LSP6AllowedCallsTest.t.sol b/packages/lsp6-contracts/foundry/LSP6AllowedCallsTest.t.sol similarity index 92% rename from tests/foundry/LSP6KeyManager/LSP6AllowedCallsTest.t.sol rename to packages/lsp6-contracts/foundry/LSP6AllowedCallsTest.t.sol index 7b75c7c43..fe967d5c1 100644 --- a/tests/foundry/LSP6KeyManager/LSP6AllowedCallsTest.t.sol +++ b/packages/lsp6-contracts/foundry/LSP6AllowedCallsTest.t.sol @@ -3,15 +3,13 @@ pragma solidity ^0.8.4; // libraries import "forge-std/Test.sol"; -import { - LSP2Utils -} from "../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // modules -import {UniversalProfile} from "../../../contracts/UniversalProfile.sol"; +import {ERC725} from "@erc725/smart-contracts/contracts/ERC725.sol"; import { KeyManagerInternalTester -} from "../../../contracts/Mocks/KeyManager/KeyManagerInternalsTester.sol"; +} from "../contracts/Mocks/KeyManagerInternalsTester.sol"; // constants import { @@ -25,29 +23,27 @@ import { _ALLOWEDCALLS_CALL, _ALLOWEDCALLS_STATICCALL, _ALLOWEDCALLS_DELEGATECALL -} from "../../../contracts/LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; // errors to test -import {NotAllowedCall} from "../../../contracts/LSP6KeyManager/LSP6Errors.sol"; +import {NotAllowedCall} from "@lukso/lsp6-contracts/contracts/LSP6Errors.sol"; // mock contracts for testing -import { - FallbackInitializer -} from "../../../contracts/Mocks/FallbackInitializer.sol"; -import {TargetContract} from "../../../contracts/Mocks/TargetContract.sol"; +import {FallbackInitializer} from "../contracts/Mocks/FallbackInitializer.sol"; +import {TargetContract} from "../contracts/Mocks/TargetContract.sol"; contract LSP6AllowedCallsTest is Test { using LSP2Utils for *; - UniversalProfile universalProfile; + ERC725 account; KeyManagerInternalTester keyManager; TargetContract targetContract; FallbackInitializer targetWithFallback; function setUp() public { - universalProfile = new UniversalProfile(address(this)); - keyManager = new KeyManagerInternalTester(address(universalProfile)); + account = new ERC725(address(this)); + keyManager = new KeyManagerInternalTester(address(account)); targetContract = new TargetContract(); targetWithFallback = new FallbackInitializer(); @@ -72,7 +68,7 @@ contract LSP6AllowedCallsTest is Test { allowedSelector // function ); - universalProfile.setData(allowedCallsDataKey, allowedCallsDataValue); + account.setData(allowedCallsDataKey, allowedCallsDataValue); } function testShouldRevertWithEmptyMessageCallWithCallTypeAllowedValueOnly() diff --git a/tests/foundry/LSP6KeyManager/LSP6SetDataTest.t.sol b/packages/lsp6-contracts/foundry/LSP6SetDataTest.t.sol similarity index 76% rename from tests/foundry/LSP6KeyManager/LSP6SetDataTest.t.sol rename to packages/lsp6-contracts/foundry/LSP6SetDataTest.t.sol index 729b284e3..caeecf491 100644 --- a/tests/foundry/LSP6KeyManager/LSP6SetDataTest.t.sol +++ b/packages/lsp6-contracts/foundry/LSP6SetDataTest.t.sol @@ -2,37 +2,34 @@ pragma solidity ^0.8.4; import "forge-std/Test.sol"; -import "../../../contracts/UniversalProfile.sol"; -import "../../../contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; -import "../../../contracts/LSP6KeyManager/LSP6KeyManager.sol"; -import "../../../contracts/LSP14Ownable2Step/ILSP14Ownable2Step.sol"; -import "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; +import {ERC725} from "@erc725/smart-contracts/contracts/ERC725.sol"; +import { + LSP6KeyManager +} from "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol"; +import { + ILSP14Ownable2Step +} from "@lukso/lsp14-contracts/contracts/ILSP14Ownable2Step.sol"; +import { + IERC725Y +} from "@erc725/smart-contracts/contracts/interfaces/IERC725Y.sol"; import {BytesLib} from "solidity-bytes-utils/contracts/BytesLib.sol"; -import { - LSP2Utils -} from "../../../contracts/LSP2ERC725YJSONSchema/LSP2Utils.sol"; -import {LSP6Utils} from "../../../contracts/LSP6KeyManager/LSP6Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; +import {LSP6Utils} from "@lukso/lsp6-contracts/contracts/LSP6Utils.sol"; -import "../../../contracts/LSP1UniversalReceiver/LSP1Constants.sol"; -import "../../../contracts/LSP6KeyManager/LSP6Constants.sol"; -import "../../../contracts/LSP17ContractExtension/LSP17Constants.sol"; +import "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; +import "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; +import "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; contract LSP6SetDataTest is Test { using BytesLib for bytes; - UniversalProfile universalProfile; - LSP1UniversalReceiverDelegateUP LSP1Delegate; + ERC725 account; LSP6KeyManager keyManager; function setUp() public { - universalProfile = new UniversalProfile(address(this)); - keyManager = new LSP6KeyManager(address(universalProfile)); - LSP1Delegate = new LSP1UniversalReceiverDelegateUP(); - universalProfile.setData( - _LSP1_UNIVERSAL_RECEIVER_DELEGATE_KEY, - bytes.concat(bytes20(address(LSP1Delegate))) - ); + account = new ERC725(address(this)); + keyManager = new LSP6KeyManager(address(account)); } // Test for `AddressPermissions:AllowedERC725YDataKeys:` == `[0x0000] @@ -51,10 +48,7 @@ contract LSP6SetDataTest is Test { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, bytes20(address(this)) ); - universalProfile.setData( - ownerDataKey, - bytes.concat(_PERMISSION_CHANGEOWNER) - ); + account.setData(ownerDataKey, bytes.concat(_PERMISSION_CHANGEOWNER)); // Set permissions and allowed data keys for malicious address address malicious = vm.addr(1234); @@ -69,7 +63,7 @@ contract LSP6SetDataTest is Test { bytes20(malicious) ); - universalProfile.setData( + account.setData( permissionsDataKey, bytes.concat(_PERMISSION_SETDATA | _PERMISSION_CHANGEOWNER) ); @@ -77,19 +71,16 @@ contract LSP6SetDataTest is Test { // set `0x0000` in the list of AllowedERC725YDataKeys of the controller // this correspond to a bytes[CompactBytesArray] with only one entry // where the length of this single `bytes` entry is `0` - universalProfile.setData( - allowedERC725YDataKeysDataKey, - bytes.concat(bytes2(0)) - ); + account.setData(allowedERC725YDataKeysDataKey, bytes.concat(bytes2(0))); - // Setup KeyManager as the owner of the universalProfile - universalProfile.transferOwnership(address(keyManager)); + // Setup KeyManager as the owner of the account + account.transferOwnership(address(keyManager)); bytes memory payload = abi.encodeWithSelector( ILSP14Ownable2Step.acceptOwnership.selector, "" ); keyManager.execute(payload); - assert(universalProfile.owner() == address(keyManager)); + assert(account.owner() == address(keyManager)); // Verify malicious can set data for most data keys bytes memory functionArgs = abi.encode(dataKey, dataValue); @@ -104,14 +95,14 @@ contract LSP6SetDataTest is Test { // CHECK the LSP20 verification function reverts as well keyManager.lsp20VerifyCall( malicious, - address(universalProfile), + address(account), malicious, 0, functionArgs ); // CHECK it reverts when calling directly the Universal Profile - universalProfile.setData(dataKey, dataValue); + account.setData(dataKey, dataValue); } // Test for @@ -140,10 +131,7 @@ contract LSP6SetDataTest is Test { _LSP6KEY_ADDRESSPERMISSIONS_PERMISSIONS_PREFIX, bytes20(address(this)) ); - universalProfile.setData( - ownerDataKey, - bytes.concat(_PERMISSION_CHANGEOWNER) - ); + account.setData(ownerDataKey, bytes.concat(_PERMISSION_CHANGEOWNER)); // Set permissions and allowed data keys for malicious address address malicious = vm.addr(1234); @@ -158,7 +146,7 @@ contract LSP6SetDataTest is Test { bytes20(malicious) ); - universalProfile.setData( + account.setData( permissionsDataKey, bytes.concat(_PERMISSION_SETDATA | _PERMISSION_CHANGEOWNER) ); @@ -203,19 +191,19 @@ contract LSP6SetDataTest is Test { } // 2. set this list of malicious Allowed ERC725Y Data Keys - universalProfile.setData( + account.setData( allowedERC725YDataKeysDataKey, maliciousCompactBytesArrayOfAllowedERC725YDataKeys ); - // Setup KeyManager as the owner of the universalProfile - universalProfile.transferOwnership(address(keyManager)); + // Setup KeyManager as the owner of the account + account.transferOwnership(address(keyManager)); bytes memory payload = abi.encodeWithSelector( ILSP14Ownable2Step.acceptOwnership.selector, "" ); keyManager.execute(payload); - assert(universalProfile.owner() == address(keyManager)); + assert(account.owner() == address(keyManager)); // Verify malicious can set data for most data keys bytes memory functionArgs = abi.encode(dataKey, dataValue); @@ -230,13 +218,13 @@ contract LSP6SetDataTest is Test { // CHECK the LSP20 verification function reverts as well keyManager.lsp20VerifyCall( malicious, - address(universalProfile), + address(account), malicious, 0, functionArgs ); // CHECK it reverts when calling directly the Universal Profile - universalProfile.setData(dataKey, dataValue); + account.setData(dataKey, dataValue); } } diff --git a/tests/foundry/LSP6KeyManager/LSP6Utils.t.sol b/packages/lsp6-contracts/foundry/LSP6Utils.t.sol similarity index 99% rename from tests/foundry/LSP6KeyManager/LSP6Utils.t.sol rename to packages/lsp6-contracts/foundry/LSP6Utils.t.sol index a8a805ec5..49b7b2f33 100644 --- a/tests/foundry/LSP6KeyManager/LSP6Utils.t.sol +++ b/packages/lsp6-contracts/foundry/LSP6Utils.t.sol @@ -4,8 +4,8 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; import "forge-std/console.sol"; -import "../../../contracts/LSP6KeyManager/LSP6Utils.sol"; -import "../../../contracts/LSP6KeyManager/LSP6Constants.sol"; +import {LSP6Utils} from "../contracts/LSP6Utils.sol"; +import "../contracts/LSP6Constants.sol"; contract LSP6UtilsTests is Test { mapping(bytes32 => bool) selectedPermissions; diff --git a/packages/lsp6-contracts/hardhat.config.ts b/packages/lsp6-contracts/hardhat.config.ts new file mode 100644 index 000000000..e26f28156 --- /dev/null +++ b/packages/lsp6-contracts/hardhat.config.ts @@ -0,0 +1,131 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [ + 'LSP6KeyManager', // Standard version + 'LSP6KeyManagerInit', // Proxy version + ], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp6-contracts/index.ts b/packages/lsp6-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp6-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp6-contracts/package.json b/packages/lsp6-contracts/package.json new file mode 100644 index 000000000..54d14e310 --- /dev/null +++ b/packages/lsp6-contracts/package.json @@ -0,0 +1,60 @@ +{ + "name": "@lukso/lsp6-contracts", + "version": "0.12.1", + "description": "Package for the LSP6 Key Manager standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:foundry": "forge build", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'", + "test:foundry": "FOUNDRY_PROFILE=lsp6 forge test --no-match-test Skip -vvv" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp2-contracts": "*", + "@lukso/lsp14-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*", + "@lukso/lsp20-contracts": "*", + "@lukso/lsp25-contracts": "*" + } +} diff --git a/packages/lsp6-contracts/tsconfig.json b/packages/lsp6-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp6-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp7-contracts/.eslintrc.js b/packages/lsp7-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp7-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp7-contracts/.solhint.json b/packages/lsp7-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp7-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp7-contracts/README.md b/packages/lsp7-contracts/README.md new file mode 100644 index 000000000..7d878e99a --- /dev/null +++ b/packages/lsp7-contracts/README.md @@ -0,0 +1,3 @@ +# LSP7 Digital Asset · [![npm version](https://img.shields.io/npm/v/@lukso/lsp7-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp7-contracts) + +Package for the LSP7 Digital Asset standard. diff --git a/packages/lsp7-contracts/build.config.ts b/packages/lsp7-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp7-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp7-contracts/constants.ts b/packages/lsp7-contracts/constants.ts new file mode 100644 index 000000000..955a3c0e3 --- /dev/null +++ b/packages/lsp7-contracts/constants.ts @@ -0,0 +1,15 @@ +export const INTERFACE_ID_LSP7 = '0xc52d6008'; + +export const LSP7_TYPE_IDS = { + // keccak256('LSP7Tokens_SenderNotification') + LSP7Tokens_SenderNotification: + '0x429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea', + + // keccak256('LSP7Tokens_RecipientNotification') + LSP7Tokens_RecipientNotification: + '0x20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c', + + // keccak256('LSP7Tokens_OperatorNotification') + LSP7Tokens_OperatorNotification: + '0x386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc', +}; diff --git a/contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol b/packages/lsp7-contracts/contracts/ILSP7DigitalAsset.sol similarity index 100% rename from contracts/LSP7DigitalAsset/ILSP7DigitalAsset.sol rename to packages/lsp7-contracts/contracts/ILSP7DigitalAsset.sol diff --git a/contracts/LSP7DigitalAsset/LSP7Constants.sol b/packages/lsp7-contracts/contracts/LSP7Constants.sol similarity index 100% rename from contracts/LSP7DigitalAsset/LSP7Constants.sol rename to packages/lsp7-contracts/contracts/LSP7Constants.sol diff --git a/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol b/packages/lsp7-contracts/contracts/LSP7DigitalAsset.sol similarity index 95% rename from contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol rename to packages/lsp7-contracts/contracts/LSP7DigitalAsset.sol index c7abee9aa..e2f3b28b9 100644 --- a/contracts/LSP7DigitalAsset/LSP7DigitalAsset.sol +++ b/packages/lsp7-contracts/contracts/LSP7DigitalAsset.sol @@ -8,12 +8,14 @@ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import {ERC725YCore} from "@erc725/smart-contracts/contracts/ERC725YCore.sol"; import { LSP4DigitalAssetMetadata -} from "../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol"; import {LSP7DigitalAssetCore} from "./LSP7DigitalAssetCore.sol"; -import {LSP17Extendable} from "../LSP17ContractExtension/LSP17Extendable.sol"; +import { + LSP17Extendable +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol"; // libraries -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // constants import {_INTERFACEID_LSP7} from "./LSP7Constants.sol"; @@ -21,7 +23,7 @@ import {LSP7TokenContractCannotHoldValue} from "./LSP7Errors.sol"; import { _LSP17_EXTENSION_PREFIX -} from "../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; // errors @@ -29,7 +31,7 @@ import { NoExtensionFoundForFunctionSelector, InvalidFunctionSelector, InvalidExtensionAddress -} from "../LSP17ContractExtension/LSP17Errors.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Errors.sol"; /** * @title Implementation of a LSP7 Digital Asset, a contract that represents a fungible token. diff --git a/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol b/packages/lsp7-contracts/contracts/LSP7DigitalAssetCore.sol similarity index 99% rename from contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol rename to packages/lsp7-contracts/contracts/LSP7DigitalAssetCore.sol index 9ca4798f9..6b54dc843 100644 --- a/contracts/LSP7DigitalAsset/LSP7DigitalAssetCore.sol +++ b/packages/lsp7-contracts/contracts/LSP7DigitalAssetCore.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.4; // interfaces import { ILSP1UniversalReceiver as ILSP1 -} from "../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; import {ILSP7DigitalAsset} from "./ILSP7DigitalAsset.sol"; // modules @@ -16,7 +16,7 @@ import { import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import {LSP1Utils} from "../LSP1UniversalReceiver/LSP1Utils.sol"; +import {LSP1Utils} from "@lukso/lsp1-contracts/contracts/LSP1Utils.sol"; // errors import { @@ -36,7 +36,9 @@ import { } from "./LSP7Errors.sol"; // constants -import {_INTERFACEID_LSP1} from "../LSP1UniversalReceiver/LSP1Constants.sol"; +import { + _INTERFACEID_LSP1 +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _TYPEID_LSP7_TOKENOPERATOR, _TYPEID_LSP7_TOKENSSENDER, diff --git a/contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol b/packages/lsp7-contracts/contracts/LSP7DigitalAssetInitAbstract.sol similarity index 94% rename from contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol rename to packages/lsp7-contracts/contracts/LSP7DigitalAssetInitAbstract.sol index 80169e687..0c8fe8163 100644 --- a/contracts/LSP7DigitalAsset/LSP7DigitalAssetInitAbstract.sol +++ b/packages/lsp7-contracts/contracts/LSP7DigitalAssetInitAbstract.sol @@ -8,13 +8,15 @@ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import {ERC725YCore} from "@erc725/smart-contracts/contracts/ERC725YCore.sol"; import { LSP4DigitalAssetMetadataInitAbstract -} from "../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadataInitAbstract.sol"; import {LSP7DigitalAssetCore} from "./LSP7DigitalAssetCore.sol"; -import {LSP17Extendable} from "../LSP17ContractExtension/LSP17Extendable.sol"; +import { + LSP17Extendable +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol"; // libraries -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // constants import {_INTERFACEID_LSP7} from "./LSP7Constants.sol"; @@ -22,7 +24,7 @@ import {LSP7TokenContractCannotHoldValue} from "./LSP7Errors.sol"; import { _LSP17_EXTENSION_PREFIX -} from "../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; // errors @@ -30,7 +32,7 @@ import { NoExtensionFoundForFunctionSelector, InvalidFunctionSelector, InvalidExtensionAddress -} from "../LSP17ContractExtension/LSP17Errors.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Errors.sol"; /** * @title LSP7DigitalAsset contract diff --git a/contracts/LSP7DigitalAsset/LSP7Errors.sol b/packages/lsp7-contracts/contracts/LSP7Errors.sol similarity index 100% rename from contracts/LSP7DigitalAsset/LSP7Errors.sol rename to packages/lsp7-contracts/contracts/LSP7Errors.sol diff --git a/contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol b/packages/lsp7-contracts/contracts/extensions/LSP7Burnable.sol similarity index 100% rename from contracts/LSP7DigitalAsset/extensions/LSP7Burnable.sol rename to packages/lsp7-contracts/contracts/extensions/LSP7Burnable.sol diff --git a/contracts/LSP7DigitalAsset/extensions/LSP7BurnableInitAbstract.sol b/packages/lsp7-contracts/contracts/extensions/LSP7BurnableInitAbstract.sol similarity index 100% rename from contracts/LSP7DigitalAsset/extensions/LSP7BurnableInitAbstract.sol rename to packages/lsp7-contracts/contracts/extensions/LSP7BurnableInitAbstract.sol diff --git a/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol b/packages/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol similarity index 100% rename from contracts/LSP7DigitalAsset/extensions/LSP7CappedSupply.sol rename to packages/lsp7-contracts/contracts/extensions/LSP7CappedSupply.sol diff --git a/contracts/LSP7DigitalAsset/extensions/LSP7CappedSupplyInitAbstract.sol b/packages/lsp7-contracts/contracts/extensions/LSP7CappedSupplyInitAbstract.sol similarity index 100% rename from contracts/LSP7DigitalAsset/extensions/LSP7CappedSupplyInitAbstract.sol rename to packages/lsp7-contracts/contracts/extensions/LSP7CappedSupplyInitAbstract.sol diff --git a/contracts/LSP7DigitalAsset/presets/ILSP7Mintable.sol b/packages/lsp7-contracts/contracts/presets/ILSP7Mintable.sol similarity index 100% rename from contracts/LSP7DigitalAsset/presets/ILSP7Mintable.sol rename to packages/lsp7-contracts/contracts/presets/ILSP7Mintable.sol diff --git a/contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol b/packages/lsp7-contracts/contracts/presets/LSP7Mintable.sol similarity index 100% rename from contracts/LSP7DigitalAsset/presets/LSP7Mintable.sol rename to packages/lsp7-contracts/contracts/presets/LSP7Mintable.sol diff --git a/contracts/LSP7DigitalAsset/presets/LSP7MintableInit.sol b/packages/lsp7-contracts/contracts/presets/LSP7MintableInit.sol similarity index 100% rename from contracts/LSP7DigitalAsset/presets/LSP7MintableInit.sol rename to packages/lsp7-contracts/contracts/presets/LSP7MintableInit.sol diff --git a/contracts/LSP7DigitalAsset/presets/LSP7MintableInitAbstract.sol b/packages/lsp7-contracts/contracts/presets/LSP7MintableInitAbstract.sol similarity index 100% rename from contracts/LSP7DigitalAsset/presets/LSP7MintableInitAbstract.sol rename to packages/lsp7-contracts/contracts/presets/LSP7MintableInitAbstract.sol diff --git a/packages/lsp7-contracts/hardhat.config.ts b/packages/lsp7-contracts/hardhat.config.ts new file mode 100644 index 000000000..23f109844 --- /dev/null +++ b/packages/lsp7-contracts/hardhat.config.ts @@ -0,0 +1,139 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [ + // Standard version + // ------------------ + 'LSP7DigitalAsset', + 'LSP7CappedSupply', + 'LSP7Mintable', + // Proxy version + // ------------------ + 'LSP7DigitalAssetInitAbstract', + 'LSP7CappedSupplyInitAbstract', + 'LSP7MintableInit', + ], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp7-contracts/index.ts b/packages/lsp7-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp7-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp7-contracts/package.json b/packages/lsp7-contracts/package.json new file mode 100644 index 000000000..ccad0bc1f --- /dev/null +++ b/packages/lsp7-contracts/package.json @@ -0,0 +1,54 @@ +{ + "name": "@lukso/lsp7-contracts", + "version": "0.12.1", + "description": "Package for the LSP7 Digital Asset standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*" + } +} diff --git a/packages/lsp7-contracts/tsconfig.json b/packages/lsp7-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp7-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp8-contracts/.eslintrc.js b/packages/lsp8-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp8-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp8-contracts/.solhint.json b/packages/lsp8-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp8-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp8-contracts/README.md b/packages/lsp8-contracts/README.md new file mode 100644 index 000000000..45de90454 --- /dev/null +++ b/packages/lsp8-contracts/README.md @@ -0,0 +1,3 @@ +# LSP8 Identifiable Digital Asset · [![npm version](https://img.shields.io/npm/v/@lukso/lsp8-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp8-contracts) + +Package for the LSP8 Identifiable Digital Asset Standard. diff --git a/packages/lsp8-contracts/build.config.ts b/packages/lsp8-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp8-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp8-contracts/constants.ts b/packages/lsp8-contracts/constants.ts new file mode 100644 index 000000000..59dd86e0f --- /dev/null +++ b/packages/lsp8-contracts/constants.ts @@ -0,0 +1,38 @@ +export const INTERFACE_ID_LSP8 = '0x3a271706'; + +export const LSP8DataKeys = { + LSP8TokenIdFormat: '0xf675e9361af1c1664c1868cfa3eb97672d6b1a513aa5b81dec34c9ee330e818d', + LSP8TokenMetadataBaseURI: '0x1a7628600c3bac7101f53697f48df381ddc36b9015e7d7c9c5633d1252aa2843', + LSP8ReferenceContract: '0x708e7b881795f2e6b6c2752108c177ec89248458de3bf69d0d43480b3e5034e6', +}; + +export const LSP8_TYPE_IDS = { + // keccak256('LSP8Tokens_SenderNotification') + LSP8Tokens_SenderNotification: + '0xb23eae7e6d1564b295b4c3e3be402d9a2f0776c57bdf365903496f6fa481ab00', + + // keccak256('LSP8Tokens_RecipientNotification') + LSP8Tokens_RecipientNotification: + '0x0b084a55ebf70fd3c06fd755269dac2212c4d3f0f4d09079780bfa50c1b2984d', + + // keccak256('LSP8Tokens_OperatorNotification') + LSP8Tokens_OperatorNotification: + '0x8a1c15a8799f71b547e08e2bcb2e85257e81b0a07eee2ce6712549eef1f00970', +}; + +/** + * @dev List of LSP8 Token ID Formats that can be used to create different types of NFTs and represent each NFT identifiers (= tokenIds) differently. + * @see For details see: https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-8-IdentifiableDigitalAsset.md#lsp8tokenidformat + */ +export const LSP8_TOKEN_ID_FORMAT = { + NUMBER: 0, + STRING: 1, + ADDRESS: 2, + UNIQUE_ID: 3, + HASH: 4, + MIXED_DEFAULT_NUMBER: 100, + MIXED_DEFAULT_STRING: 101, + MIXED_DEFAULT_ADDRESS: 102, + MIXED_DEFAULT_UNIQUE_ID: 103, + MIXED_DEFAULT_HASH: 104, +}; diff --git a/contracts/LSP8IdentifiableDigitalAsset/ILSP8IdentifiableDigitalAsset.sol b/packages/lsp8-contracts/contracts/ILSP8IdentifiableDigitalAsset.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/ILSP8IdentifiableDigitalAsset.sol rename to packages/lsp8-contracts/contracts/ILSP8IdentifiableDigitalAsset.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol b/packages/lsp8-contracts/contracts/LSP8Constants.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol rename to packages/lsp8-contracts/contracts/LSP8Constants.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol b/packages/lsp8-contracts/contracts/LSP8Errors.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/LSP8Errors.sol rename to packages/lsp8-contracts/contracts/LSP8Errors.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol b/packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol similarity index 95% rename from contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol rename to packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol index 155237d49..cbd3d2a33 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAsset.sol +++ b/packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAsset.sol @@ -11,16 +11,18 @@ import { } from "./LSP8IdentifiableDigitalAssetCore.sol"; import { LSP4DigitalAssetMetadata -} from "../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadata.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadata.sol"; import { LSP4DigitalAssetMetadataCore -} from "../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadataCore.sol"; -import {LSP17Extendable} from "../LSP17ContractExtension/LSP17Extendable.sol"; +import { + LSP17Extendable +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol"; // libraries -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // constants import {_INTERFACEID_LSP8, _LSP8_TOKENID_FORMAT_KEY} from "./LSP8Constants.sol"; @@ -33,7 +35,7 @@ import { import { _LSP17_EXTENSION_PREFIX -} from "../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; // errors @@ -41,7 +43,7 @@ import { NoExtensionFoundForFunctionSelector, InvalidFunctionSelector, InvalidExtensionAddress -} from "../LSP17ContractExtension/LSP17Errors.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Errors.sol"; /** * @title Implementation of a LSP8 Identifiable Digital Asset, a contract that represents a non-fungible token. diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol b/packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetCore.sol similarity index 98% rename from contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol rename to packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetCore.sol index 2846c4ac0..ec8c4d32c 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetCore.sol +++ b/packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetCore.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.12; // interfaces import { ILSP1UniversalReceiver as ILSP1 -} from "../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; import { ILSP8IdentifiableDigitalAsset } from "./ILSP8IdentifiableDigitalAsset.sol"; @@ -13,7 +13,7 @@ import { import { LSP4DigitalAssetMetadataCore -} from "../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadataCore.sol"; // libraries import { @@ -22,7 +22,7 @@ import { import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import {LSP1Utils} from "../LSP1UniversalReceiver/LSP1Utils.sol"; +import {LSP1Utils} from "@lukso/lsp1-contracts/contracts/LSP1Utils.sol"; // errors import { @@ -46,7 +46,9 @@ import { } from "./LSP8Errors.sol"; // constants -import {_INTERFACEID_LSP1} from "../LSP1UniversalReceiver/LSP1Constants.sol"; +import { + _INTERFACEID_LSP1 +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _TYPEID_LSP8_TOKENOPERATOR, _TYPEID_LSP8_TOKENSSENDER, diff --git a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol b/packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol similarity index 95% rename from contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol rename to packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol index 008a72421..fa75a43c5 100644 --- a/contracts/LSP8IdentifiableDigitalAsset/LSP8IdentifiableDigitalAssetInitAbstract.sol +++ b/packages/lsp8-contracts/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol @@ -11,16 +11,18 @@ import { } from "./LSP8IdentifiableDigitalAssetCore.sol"; import { LSP4DigitalAssetMetadataInitAbstract -} from "../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataInitAbstract.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadataInitAbstract.sol"; import { LSP4DigitalAssetMetadataCore -} from "../LSP4DigitalAssetMetadata/LSP4DigitalAssetMetadataCore.sol"; +} from "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadataCore.sol"; -import {LSP17Extendable} from "../LSP17ContractExtension/LSP17Extendable.sol"; +import { + LSP17Extendable +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol"; // libraries -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // constants import {_INTERFACEID_LSP8, _LSP8_TOKENID_FORMAT_KEY} from "./LSP8Constants.sol"; @@ -33,7 +35,7 @@ import { import { _LSP17_EXTENSION_PREFIX -} from "../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; // errors @@ -41,7 +43,7 @@ import { NoExtensionFoundForFunctionSelector, InvalidFunctionSelector, InvalidExtensionAddress -} from "../LSP17ContractExtension/LSP17Errors.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Errors.sol"; /** * @title Implementation of a LSP8 Identifiable Digital Asset, a contract that represents a non-fungible token. diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol b/packages/lsp8-contracts/contracts/extensions/LSP8Burnable.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Burnable.sol rename to packages/lsp8-contracts/contracts/extensions/LSP8Burnable.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8BurnableInitAbstract.sol b/packages/lsp8-contracts/contracts/extensions/LSP8BurnableInitAbstract.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8BurnableInitAbstract.sol rename to packages/lsp8-contracts/contracts/extensions/LSP8BurnableInitAbstract.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol b/packages/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupply.sol rename to packages/lsp8-contracts/contracts/extensions/LSP8CappedSupply.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol b/packages/lsp8-contracts/contracts/extensions/LSP8CappedSupplyInitAbstract.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8CappedSupplyInitAbstract.sol rename to packages/lsp8-contracts/contracts/extensions/LSP8CappedSupplyInitAbstract.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol b/packages/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8Enumerable.sol rename to packages/lsp8-contracts/contracts/extensions/LSP8Enumerable.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol b/packages/lsp8-contracts/contracts/extensions/LSP8EnumerableInitAbstract.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/extensions/LSP8EnumerableInitAbstract.sol rename to packages/lsp8-contracts/contracts/extensions/LSP8EnumerableInitAbstract.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/presets/ILSP8Mintable.sol b/packages/lsp8-contracts/contracts/presets/ILSP8Mintable.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/presets/ILSP8Mintable.sol rename to packages/lsp8-contracts/contracts/presets/ILSP8Mintable.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol b/packages/lsp8-contracts/contracts/presets/LSP8Mintable.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol rename to packages/lsp8-contracts/contracts/presets/LSP8Mintable.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInit.sol b/packages/lsp8-contracts/contracts/presets/LSP8MintableInit.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInit.sol rename to packages/lsp8-contracts/contracts/presets/LSP8MintableInit.sol diff --git a/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInitAbstract.sol b/packages/lsp8-contracts/contracts/presets/LSP8MintableInitAbstract.sol similarity index 100% rename from contracts/LSP8IdentifiableDigitalAsset/presets/LSP8MintableInitAbstract.sol rename to packages/lsp8-contracts/contracts/presets/LSP8MintableInitAbstract.sol diff --git a/packages/lsp8-contracts/hardhat.config.ts b/packages/lsp8-contracts/hardhat.config.ts new file mode 100644 index 000000000..db8d7e37d --- /dev/null +++ b/packages/lsp8-contracts/hardhat.config.ts @@ -0,0 +1,139 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [ + // Standard version + // ------------------ + 'LSP8IdentifiableDigitalAsset', + 'LSP8CappedSupply', + 'LSP8Mintable', + // Proxy version + // ------------------ + 'LSP8IdentifiableDigitalAssetInitAbstract', + 'LSP8CappedSupplyInitAbstract', + 'LSP8MintableInit', + ], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp8-contracts/index.ts b/packages/lsp8-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp8-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp8-contracts/package.json b/packages/lsp8-contracts/package.json new file mode 100644 index 000000000..73c0b7f4f --- /dev/null +++ b/packages/lsp8-contracts/package.json @@ -0,0 +1,56 @@ +{ + "name": "@lukso/lsp8-contracts", + "version": "0.12.1", + "description": "Package for the LSP8 Identifiable Digital Asset standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp2-contracts": "*", + "@lukso/lsp4-contracts": "*", + "@lukso/lsp17contractextension-contracts": "*" + } +} diff --git a/packages/lsp8-contracts/tsconfig.json b/packages/lsp8-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp8-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/lsp9-contracts/.eslintrc.js b/packages/lsp9-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/lsp9-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/lsp9-contracts/.solhint.json b/packages/lsp9-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/lsp9-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/lsp9-contracts/README.md b/packages/lsp9-contracts/README.md new file mode 100644 index 000000000..8ad3ad43c --- /dev/null +++ b/packages/lsp9-contracts/README.md @@ -0,0 +1,3 @@ +# LSP9 Vault · [![npm version](https://img.shields.io/npm/v/@lukso/lsp9-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/lsp9-contracts) + +Package for the LSP9 Vault standard. diff --git a/packages/lsp9-contracts/build.config.ts b/packages/lsp9-contracts/build.config.ts new file mode 100644 index 000000000..dc4f36906 --- /dev/null +++ b/packages/lsp9-contracts/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./index'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/lsp9-contracts/constants.ts b/packages/lsp9-contracts/constants.ts new file mode 100644 index 000000000..bc924c4d5 --- /dev/null +++ b/packages/lsp9-contracts/constants.ts @@ -0,0 +1,54 @@ +// ERC165 Interface ID +// ---------- +export const INTERFACE_ID_LSP9 = '0x28af17e6'; + +// ERC725X +// ---------- + +/** + * @dev list of ERC725X operation types. + * @see https://github.com/ERC725Alliance/ERC725/blob/develop/docs/ERC-725.md#execute + */ +export const OPERATION_TYPES = { + CALL: 0, + CREATE: 1, + CREATE2: 2, + STATICCALL: 3, + DELEGATECALL: 4, +}; + +/** + * @dev list of ERC725Y keys from the LSP standards. + * Can be used to detect if a contract implements a specific LSP Metadata standard + * and contain a set of pre-defined ERC725Y Data Keys. + */ +export const LSP9SupportedStandard = { + key: '0xeafec4d89fa9619884b600007c0334a14085fefa8b51ae5a40895018882bdb90', + value: '0x7c0334a1', +}; + +export const LSP9DataKeys = { + SupportedStandards_LSP9: LSP9SupportedStandard.key, +}; + +/** + * @dev list of standard type IDs ("hooks") defined in the LSPs that can be used to notify + * a LSP1 compliant contract about certain type of transactions or information + * (e.g: token transfer, vault transfer, ownership transfer, etc...) + */ +export const LSP9_TYPE_IDS = { + // keccak256('LSP9ValueReceived') + LSP9ValueReceived: '0x468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc', + + // keccak256('LSP9OwnershipTransferStarted') + LSP9OwnershipTransferStarted: + '0xaefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f', + + // keccak256('LSP9OwnershipTransferred_SenderNotification') + LSP9OwnershipTransferred_SenderNotification: + '0x0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471', + + // keccak256('LSP9OwnershipTransferred_RecipientNotification') + LSP9OwnershipTransferred_RecipientNotification: + '0x79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c', +}; diff --git a/contracts/LSP9Vault/ILSP9Vault.sol b/packages/lsp9-contracts/contracts/ILSP9Vault.sol similarity index 100% rename from contracts/LSP9Vault/ILSP9Vault.sol rename to packages/lsp9-contracts/contracts/ILSP9Vault.sol diff --git a/contracts/LSP9Vault/LSP9Constants.sol b/packages/lsp9-contracts/contracts/LSP9Constants.sol similarity index 100% rename from contracts/LSP9Vault/LSP9Constants.sol rename to packages/lsp9-contracts/contracts/LSP9Constants.sol diff --git a/contracts/LSP9Vault/LSP9Errors.sol b/packages/lsp9-contracts/contracts/LSP9Errors.sol similarity index 88% rename from contracts/LSP9Vault/LSP9Errors.sol rename to packages/lsp9-contracts/contracts/LSP9Errors.sol index 38bf3a90a..68868e2d6 100644 --- a/contracts/LSP9Vault/LSP9Errors.sol +++ b/packages/lsp9-contracts/contracts/LSP9Errors.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.4; /** * @notice The `LSP1UniversalReceiverDelegate` is not allowed to set the following data key: `dataKey`. - * @dev Reverts when the Vault version of [LSP1UniversalReceiverDelegate] sets LSP1/6/17 Data Keys. + * @dev Reverts when the Vault version of [LSP1UniversalReceiverDelegate] sets @lukso/lsp1-contracts/6/17 Data Keys. * @param dataKey The data key that the Vault version of [LSP1UniversalReceiverDelegate] is not allowed to set. */ error LSP1DelegateNotAllowedToSetDataKey(bytes32 dataKey); diff --git a/contracts/LSP9Vault/LSP9Vault.sol b/packages/lsp9-contracts/contracts/LSP9Vault.sol similarity index 93% rename from contracts/LSP9Vault/LSP9Vault.sol rename to packages/lsp9-contracts/contracts/LSP9Vault.sol index 7fa70ce43..b312c3863 100644 --- a/contracts/LSP9Vault/LSP9Vault.sol +++ b/packages/lsp9-contracts/contracts/LSP9Vault.sol @@ -5,11 +5,11 @@ pragma solidity ^0.8.4; import { OwnableUnset } from "@erc725/smart-contracts/contracts/custom/OwnableUnset.sol"; -import {Version} from "../Version.sol"; +import {Version} from "./Version.sol"; import {LSP9VaultCore} from "./LSP9VaultCore.sol"; // libraries -import {LSP1Utils} from "../LSP1UniversalReceiver/LSP1Utils.sol"; +import {LSP1Utils} from "@lukso/lsp1-contracts/contracts/LSP1Utils.sol"; // constants import { @@ -17,7 +17,7 @@ import { _LSP9_SUPPORTED_STANDARDS_VALUE, _TYPEID_LSP9_VALUE_RECEIVED, _TYPEID_LSP9_OwnershipTransferred_RecipientNotification -} from "../LSP9Vault/LSP9Constants.sol"; +} from "./LSP9Constants.sol"; /** * @title Implementation of LSP9Vault built on top of [ERC725], [LSP-1-UniversalReceiver] diff --git a/contracts/LSP9Vault/LSP9VaultCore.sol b/packages/lsp9-contracts/contracts/LSP9VaultCore.sol similarity index 96% rename from contracts/LSP9Vault/LSP9VaultCore.sol rename to packages/lsp9-contracts/contracts/LSP9VaultCore.sol index 19f5b7070..7f0754286 100644 --- a/contracts/LSP9Vault/LSP9VaultCore.sol +++ b/packages/lsp9-contracts/contracts/LSP9VaultCore.sol @@ -4,19 +4,19 @@ pragma solidity ^0.8.4; // interfaces import { ILSP1UniversalReceiver -} from "../LSP1UniversalReceiver/ILSP1UniversalReceiver.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol"; import { ILSP1UniversalReceiverDelegate -} from "../LSP1UniversalReceiver/ILSP1UniversalReceiverDelegate.sol"; +} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiverDelegate.sol"; import {ILSP9Vault} from "./ILSP9Vault.sol"; // libraries import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import {LSP1Utils} from "../LSP1UniversalReceiver/LSP1Utils.sol"; -import {LSP2Utils} from "../LSP2ERC725YJSONSchema/LSP2Utils.sol"; +import {LSP1Utils} from "@lukso/lsp1-contracts/contracts/LSP1Utils.sol"; +import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol"; // modules import {ERC725XCore} from "@erc725/smart-contracts/contracts/ERC725XCore.sol"; @@ -24,8 +24,12 @@ import {ERC725YCore} from "@erc725/smart-contracts/contracts/ERC725YCore.sol"; import { OwnableUnset } from "@erc725/smart-contracts/contracts/custom/OwnableUnset.sol"; -import {LSP14Ownable2Step} from "../LSP14Ownable2Step/LSP14Ownable2Step.sol"; -import {LSP17Extendable} from "../LSP17ContractExtension/LSP17Extendable.sol"; +import { + LSP14Ownable2Step +} from "@lukso/lsp14-contracts/contracts/LSP14Ownable2Step.sol"; +import { + LSP17Extendable +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extendable.sol"; // constants import { @@ -47,11 +51,11 @@ import { _INTERFACEID_LSP1_DELEGATE, _LSP1_UNIVERSAL_RECEIVER_DELEGATE_PREFIX, _LSP1_UNIVERSAL_RECEIVER_DELEGATE_KEY -} from "../LSP1UniversalReceiver/LSP1Constants.sol"; +} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol"; import { _LSP6KEY_ADDRESSPERMISSIONS_PREFIX -} from "../LSP6KeyManager/LSP6Constants.sol"; +} from "@lukso/lsp6-contracts/contracts/LSP6Constants.sol"; import { _INTERFACEID_LSP9, _TYPEID_LSP9_VALUE_RECEIVED, @@ -59,17 +63,19 @@ import { _TYPEID_LSP9_OwnershipTransferred_SenderNotification, _TYPEID_LSP9_OwnershipTransferred_RecipientNotification } from "./LSP9Constants.sol"; -import {_INTERFACEID_LSP14} from "../LSP14Ownable2Step/LSP14Constants.sol"; +import { + _INTERFACEID_LSP14 +} from "@lukso/lsp14-contracts/contracts/LSP14Constants.sol"; import { _LSP17_EXTENSION_PREFIX -} from "../LSP17ContractExtension/LSP17Constants.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol"; // errors import {LSP1DelegateNotAllowedToSetDataKey} from "./LSP9Errors.sol"; import { NoExtensionFoundForFunctionSelector -} from "../LSP17ContractExtension/LSP17Errors.sol"; +} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Errors.sol"; /** * @title Core Implementation of LSP9Vault built on top of [ERC725], [LSP1UniversalReceiver] diff --git a/contracts/LSP9Vault/LSP9VaultInit.sol b/packages/lsp9-contracts/contracts/LSP9VaultInit.sol similarity index 97% rename from contracts/LSP9Vault/LSP9VaultInit.sol rename to packages/lsp9-contracts/contracts/LSP9VaultInit.sol index 427275349..2e288e8ee 100644 --- a/contracts/LSP9Vault/LSP9VaultInit.sol +++ b/packages/lsp9-contracts/contracts/LSP9VaultInit.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.4; // modules -import {Version} from "../Version.sol"; +import {Version} from "./Version.sol"; import {LSP9VaultInitAbstract} from "./LSP9VaultInitAbstract.sol"; /** diff --git a/contracts/LSP9Vault/LSP9VaultInitAbstract.sol b/packages/lsp9-contracts/contracts/LSP9VaultInitAbstract.sol similarity index 95% rename from contracts/LSP9Vault/LSP9VaultInitAbstract.sol rename to packages/lsp9-contracts/contracts/LSP9VaultInitAbstract.sol index 97f67ac1c..e25815ebd 100644 --- a/contracts/LSP9Vault/LSP9VaultInitAbstract.sol +++ b/packages/lsp9-contracts/contracts/LSP9VaultInitAbstract.sol @@ -11,7 +11,7 @@ import { import {LSP9VaultCore} from "./LSP9VaultCore.sol"; // libraries -import {LSP1Utils} from "../LSP1UniversalReceiver/LSP1Utils.sol"; +import {LSP1Utils} from "@lukso/lsp1-contracts/contracts/LSP1Utils.sol"; // constants import { @@ -19,7 +19,7 @@ import { _LSP9_SUPPORTED_STANDARDS_VALUE, _TYPEID_LSP9_VALUE_RECEIVED, _TYPEID_LSP9_OwnershipTransferred_RecipientNotification -} from "../LSP9Vault/LSP9Constants.sol"; +} from "./LSP9Constants.sol"; /** * @title Inheritable Proxy Implementation of LSP9Vault built on top of ERC725, LSP1UniversalReceiver diff --git a/packages/lsp9-contracts/contracts/Version.sol b/packages/lsp9-contracts/contracts/Version.sol new file mode 100644 index 000000000..58a3f0925 --- /dev/null +++ b/packages/lsp9-contracts/contracts/Version.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +abstract contract Version { + /** + * @dev Get the version of the contract. + * @notice Contract version. + * + * @return The version of the the contract. + */ + // DO NOT CHANGE + // Comments block below is used by release-please to automatically update the version in this file. + // x-release-please-start-version + string public constant VERSION = "0.14.0"; + + // x-release-please-end +} diff --git a/packages/lsp9-contracts/hardhat.config.ts b/packages/lsp9-contracts/hardhat.config.ts new file mode 100644 index 000000000..5936de04e --- /dev/null +++ b/packages/lsp9-contracts/hardhat.config.ts @@ -0,0 +1,131 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [ + 'LSP9Vault', // Standard version + 'LSP9VaultInit', // Proxy version + ], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/lsp9-contracts/index.ts b/packages/lsp9-contracts/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/packages/lsp9-contracts/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/packages/lsp9-contracts/package.json b/packages/lsp9-contracts/package.json new file mode 100644 index 000000000..ccac59e84 --- /dev/null +++ b/packages/lsp9-contracts/package.json @@ -0,0 +1,54 @@ +{ + "name": "@lukso/lsp9-contracts", + "version": "0.12.1", + "description": "Package for the LSP9 Vault standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@lukso/lsp1-contracts": "*", + "@lukso/lsp6-contracts": "*" + } +} diff --git a/packages/lsp9-contracts/tsconfig.json b/packages/lsp9-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/lsp9-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/packages/universalprofile-contracts/.eslintrc.js b/packages/universalprofile-contracts/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/universalprofile-contracts/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/universalprofile-contracts/.solhint.json b/packages/universalprofile-contracts/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/universalprofile-contracts/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/packages/universalprofile-contracts/README.md b/packages/universalprofile-contracts/README.md new file mode 100644 index 000000000..0a89a85cd --- /dev/null +++ b/packages/universalprofile-contracts/README.md @@ -0,0 +1,16 @@ +# Universal Profile · [![npm version](https://img.shields.io/npm/v/@lukso/universalprofile-contracts.svg?style=flat)](https://www.npmjs.com/package/@lukso/universalprofile-contracts) + +Smart Contract implementation for **Universal Profile**, a combination of LSP0 ERC725 Account and LSP3 Profile Metadata. + +## Solidity constants + +The constants related to LSP3 Profile Metadata can be directly imported from the `Constants.sol` file. + + +```solidity +import { + _LSP3_SUPPORTED_STANDARDS_KEY, + _LSP3_SUPPORTED_STANDARDS_VALUE, + _LSP3_PROFILE_KEY +} from "universalprofile/contracts/Constants.sol"; +``` diff --git a/packages/universalprofile-contracts/contracts/Constants.sol b/packages/universalprofile-contracts/contracts/Constants.sol new file mode 100644 index 000000000..71a798e0a --- /dev/null +++ b/packages/universalprofile-contracts/contracts/Constants.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +/// @dev This files makes constants related to LSP3 Profile Metadata available to be imported +/// directly from the UniversalProfile package. + +// solhint-disable no-unused-import +import { + _LSP3_SUPPORTED_STANDARDS_KEY, + _LSP3_SUPPORTED_STANDARDS_VALUE, + _LSP3_PROFILE_KEY +} from "@lukso/lsp3-contracts/contracts/LSP3Constants.sol"; + +// solhint-enable diff --git a/contracts/UniversalProfile.sol b/packages/universalprofile-contracts/contracts/UniversalProfile.sol similarity index 90% rename from contracts/UniversalProfile.sol rename to packages/universalprofile-contracts/contracts/UniversalProfile.sol index 027c5cd34..130ea8369 100644 --- a/contracts/UniversalProfile.sol +++ b/packages/universalprofile-contracts/contracts/UniversalProfile.sol @@ -2,13 +2,15 @@ pragma solidity ^0.8.4; // modules -import {LSP0ERC725Account} from "./LSP0ERC725Account/LSP0ERC725Account.sol"; +import { + LSP0ERC725Account +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725Account.sol"; // constants import { _LSP3_SUPPORTED_STANDARDS_KEY, _LSP3_SUPPORTED_STANDARDS_VALUE -} from "./LSP3ProfileMetadata/LSP3Constants.sol"; +} from "@lukso/lsp3-contracts/contracts/LSP3Constants.sol"; /** * @title implementation of a LUKSO's Universal Profile based on LSP3 diff --git a/contracts/UniversalProfileInit.sol b/packages/universalprofile-contracts/contracts/UniversalProfileInit.sol similarity index 100% rename from contracts/UniversalProfileInit.sol rename to packages/universalprofile-contracts/contracts/UniversalProfileInit.sol diff --git a/contracts/UniversalProfileInitAbstract.sol b/packages/universalprofile-contracts/contracts/UniversalProfileInitAbstract.sol similarity index 92% rename from contracts/UniversalProfileInitAbstract.sol rename to packages/universalprofile-contracts/contracts/UniversalProfileInitAbstract.sol index f49f14203..3e414ee02 100644 --- a/contracts/UniversalProfileInitAbstract.sol +++ b/packages/universalprofile-contracts/contracts/UniversalProfileInitAbstract.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.4; // modules import { LSP0ERC725AccountInitAbstract -} from "./LSP0ERC725Account/LSP0ERC725AccountInitAbstract.sol"; +} from "@lukso/lsp0-contracts/contracts/LSP0ERC725AccountInitAbstract.sol"; // constants import { _LSP3_SUPPORTED_STANDARDS_KEY, _LSP3_SUPPORTED_STANDARDS_VALUE -} from "./LSP3ProfileMetadata/LSP3Constants.sol"; +} from "@lukso/lsp3-contracts/contracts/LSP3Constants.sol"; /** * @title Inheritable Proxy implementation of a LUKSO's Universal Profile based on LSP3 diff --git a/packages/universalprofile-contracts/contracts/Version.sol b/packages/universalprofile-contracts/contracts/Version.sol new file mode 100644 index 000000000..58a3f0925 --- /dev/null +++ b/packages/universalprofile-contracts/contracts/Version.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +abstract contract Version { + /** + * @dev Get the version of the contract. + * @notice Contract version. + * + * @return The version of the the contract. + */ + // DO NOT CHANGE + // Comments block below is used by release-please to automatically update the version in this file. + // x-release-please-start-version + string public constant VERSION = "0.14.0"; + + // x-release-please-end +} diff --git a/packages/universalprofile-contracts/hardhat.config.ts b/packages/universalprofile-contracts/hardhat.config.ts new file mode 100644 index 000000000..892bd2412 --- /dev/null +++ b/packages/universalprofile-contracts/hardhat.config.ts @@ -0,0 +1,131 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [ + 'UniversalProfile', // Standard version + 'UniversalProfileInit', // Proxy version + ], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/universalprofile-contracts/package.json b/packages/universalprofile-contracts/package.json new file mode 100644 index 000000000..e46a0ed58 --- /dev/null +++ b/packages/universalprofile-contracts/package.json @@ -0,0 +1,49 @@ +{ + "name": "@lukso/universalprofile-contracts", + "version": "0.12.1", + "description": "Package for Universal Profile, an implementation of LSP0 ERC725 Account & LSP3 Profile Metadata standards combined together.", + "license": "Apache-2.0", + "author": "", + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "./README.md" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@lukso/lsp0-contracts": "*", + "@lukso/lsp3-contracts": "*" + } +} diff --git a/packages/universalprofile-contracts/tsconfig.json b/packages/universalprofile-contracts/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/universalprofile-contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/publish.mjs b/publish.mjs new file mode 100644 index 000000000..5cd7b06bd --- /dev/null +++ b/publish.mjs @@ -0,0 +1,12 @@ +#!/usr/bin/env node +import { readFile } from 'fs/promises'; +import { $ } from 'zx'; + +const outputs = JSON.parse(await readFile(process.argv[2], 'utf-8')); +for (const key in outputs) { + const value = outputs[key]; + const match = key.match(/^(.*\/.*)--release_created$/); + if (!match || !value) continue; + const workspace = match[1]; + await $`npm publish --workspace=./${workspace} --no-git-checks --access public`; +} diff --git a/release-please-config.json b/release-please-config.json index 399b7e0f9..7ebc7ec81 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -1,13 +1,201 @@ { "packages": { - ".": { - "changelog-path": "CHANGELOG.md", + "packages/lsp-smart-contracts": { + "component": "lsp-smart-contracts", + "package-name": "@lukso/lsp-smart-contracts", + "include-component-in-tag": true, "release-type": "node", "bump-minor-pre-major": true, "bump-patch-for-minor-pre-major": false, "draft": false, - "prerelease": false, - "extra-files": ["contracts/Version.sol"] + "prerelease-type": "rc" + }, + "packages/lsp0-contracts": { + "component": "lsp0-contracts", + "package-name": "@lukso/lsp0-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc", + "extra-files": ["./packages/lsp0-contracts/contracts/Version.sol"] + }, + "packages/lsp1-contracts": { + "component": "lsp1-contracts", + "package-name": "@lukso/lsp1-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp1delegate-contracts": { + "component": "lsp1delegate-contracts", + "package-name": "@lukso/lsp1delegate-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc", + "extra-files": ["./packages/lsp1delegate-contracts/contracts/Version.sol"] + }, + "packages/lsp2-contracts": { + "component": "lsp2-contracts", + "package-name": "@lukso/lsp2-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp3-contracts": { + "component": "lsp3-contracts", + "package-name": "@lukso/lsp3-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp4-contracts": { + "component": "lsp4-contracts", + "package-name": "@lukso/lsp4-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp5-contracts": { + "component": "lsp5-contracts", + "package-name": "@lukso/lsp5-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp6-contracts": { + "component": "lsp6-contracts", + "package-name": "@lukso/lsp6-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc", + "extra-files": ["./packages/lsp6-contracts/contracts/Version.sol"] + }, + "packages/lsp7-contracts": { + "component": "lsp7-contracts", + "package-name": "@lukso/lsp7-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp8-contracts": { + "component": "lsp8-contracts", + "package-name": "@lukso/lsp8-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp9-contracts": { + "component": "lsp9-contracts", + "package-name": "@lukso/lsp9-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc", + "extra-files": ["./packages/lsp9-contracts/contracts/Version.sol"] + }, + "packages/lsp10-contracts": { + "component": "lsp10-contracts", + "package-name": "@lukso/lsp10-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp12-contracts": { + "component": "lsp12-contracts", + "package-name": "@lukso/lsp12-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp14-contracts": { + "component": "lsp14-contracts", + "package-name": "@lukso/lsp14-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp16-contracts": { + "component": "lsp16-contracts", + "package-name": "@lukso/lsp16-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp17-contracts": { + "component": "lsp17-contracts", + "package-name": "@lukso/lsp17-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" + }, + "packages/lsp17contractextension-contracts": { + "component": "lsp17contractextension-contracts", + "package-name": "@lukso/lsp17contractextension-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc", + "extra-files": [ + "./packages/lsp17contractextension-contracts/contracts/Version.sol" + ] + }, + "packages/lsp23-contracts": { + "component": "lsp23-contracts", + "package-name": "@lukso/lsp23-contracts", + "include-component-in-tag": true, + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease-type": "rc" } }, "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" diff --git a/remappings.txt b/remappings.txt index ca89288f2..56afbcc7b 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,6 +1,4 @@ -@erc725/smart-contracts/=node_modules/@erc725/smart-contracts/ -@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ -@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/ +@=node_modules/@ eth-gas-reporter/=node_modules/eth-gas-reporter/ forge-std/=lib/forge-std/src/ hardhat-deploy/=node_modules/hardhat-deploy/ diff --git a/template/.eslintrc.js b/template/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/template/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/template/.solhint.json b/template/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/template/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "rules": { + "avoid-sha3": "error", + "avoid-suicide": "error", + "avoid-throw": "error", + "avoid-tx-origin": "error", + "check-send-result": "error", + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "not-rely-on-block-hash": "error", + "not-rely-on-time": "error", + "reentrancy": "error", + "constructor-syntax": "error", + "private-vars-leading-underscore": ["error", { "strict": false }], + "imports-on-top": "error", + "visibility-modifier-order": "error", + "no-unused-import": "error", + "no-global-import": "error", + "reason-string": ["warn", { "maxLength": 120 }], + "avoid-low-level-calls": "off", + "no-empty-blocks": ["error", { "ignoreConstructors": true }], + "custom-errors": "off" + } +} diff --git a/template/README.md b/template/README.md new file mode 100644 index 000000000..44c90d86b --- /dev/null +++ b/template/README.md @@ -0,0 +1,51 @@ +# LSP Package Template + +This project can be used as a skeleton to build a package for a LSP implementation in Solidity (LUKSO Standard Proposal) + +It is based on Hardhat. + +## How to setup a LSP as a package? + +1. Copy the `template/` folder and paste it under the `packages/` folder. Then rename this `template/` folder that you copied with the LSP name. + +You can do so either: + +- manually, by copying the folder and pasting it inside `packages` and then renaming it. + or +- by running the following command from the root of the repository. + +```bash +cp -r template packages/lsp-name +``` + +2. Update the `"name"` and `"description"` field inside the `package.json` for this LSP package you just created. + +3. Setup the dependencies + +If this LSP uses external dependencies like `@openzeppelin/contracts`, put them under `dependencies` with the version number. + +```json +"@openzeppelin/contracts": "^4.9.3" +``` + +If this LSP uses other LSP as dependencies, put each LSP dependency as shown below. This will use the current code in the package: + +```json +"@lsp2": "*" +``` + +4. Setup the npm commands for linting, building, testing, etc... under the `"scripts"` in the `package.json` + +5. Test that all commands you setup run successfully + +By running the commands below, your LSP package should come up in the list of packages that Turbo is running this command for. + +```bash +turbo build +turbo lint +turbo lint:solidity +turbo test +turbo test:foundry +``` + +6. Finally update the relevant information in the `README.md` file in the folder of the newly created package, such as the title at the top, some description, etc... diff --git a/template/build.config.ts b/template/build.config.ts new file mode 100644 index 000000000..71798d1ff --- /dev/null +++ b/template/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: ['./constants'], + declaration: 'compatible', // generate .d.ts files + rollup: { + emitCJS: true, + }, +}); diff --git a/template/constants.ts b/template/constants.ts new file mode 100644 index 000000000..7ae3bf471 --- /dev/null +++ b/template/constants.ts @@ -0,0 +1,4 @@ +// Define your constants to be exported here + +// example +export const LSPN_CONSTANT_VALUE = 123; diff --git a/template/hardhat.config.ts b/template/hardhat.config.ts new file mode 100644 index 000000000..1f9e172b9 --- /dev/null +++ b/template/hardhat.config.ts @@ -0,0 +1,128 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import { NetworkUserConfig } from 'hardhat/types'; +import { config as dotenvConfig } from 'dotenv'; +import { resolve } from 'path'; + +/** + * this package includes: + * - @nomiclabs/hardhat-ethers + * - @nomicfoundation/hardhat-chai-matchers + * - @nomicfoundation/hardhat-network-helpers + * - @nomiclabs/hardhat-etherscan + * - hardhat-gas-reporter (is this true? Why do we have it as a separate dependency?) + * - @typechain/hardhat + * - solidity-coverage + */ +import '@nomicfoundation/hardhat-toolbox'; + +// additional hardhat plugins +import 'hardhat-packager'; +import 'hardhat-contract-sizer'; +import 'hardhat-deploy'; + +// custom built hardhat plugins and scripts +// can be imported here (e.g: docs generation, gas benchmark, etc...) + +dotenvConfig({ path: resolve(__dirname, './.env') }); + +function getTestnetChainConfig(): NetworkUserConfig { + const config: NetworkUserConfig = { + live: true, + url: 'https://rpc.testnet.lukso.network', + chainId: 4201, + }; + + if (process.env.CONTRACT_VERIFICATION_TESTNET_PK !== undefined) { + config['accounts'] = [process.env.CONTRACT_VERIFICATION_TESTNET_PK]; + } + + return config; +} + +const config: HardhatUserConfig = { + defaultNetwork: 'hardhat', + networks: { + hardhat: { + live: false, + saveDeployments: false, + allowBlocksWithSameTimestamp: true, + }, + luksoTestnet: getTestnetChainConfig(), + }, + namedAccounts: { + owner: 0, + }, + // uncomment if the contracts from this LSP package must be deployed at deterministic + // // addresses across multiple chains + // deterministicDeployment: { + // luksoTestnet: { + // // Nick Factory. See https://github.com/Arachnid/deterministic-deployment-proxy + // factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c', + // deployer: '0x3fab184622dc19b6109349b94811493bf2a45362', + // funding: '0x0000000000000000000000000000000000000000000000000000000000000000', + // signedTx: + // '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222', + // }, + // }, + etherscan: { + apiKey: 'no-api-key-needed', + customChains: [ + { + network: 'luksoTestnet', + chainId: 4201, + urls: { + apiURL: 'https://api.explorer.execution.testnet.lukso.network/api', + browserURL: 'https://explorer.execution.testnet.lukso.network/', + }, + }, + ], + }, + gasReporter: { + enabled: true, + currency: 'USD', + gasPrice: 21, + excludeContracts: ['Helpers/'], + src: './contracts', + showMethodSig: true, + }, + solidity: { + version: '0.8.17', + settings: { + optimizer: { + enabled: true, + /** + * Optimize for how many times you intend to run the code. + * Lower values will optimize more for initial deployment cost, higher + * values will optimize more for high-frequency usage. + * @see https://docs.soliditylang.org/en/v0.8.6/internals/optimizer.html#opcode-based-optimizer-module + */ + runs: 1000, + }, + outputSelection: { + '*': { + '*': ['storageLayout'], + }, + }, + }, + }, + packager: { + // What contracts to keep the artifacts and the bindings for. + contracts: [], + // Whether to include the TypeChain factories or not. + // If this is enabled, you need to run the TypeChain files through the TypeScript compiler before shipping to the registry. + includeFactories: true, + }, + paths: { + artifacts: 'artifacts', + tests: 'tests', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/template/index.ts b/template/index.ts new file mode 100644 index 000000000..c94f80f84 --- /dev/null +++ b/template/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/template/package.json b/template/package.json new file mode 100644 index 000000000..eb65c9d2b --- /dev/null +++ b/template/package.json @@ -0,0 +1,56 @@ +{ + "name": "lspN", + "version": "0.12.1", + "description": "Package for the LSPN standard", + "license": "Apache-2.0", + "author": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "typings": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.mjs", + "types": "./dist/index.d.ts" + }, + "./artifacts/*": "./artifacts/*", + "./package.json": "./package.json" + }, + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "files": [ + "contracts/**/*.sol", + "!contracts/Mocks/**/*.sol", + "artifacts/*.json", + "dist", + "types", + "!types/factories", + "./README.md" + ], + "scripts": { + "package": "hardhat prepare-package", + "build": "hardhat compile --show-stack-traces", + "build:foundry": "forge build", + "build:js": "unbuild", + "build:types": "npx typechain --target=ethers-v6 ./artifacts/*.json --out-dir types", + "clean": "hardhat clean && rm -Rf dist/", + "format": "prettier --write .", + "lint": "eslint . --ext .ts,.js", + "lint:solidity": "solhint 'contracts/**/*.sol' && prettier --check 'contracts/**/*.sol'", + "test": "hardhat test --no-compile tests/*.test.ts", + "test:foundry": "FOUNDRY_PROFILE=lspN forge test --no-match-test Skip -vvv", + "test:coverage": "hardhat coverage" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3" + } +} diff --git a/template/tsconfig.json b/template/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/template/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/tests/Mocks/AddressRegistry.test.ts b/tests/Mocks/AddressRegistry.test.ts deleted file mode 100644 index 672cc7c11..000000000 --- a/tests/Mocks/AddressRegistry.test.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { ethers } from 'hardhat'; -import { expect } from 'chai'; -import { - AddressRegistry, - AddressRegistryRequiresERC725, - AddressRegistryRequiresERC725__factory, - AddressRegistry__factory, - UniversalProfile, - UniversalProfile__factory, -} from '../../types'; - -describe('Address Registry contracts', () => { - let addressRegistry: AddressRegistry; - let accounts: SignerWithAddress[]; - - before(async () => { - accounts = await ethers.getSigners(); - addressRegistry = await new AddressRegistry__factory(accounts[1]).deploy(); - }); - - describe('AddressRegistry', () => { - it('add address', async () => { - await addressRegistry.addAddress(accounts[1].address); - expect(await addressRegistry.getAddress(0)).to.equal(accounts[1].address); - }); - - it('add same address', async () => { - expect(await addressRegistry.containsAddress(accounts[1].address)).to.be.true; - - await addressRegistry.addAddress(accounts[1].address); - expect(await addressRegistry.getAddress(0)).to.equal(accounts[1].address); - }); - - it('should add and remove address', async () => { - await addressRegistry.addAddress(accounts[4].address); - expect(await addressRegistry.containsAddress(accounts[4].address)).to.be.true; - - await addressRegistry.removeAddress(accounts[4].address); - expect(await addressRegistry.containsAddress(accounts[4].address)).to.be.false; - }); - - it('should give the right count', async () => { - expect(await addressRegistry.length()).to.equal('1'); - // add new entry - await addressRegistry.addAddress(accounts[2].address); - expect(await addressRegistry.length()).to.equal('2'); - }); - - it('get correct index', async () => { - expect(await addressRegistry.getIndex(accounts[1].address)).to.equal('0'); - expect(await addressRegistry.getIndex(accounts[2].address)).to.equal('1'); - - await expect(addressRegistry.getIndex(accounts[4].address)).to.be.revertedWith( - 'EnumerableSet: Index not found', - ); - }); - - it('can list all values of the registry', async () => { - const length = await (await addressRegistry.length()).toNumber(); - const values = []; - - for (let i = 0; i < length; i++) { - values.push(await addressRegistry.getAddress(i)); - } - - expect(values).to.deep.equal([accounts[1].address, accounts[2].address]); - }); - - it('can get all raw values in one call', async () => { - expect(await addressRegistry.getAllRawValues()).to.deep.equal([ - '0x000000000000000000000000' + accounts[1].address.replace('0x', '').toLowerCase(), - '0x000000000000000000000000' + accounts[2].address.replace('0x', '').toLowerCase(), - ]); - }); - }); - - // Require ERC725 - describe('AddressRegistryRequiresERC725', () => { - let addressRegistryRequireERC725: AddressRegistryRequiresERC725, - account: UniversalProfile, - owner: SignerWithAddress; - - before(async () => { - owner = accounts[3]; - account = await new UniversalProfile__factory(owner).deploy(owner.address); - addressRegistryRequireERC725 = await new AddressRegistryRequiresERC725__factory( - owner, - ).deploy(); - }); - - it('add address', async () => { - const abi = addressRegistryRequireERC725.interface.encodeFunctionData('addAddress', [ - account.address, - ]); - - await account.connect(owner).execute(0, addressRegistryRequireERC725.address, 0, abi, { - gasLimit: 3_000_000, - }); - expect(await addressRegistryRequireERC725.getAddress(0)).to.equal(account.address); - }); - - it('external account adds address', async () => { - await addressRegistryRequireERC725.connect(accounts[5]).addAddress(account.address); - expect(await addressRegistryRequireERC725.getAddress(0)).to.equal(account.address); - }); - - it('remove address', async () => { - const abi = addressRegistryRequireERC725.interface.encodeFunctionData('removeAddress', [ - account.address, - ]); - - await account.connect(owner).execute(0, addressRegistryRequireERC725.address, 0, abi); - expect(await addressRegistryRequireERC725.containsAddress(account.address)).to.equal(false); - }); - - it('should fail if called by a regular address', async () => { - // simply reverts as no ERC165 is detected - await expect(addressRegistryRequireERC725.addAddress(accounts[5].address)).to.be.reverted; - }); - }); -}); diff --git a/tests/Mocks/NFTStorage.test.ts b/tests/Mocks/NFTStorage.test.ts deleted file mode 100644 index acb753814..000000000 --- a/tests/Mocks/NFTStorage.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import keccak256 from 'keccak256'; -import { MerkleTree } from 'merkletreejs'; - -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { ethers } from 'hardhat'; -import { expect } from 'chai'; -import { NFTStorageMerkle, NFTStorageMerkle__factory } from '../../types'; - -describe('NFTStorageMerkle', () => { - describe('Testing Merkle Tree', () => { - let accounts: SignerWithAddress[]; - let owner, nftList; - - let nftStorage: NFTStorageMerkle; - let leaves; - let merkletree; - - before(async () => { - accounts = await ethers.getSigners(); - owner = accounts[0]; - nftList = [ - accounts[1].address, - accounts[2].address, - accounts[3].address, - accounts[4].address, // verify this leaf - accounts[5].address, - accounts[6].address, - accounts[7].address, - accounts[8].address, - ]; - - nftStorage = await new NFTStorageMerkle__factory(owner).deploy(); - - leaves = nftList.map((x) => keccak256(x)); - merkletree = new MerkleTree(leaves, keccak256, { sortPairs: true }); - }); - - it('Should return 8 for leaves count', () => { - const count = merkletree.getHexLeaves().length; - expect(count).to.equal(8); - }); - - it('Keccak256 hash should match for the first NFT address', async () => { - const firstNFT = merkletree.getHexLeaves()[0]; - - expect(firstNFT).to.equal(ethers.utils.keccak256(nftList[0])); - }); - - it('Should verify the proof in the smart contract', async () => { - const root = merkletree.getHexRoot(); - const leaf = merkletree.getHexLeaves()[3]; - const proof = merkletree.getHexProof(leaf); - - const result = await nftStorage.callStatic.verifyMerkleProof(proof, root, leaf); - expect(result).to.be.true; - }); - }); -}); diff --git a/tests/importRequire.sh b/tests/importRequire.sh deleted file mode 100755 index aad4cf81e..000000000 --- a/tests/importRequire.sh +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env bash -rm -rf ./.test -mkdir ./.test -testdir="$(pwd)/.test" -trap "rm -rf $testdir" EXIT -RED="\033[31m" -GREEN="\033[32m" -YELLOW="\033[33m" -ENDCOLOR="\033[0m" - -if [ ! -f './dist/constants.cjs.js' ] -then - echo -e "${RED}Fail: No constants.cjs.js found${ENDCOLOR}" - exit 1 -fi -if [ ! -f './dist/constants.es.js' ] -then - echo -e "${RED}Fail: No constants.es.js found${ENDCOLOR}" - exit 1 -fi -if [ ! -f './package.json' ] -then - echo -e "${RED}Fail: No package.json found${ENDCOLOR}" - exit 1 -fi - -echo -e "${YELLOW}Packaging npm package${ENDCOLOR}" -npm pack - -PACK="$(pwd)/$(ls | grep -E "^lukso.*tgz$")" -if [ ! -f "$PACK" ] -then - echo -e "${RED}Fail: No tgz pack file found${ENDCOLOR}" - exit 1 -fi - -echo -e "${YELLOW}Creating test directory${ENDCOLOR}" -cd ./.test - -echo -e "${YELLOW}Creating package.json type=module${ENDCOLOR}" -cat > package.json < test.cjs < test.ts < tsconfig.json < Date: Mon, 4 Mar 2024 09:27:11 -0700 Subject: [PATCH 24/29] docs: improve documentation for releasing specific packages --- RELEASE.md | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index cbef62462..26b196273 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -37,15 +37,15 @@ The following commit prefixes will result in changes in the CHANGELOG: When a commit to the main branch has `Release-As: x.x.x` (case insensitive) in the **commit body**, Release Please will open a new pull request for the specified version. -`git commit --allow-empty -m "chore: release 2.0.0" -m "Release-As: 2.0.0"` results in the following commit message: +`git commit --allow-empty -m "chore: release lsp-smart-contracts 2.0.0" -m "Release-As: 2.0.0"` results in the following commit message: ```txt -chore: release 2.0.0 +chore: release lsp-smart-contracts 2.0.0 Release-As: 2.0.0 ``` -The following [commit pattern](https://github.com/googleapis/release-please/blob/main/docs/customizing.md#pull-request-title) can also be specified to instruct release-please to trigger a specific release for a specific package. +The following [commit pattern](https://github.com/googleapis/release-please/blob/main/docs/customizing.md#pull-request-title) must be specified: ``` chore: release${component} ${version} @@ -56,33 +56,54 @@ Where: - `${component}`: the name of the LSP package listed under `packages/` to release. - `${version}`: the version number to release for. +Depending on the pattern, you can instruct to: + +- either release the full `@lukso/lsp-smart-contracts` package +- or instruct release-please to trigger a specific release for a specific package like `@lukso/lsp7-contracts` for the LSP7 contracts only. + _Example:_ -A common release pull request title would be: +A common release pull request title for the `@lukso/lsp-smart-contracts` (the "umbrella" package that contains all the LSPs) would be: ``` chore: release lsp-smart-contracts v0.15.0 ``` +A common release pull request title for a specific package only like `@lukso/lsp7-contracts` (only the contracts related to LSP7) would be: + +``` +chore: release lsp7-contracts v0.15.0 +``` + ## Creating pre-release We use the suffix `-rc` to specify release versions that are not ready for production and may be unstable. This usually takes the following pattern as an example: `@lukso/lsp7-contracts-v0.15.0-rc.0`. Each pre-release can then in turn be incremented as `rc.1`, `rc.2`, etc... If you would like to publish a package as a pre-release version, you can enforce it by: -1. creating a commit that includes the following pattern (for example): +1. First, create a commit that includes the following pattern. + +_Example for the whole `@lukso/lsp-smart-contracts` repository that contains all the packages:_ ``` -chore: release lsp-smart-contracts v0.15.0-rc.0 +chore: release lsp-smart-contracts 0.15.0-rc.0 ``` -2. specifying the following fields for this package under the `.release-please-manifest.json`. +_Example for only a specific package like `@lukso/lsp7-contracts` to only create a pre-release of the LSP7 contracts:_ + +2. Then specify the following fields for this package under the `.release-please-manifest.json`. ```json "prerelease-type": "rc", "prerelease": true ``` +3. Finally, make an empty commit like the commands above: + +``` +git commit --allow-empty -m "chore: release lsp-smart-contracts 0.15.0-rc.0" -m "Release-As: 0.15.0-rc.0" +``` + Pre-releases will show up with a "Pre-Release" badge on the [list of Github Releases](https://github.com/lukso-network/lsp-smart-contracts/releases) of the repository. ## How can I fix release notes? From c75470bec7bac91c1e67e605efb9b3b10c434422 Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:55:56 -0700 Subject: [PATCH 25/29] chore: release lsp-smart-contracts 0.15.0-rc.0 (#903) Release-As: lsp-smart-contracts-v0.15.0-rc.0 From c88549256c7a715b8e85d3dd100641f4460e0a8e Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:56:36 -0700 Subject: [PATCH 26/29] chore: release lsp7-contracts 0.15.0-rc.0 (#904) Release-As: lsp7-contracts-v0.15.0-rc.0 From 7dd1a1f380dc938f44cc41298f08667f2be2b59f Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:56:44 -0700 Subject: [PATCH 27/29] chore: release lsp8-contracts 0.15.0-rc.0 (#905) Release-As: lsp8-contracts-v0.15.0-rc.0 From b5846a5772577eb03abd815283075d45c0bb991c Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Tue, 5 Mar 2024 11:38:44 -0700 Subject: [PATCH 28/29] chore: try resolve merge conflicts for `package.json` from `develop` to `main` (#907) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3ffb7bbdc..b228ff694 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@lukso/lsp-smart-contracts-monorepo", + "version": "0.14.0", "description": "The reference smart contract implementation for the LUKSO LSP standards", - "version": "0.12.1", "private": true, "npmClient": "npm", "author": "", From 122556dcbb28ff10338144cf3c0468735cfe6f05 Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:28:58 -0700 Subject: [PATCH 29/29] Merge branch 'main' into resolve-conflicts-main (as cherry-pick) (#908) Co-authored-by: Andreas Richter <708186+richtera@users.noreply.github.com> --- package-lock.json | 1298 +++++++++++++++++++++++---------------------- 1 file changed, 654 insertions(+), 644 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8efb1989..7c487cb96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@lukso/lsp-smart-contracts-monorepo", - "version": "0.12.1", + "version": "0.14.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@lukso/lsp-smart-contracts-monorepo", - "version": "0.12.1", + "version": "0.14.0", "hasInstallScript": true, "license": "Apache-2.0", "workspaces": [ @@ -86,17 +86,26 @@ "dev": true }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@b00ste/hardhat-dodoc": { "version": "0.3.16", "resolved": "https://registry.npmjs.org/@b00ste/hardhat-dodoc/-/hardhat-dodoc-0.3.16.tgz", @@ -141,20 +150,20 @@ } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -196,9 +205,9 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", - "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -303,9 +312,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "engines": { "node": ">=6.9.0" } @@ -357,13 +366,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -383,9 +392,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -394,12 +403,12 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", - "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", "dependencies": { "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "babel-plugin-polyfill-corejs2": "^0.4.8", "babel-plugin-polyfill-corejs3": "^0.9.0", "babel-plugin-polyfill-regenerator": "^0.5.5", @@ -413,9 +422,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -424,9 +433,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.9.tgz", - "integrity": "sha512-oeOFTrYWdWXCvXGB5orvMTJ6gCZ9I6FBjR+M38iKNXCsPxr4xT0RTdg5uz1H7QP8pp74IzPtwritEr+JscqHXQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.0.tgz", + "integrity": "sha512-HxiRMOncx3ly6f3fcZ1GVKf+/EROcI9qwPgmij8Czqy6Okm/0T37T4y2ZIlLUuEUFjtM7NRsfdCO8Y3tAiJZew==", "dev": true, "dependencies": { "core-js-pure": "^3.30.2", @@ -437,22 +446,22 @@ } }, "node_modules/@babel/standalone": { - "version": "7.23.10", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.23.10.tgz", - "integrity": "sha512-xqWviI/pt1Zb/d+6ilWa5IDL2mkDzsBnlHbreqnfyP3/QB/ofQ1bNVcHj8YQX154Rf/xZKR6y0s1ydVF3nAS8g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.24.0.tgz", + "integrity": "sha512-yIZ/X3EAASgX/MW1Bn8iZKxCwixgYJAUaIScoZ9C6Gapw5l3eKIbtVSgO/IGldQed9QXm22yurKVWyWj5/j+SQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -471,9 +480,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -481,8 +490,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -511,9 +520,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -1824,9 +1833,9 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "dev": true, "engines": { "node": ">=14" @@ -1871,18 +1880,27 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", - "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1892,9 +1910,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -1908,6 +1926,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2127,136 +2146,186 @@ "node": ">= 8" } }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz", - "integrity": "sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==", + "node_modules/@nomicfoundation/edr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.2.1.tgz", + "integrity": "sha512-Dleau3ItHJh2n85G2J6AIPBoLgu/mOWkmrh26z3VsJE2tp/e00hUk/dqz85ncsVcBYEc6/YOn/DomWu0wSF9tQ==", "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "ethereum-cryptography": "0.1.3" + "engines": { + "node": ">= 18" }, + "optionalDependencies": { + "@nomicfoundation/edr-darwin-arm64": "0.2.1", + "@nomicfoundation/edr-darwin-x64": "0.2.1", + "@nomicfoundation/edr-linux-arm64-gnu": "0.2.1", + "@nomicfoundation/edr-linux-arm64-musl": "0.2.1", + "@nomicfoundation/edr-linux-x64-gnu": "0.2.1", + "@nomicfoundation/edr-linux-x64-musl": "0.2.1", + "@nomicfoundation/edr-win32-arm64-msvc": "0.2.1", + "@nomicfoundation/edr-win32-ia32-msvc": "0.2.1", + "@nomicfoundation/edr-win32-x64-msvc": "0.2.1" + } + }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.2.1.tgz", + "integrity": "sha512-aMYaRaZVQ/TmyNJIoXf1bU4k0zfinaL9Sy1day4yGlL6eiQPFfRGj9W6TZaZIoYG0XTx/mQWD7dkXJ7LdrleJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz", - "integrity": "sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==", + "node_modules/@nomicfoundation/edr-darwin-x64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.2.1.tgz", + "integrity": "sha512-ma0SLcjHm5L3nPHcKFJB0jv/gKGSKaxr5Z65rurX/eaYUQJ7YGMsb8er9bSCo9rjzOtxf4FoPj3grL3zGpOj8A==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.4", - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-ethash": "3.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "lru-cache": "^10.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", - "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.2.1.tgz", + "integrity": "sha512-NX3G4pBhRitWrjSGY3HTyCq3wKSm5YqrKVOCNQGl9/jcjSovqxlgzFMiTx4YZCzGntfJ/1om9AI84OWxYJjoDw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.4" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz", - "integrity": "sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==", + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.2.1.tgz", + "integrity": "sha512-gdQ3QHkt9XRkdtOGQ8fMwS11MXdjLeZgLrqoial4V4qtMaamIMMhVczK+VEvUhD8p7G4BVmp6kmkvcsthmndmw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "bigint-crypto-utils": "^3.2.2", - "ethereum-cryptography": "0.1.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz", - "integrity": "sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==", + "node_modules/@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.2.1.tgz", + "integrity": "sha512-OqabFY37vji6mYbLD9CvG28lja68czeVw58oWByIhFV3BpBu/cyP1oAbhzk3LieylujabS3Ekpvjw2Tkf0A9RQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-statemanager": "2.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "@types/debug": "^4.1.9", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "rustbn-wasm": "^0.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", - "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "node_modules/@nomicfoundation/edr-linux-x64-musl": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.2.1.tgz", + "integrity": "sha512-vHfFFK2EPISuQUQge+bdjXamb0EUjfl8srYSog1qfiwyLwLeuSbpyyFzDeITAgPpkkFuedTfJW553K0Hipspyg==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "rlp": "bin/rlp.cjs" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz", - "integrity": "sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==", + "node_modules/@nomicfoundation/edr-win32-arm64-msvc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.2.1.tgz", + "integrity": "sha512-K/mui67RCKxghbSyvhvW3rvyVN1pa9M1Q9APUx1PtWjSSdXDFpqEY1NYsv2syb47Ca8ObJwVMF+LvnB6GvhUOQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "js-sdsl": "^4.1.4", - "lru-cache": "^10.0.0" - }, - "peerDependencies": { - "@nomicfoundation/ethereumjs-verkle": "0.0.2" - }, - "peerDependenciesMeta": { - "@nomicfoundation/ethereumjs-verkle": { - "optional": true - } + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz", - "integrity": "sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==", + "node_modules/@nomicfoundation/edr-win32-ia32-msvc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.2.1.tgz", + "integrity": "sha512-HHK0mXEtjvfjJrJlqcYgQCy3lZIXS1KNl2GaP8bwEIuEwx++XxXs/ThLjPepM1nhCGICij8IGy7p3KrkzRelsw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.2.1.tgz", + "integrity": "sha512-FY4eQJdj1/y8ST0RyQycx63yr+lvdYNnUkzgWf4X+vPH1lOhXae+L2NDcNCQlTDAfQcD6yz0bkBUkLrlJ8pTww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "lru-cache": "^10.0.0", - "readable-stream": "^3.6.0" + "@nomicfoundation/ethereumjs-util": "9.0.4" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "dev": true, + "bin": { + "rlp": "bin/rlp.cjs" }, "engines": { "node": ">=18" @@ -2306,43 +2375,6 @@ } } }, - "node_modules/@nomicfoundation/ethereumjs-verkle": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz", - "integrity": "sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "lru-cache": "^10.0.0", - "rust-verkle-wasm": "^0.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz", - "integrity": "sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.4", - "@nomicfoundation/ethereumjs-blockchain": "7.0.4", - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-evm": "2.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-statemanager": "2.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.6.tgz", @@ -2631,14 +2663,14 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", - "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==" }, "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.5.tgz", - "integrity": "sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg==" + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz", + "integrity": "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==" }, "node_modules/@rollup/plugin-alias": { "version": "5.1.0", @@ -2834,9 +2866,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz", + "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==", "cpu": [ "arm" ], @@ -2848,9 +2880,9 @@ "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz", + "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==", "cpu": [ "arm64" ], @@ -2862,9 +2894,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz", + "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==", "cpu": [ "arm64" ], @@ -2876,9 +2908,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz", + "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==", "cpu": [ "x64" ], @@ -2890,9 +2922,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz", + "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==", "cpu": [ "arm" ], @@ -2904,9 +2936,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz", + "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==", "cpu": [ "arm64" ], @@ -2918,9 +2950,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz", + "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==", "cpu": [ "arm64" ], @@ -2932,9 +2964,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz", + "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==", "cpu": [ "riscv64" ], @@ -2946,9 +2978,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz", + "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==", "cpu": [ "x64" ], @@ -2960,9 +2992,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz", + "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==", "cpu": [ "x64" ], @@ -2974,9 +3006,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz", + "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==", "cpu": [ "arm64" ], @@ -2988,9 +3020,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz", + "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==", "cpu": [ "ia32" ], @@ -3002,9 +3034,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz", + "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==", "cpu": [ "x64" ], @@ -3814,12 +3846,12 @@ "dev": true }, "node_modules/@turbo/gen": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/@turbo/gen/-/gen-1.12.4.tgz", - "integrity": "sha512-3Z8KZ6Vnc2x6rr8sNJ4QNYpkAttLBfb91uPzDlFDY7vgJg+vfXT8YWyZznVL+19ZixF2C/F4Ucp4/YjG2e1drg==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/@turbo/gen/-/gen-1.12.5.tgz", + "integrity": "sha512-sEF/iryAcWYqONXcrAyWREUVPA4eba22hxU1yx4b9+Rs9SUNFkM54cDaXEAtzbh/iji428aQpnuxi+SUT7m9zw==", "dev": true, "dependencies": { - "@turbo/workspaces": "1.12.4", + "@turbo/workspaces": "1.12.5", "chalk": "2.4.2", "commander": "^10.0.0", "fs-extra": "^10.1.0", @@ -3836,9 +3868,9 @@ } }, "node_modules/@turbo/workspaces": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/@turbo/workspaces/-/workspaces-1.12.4.tgz", - "integrity": "sha512-a1hF8Nr6MOeCpvlLR569dGTlzgRLj2Rxo6dTb4jtL+jhHwCb94A9kDPgcRnYGFr45mgulICarVaNZxDjw4/riQ==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/@turbo/workspaces/-/workspaces-1.12.5.tgz", + "integrity": "sha512-UksAe6nxryEZoUr5IMUzt9bwsZLxccUnT469fI3OE5Xbd5fbInzLKIZ3ZuzFvXR4N7ezr2HCvkUItmgwe7k1HA==", "dev": true, "dependencies": { "chalk": "2.4.2", @@ -3991,15 +4023,6 @@ "@types/node": "*" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -4106,16 +4129,10 @@ "dev": true, "peer": true }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, "node_modules/@types/node": { - "version": "20.11.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.21.tgz", - "integrity": "sha512-/ySDLGscFPNasfqStUuWWPfL78jompfIoVzLJPVVAHBh6rpG68+pI2Gk+fNLeI8/f1yPYL4s46EleVIc20F1Ow==", + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dependencies": { "undici-types": "~5.26.4" } @@ -4140,22 +4157,6 @@ "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", "dev": true }, - "node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -5089,9 +5090,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", "dev": true, "funding": [ { @@ -5108,8 +5109,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -5268,15 +5269,6 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, - "node_modules/bigint-crypto-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -5792,9 +5784,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001591", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", - "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", + "version": "1.0.30001594", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", + "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", "funding": [ { "type": "opencollective", @@ -6525,12 +6517,12 @@ "dev": true }, "node_modules/cross-fetch": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", - "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, "dependencies": { - "node-fetch": "^2.6.7", - "whatwg-fetch": "^2.0.4" + "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { @@ -6630,12 +6622,12 @@ } }, "node_modules/cssnano": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.5.tgz", - "integrity": "sha512-tpTp/ukgrElwu3ESFY4IvWnGn8eTt8cJhC2aAbtA3lvUlxp6t6UPv8YCLjNnEGiFreT1O0LiOM1U3QyTBVFl2A==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.0.tgz", + "integrity": "sha512-e2v4w/t3OFM6HTuSweI4RSdABaqgVgHlJp5FZrQsopHnKKHLFIvK2D3C4kHWeFIycN/1L1J5VIrg5KlDzn3r/g==", "dev": true, "dependencies": { - "cssnano-preset-default": "^6.0.5", + "cssnano-preset-default": "^6.1.0", "lilconfig": "^3.1.1" }, "engines": { @@ -6650,40 +6642,41 @@ } }, "node_modules/cssnano-preset-default": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.5.tgz", - "integrity": "sha512-M+qRDEr5QZrfNl0B2ySdbTLGyNb8kBcSjuwR7WBamYBOEREH9t2efnB/nblekqhdGLZdkf4oZNetykG2JWRdZQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.0.tgz", + "integrity": "sha512-4DUXZoDj+PI3fRl3MqMjl9DwLGjcsFP4qt+92nLUcN1RGfw2TY+GwNoG2B38Usu1BrcTs8j9pxNfSusmvtSjfg==", "dev": true, "dependencies": { + "browserslist": "^4.23.0", "css-declaration-sorter": "^7.1.1", - "cssnano-utils": "^4.0.1", + "cssnano-utils": "^4.0.2", "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.0.3", - "postcss-convert-values": "^6.0.4", - "postcss-discard-comments": "^6.0.1", - "postcss-discard-duplicates": "^6.0.2", - "postcss-discard-empty": "^6.0.2", - "postcss-discard-overridden": "^6.0.1", - "postcss-merge-longhand": "^6.0.3", - "postcss-merge-rules": "^6.0.4", - "postcss-minify-font-values": "^6.0.2", - "postcss-minify-gradients": "^6.0.2", - "postcss-minify-params": "^6.0.3", - "postcss-minify-selectors": "^6.0.2", - "postcss-normalize-charset": "^6.0.1", - "postcss-normalize-display-values": "^6.0.1", - "postcss-normalize-positions": "^6.0.1", - "postcss-normalize-repeat-style": "^6.0.1", - "postcss-normalize-string": "^6.0.1", - "postcss-normalize-timing-functions": "^6.0.1", - "postcss-normalize-unicode": "^6.0.3", - "postcss-normalize-url": "^6.0.1", - "postcss-normalize-whitespace": "^6.0.1", - "postcss-ordered-values": "^6.0.1", - "postcss-reduce-initial": "^6.0.3", - "postcss-reduce-transforms": "^6.0.1", - "postcss-svgo": "^6.0.2", - "postcss-unique-selectors": "^6.0.2" + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.4", + "postcss-merge-rules": "^6.1.0", + "postcss-minify-font-values": "^6.0.3", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.3", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.3" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -6693,9 +6686,9 @@ } }, "node_modules/cssnano-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.1.tgz", - "integrity": "sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", "dev": true, "engines": { "node": "^14 || ^16 || >=18.0" @@ -6738,12 +6731,15 @@ "dev": true }, "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/dashdash": { @@ -7155,9 +7151,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.684", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.684.tgz", - "integrity": "sha512-MoDE0pUsIzTewI96Vbv84sTkER9Nbp58pa1K7Ub03s6+2HvuJ+jbnxcLJm22mpomJe+5PWtiPXqhbU5ZkyHU5A==" + "version": "1.4.693", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz", + "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -7259,18 +7255,18 @@ } }, "node_modules/es-abstract": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", - "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.6", + "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", @@ -7278,15 +7274,15 @@ "globalthis": "^1.0.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "hasown": "^2.0.1", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", @@ -7299,10 +7295,10 @@ "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.1", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.14" }, @@ -7400,12 +7396,15 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/esbuild": { @@ -7568,11 +7567,11 @@ } }, "node_modules/eslint-config-turbo": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.12.4.tgz", - "integrity": "sha512-5hqEaV6PNmAYLL4RTmq74OcCt8pgzOLnfDVPG/7PUXpQ0Mpz0gr926oCSFukywKKXjdum3VHD84S7Z9A/DqTAw==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.12.5.tgz", + "integrity": "sha512-wXytbX+vTzQ6rwgM6sIr447tjYJBlRj5V/eBFNGNXw5Xs1R715ppPYhbmxaFbkrWNQSGJsWRrYGAlyq0sT/OsQ==", "dependencies": { - "eslint-plugin-turbo": "1.12.4" + "eslint-plugin-turbo": "1.12.5" }, "peerDependencies": { "eslint": ">6.6.0" @@ -7599,9 +7598,9 @@ } }, "node_modules/eslint-plugin-turbo": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.12.4.tgz", - "integrity": "sha512-3AGmXvH7E4i/XTWqBrcgu+G7YKZJV/8FrEn79kTd50ilNsv+U3nS2IlcCrQB6Xm2m9avGD9cadLzKDR1/UF2+g==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.12.5.tgz", + "integrity": "sha512-cXy7mCzAdngBTJIWH4DASXHy0vQpujWDBqRTu0YYqCN/QEGsi3HWM+STZEbPYELdjtm5EsN2HshOSSqWnjdRHg==", "dependencies": { "dotenv": "16.0.3" }, @@ -7823,11 +7822,6 @@ "node": ">=0.10" } }, - "node_modules/esniff/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -8866,13 +8860,13 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -8906,29 +8900,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -8964,20 +8935,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -8986,11 +8943,6 @@ "type": "^2.7.2" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -9847,24 +9799,17 @@ } }, "node_modules/hardhat": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.1.tgz", - "integrity": "sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.21.0.tgz", + "integrity": "sha512-8DlJAVJDEVHaV1sh9FLuKLLgCFv9EAJ+M+8IbjSIPgoeNo3ss5L1HgGBMfnI88c7OzMEZkdcuyGoobFeK3Orqw==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.4", - "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/edr": "^0.2.0", "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-evm": "2.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-statemanager": "2.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", "@nomicfoundation/ethereumjs-tx": "5.0.4", "@nomicfoundation/ethereumjs-util": "9.0.4", - "@nomicfoundation/ethereumjs-verkle": "0.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.4", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -10207,6 +10152,105 @@ "typechain": "8.x" } }, + "node_modules/hardhat-packager/node_modules/@typechain/ethers-v5": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" + } + }, + "node_modules/hardhat-packager/node_modules/@typechain/hardhat": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz", + "integrity": "sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==", + "dev": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@typechain/ethers-v5": "^10.2.1", + "ethers": "^5.4.7", + "hardhat": "^2.9.9", + "typechain": "^8.1.1" + } + }, + "node_modules/hardhat-packager/node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hardhat-packager/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "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" + } + }, "node_modules/hardhat/node_modules/@noble/hashes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", @@ -11376,16 +11420,6 @@ "node": ">=10" } }, - "node_modules/js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -12063,12 +12097,12 @@ "dev": true }, "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { - "node": "14 || >=16.14" + "node": ">=12" } }, "node_modules/ltgt": { @@ -12077,9 +12111,9 @@ "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" }, "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -14417,9 +14451,9 @@ } }, "node_modules/postcss-colormin": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.3.tgz", - "integrity": "sha512-ECpkS+UZRyAtu/kjive2/1mihP+GNtgC8kcdU8ueWZi1ZVxMNnRziCLdhrWECJhEtSWijfX2Cl9XTTCK/hjGaA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "dev": true, "dependencies": { "browserslist": "^4.23.0", @@ -14435,9 +14469,9 @@ } }, "node_modules/postcss-convert-values": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.4.tgz", - "integrity": "sha512-YT2yrGzPXoQD3YeA2kBo/696qNwn7vI+15AOS2puXWEvSWqdCqlOyDWRy5GNnOc9ACRGOkuQ4ESQEqPJBWt/GA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "dev": true, "dependencies": { "browserslist": "^4.23.0", @@ -14451,9 +14485,9 @@ } }, "node_modules/postcss-discard-comments": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.1.tgz", - "integrity": "sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "dev": true, "engines": { "node": "^14 || ^16 || >=18.0" @@ -14463,9 +14497,9 @@ } }, "node_modules/postcss-discard-duplicates": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.2.tgz", - "integrity": "sha512-U2rsj4w6pAGROCCcD13LP2eBIi1whUsXs4kgE6xkIuGfkbxCBSKhkCTWyowFd66WdVlLv0uM1euJKIgmdmZObg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "dev": true, "engines": { "node": "^14 || ^16 || >=18.0" @@ -14475,9 +14509,9 @@ } }, "node_modules/postcss-discard-empty": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.2.tgz", - "integrity": "sha512-rj6pVC2dVCJrP0Y2RkYTQEbYaCf4HEm+R/2StQgJqGHxAa3+KcYslNQhcRqjLHtl/4wpzipJluaJLqBj6d5eDQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "dev": true, "engines": { "node": "^14 || ^16 || >=18.0" @@ -14487,9 +14521,9 @@ } }, "node_modules/postcss-discard-overridden": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.1.tgz", - "integrity": "sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "dev": true, "engines": { "node": "^14 || ^16 || >=18.0" @@ -14499,13 +14533,13 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.3.tgz", - "integrity": "sha512-kF/y3DU8CRt+SX3tP/aG+2gkZI2Z7OXDsPU7FgxIJmuyhQQ1EHceIYcsp/alvzCm2P4c37Sfdu8nNrHc+YeyLg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.4.tgz", + "integrity": "sha512-vAfWGcxUUGlFiPM3nDMZA+/Yo9sbpc3JNkcYZez8FfJDv41Dh7tAgA3QGVTocaHCZZL6aXPXPOaBMJsjujodsA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.0.3" + "stylehacks": "^6.1.0" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -14515,14 +14549,14 @@ } }, "node_modules/postcss-merge-rules": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.4.tgz", - "integrity": "sha512-97iF3UJ5v8N1BWy38y+0l+Z8o5/9uGlEgtWic2PJPzoRrLB6Gxg8TVG93O0EK52jcLeMsywre26AUlX1YAYeHA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.0.tgz", + "integrity": "sha512-lER+W3Gr6XOvxOYk1Vi/6UsAgKMg6MDBthmvbNqi2XxAk/r9XfhdYZSigfWjuWWn3zYw2wLelvtM8XuAEFqRkA==", "dev": true, "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.1", + "cssnano-utils": "^4.0.2", "postcss-selector-parser": "^6.0.15" }, "engines": { @@ -14533,9 +14567,9 @@ } }, "node_modules/postcss-minify-font-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.2.tgz", - "integrity": "sha512-IedzbVMoX0a7VZWjSYr5qJ6C37rws8kl8diPBeMZLJfWKkgXuMFY5R/OxPegn/q9tK9ztd0XRH3aR0u2t+A7uQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.3.tgz", + "integrity": "sha512-SmAeTA1We5rMnN3F8X9YBNo9bj9xB4KyDHnaNJnBfQIPi+60fNiR9OTRnIaMqkYzAQX0vObIw4Pn0vuKEOettg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14548,13 +14582,13 @@ } }, "node_modules/postcss-minify-gradients": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.2.tgz", - "integrity": "sha512-vP5mF7iI6/5fcpv+rSfwWQekOE+8I1i7/7RjZPGuIjj6eUaZVeG4XZYZrroFuw1WQd51u2V32wyQFZ+oYdE7CA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "dev": true, "dependencies": { "colord": "^2.9.3", - "cssnano-utils": "^4.0.1", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -14565,13 +14599,13 @@ } }, "node_modules/postcss-minify-params": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.3.tgz", - "integrity": "sha512-j4S74d3AAeCK5eGdQndXSrkxusV2ekOxbXGnlnZthMyZBBvSDiU34CihTASbJxuVB3bugudmwolS7+Dgs5OyOQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "dev": true, "dependencies": { "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.1", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -14582,9 +14616,9 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.2.tgz", - "integrity": "sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.3.tgz", + "integrity": "sha512-IcV7ZQJcaXyhx4UBpWZMsinGs2NmiUC60rJSkyvjPCPqhNjVGsrJUM+QhAtCaikZ0w0/AbZuH4wVvF/YMuMhvA==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.15" @@ -14616,9 +14650,9 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.1.tgz", - "integrity": "sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "dev": true, "engines": { "node": "^14 || ^16 || >=18.0" @@ -14628,9 +14662,9 @@ } }, "node_modules/postcss-normalize-display-values": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.1.tgz", - "integrity": "sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14643,9 +14677,9 @@ } }, "node_modules/postcss-normalize-positions": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.1.tgz", - "integrity": "sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14658,9 +14692,9 @@ } }, "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.1.tgz", - "integrity": "sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14673,9 +14707,9 @@ } }, "node_modules/postcss-normalize-string": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.1.tgz", - "integrity": "sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14688,9 +14722,9 @@ } }, "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.1.tgz", - "integrity": "sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14703,9 +14737,9 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.3.tgz", - "integrity": "sha512-T2Bb3gXz0ASgc3ori2dzjv6j/P2IantreaC6fT8tWjqYUiqMAh5jGIkdPwEV2FaucjQlCLeFJDJh2BeSugE1ig==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "dev": true, "dependencies": { "browserslist": "^4.23.0", @@ -14719,9 +14753,9 @@ } }, "node_modules/postcss-normalize-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.1.tgz", - "integrity": "sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14734,9 +14768,9 @@ } }, "node_modules/postcss-normalize-whitespace": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.1.tgz", - "integrity": "sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14749,12 +14783,12 @@ } }, "node_modules/postcss-ordered-values": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.1.tgz", - "integrity": "sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "dev": true, "dependencies": { - "cssnano-utils": "^4.0.1", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -14765,9 +14799,9 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.3.tgz", - "integrity": "sha512-w4QIR9pEa1N4xMx3k30T1vLZl6udVK2RmNqrDXhBXX9L0mBj2a8ADs8zkbaEH7eUy1m30Wyr5EBgHN31Yq1JvA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "dev": true, "dependencies": { "browserslist": "^4.23.0", @@ -14781,9 +14815,9 @@ } }, "node_modules/postcss-reduce-transforms": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.1.tgz", - "integrity": "sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14809,9 +14843,9 @@ } }, "node_modules/postcss-svgo": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.2.tgz", - "integrity": "sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", @@ -14825,9 +14859,9 @@ } }, "node_modules/postcss-unique-selectors": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.2.tgz", - "integrity": "sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.3.tgz", + "integrity": "sha512-NFXbYr8qdmCr/AFceaEfdcsKGCvWTeGO6QVC9h2GvtWgj0/0dklKQcaMMVzs6tr8bY+ase8hOtHW8OBTTRvS8A==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.15" @@ -15052,15 +15086,6 @@ "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -15095,12 +15120,12 @@ } }, "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", + "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -15701,21 +15726,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rust-verkle-wasm": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz", - "integrity": "sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==", - "dev": true - }, - "node_modules/rustbn-wasm": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz", - "integrity": "sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==", - "dev": true, - "dependencies": { - "@scure/base": "^1.1.1" - } - }, "node_modules/rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", @@ -16333,11 +16343,11 @@ } }, "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" @@ -16778,9 +16788,9 @@ "dev": true }, "node_modules/solidity-coverage": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.9.tgz", - "integrity": "sha512-ZhPsxlsLkYyzgwoVGh8RBN2ju7JVahvMkk+8RBVc0vP/3UNq88GzvL8kvbuY48lVIRL8eQjJ+0X8al2Bu9/2iQ==", + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.10.tgz", + "integrity": "sha512-6nvlWLnCjBIVnCgTZiIo2XBI62O3YJuU83xj+bklnH/B+dXGTjuQB7SccZfysUC3LFkjtZO/KjzUJ/hiSlkXWw==", "dev": true, "peer": true, "dependencies": { @@ -17190,9 +17200,9 @@ } }, "node_modules/stylehacks": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.3.tgz", - "integrity": "sha512-KzBqjnqktc8/I0ERCb+lGq06giF/JxDbw2r9kEVhen9noHeIDRtMWUp9r62sOk+/2bbX6sFG1GhsS7ToXG0PEg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.0.tgz", + "integrity": "sha512-ETErsPFgwlfYZ/CSjMO2Ddf+TsnkCVPBPaoB99Ro8WMAxf7cglzmFsRBhRmKObFjibtcvlNxFFPHuyr3sNlNUQ==", "dev": true, "dependencies": { "browserslist": "^4.23.0", @@ -17951,26 +17961,26 @@ } }, "node_modules/turbo": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.12.4.tgz", - "integrity": "sha512-yUJ7elEUSToiGwFZogXpYKJpQ0BvaMbkEuQECIWtkBLcmWzlMOt6bActsIm29oN83mRU0WbzGt4e8H1KHWedhg==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.12.5.tgz", + "integrity": "sha512-FATU5EnhrYG8RvQJYFJnDd18DpccDjyvd53hggw9T9JEg9BhWtIEoeaKtBjYbpXwOVrJQMDdXcIB4f2nD3QPPg==", "dev": true, "bin": { "turbo": "bin/turbo" }, "optionalDependencies": { - "turbo-darwin-64": "1.12.4", - "turbo-darwin-arm64": "1.12.4", - "turbo-linux-64": "1.12.4", - "turbo-linux-arm64": "1.12.4", - "turbo-windows-64": "1.12.4", - "turbo-windows-arm64": "1.12.4" + "turbo-darwin-64": "1.12.5", + "turbo-darwin-arm64": "1.12.5", + "turbo-linux-64": "1.12.5", + "turbo-linux-arm64": "1.12.5", + "turbo-windows-64": "1.12.5", + "turbo-windows-arm64": "1.12.5" } }, "node_modules/turbo-darwin-64": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.12.4.tgz", - "integrity": "sha512-dBwFxhp9isTa9RS/fz2gDVk5wWhKQsPQMozYhjM7TT4jTrnYn0ZJMzr7V3B/M/T8QF65TbniW7w1gtgxQgX5Zg==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.12.5.tgz", + "integrity": "sha512-0GZ8reftwNQgIQLHkHjHEXTc/Z1NJm+YjsrBP+qhM/7yIZ3TEy9gJhuogDt2U0xIWwFgisTyzbtU7xNaQydtoA==", "cpu": [ "x64" ], @@ -17981,9 +17991,9 @@ ] }, "node_modules/turbo-darwin-arm64": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.12.4.tgz", - "integrity": "sha512-1Uo5iI6xsJ1j9ObsqxYRsa3W26mEbUe6fnj4rQYV6kDaqYD54oAMJ6hM53q9rB8JvFxwdrUXGp3PwTw9A0qqkA==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.12.5.tgz", + "integrity": "sha512-8WpOLNNzvH6kohQOjihD+gaWL+ZFNfjvBwhOF0rjEzvW+YR3Pa7KjhulrjWyeN2yMFqAPubTbZIGOz1EVXLuQA==", "cpu": [ "arm64" ], @@ -17994,9 +18004,9 @@ ] }, "node_modules/turbo-linux-64": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.12.4.tgz", - "integrity": "sha512-ONg2aSqKP7LAQOg7ysmU5WpEQp4DGNxSlAiR7um+LKtbmC/UxogbR5+T+Uuq6zGuQ5kJyKjWJ4NhtvUswOqBsA==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.12.5.tgz", + "integrity": "sha512-INit73+bNUpwqGZCxgXCR3I+cQsdkQ3/LkfkgSOibkpg+oGqxJRzeXw3sp990d7SCoE8QOcs3iw+PtiFX/LDAA==", "cpu": [ "x64" ], @@ -18007,9 +18017,9 @@ ] }, "node_modules/turbo-linux-arm64": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.12.4.tgz", - "integrity": "sha512-9FPufkwdgfIKg/9jj87Cdtftw8o36y27/S2vLN7FTR2pp9c0MQiTBOLVYadUr1FlShupddmaMbTkXEhyt9SdrA==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.12.5.tgz", + "integrity": "sha512-6lkRBvxtI/GQdGtaAec9LvVQUoRw6nXFp0kM+Eu+5PbZqq7yn6cMkgDJLI08zdeui36yXhone8XGI8pHg8bpUQ==", "cpu": [ "arm64" ], @@ -18020,9 +18030,9 @@ ] }, "node_modules/turbo-windows-64": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.12.4.tgz", - "integrity": "sha512-2mOtxHW5Vjh/5rDVu/aFwsMzI+chs8XcEuJHlY1sYOpEymYTz+u6AXbnzRvwZFMrLKr7J7fQOGl+v96sLKbNdA==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.12.5.tgz", + "integrity": "sha512-gQYbOhZg5Ww0bQ/bC0w/4W6yQRwBumUUnkB+QPo15VznwxZe2a7bo6JM+9Xy9dKLa/kn+p7zTqme4OEp6M3/Yg==", "cpu": [ "x64" ], @@ -18033,9 +18043,9 @@ ] }, "node_modules/turbo-windows-arm64": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.12.4.tgz", - "integrity": "sha512-nOY5wae9qnxPOpT1fRuYO0ks6dTwpKMPV6++VkDkamFDLFHUDVM/9kmD2UTeh1yyrKnrZksbb9zmShhmfj1wog==", + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.12.5.tgz", + "integrity": "sha512-auvhZ9FrhnvQ4mgBlY9O68MT4dIfprYGvd2uPICba/mHUZZvVy5SGgbHJ0KbMwaJfnnFoPgLJO6M+3N2gDprKw==", "cpu": [ "arm64" ], @@ -18056,9 +18066,9 @@ "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" }, "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, "node_modules/type-check": { "version": "0.4.0", @@ -18302,9 +18312,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19088,9 +19098,9 @@ } }, "node_modules/vite": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", - "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", "dev": true, "peer": true, "dependencies": { @@ -19760,9 +19770,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz", + "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==", "dev": true, "peer": true, "dependencies": { @@ -19776,19 +19786,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.12.1", + "@rollup/rollup-android-arm64": "4.12.1", + "@rollup/rollup-darwin-arm64": "4.12.1", + "@rollup/rollup-darwin-x64": "4.12.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.1", + "@rollup/rollup-linux-arm64-gnu": "4.12.1", + "@rollup/rollup-linux-arm64-musl": "4.12.1", + "@rollup/rollup-linux-riscv64-gnu": "4.12.1", + "@rollup/rollup-linux-x64-gnu": "4.12.1", + "@rollup/rollup-linux-x64-musl": "4.12.1", + "@rollup/rollup-win32-arm64-msvc": "4.12.1", + "@rollup/rollup-win32-ia32-msvc": "4.12.1", + "@rollup/rollup-win32-x64-msvc": "4.12.1", "fsevents": "~2.3.2" } }, @@ -20281,6 +20291,15 @@ "node": ">=0.8" } }, + "node_modules/web3-provider-engine/node_modules/cross-fetch": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", + "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", + "dependencies": { + "node-fetch": "^2.6.7", + "whatwg-fetch": "^2.0.4" + } + }, "node_modules/web3-provider-engine/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", @@ -20350,15 +20369,6 @@ "node": ">=8.0.0" } }, - "node_modules/web3-providers-http/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/web3-providers-ipc": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz", @@ -21169,4 +21179,4 @@ } } } -} +} \ No newline at end of file