From 39de744f6a30bcd255ba49d8748b2be79dd02660 Mon Sep 17 00:00:00 2001 From: zacksfF Date: Thu, 13 Nov 2025 13:59:31 +0100 Subject: [PATCH 1/3] feat: add IPackageRegistry --- src/interfaces/IPackageRegistry.sol | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/interfaces/IPackageRegistry.sol b/src/interfaces/IPackageRegistry.sol index e69de29..caa854a 100644 --- a/src/interfaces/IPackageRegistry.sol +++ b/src/interfaces/IPackageRegistry.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IPackageRegistry +/// @notice Interface for EthPM v3 Package Registry based on EIP-2678 +/// @dev Defines functions for publishing and retrieving packages +interface IPackageRegistry { + /// @notice Publish a package to the registry + /// @param name Package name (lowercase, numbers, hyphens only) + /// @param version Package version + /// @param manifestURI Content-addressable URI (e.g., ipfs://) + function publish(string calldata name, string calldata version, string calldata manifestURI) external; + + /// @notice Get package manifest URI + /// @param name Package name + /// @param version Package version + /// @return manifestURI The content-addressable URI of the package manifest + function getPackageURI(string calldata name, string calldata version) external view returns (string memory); + + /// @notice Check if package version exists + /// @param name Package name + /// @param version Package version + /// @return exists True if package exists + function packageExists(string calldata name, string calldata version) external view returns (bool); +} + From 2eb0eb0321a9eeb81cd94fbb052a34da7a29019a Mon Sep 17 00:00:00 2001 From: zacksfF Date: Thu, 13 Nov 2025 14:04:52 +0100 Subject: [PATCH 2/3] feat: impl IPackageManifest #1 --- src/interfaces/IPackageManifest.sol | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/interfaces/IPackageManifest.sol b/src/interfaces/IPackageManifest.sol index e69de29..3b1ecdb 100644 --- a/src/interfaces/IPackageManifest.sol +++ b/src/interfaces/IPackageManifest.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IPackageManifest +/// @notice Interface for EthPM v3 Package Manifest structure based on EIP-2678 +interface IPackageManifest { + /// @notice Package Meta Object from EIP-2678 + struct PackageMeta { + string[] authors; // Human readable names + string license; // SPDX format + string description; // Additional detail + string[] keywords; // Relevant keywords + mapping(string => string) links; // URIs (website, docs, repo) + } + + /// @notice Compiler Information Object from EIP-2678 + struct CompilerInfo { + string name; // Compiler name (e.g., "solc") + string version; // Semver or commit hash format + } + + /// @notice Contract Instance Object from EIP-2678 + struct ContractInstance { + string contractType; // Reference to Contract Type + address instanceAddress; // Deployed address + } + + /// @notice Link Reference Object from EIP-2678 + struct LinkReference { + uint256[] offsets; // Start positions in bytecode (0-indexed) + uint256 length; // Length in bytes + string name; // Identifier for linking + } + + /// @notice Link Value Object from EIP-2678 + struct LinkValue { + uint256[] offsets; // Locations where value was written + string valueType; // "literal" or "reference" + string value; // Value to write when linking + } +} \ No newline at end of file From 853e90e5e45244d52011cebc5e9d6b362cd74677 Mon Sep 17 00:00:00 2001 From: zacksfF Date: Thu, 13 Nov 2025 14:06:35 +0100 Subject: [PATCH 3/3] feat: test interface --- test/interfaces/IPackageRegistry.t.sol | 48 ++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 test/interfaces/IPackageRegistry.t.sol diff --git a/test/interfaces/IPackageRegistry.t.sol b/test/interfaces/IPackageRegistry.t.sol new file mode 100644 index 0000000..83bf51b --- /dev/null +++ b/test/interfaces/IPackageRegistry.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; +import "../../src/interfaces/IPackageRegistry.sol"; + +contract MockPackageRegistry is IPackageRegistry { + mapping(bytes32 => string) private packages; + + function publish(string calldata name, string calldata version, string calldata manifestURI) external { + bytes32 key = keccak256(abi.encodePacked(name, version)); + packages[key] = manifestURI; + } + + function getPackageURI(string calldata name, string calldata version) external view returns (string memory) { + bytes32 key = keccak256(abi.encodePacked(name, version)); + return packages[key]; + } + + function packageExists(string calldata name, string calldata version) external view returns (bool) { + bytes32 key = keccak256(abi.encodePacked(name, version)); + return bytes(packages[key]).length > 0; + } +} + +contract IPackageRegistryTest is Test { + MockPackageRegistry registry; + + function setUp() public { + registry = new MockPackageRegistry(); + } + + function testPublishPackage() public { + registry.publish("safe-math-lib", "1.0.0", "ipfs://QmTest123"); + assertTrue(registry.packageExists("safe-math-lib", "1.0.0")); + } + + function testGetPackageURI() public { + string memory manifestURI = "ipfs://QmTest123"; + registry.publish("wallet", "2.1.0", manifestURI); + + assertEq(registry.getPackageURI("wallet", "2.1.0"), manifestURI); + } + + function testPackageNotExists() public { + assertFalse(registry.packageExists("nonexistent", "1.0.0")); + } +}