diff --git a/src/common/turbo.ts b/src/common/turbo.ts index d7697ee4..9f3aa11f 100644 --- a/src/common/turbo.ts +++ b/src/common/turbo.ts @@ -15,6 +15,7 @@ */ import { Currency, + DelegatedPaymentApproval, GetDelegatedPaymentApprovalsResponse, NativeAddress, TokenType, @@ -294,7 +295,7 @@ export class TurboAuthenticatedClient */ createDelegatedPaymentApproval( p: TurboCreateDelegatedPaymentApprovalParams, - ): Promise { + ): Promise { return this.uploadService.createDelegatedPaymentApproval(p); } @@ -306,7 +307,7 @@ export class TurboAuthenticatedClient */ revokeDelegatedPaymentApprovals( p: TurboRevokeDelegatePaymentApprovalsParams, - ): Promise { + ): Promise { return this.uploadService.revokeDelegatedPaymentApprovals(p); } } diff --git a/src/common/upload.ts b/src/common/upload.ts index a1943009..49515feb 100644 --- a/src/common/upload.ts +++ b/src/common/upload.ts @@ -20,6 +20,7 @@ import { pLimit } from 'plimit-lit'; import { ArweaveManifest, DataItemOptions, + DelegatedPaymentApproval, TokenType, TurboAbortSignal, TurboAuthenticatedUploadServiceConfiguration, @@ -319,7 +320,7 @@ export abstract class TurboAuthenticatedBaseUploadService approvedAddress, approvedWincAmount, expiresBySeconds, - }: TurboCreateDelegatedPaymentApprovalParams): Promise { + }: TurboCreateDelegatedPaymentApprovalParams): Promise { const dataItemOpts = { tags: [ { name: createDelegatedPaymentApprovalTagName, value: approvedAddress }, @@ -336,16 +337,25 @@ export abstract class TurboAuthenticatedBaseUploadService const nonceData = Buffer.from( approvedAddress + approvedWincAmount + Date.now(), ); - return this.uploadFile({ + const { createdApproval, ...uploadResponse } = await this.uploadFile({ fileStreamFactory: () => Readable.from(nonceData), fileSizeFactory: () => nonceData.byteLength, dataItemOpts, }); + if (!createdApproval) { + throw new Error( + 'Failed to create delegated payment approval but upload has succeeded\n' + + JSON.stringify(uploadResponse), + ); + } + return createdApproval; } public async revokeDelegatedPaymentApprovals({ revokedAddress, - }: TurboRevokeDelegatePaymentApprovalsParams): Promise { + }: TurboRevokeDelegatePaymentApprovalsParams): Promise< + DelegatedPaymentApproval[] + > { const dataItemOpts = { tags: [ { @@ -356,10 +366,17 @@ export abstract class TurboAuthenticatedBaseUploadService }; const nonceData = Buffer.from(revokedAddress + Date.now()); - return this.uploadFile({ + const { revokedApprovals, ...uploadResponse } = await this.uploadFile({ fileStreamFactory: () => Readable.from(nonceData), fileSizeFactory: () => nonceData.byteLength, dataItemOpts, }); + if (!revokedApprovals) { + throw new Error( + 'Failed to revoke delegated payment approvals but upload has succeeded\n' + + JSON.stringify(uploadResponse), + ); + } + return revokedApprovals; } } diff --git a/src/types.ts b/src/types.ts index 5a65f1ec..5e2b432f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -207,6 +207,8 @@ export type TurboUploadDataItemResponse = { id: TransactionId; owner: PublicArweaveAddress; winc: string; + createdApproval?: DelegatedPaymentApproval; + revokedApprovals?: DelegatedPaymentApproval[]; }; type UploadFolderParams = { @@ -599,9 +601,11 @@ export type TurboFundWithTokensParams = { export interface TurboAuthenticatedPaymentServiceInterface extends TurboUnauthenticatedPaymentServiceInterface { getBalance: (userAddress?: UserAddress) => Promise; + getDelegatedPaymentApprovals( userAddress?: UserAddress, ): Promise; + topUpWithTokens( p: TurboFundWithTokensParams, ): Promise; @@ -626,10 +630,11 @@ export interface TurboAuthenticatedUploadServiceInterface createDelegatedPaymentApproval( p: TurboCreateDelegatedPaymentApprovalParams, - ): Promise; + ): Promise; + revokeDelegatedPaymentApprovals( p: TurboRevokeDelegatePaymentApprovalsParams, - ): Promise; + ): Promise; } export interface TurboUnauthenticatedClientInterface @@ -652,6 +657,7 @@ export interface TokenTools { target: string; reward?: string; }>; + pollForTxBeingAvailable: (p: { txId: string }) => Promise; }