From 59d01ef82314bf110589691719ccedfdb82d56b0 Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Mon, 20 Oct 2025 12:02:42 +0200 Subject: [PATCH 1/5] feat: add `WarmStorageService#topUpCDNPaymentRails` --- docs/src/content/docs/intro/components.mdx | 3 +++ packages/synapse-sdk/src/abis/gen.ts | 2 +- .../src/test/warm-storage-service.test.ts | 26 +++++++++++++++++++ .../synapse-sdk/src/warm-storage/service.ts | 14 ++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/docs/src/content/docs/intro/components.mdx b/docs/src/content/docs/intro/components.mdx index 9d3b108a..7ffa8451 100644 --- a/docs/src/content/docs/intro/components.mdx +++ b/docs/src/content/docs/intro/components.mdx @@ -135,6 +135,9 @@ if (verification.dataSetLive) { // Service provider operations const isApproved = await warmStorageService.isProviderApproved(providerAddress) const providers = await warmStorageService.getAllApprovedProviders() + +// Top up CDN payment rails +await wamStorageService.topUpCDNPaymentRails(signer, dataSetId, cdnAmountToAdd, cacheMissAmountToAdd) ``` ### Subgraph Service diff --git a/packages/synapse-sdk/src/abis/gen.ts b/packages/synapse-sdk/src/abis/gen.ts index 76b19058..08cb7030 100644 --- a/packages/synapse-sdk/src/abis/gen.ts +++ b/packages/synapse-sdk/src/abis/gen.ts @@ -2984,7 +2984,7 @@ export const paymentsAbi = [ { name: 'finalSettledEpoch', internalType: 'uint256', type: 'uint256' }, { name: 'note', internalType: 'string', type: 'string' }, ], - stateMutability: 'nonpayable', + stateMutability: 'payable', }, { type: 'function', diff --git a/packages/synapse-sdk/src/test/warm-storage-service.test.ts b/packages/synapse-sdk/src/test/warm-storage-service.test.ts index 23de1802..207d802b 100644 --- a/packages/synapse-sdk/src/test/warm-storage-service.test.ts +++ b/packages/synapse-sdk/src/test/warm-storage-service.test.ts @@ -2035,4 +2035,30 @@ describe('WarmStorageService', () => { mockProvider.call = originalCall }) }) + + describe('CDN Operations', () => { + it('should top up CDN payment rails (mock transaction)', async () => { + const dataSetId = 49 + const warmStorageService = await createWarmStorageService() + const mockSigner = { + getAddress: async () => '0x1234567890123456789012345678901234567890', + } as any + + // Mock the contract connection + const originalGetWarmStorageContract = (warmStorageService as any)._getWarmStorageContract + ;(warmStorageService as any)._getWarmStorageContract = () => ({ + connect: () => ({ + topUpCDNPaymentRails: async () => ({ + hash: '0xmocktxhash', + wait: async () => ({ status: 1 }), + }), + }), + }) + + const tx = await warmStorageService.topUpCDNPaymentRails(mockSigner, dataSetId, 1n, 1n) + assert.equal(tx.hash, '0xmocktxhash') + + ;(warmStorageService as any)._getWarmStorageContract = originalGetWarmStorageContract + }) + }) }) diff --git a/packages/synapse-sdk/src/warm-storage/service.ts b/packages/synapse-sdk/src/warm-storage/service.ts index ca254686..4350fd29 100644 --- a/packages/synapse-sdk/src/warm-storage/service.ts +++ b/packages/synapse-sdk/src/warm-storage/service.ts @@ -6,6 +6,7 @@ * - Service provider registration and management * - Client dataset ID tracking * - Data set creation verification + * - CDN service management * * @example * ```typescript @@ -1081,4 +1082,17 @@ export class WarmStorageService { const window = await viewContract.challengeWindow() return Number(window) } + + // ========== CDN Operations ========== + + async topUpCDNPaymentRails( + signer: ethers.Signer, + dataSetId: number, + cdnAmountToAdd: bigint, + cacheMissAmountToAdd: bigint + ): Promise { + const contract = this._getWarmStorageContract() + const contractWithSigner = contract.connect(signer) as ethers.Contract + return await contractWithSigner.topUpCDNPaymentRails(dataSetId, cdnAmountToAdd, cacheMissAmountToAdd) + } } From 8fc2f984eb55a9489ae16fe474315890ab2b5040 Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Tue, 21 Oct 2025 12:19:00 +0200 Subject: [PATCH 2/5] Update packages/synapse-sdk/src/warm-storage/service.ts Co-authored-by: Srdjan --- packages/synapse-sdk/src/warm-storage/service.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/synapse-sdk/src/warm-storage/service.ts b/packages/synapse-sdk/src/warm-storage/service.ts index 4350fd29..fd038f41 100644 --- a/packages/synapse-sdk/src/warm-storage/service.ts +++ b/packages/synapse-sdk/src/warm-storage/service.ts @@ -1082,9 +1082,17 @@ export class WarmStorageService { const window = await viewContract.challengeWindow() return Number(window) } - - // ========== CDN Operations ========== - + /** + * Increments the fixed locked-up amounts for CDN payment rails. + * + * This method tops up the prepaid balance for CDN services by adding to the existing + * lockup amounts. Both CDN and cache miss rails can be incremented independently. + * + * @param dataSetId - The ID of the data set + * @param cdnAmountToAdd - Amount to add to the CDN rail lockup + * @param cacheMissAmountToAdd - Amount to add to the cache miss rail lockup + * @returns Transaction response + */ async topUpCDNPaymentRails( signer: ethers.Signer, dataSetId: number, From 8c373cfddd77f9556d7806709c173f59a315ba98 Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Tue, 21 Oct 2025 12:19:57 +0200 Subject: [PATCH 3/5] `npm run generate-abi` --- packages/synapse-sdk/src/abis/gen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/synapse-sdk/src/abis/gen.ts b/packages/synapse-sdk/src/abis/gen.ts index 08cb7030..76b19058 100644 --- a/packages/synapse-sdk/src/abis/gen.ts +++ b/packages/synapse-sdk/src/abis/gen.ts @@ -2984,7 +2984,7 @@ export const paymentsAbi = [ { name: 'finalSettledEpoch', internalType: 'uint256', type: 'uint256' }, { name: 'note', internalType: 'string', type: 'string' }, ], - stateMutability: 'payable', + stateMutability: 'nonpayable', }, { type: 'function', From dc59dd750d3d66be958a7d04eb894f21d3dcf3c3 Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Tue, 21 Oct 2025 12:50:53 +0200 Subject: [PATCH 4/5] fix --- packages/synapse-sdk/src/warm-storage/service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/synapse-sdk/src/warm-storage/service.ts b/packages/synapse-sdk/src/warm-storage/service.ts index fd038f41..1c8f8d8b 100644 --- a/packages/synapse-sdk/src/warm-storage/service.ts +++ b/packages/synapse-sdk/src/warm-storage/service.ts @@ -1084,10 +1084,10 @@ export class WarmStorageService { } /** * Increments the fixed locked-up amounts for CDN payment rails. - * + * * This method tops up the prepaid balance for CDN services by adding to the existing * lockup amounts. Both CDN and cache miss rails can be incremented independently. - * + * * @param dataSetId - The ID of the data set * @param cdnAmountToAdd - Amount to add to the CDN rail lockup * @param cacheMissAmountToAdd - Amount to add to the cache miss rail lockup From a3e8c9513c8779ed8620ffeea2a72b611d24b07c Mon Sep 17 00:00:00 2001 From: Julian Gruber Date: Wed, 22 Oct 2025 11:42:27 +0200 Subject: [PATCH 5/5] add client side validations --- packages/synapse-sdk/src/warm-storage/service.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/synapse-sdk/src/warm-storage/service.ts b/packages/synapse-sdk/src/warm-storage/service.ts index 1c8f8d8b..b663a24d 100644 --- a/packages/synapse-sdk/src/warm-storage/service.ts +++ b/packages/synapse-sdk/src/warm-storage/service.ts @@ -1099,6 +1099,13 @@ export class WarmStorageService { cdnAmountToAdd: bigint, cacheMissAmountToAdd: bigint ): Promise { + if (cdnAmountToAdd < 0n || cacheMissAmountToAdd < 0n) { + throw new Error('Top up amounts must be positive') + } + if (cdnAmountToAdd === 0n && cacheMissAmountToAdd === 0n) { + throw new Error('At least one top up amount must be >0') + } + const contract = this._getWarmStorageContract() const contractWithSigner = contract.connect(signer) as ethers.Contract return await contractWithSigner.topUpCDNPaymentRails(dataSetId, cdnAmountToAdd, cacheMissAmountToAdd)