From f483b8bd8caecb6636bef3f1f8ab6d3118363f88 Mon Sep 17 00:00:00 2001 From: b00ste Date: Fri, 9 Feb 2024 11:40:06 +0200 Subject: [PATCH] build!: move LSP1 URD in its own package --- .github/workflows/solc_version.yml | 2 + .mythx.yml | 4 +- contracts/Imports.sol | 7 + .../LSP1UniversalReceiverDelegateUP.md | 20 +-- .../LSP1UniversalReceiverDelegateVault.md | 20 +-- dodoc/config.ts | 4 +- package-lock.json | 64 +++++++++ package.json | 1 + .../.eslintrc.js | 4 + .../.solhint.json | 25 ++++ .../LSP1UniversalReceiverDelegate/README.md | 3 + .../contracts}/LSP1Errors.sol | 0 .../LSP1UniversalReceiverDelegateUP.sol | 2 +- .../LSP1UniversalReceiverDelegateVault.sol | 2 +- .../contracts/Version.sol | 17 +++ .../hardhat.config.ts | 128 ++++++++++++++++++ .../package.json | 54 ++++++++ .../tsconfig.json | 4 + remappings.txt | 1 + .../GasTests/UniversalProfileTestsHelper.sol | 2 +- .../GasTests/execute/RestrictedController.sol | 2 +- .../execute/UnrestrictedController.sol | 2 +- 22 files changed, 339 insertions(+), 29 deletions(-) rename docs/contracts/{LSP1UniversalReceiver => lsp1delegate/contracts}/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md (86%) rename docs/contracts/{LSP1UniversalReceiver => lsp1delegate/contracts}/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md (83%) create mode 100644 packages/LSP1UniversalReceiverDelegate/.eslintrc.js create mode 100644 packages/LSP1UniversalReceiverDelegate/.solhint.json create mode 100644 packages/LSP1UniversalReceiverDelegate/README.md rename {contracts/LSP1UniversalReceiver => packages/LSP1UniversalReceiverDelegate/contracts}/LSP1Errors.sol (100%) rename {contracts/LSP1UniversalReceiver => packages/LSP1UniversalReceiverDelegate/contracts}/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol (99%) rename {contracts/LSP1UniversalReceiver => packages/LSP1UniversalReceiverDelegate/contracts}/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol (99%) create mode 100644 packages/LSP1UniversalReceiverDelegate/contracts/Version.sol create mode 100644 packages/LSP1UniversalReceiverDelegate/hardhat.config.ts create mode 100644 packages/LSP1UniversalReceiverDelegate/package.json create mode 100644 packages/LSP1UniversalReceiverDelegate/tsconfig.json diff --git a/.github/workflows/solc_version.yml b/.github/workflows/solc_version.yml index 6a7922d5d..1c6731f28 100644 --- a/.github/workflows/solc_version.yml +++ b/.github/workflows/solc_version.yml @@ -83,6 +83,7 @@ jobs: solidity-bytes-utils/=node_modules/solidity-bytes-utils/ \ lsp0/=packages/LSP0ERC725Account/ \ lsp1/=packages/LSP1UniversalReceiver/ \ + lsp1delegate/=packages/LSP1UniversalReceiverDelegate/ \ lsp2/=packages/LSP2ERC725YJSONSchema/ \ lsp3/=packages/LSP3ProfileMetadata/ \ lsp4/=packages/LSP4DigitalAssetMetadata/ \ @@ -105,6 +106,7 @@ jobs: solidity-bytes-utils/=node_modules/solidity-bytes-utils/ \ lsp0/=packages/LSP0ERC725Account/ \ lsp1/=packages/LSP1UniversalReceiver/ \ + lsp1delegate/=packages/LSP1UniversalReceiverDelegate/ \ lsp2/=packages/LSP2ERC725YJSONSchema/ \ lsp3/=packages/LSP3ProfileMetadata/ \ lsp4/=packages/LSP4DigitalAssetMetadata/ \ diff --git a/.mythx.yml b/.mythx.yml index 73c1c368e..9fec6ba6b 100644 --- a/.mythx.yml +++ b/.mythx.yml @@ -16,8 +16,8 @@ analyze: targets: # LSP1 # ------------------ - - contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol - - contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol + - lsp1delegate/contract/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol + - lsp1delegate/contract/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol # Standard version # ------------------ diff --git a/contracts/Imports.sol b/contracts/Imports.sol index 351cefe28..bc7cb5611 100644 --- a/contracts/Imports.sol +++ b/contracts/Imports.sol @@ -3,5 +3,12 @@ pragma solidity ^0.8.4; // solhint-disable no-unused-import +import { + LSP1UniversalReceiverDelegateUP +} from "lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; +import { + LSP1UniversalReceiverDelegateVault +} from "lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol"; + import {LSP9Vault} from "lsp9/contracts/LSP9Vault.sol"; import {LSP9VaultInit} from "lsp9/contracts/LSP9VaultInit.sol"; diff --git a/docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md b/docs/contracts/lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md similarity index 86% rename from docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md rename to docs/contracts/lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md index 4dde9b462..faa6086bb 100644 --- a/docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.md +++ b/docs/contracts/lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/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-UniversalReceiverDelegateUP`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateUP.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/lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/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-UniversalReceiverDelegateUP**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateUP.md#version) +- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/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-UniversalReceiverDelegateUP**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateUP.md#supportsinterface) +- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/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-UniversalReceiverDelegateUP**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateUP.md#universalreceiverdelegate) +- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/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-UniversalReceiverDelegateUP**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateUP.md#cannotregistereoasasassets) +- Solidity implementation: [`LSP1UniversalReceiverDelegateUP.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol) - Error signature: `CannotRegisterEOAsAsAssets(address)` - Error hash: `0xa5295345` diff --git a/docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md b/docs/contracts/lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md similarity index 83% rename from docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md rename to docs/contracts/lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md index 368b82286..ea48f99d5 100644 --- a/docs/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.md +++ b/docs/contracts/lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/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-UniversalReceiverDelegateVault`](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateVault.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/lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/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-UniversalReceiverDelegateVault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateVault.md#version) +- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/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-UniversalReceiverDelegateVault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateVault.md#supportsinterface) +- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/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-UniversalReceiverDelegateVault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateVault.md#universalreceiverdelegate) +- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/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-UniversalReceiverDelegateVault**](https://github.com/lukso-network/lips/tree/main/LSPs/LSP-1-UniversalReceiverDelegateVault.md#cannotregistereoasasassets) +- Solidity implementation: [`LSP1UniversalReceiverDelegateVault.sol`](https://github.com/lukso-network/lsp-smart-contracts/blob/develop/lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol) - Error signature: `CannotRegisterEOAsAsAssets(address)` - Error hash: `0xa5295345` diff --git a/dodoc/config.ts b/dodoc/config.ts index a7053830d..5cced584b 100644 --- a/dodoc/config.ts +++ b/dodoc/config.ts @@ -6,8 +6,8 @@ export const dodocConfig = { include: [ 'universalprofile/contracts/UniversalProfile.sol', 'lsp0/contracts/LSP0ERC725Account.sol', - 'contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol', - 'contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol', + 'lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol', + 'lsp1delegate/contracts/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol', 'lsp6/contracts/LSP6KeyManager.sol', 'lsp9/contracts/LSP9Vault.sol', 'contracts/LSP11BasicSocialRecovery/LSP11BasicSocialRecovery.sol', diff --git a/package-lock.json b/package-lock.json index ae37c829a..abdf7feae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "lsp16": "*", "lsp17": "*", "lsp17contractextension": "*", + "lsp1delegate": "*", "lsp2": "*", "lsp20": "*", "lsp25": "*", @@ -13560,6 +13561,10 @@ "resolved": "packages/LSP17ContractExtension", "link": true }, + "node_modules/lsp1delegate": { + "resolved": "packages/LSP1UniversalReceiverDelegate", + "link": true + }, "node_modules/lsp2": { "resolved": "packages/LSP2ERC725YJSONSchema", "link": true @@ -24024,6 +24029,37 @@ "typescript": "^5.3.3" } }, + "packages/LSP1UniversalReceiverDelegate": { + "version": "0.12.1", + "license": "Apache-2.0", + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "lsp1": "*", + "lsp10": "*", + "lsp5": "*", + "lsp7": "*", + "lsp8": "*", + "lsp9": "*" + }, + "devDependencies": { + "@nomicfoundation/hardhat-toolbox": "^2.0.2", + "@typechain/ethers-v5": "^10.2.0", + "dotenv": "^16.0.3", + "eslint-config-custom": "*", + "ethers": "^5.7.2", + "hardhat": "^2.13.0", + "hardhat-contract-sizer": "^2.8.0", + "hardhat-deploy": "^0.11.25", + "hardhat-gas-reporter": "^1.0.9", + "hardhat-packager": "^1.4.2", + "solhint": "^3.3.6", + "ts-node": "^10.2.0", + "tsconfig": "*", + "typechain": "^8.0.0", + "typescript": "^5.3.3" + } + }, "packages/LSP20CallVerification": { "name": "lsp20", "version": "0.12.1", @@ -34709,6 +34745,34 @@ "typescript": "^5.3.3" } }, + "lsp1delegate": { + "version": "file:packages/LSP1UniversalReceiverDelegate", + "requires": { + "@erc725/smart-contracts": "^7.0.0", + "@nomicfoundation/hardhat-toolbox": "^2.0.2", + "@openzeppelin/contracts": "^4.9.3", + "@typechain/ethers-v5": "^10.2.0", + "dotenv": "^16.0.3", + "eslint-config-custom": "*", + "ethers": "^5.7.2", + "hardhat": "^2.13.0", + "hardhat-contract-sizer": "^2.8.0", + "hardhat-deploy": "^0.11.25", + "hardhat-gas-reporter": "^1.0.9", + "hardhat-packager": "^1.4.2", + "lsp1": "*", + "lsp10": "*", + "lsp5": "*", + "lsp7": "*", + "lsp8": "*", + "lsp9": "*", + "solhint": "^3.3.6", + "ts-node": "^10.2.0", + "tsconfig": "*", + "typechain": "^8.0.0", + "typescript": "^5.3.3" + } + }, "lsp2": { "version": "file:packages/LSP2ERC725YJSONSchema", "requires": { diff --git a/package.json b/package.json index 43c550da6..887fe47ff 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,7 @@ "solidity-bytes-utils": "0.8.0", "lsp0": "*", "lsp1": "*", + "lsp1delegate": "*", "lsp2": "*", "lsp4": "*", "lsp5": "*", diff --git a/packages/LSP1UniversalReceiverDelegate/.eslintrc.js b/packages/LSP1UniversalReceiverDelegate/.eslintrc.js new file mode 100644 index 000000000..03ee7431b --- /dev/null +++ b/packages/LSP1UniversalReceiverDelegate/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom'], +}; diff --git a/packages/LSP1UniversalReceiverDelegate/.solhint.json b/packages/LSP1UniversalReceiverDelegate/.solhint.json new file mode 100644 index 000000000..26e01c48a --- /dev/null +++ b/packages/LSP1UniversalReceiverDelegate/.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/LSP1UniversalReceiverDelegate/README.md b/packages/LSP1UniversalReceiverDelegate/README.md new file mode 100644 index 000000000..dc0604451 --- /dev/null +++ b/packages/LSP1UniversalReceiverDelegate/README.md @@ -0,0 +1,3 @@ +# LSP1 Universal Receiver Delegate + +Package for the LSP1 Universal Receiver Delegate standard. diff --git a/contracts/LSP1UniversalReceiver/LSP1Errors.sol b/packages/LSP1UniversalReceiverDelegate/contracts/LSP1Errors.sol similarity index 100% rename from contracts/LSP1UniversalReceiver/LSP1Errors.sol rename to packages/LSP1UniversalReceiverDelegate/contracts/LSP1Errors.sol diff --git a/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol b/packages/LSP1UniversalReceiverDelegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol similarity index 99% rename from contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol rename to packages/LSP1UniversalReceiverDelegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol index f67cec8d7..fe79367ba 100644 --- a/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol +++ b/packages/LSP1UniversalReceiverDelegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol @@ -12,7 +12,7 @@ import {ILSP7DigitalAsset} from "lsp7/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 { diff --git a/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol b/packages/LSP1UniversalReceiverDelegate/contracts/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol similarity index 99% rename from contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol rename to packages/LSP1UniversalReceiverDelegate/contracts/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol index 6155844d0..a6426a61b 100644 --- a/contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol +++ b/packages/LSP1UniversalReceiverDelegate/contracts/LSP1UniversalReceiverDelegateVault/LSP1UniversalReceiverDelegateVault.sol @@ -12,7 +12,7 @@ import {ILSP7DigitalAsset} from "lsp7/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 "lsp5/contracts/LSP5Utils.sol"; diff --git a/packages/LSP1UniversalReceiverDelegate/contracts/Version.sol b/packages/LSP1UniversalReceiverDelegate/contracts/Version.sol new file mode 100644 index 000000000..58a3f0925 --- /dev/null +++ b/packages/LSP1UniversalReceiverDelegate/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/LSP1UniversalReceiverDelegate/hardhat.config.ts b/packages/LSP1UniversalReceiverDelegate/hardhat.config.ts new file mode 100644 index 000000000..d818a205d --- /dev/null +++ b/packages/LSP1UniversalReceiverDelegate/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-v5', + }, + mocha: { + timeout: 10000000, + }, +}; + +export default config; diff --git a/packages/LSP1UniversalReceiverDelegate/package.json b/packages/LSP1UniversalReceiverDelegate/package.json new file mode 100644 index 000000000..c9a37e3f1 --- /dev/null +++ b/packages/LSP1UniversalReceiverDelegate/package.json @@ -0,0 +1,54 @@ +{ + "name": "lsp1delegate", + "version": "0.12.1", + "description": "Package for the LSP1 Universal Receiver Delegate standard", + "license": "Apache-2.0", + "author": "", + "keywords": [ + "LUKSO", + "LSP", + "Blockchain", + "Standards", + "Smart Contracts", + "Ethereum", + "EVM", + "Solidity" + ], + "scripts": { + "build": "hardhat compile --show-stack-traces", + "clean": "hardhat clean", + "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": "forge test --no-match-test Skip -vvv", + "test:coverage": "hardhat coverage" + }, + "dependencies": { + "@erc725/smart-contracts": "^7.0.0", + "@openzeppelin/contracts": "^4.9.3", + "lsp1": "*", + "lsp5": "*", + "lsp7": "*", + "lsp8": "*", + "lsp9": "*", + "lsp10": "*" + }, + "devDependencies": { + "@nomicfoundation/hardhat-toolbox": "^2.0.2", + "@typechain/ethers-v5": "^10.2.0", + "dotenv": "^16.0.3", + "eslint-config-custom": "*", + "ethers": "^5.7.2", + "hardhat": "^2.13.0", + "hardhat-contract-sizer": "^2.8.0", + "hardhat-deploy": "^0.11.25", + "hardhat-gas-reporter": "^1.0.9", + "hardhat-packager": "^1.4.2", + "solhint": "^3.3.6", + "ts-node": "^10.2.0", + "tsconfig": "*", + "typechain": "^8.0.0", + "typescript": "^5.3.3" + } +} diff --git a/packages/LSP1UniversalReceiverDelegate/tsconfig.json b/packages/LSP1UniversalReceiverDelegate/tsconfig.json new file mode 100644 index 000000000..b7a34e03f --- /dev/null +++ b/packages/LSP1UniversalReceiverDelegate/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "tsconfig/contracts.json", + "include": ["**/*.ts"] +} diff --git a/remappings.txt b/remappings.txt index 267cec095..b1de7c06c 100644 --- a/remappings.txt +++ b/remappings.txt @@ -9,6 +9,7 @@ solidity-bytes-utils/=node_modules/solidity-bytes-utils/ ds-test/=lib/forge-std/lib/ds-test/src/ lsp0/=packages/LSP0ERC725Account/ lsp1/=packages/LSP1UniversalReceiver/ +lsp1delegate/=packages/LSP1UniversalReceiverDelegate/ lsp2/=packages/LSP2ERC725YJSONSchema/ lsp4/=packages/LSP4DigitalAssetMetadata/ lsp5/=packages/LSP5ReceivedAssets/ diff --git a/tests/foundry/GasTests/UniversalProfileTestsHelper.sol b/tests/foundry/GasTests/UniversalProfileTestsHelper.sol index dc9012897..453842145 100644 --- a/tests/foundry/GasTests/UniversalProfileTestsHelper.sol +++ b/tests/foundry/GasTests/UniversalProfileTestsHelper.sol @@ -6,7 +6,7 @@ import "forge-std/Test.sol"; import "lsp0/contracts/LSP0ERC725Account.sol"; import { LSP1UniversalReceiverDelegateUP -} from "../../../contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; +} from "lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; import "lsp2/contracts/LSP2Utils.sol"; import "../../../contracts/Mocks/Tokens/LSP7Tester.sol"; import "../../../contracts/Mocks/Tokens/LSP8Tester.sol"; diff --git a/tests/foundry/GasTests/execute/RestrictedController.sol b/tests/foundry/GasTests/execute/RestrictedController.sol index e9c5304eb..ebb5c9330 100644 --- a/tests/foundry/GasTests/execute/RestrictedController.sol +++ b/tests/foundry/GasTests/execute/RestrictedController.sol @@ -5,7 +5,7 @@ import "../LSP6s/LSP6ExecuteRC.sol"; import {LSP0ERC725Account} from "lsp0/contracts/LSP0ERC725Account.sol"; import { LSP1UniversalReceiverDelegateUP -} from "../../../../contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; +} from "lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; import "lsp2/contracts/LSP2Utils.sol"; import "../../../../contracts/Mocks/Tokens/LSP7Tester.sol"; import "../../../../contracts/Mocks/Tokens/LSP8Tester.sol"; diff --git a/tests/foundry/GasTests/execute/UnrestrictedController.sol b/tests/foundry/GasTests/execute/UnrestrictedController.sol index 7ce7b24a7..f177a27dd 100644 --- a/tests/foundry/GasTests/execute/UnrestrictedController.sol +++ b/tests/foundry/GasTests/execute/UnrestrictedController.sol @@ -5,7 +5,7 @@ import "../LSP6s/LSP6ExecuteUC.sol"; import {LSP0ERC725Account} from "lsp0/contracts/LSP0ERC725Account.sol"; import { LSP1UniversalReceiverDelegateUP -} from "../../../../contracts/LSP1UniversalReceiver/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; +} from "lsp1delegate/contracts/LSP1UniversalReceiverDelegateUP/LSP1UniversalReceiverDelegateUP.sol"; import "lsp2/contracts/LSP2Utils.sol"; import "../../../../contracts/Mocks/Tokens/LSP7Tester.sol"; import "../../../../contracts/Mocks/Tokens/LSP8Tester.sol";