@@ -61,7 +61,8 @@ contract ServiceProviderRegistryFullTest is Test {
6161 storagePricePerTibPerMonth: 1000000000000000000 , // 1 FIL per TiB per month
6262 minProvingPeriodInEpochs: 2880 , // 1 day in epochs (30 second blocks)
6363 location: "North America " ,
64- paymentTokenAddress: IERC20 (address (0 )) // Payment in FIL
64+ paymentTokenAddress: IERC20 (address (0 )), // Payment in FIL
65+ ipniPeerId: hex ""
6566 });
6667
6768 updatedPDPData = ServiceProviderRegistryStorage.PDPOffering ({
@@ -73,7 +74,8 @@ contract ServiceProviderRegistryFullTest is Test {
7374 storagePricePerTibPerMonth: 2000000000000000000 , // 2 FIL per TiB per month
7475 minProvingPeriodInEpochs: 1440 , // 12 hours in epochs
7576 location: "Europe " ,
76- paymentTokenAddress: IERC20 (address (0 )) // Payment in FIL
77+ paymentTokenAddress: IERC20 (address (0 )), // Payment in FIL
78+ ipniPeerId: hex ""
7779 });
7880
7981 // Encode PDP data
@@ -1800,4 +1802,179 @@ contract ServiceProviderRegistryFullTest is Test {
18001802 assertFalse (tierCleared, "Tier key should not exist after update " );
18011803 assertEq (clearedTier, "" , "Tier key should be cleared after update " );
18021804 }
1805+
1806+ // ========== IPNI Peer ID Validation Tests ==========
1807+
1808+ function testRegisterWithEmptyIpniPeerId () public {
1809+ ServiceProviderRegistryStorage.PDPOffering memory validPDP = defaultPDPData;
1810+ validPDP.ipniPeerId = hex "" ;
1811+ bytes memory encodedPDP = abi.encode (validPDP);
1812+ string [] memory emptyKeys = new string [](0 );
1813+ string [] memory emptyValues = new string [](0 );
1814+
1815+ vm.prank (provider1);
1816+ uint256 providerId = registry.registerProvider {value: REGISTRATION_FEE}(
1817+ provider1,
1818+ "" ,
1819+ "Test provider " ,
1820+ ServiceProviderRegistryStorage.ProductType.PDP,
1821+ encodedPDP,
1822+ emptyKeys,
1823+ emptyValues
1824+ );
1825+ assertEq (providerId, 1 , "Should succeed with empty ipniPeerId " );
1826+
1827+ // Verify it was stored correctly
1828+ (ServiceProviderRegistryStorage.PDPOffering memory stored ,,) = registry.getPDPService (providerId);
1829+ assertEq (stored.ipniPeerId.length , 0 , "Empty IPNI peer ID should be stored " );
1830+ }
1831+
1832+ function testRegisterWithMaxLengthIpniPeerId () public {
1833+ bytes memory maxPeerId = new bytes (128 );
1834+ for (uint256 i = 0 ; i < 128 ; i++ ) {
1835+ maxPeerId[i] = 0xFF ;
1836+ }
1837+
1838+ ServiceProviderRegistryStorage.PDPOffering memory validPDP = defaultPDPData;
1839+ validPDP.ipniPeerId = maxPeerId;
1840+ bytes memory encodedPDP = abi.encode (validPDP);
1841+ string [] memory emptyKeys = new string [](0 );
1842+ string [] memory emptyValues = new string [](0 );
1843+
1844+ vm.prank (provider1);
1845+ uint256 providerId = registry.registerProvider {value: REGISTRATION_FEE}(
1846+ provider1,
1847+ "" ,
1848+ "Test provider " ,
1849+ ServiceProviderRegistryStorage.ProductType.PDP,
1850+ encodedPDP,
1851+ emptyKeys,
1852+ emptyValues
1853+ );
1854+ assertEq (providerId, 1 , "Should succeed with 128-byte ipniPeerId " );
1855+
1856+ // Verify it was stored correctly
1857+ (ServiceProviderRegistryStorage.PDPOffering memory stored ,,) = registry.getPDPService (providerId);
1858+ assertEq (stored.ipniPeerId.length , 128 , "128-byte IPNI peer ID should be stored " );
1859+ assertEq (stored.ipniPeerId, maxPeerId, "IPNI peer ID should match " );
1860+ }
1861+
1862+ function testRegisterWithTooLongIpniPeerId () public {
1863+ bytes memory longPeerId = new bytes (129 );
1864+ for (uint256 i = 0 ; i < 129 ; i++ ) {
1865+ longPeerId[i] = 0xFF ;
1866+ }
1867+
1868+ ServiceProviderRegistryStorage.PDPOffering memory invalidPDP = defaultPDPData;
1869+ invalidPDP.ipniPeerId = longPeerId;
1870+ bytes memory encodedInvalidPDP = abi.encode (invalidPDP);
1871+ string [] memory emptyKeys = new string [](0 );
1872+ string [] memory emptyValues = new string [](0 );
1873+
1874+ vm.prank (provider1);
1875+ vm.expectRevert ("IPNI peer ID too long " );
1876+ registry.registerProvider {value: REGISTRATION_FEE}(
1877+ provider1,
1878+ "" ,
1879+ "Test provider " ,
1880+ ServiceProviderRegistryStorage.ProductType.PDP,
1881+ encodedInvalidPDP,
1882+ emptyKeys,
1883+ emptyValues
1884+ );
1885+ }
1886+
1887+ function testRegisterWithRealisticIpniPeerId () public {
1888+ // Typical libp2p peer ID is ~38 bytes (multihash of public key)
1889+ // Format: 0x1220<32-byte sha256 hash> for a total of 34 bytes
1890+ bytes memory realisticPeerId = hex "12205f8bb7e5e0e8e5f8e5e0e8e5f8e5e0e8e5f8e5e0e8e5f8e5e0e8e5f8abcdef01 " ;
1891+
1892+ ServiceProviderRegistryStorage.PDPOffering memory validPDP = defaultPDPData;
1893+ validPDP.ipniPeerId = realisticPeerId;
1894+ bytes memory encodedPDP = abi.encode (validPDP);
1895+ string [] memory emptyKeys = new string [](0 );
1896+ string [] memory emptyValues = new string [](0 );
1897+
1898+ vm.prank (provider1);
1899+ uint256 providerId = registry.registerProvider {value: REGISTRATION_FEE}(
1900+ provider1,
1901+ "" ,
1902+ "Test provider " ,
1903+ ServiceProviderRegistryStorage.ProductType.PDP,
1904+ encodedPDP,
1905+ emptyKeys,
1906+ emptyValues
1907+ );
1908+
1909+ // Verify it was stored correctly
1910+ (ServiceProviderRegistryStorage.PDPOffering memory stored ,,) = registry.getPDPService (providerId);
1911+ assertEq (stored.ipniPeerId, realisticPeerId, "IPNI peer ID should be stored correctly " );
1912+ assertEq (stored.ipniPeerId.length , 34 , "Realistic IPNI peer ID should be 34 bytes " );
1913+ }
1914+
1915+ function testUpdateIpniPeerId () public {
1916+ // Register with empty IPNI peer ID
1917+ string [] memory emptyKeys = new string [](0 );
1918+ string [] memory emptyValues = new string [](0 );
1919+
1920+ vm.prank (provider1);
1921+ uint256 providerId = registry.registerProvider {value: REGISTRATION_FEE}(
1922+ provider1,
1923+ "" ,
1924+ "Test provider " ,
1925+ ServiceProviderRegistryStorage.ProductType.PDP,
1926+ encodedDefaultPDPData,
1927+ emptyKeys,
1928+ emptyValues
1929+ );
1930+
1931+ // Verify initial state
1932+ (ServiceProviderRegistryStorage.PDPOffering memory initialStored ,,) = registry.getPDPService (providerId);
1933+ assertEq (initialStored.ipniPeerId.length , 0 , "Initial IPNI peer ID should be empty " );
1934+
1935+ // Update with a peer ID
1936+ bytes memory newPeerId = hex "12205f8bb7e5e0e8e5f8e5e0e8e5f8e5e0e8e5f8e5e0e8e5f8e5e0e8e5f8abcdef01 " ;
1937+ ServiceProviderRegistryStorage.PDPOffering memory updatedData = updatedPDPData;
1938+ updatedData.ipniPeerId = newPeerId;
1939+ bytes memory encodedUpdatedData = abi.encode (updatedData);
1940+
1941+ vm.prank (provider1);
1942+ registry.updateProduct (ServiceProviderRegistryStorage.ProductType.PDP, encodedUpdatedData, emptyKeys, emptyValues);
1943+
1944+ // Verify update
1945+ (ServiceProviderRegistryStorage.PDPOffering memory updatedStored ,,) = registry.getPDPService (providerId);
1946+ assertEq (updatedStored.ipniPeerId, newPeerId, "IPNI peer ID should be updated " );
1947+ assertEq (updatedStored.ipniPeerId.length , 34 , "Updated IPNI peer ID should be 34 bytes " );
1948+ }
1949+
1950+ function testUpdateWithTooLongIpniPeerId () public {
1951+ // Register first
1952+ string [] memory emptyKeys = new string [](0 );
1953+ string [] memory emptyValues = new string [](0 );
1954+
1955+ vm.prank (provider1);
1956+ registry.registerProvider {value: REGISTRATION_FEE}(
1957+ provider1,
1958+ "" ,
1959+ "Test provider " ,
1960+ ServiceProviderRegistryStorage.ProductType.PDP,
1961+ encodedDefaultPDPData,
1962+ emptyKeys,
1963+ emptyValues
1964+ );
1965+
1966+ // Try to update with too long peer ID
1967+ bytes memory longPeerId = new bytes (129 );
1968+ for (uint256 i = 0 ; i < 129 ; i++ ) {
1969+ longPeerId[i] = 0xAB ;
1970+ }
1971+
1972+ ServiceProviderRegistryStorage.PDPOffering memory invalidData = updatedPDPData;
1973+ invalidData.ipniPeerId = longPeerId;
1974+ bytes memory encodedInvalidData = abi.encode (invalidData);
1975+
1976+ vm.prank (provider1);
1977+ vm.expectRevert ("IPNI peer ID too long " );
1978+ registry.updateProduct (ServiceProviderRegistryStorage.ProductType.PDP, encodedInvalidData, emptyKeys, emptyValues);
1979+ }
18031980}
0 commit comments