From fe5832128395fb68b302f14a7ce3e69c12b88d14 Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Mon, 3 Nov 2025 14:58:40 +0100 Subject: [PATCH 1/7] Update PDPVerifier ABI --- index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index 1a07839..e73235e 100644 --- a/index.js +++ b/index.js @@ -22,8 +22,8 @@ export const pdpVerifierAbi = [ 'function getNextPieceId(uint256 dataSetId) public view returns (uint256)', // Returns the piece CID for a given data set and piece ID 'function getPieceCid(uint256 dataSetId, uint256 pieceId) public view returns (tuple(bytes))', - // Returns the owner of a data set and the proposed owner if any - 'function getDataSetOwner(uint256 dataSetId) public view returns (address, address)', + // Returns the storage provider of a data set and the proposed storage provider if any + 'function getDataSetStorageProvider(uint256 dataSetId) public view returns (address, address)', ] /** @@ -33,7 +33,7 @@ export const pdpVerifierAbi = [ * pieceLive(setId: BigInt, pieceId: BigInt): Promise * getNextPieceId(setId: BigInt): Promise * getPieceCid(setId: BigInt, pieceId: BigInt): Promise<[string]> - * getDataSetOwner(setId: BigInt): Promise<[string, string]> + * getDataSetStorageProvider(setId: BigInt): Promise<[string, string]> * isProviderApproved(provider: string): Promise * }} PdpVerifier */ @@ -266,9 +266,9 @@ async function maybeGetResolvedDataSetRetrievalUrl({ } try { - const [dataSetOwner] = await pdpVerifier.getDataSetOwner(dataSetId) + const [dataSetStorageProvider] = await pdpVerifier.getDataSetStorageProvider(dataSetId) const providerId = - await serviceProviderRegistry.getProviderIdByAddress(dataSetOwner) + await serviceProviderRegistry.getProviderIdByAddress(dataSetStorageProvider) const isApprovedProvider = await fwssStateView.isProviderApproved(providerId) @@ -276,7 +276,7 @@ async function maybeGetResolvedDataSetRetrievalUrl({ console.warn( 'Provider %s (%s) for data set ID %s is not approved, skipping retrieval URL resolution', providerId, - dataSetOwner, + dataSetStorageProvider, dataSetId, ) return undefined @@ -288,7 +288,7 @@ async function maybeGetResolvedDataSetRetrievalUrl({ console.warn( 'Provider %s (%s) for data set ID %s is not active, skipping retrieval URL resolution', providerId, - dataSetOwner, + dataSetStorageProvider, dataSetId, ) return undefined From 8ae521d0388980978b2d54121c91acf316a51a02 Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Mon, 3 Nov 2025 15:12:41 +0100 Subject: [PATCH 2/7] update more, fmt --- bin/bot.js | 6 ++--- fly.mainnet.toml | 6 ++--- index.js | 65 +++++++++++++++++++++--------------------------- 3 files changed, 35 insertions(+), 42 deletions(-) diff --git a/bin/bot.js b/bin/bot.js index b20966e..e341632 100644 --- a/bin/bot.js +++ b/bin/bot.js @@ -12,9 +12,9 @@ const { FLY_REGION, GLIF_TOKEN, RPC_URL = 'https://api.calibration.node.glif.io/', - PDP_VERIFIER_ADDRESS = '0x445238Eca6c6aB8Dff1Aa6087d9c05734D22f137', - FWSS_STATE_VIEW_ADDRESS = '0x87EDE87cEF4BfeFE0374c3470cB3F5be18b739d5', - SERVICE_PROVIDER_REGISTRY_ADDRESS = '0xA8a7e2130C27e4f39D1aEBb3D538D5937bCf8ddb', + PDP_VERIFIER_ADDRESS = '0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C', + FWSS_STATE_VIEW_ADDRESS = '0xA5D87b04086B1d591026cCE10255351B5AA4689B', + SERVICE_PROVIDER_REGISTRY_ADDRESS = '0x839e5c9988e4e9977d40708d0094103c0839Ac9D', CDN_HOSTNAME = 'calibration.filbeam.io', DELAY = 1_000, FROM_DATA_SET_ID = 0, diff --git a/fly.mainnet.toml b/fly.mainnet.toml index 8e84688..52b68da 100644 --- a/fly.mainnet.toml +++ b/fly.mainnet.toml @@ -9,9 +9,9 @@ primary_region = 'fra' [env] DELAY = 30_000 RPC_URL = 'https://api.node.glif.io/' - PDP_VERIFIER_ADDRESS = '0x1790d465d1FABE85b530B116f385091d52a12a3b' - FWSS_STATE_VIEW_ADDRESS = '0x1f4B10FFf972Cd429e4007ac2c77fC9e2315ca2f' - SERVICE_PROVIDER_REGISTRY_ADDRESS = '0x93b48FeEB7fF9a6D4d745c9EE28Bfa129E6E6676' + PDP_VERIFIER_ADDRESS = '0xBADd0B92C1c71d02E7d520f64c0876538fa2557F' + FWSS_STATE_VIEW_ADDRESS = '0x9e4e6699d8F67dFc883d6b0A7344Bd56F7E80B46' + SERVICE_PROVIDER_REGISTRY_ADDRESS = '0xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB' CDN_HOSTNAME = 'filbeam.io' [build] diff --git a/index.js b/index.js index e73235e..0c62b93 100644 --- a/index.js +++ b/index.js @@ -45,16 +45,19 @@ export const fwssStateViewAbi = [ uint256 cdnRailId, address payer, address payee, + address serviceProvider, uint256 commissionBps, uint256 clientDataSetId, - uint256 paymentEndEpoch, + uint256 pdpEndEpoch, + uint256 providerId, + uint256 dataSetId ) memory)`, `function getDataSetMetadata(uint256 dataSetId, string memory key) external view returns (bool exists, string memory value)`, 'function isProviderApproved(uint256 providerId) external view returns (bool)', ] export const serviceProviderRegistryAbi = [ - 'function getPDPService(uint256 providerId) external view returns (tuple(tuple(string,uint256,uint256,bool,bool,uint256,uint256,string,address), string[] capabilityKeys, bool isActive) memory)', + 'function getAllProductCapabilities(uint256 providerId, uint8 productType) external view returns (tuple(bool isActive, string[] capabilityKeys, bytes[] capabilityValues) memory)', 'function getProviderIdByAddress(address provider) external view returns (uint256)', 'function isProviderActive(uint256 providerId) external view returns (bool)', ] @@ -66,22 +69,15 @@ export const serviceProviderRegistryAbi = [ * cdnRailId: BigInt * payer: string * payee: string + * serviceProvider: string * commissionBps: BigInt * clientDataSetId: BigInt - * paymentEndEpoch: BigInt + * pdpEndEpoch: BigInt + * providerId: BigInt + * dataSetId: BigInt * }} DataSetInfo */ -/** - * @typedef {{ - * owner: string - * pdpUrl: string - * pieceRetrievalUrl: string - * registeredAt: BigInt - * approvedAt: BigInt - * }} ApprovedProviderInfo - */ - /** * @typedef {{ * getDataSet(dataSetId: BigInt): Promise @@ -96,28 +92,17 @@ export const serviceProviderRegistryAbi = [ * }} FilecoinWarmStorageServiceStateView */ -/** - * @typedef {{ - * serviceURL: string - * minPieceSizeInBytes: number - * maxPieceSizeInBytes: number - * ipniPiece: boolean - * ipniIpfs: boolean - * storagePricePerTibPerMonth: number - * minProvingPeriodInEpochs: number - * location: string - * paymentTokenAddress: string - * }} PDPOffering - */ - /** * @typedef {{ * isProviderActive(providerId: BigInt): Promise * getProviderIdByAddress(provider: string): Promise - * getPDPService(providerId: BigInt): Promise<{ - * pdpOffering: PDPOffering - * capabilityKeys: string[] + * getAllProductCapabilities( + * providerId: BigInt, + * productType: BigInt, + * ): Promise<{ * isActive: boolean + * capabilityKeys: string[] + * capabilityValues: Buffer[] * }> * }} ServiceProviderRegistry */ @@ -266,9 +251,11 @@ async function maybeGetResolvedDataSetRetrievalUrl({ } try { - const [dataSetStorageProvider] = await pdpVerifier.getDataSetStorageProvider(dataSetId) - const providerId = - await serviceProviderRegistry.getProviderIdByAddress(dataSetStorageProvider) + const [dataSetStorageProvider] = + await pdpVerifier.getDataSetStorageProvider(dataSetId) + const providerId = await serviceProviderRegistry.getProviderIdByAddress( + dataSetStorageProvider, + ) const isApprovedProvider = await fwssStateView.isProviderApproved(providerId) @@ -282,8 +269,12 @@ async function maybeGetResolvedDataSetRetrievalUrl({ return undefined } - const { pdpOffering, isActive } = - await serviceProviderRegistry.getPDPService(providerId) + const { isActive, capabilityKeys, capabilityValues } = + await serviceProviderRegistry.getAllProductCapabilities( + providerId, + 8n /* TODO */, + ) + if (!isActive) { console.warn( 'Provider %s (%s) for data set ID %s is not active, skipping retrieval URL resolution', @@ -294,7 +285,9 @@ async function maybeGetResolvedDataSetRetrievalUrl({ return undefined } - return pdpOffering.serviceURL + // TODO: Validation + const serviceURLIndex = capabilityKeys.indexOf('serviceURL') + return Buffer.from(capabilityValues[serviceURLIndex]).toString() } catch (err) { console.warn( 'Failed to fetch owner & provider info for DataSetID %s: %s', From 031fdb095c54291e4aa34a50f48542a014d3fe05 Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Mon, 3 Nov 2025 15:14:17 +0100 Subject: [PATCH 3/7] docs --- index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.js b/index.js index 0c62b93..b155f4a 100644 --- a/index.js +++ b/index.js @@ -11,6 +11,8 @@ const NO_ALERT_ON_RESPONSE_STATUS_CODES = [ 521, ] +// TODO: Can we still rely on `getNextDataSetId()` after https://github.com/FilOzone/filecoin-services/pull/265? + export const pdpVerifierAbi = [ // Returns the next data set ID 'function getNextDataSetId() public view returns (uint64)', From b464518765653119d9bd86340101f68bad1a9b5b Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Mon, 3 Nov 2025 15:16:09 +0100 Subject: [PATCH 4/7] fix PDP product type --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index b155f4a..8a1aa74 100644 --- a/index.js +++ b/index.js @@ -274,7 +274,7 @@ async function maybeGetResolvedDataSetRetrievalUrl({ const { isActive, capabilityKeys, capabilityValues } = await serviceProviderRegistry.getAllProductCapabilities( providerId, - 8n /* TODO */, + 0n, ) if (!isActive) { From ebc5898339c39bed810ad4213042224b347eb6db Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Mon, 3 Nov 2025 15:22:14 +0100 Subject: [PATCH 5/7] add validation --- index.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 8a1aa74..f20286d 100644 --- a/index.js +++ b/index.js @@ -287,8 +287,15 @@ async function maybeGetResolvedDataSetRetrievalUrl({ return undefined } - // TODO: Validation const serviceURLIndex = capabilityKeys.indexOf('serviceURL') + if (serviceURLIndex === -1) { + console.warn( + 'Service URL not found in capabilityKeys %s for data set ID %s', + capabilityKeys.join(','), + dataSetId, + ) + } + return Buffer.from(capabilityValues[serviceURLIndex]).toString() } catch (err) { console.warn( From b5e74cd7171e71f7acf94e391901e5aad5efc1ca Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Mon, 3 Nov 2025 15:22:21 +0100 Subject: [PATCH 6/7] fmt --- index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/index.js b/index.js index f20286d..abfa527 100644 --- a/index.js +++ b/index.js @@ -272,10 +272,7 @@ async function maybeGetResolvedDataSetRetrievalUrl({ } const { isActive, capabilityKeys, capabilityValues } = - await serviceProviderRegistry.getAllProductCapabilities( - providerId, - 0n, - ) + await serviceProviderRegistry.getAllProductCapabilities(providerId, 0n) if (!isActive) { console.warn( From b942cd9bfd790644659c7f37d3dd873c37ed9c3e Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Tue, 4 Nov 2025 10:21:27 +0100 Subject: [PATCH 7/7] Update index.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Miroslav Bajtoš --- index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/index.js b/index.js index abfa527..f2f4380 100644 --- a/index.js +++ b/index.js @@ -11,8 +11,6 @@ const NO_ALERT_ON_RESPONSE_STATUS_CODES = [ 521, ] -// TODO: Can we still rely on `getNextDataSetId()` after https://github.com/FilOzone/filecoin-services/pull/265? - export const pdpVerifierAbi = [ // Returns the next data set ID 'function getNextDataSetId() public view returns (uint64)',