UNPKG

wallet-storage

Version:

BRC100 conforming wallet, wallet storage and wallet signer components

417 lines (368 loc) 11.7 kB
import { AbortActionArgs, AbortActionResult, Beef, InternalizeActionArgs, InternalizeActionResult, ListActionsArgs, ListActionsResult, ListCertificatesResult, ListOutputsArgs, ListOutputsResult, RelinquishCertificateArgs, RelinquishOutputArgs, SendWithResult } from '@bsv/sdk' import { sdk, table } from '../index.client' /** * This is the `WalletStorage` interface implemented by a class such as `WalletStorageManager`, * which manges an active and set of backup storage providers. * * Access and conrol is not directly managed. Typically each request is made with an associated identityKey * and it is left to the providers: physical access or remote channel authentication. */ export interface WalletStorage { /** * @returns false */ isStorageProvider(): boolean isAvailable(): boolean makeAvailable(): Promise<table.Settings> migrate(storageName: string, storageIdentityKey: string): Promise<string> destroy(): Promise<void> setServices(v: sdk.WalletServices): void getServices(): sdk.WalletServices getSettings(): table.Settings getAuth(): Promise<sdk.AuthId> findOrInsertUser( identityKey: string ): Promise<{ user: table.User; isNew: boolean }> abortAction(args: AbortActionArgs): Promise<AbortActionResult> createAction( args: sdk.ValidCreateActionArgs ): Promise<sdk.StorageCreateActionResult> processAction( args: sdk.StorageProcessActionArgs ): Promise<sdk.StorageProcessActionResults> internalizeAction( args: InternalizeActionArgs ): Promise<InternalizeActionResult> findCertificates(args: sdk.FindCertificatesArgs): Promise<table.Certificate[]> findOutputBaskets( args: sdk.FindOutputBasketsArgs ): Promise<table.OutputBasket[]> findOutputs(args: sdk.FindOutputsArgs): Promise<table.Output[]> findProvenTxReqs(args: sdk.FindProvenTxReqsArgs): Promise<table.ProvenTxReq[]> listActions(args: ListActionsArgs): Promise<ListActionsResult> listCertificates( args: sdk.ValidListCertificatesArgs ): Promise<ListCertificatesResult> listOutputs(args: ListOutputsArgs): Promise<ListOutputsResult> insertCertificate(certificate: table.CertificateX): Promise<number> relinquishCertificate(args: RelinquishCertificateArgs): Promise<number> relinquishOutput(args: RelinquishOutputArgs): Promise<number> } /** * This is the `WalletStorage` interface implemented with authentication checking and * is the actual minimal interface implemented by storage and remoted storage providers. */ export interface WalletStorageProvider extends WalletStorageSync { /** * @returns true if this object's interface can be extended to the full `StorageProvider` interface */ isStorageProvider(): boolean setServices(v: sdk.WalletServices): void } export interface WalletStorageSync extends WalletStorageWriter { findOrInsertSyncStateAuth( auth: sdk.AuthId, storageIdentityKey: string, storageName: string ): Promise<{ syncState: table.SyncState; isNew: boolean }> setActive( auth: sdk.AuthId, newActiveStorageIdentityKey: string ): Promise<number> getSyncChunk(args: sdk.RequestSyncChunkArgs): Promise<sdk.SyncChunk> processSyncChunk( args: sdk.RequestSyncChunkArgs, chunk: sdk.SyncChunk ): Promise<sdk.ProcessSyncChunkResult> } export interface WalletStorageWriter extends WalletStorageReader { makeAvailable(): Promise<table.Settings> migrate(storageName: string, storageIdentityKey: string): Promise<string> destroy(): Promise<void> findOrInsertUser( identityKey: string ): Promise<{ user: table.User; isNew: boolean }> abortAction( auth: sdk.AuthId, args: AbortActionArgs ): Promise<AbortActionResult> createAction( auth: sdk.AuthId, args: sdk.ValidCreateActionArgs ): Promise<sdk.StorageCreateActionResult> processAction( auth: sdk.AuthId, args: sdk.StorageProcessActionArgs ): Promise<sdk.StorageProcessActionResults> internalizeAction( auth: sdk.AuthId, args: InternalizeActionArgs ): Promise<InternalizeActionResult> insertCertificateAuth( auth: sdk.AuthId, certificate: table.CertificateX ): Promise<number> relinquishCertificate( auth: sdk.AuthId, args: RelinquishCertificateArgs ): Promise<number> relinquishOutput( auth: sdk.AuthId, args: RelinquishOutputArgs ): Promise<number> } export interface WalletStorageReader { isAvailable(): boolean getServices(): sdk.WalletServices getSettings(): table.Settings findCertificatesAuth( auth: sdk.AuthId, args: sdk.FindCertificatesArgs ): Promise<table.Certificate[]> findOutputBasketsAuth( auth: sdk.AuthId, args: sdk.FindOutputBasketsArgs ): Promise<table.OutputBasket[]> findOutputsAuth( auth: sdk.AuthId, args: sdk.FindOutputsArgs ): Promise<table.Output[]> findProvenTxReqs(args: sdk.FindProvenTxReqsArgs): Promise<table.ProvenTxReq[]> listActions( auth: sdk.AuthId, vargs: sdk.ValidListActionsArgs ): Promise<ListActionsResult> listCertificates( auth: sdk.AuthId, vargs: sdk.ValidListCertificatesArgs ): Promise<ListCertificatesResult> listOutputs( auth: sdk.AuthId, vargs: sdk.ValidListOutputsArgs ): Promise<ListOutputsResult> } export interface AuthId { identityKey: string userId?: number isActive?: boolean } export interface FindSincePagedArgs { since?: Date paged?: sdk.Paged trx?: sdk.TrxToken } export interface FindForUserSincePagedArgs extends FindSincePagedArgs { userId: number } export interface FindPartialSincePagedArgs<T extends object> extends FindSincePagedArgs { partial: Partial<T> } export interface FindCertificatesArgs extends FindSincePagedArgs { partial: Partial<table.Certificate> certifiers?: string[] types?: string[] includeFields?: boolean } export interface FindOutputBasketsArgs extends FindSincePagedArgs { partial: Partial<table.OutputBasket> } export interface FindOutputsArgs extends FindSincePagedArgs { partial: Partial<table.Output> noScript?: boolean txStatus?: sdk.TransactionStatus[] } export type StorageProvidedBy = 'you' | 'storage' | 'you-and-storage' export interface StorageCreateTransactionSdkInput { vin: number sourceTxid: string sourceVout: number sourceSatoshis: number sourceLockingScript: string unlockingScriptLength: number providedBy: StorageProvidedBy type: string spendingDescription?: string derivationPrefix?: string derivationSuffix?: string senderIdentityKey?: string } export interface StorageCreateTransactionSdkOutput extends sdk.ValidCreateActionOutput { vout: number providedBy: StorageProvidedBy purpose?: string derivationSuffix?: string } export interface StorageCreateActionResult { inputBeef?: number[] inputs: StorageCreateTransactionSdkInput[] outputs: StorageCreateTransactionSdkOutput[] noSendChangeOutputVouts?: number[] derivationPrefix: string version: number lockTime: number reference: string } export interface StorageProcessActionArgs { isNewTx: boolean isSendWith: boolean isNoSend: boolean isDelayed: boolean reference?: string txid?: string rawTx?: number[] sendWith: string[] log?: string } export interface StorageProcessActionResults { sendWithResults?: SendWithResult[] log?: string } export interface ProvenOrRawTx { proven?: table.ProvenTx rawTx?: number[] inputBEEF?: number[] } export interface PurgeParams { purgeCompleted: boolean purgeFailed: boolean purgeSpent: boolean /** * Minimum age in msecs for transient completed transaction data purge. * Default is 14 days. */ purgeCompletedAge?: number /** * Minimum age in msecs for failed transaction data purge. * Default is 14 days. */ purgeFailedAge?: number /** * Minimum age in msecs for failed transaction data purge. * Default is 14 days. */ purgeSpentAge?: number } export interface PurgeResults { count: number log: string } export interface StorageProvenOrReq { proven?: table.ProvenTx req?: table.ProvenTxReq } /** * Specifies the available options for computing transaction fees. */ export interface StorageFeeModel { /** * Available models. Currently only "sat/kb" is supported. */ model: 'sat/kb' /** * When "fee.model" is "sat/kb", this is an integer representing the number of satoshis per kb of block space * the transaction will pay in fees. * * If undefined, the default value is used. */ value?: number } export interface StorageGetBeefOptions { /** if 'known', txids known to local storage as valid are included as txidOnly */ trustSelf?: 'known' /** list of txids to be included as txidOnly if referenced. Validity is known to caller. */ knownTxids?: string[] /** optional. If defined, raw transactions and merkle paths required by txid are merged to this instance and returned. Otherwise a new Beef is constructed and returned. */ mergeToBeef?: Beef | number[] /** optional. Default is false. `storage` is used for raw transaction and merkle proof lookup */ ignoreStorage?: boolean /** optional. Default is false. `getServices` is used for raw transaction and merkle proof lookup */ ignoreServices?: boolean /** optional. Default is false. If true, raw transactions with proofs missing from `storage` and obtained from `getServices` are not inserted to `storage`. */ ignoreNewProven?: boolean /** optional. Default is zero. Ignores available merkle paths until recursion detpth equals or exceeds value */ minProofLevel?: number } export interface StorageSyncReaderOptions { chain: sdk.Chain } export interface FindCertificateFieldsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.CertificateField> } export interface FindCommissionsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.Commission> } export interface FindOutputTagMapsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.OutputTagMap> tagIds?: number[] } export interface FindOutputTagsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.OutputTag> } export interface FindProvenTxReqsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.ProvenTxReq> status?: sdk.ProvenTxReqStatus[] txids?: string[] } export interface FindProvenTxsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.ProvenTx> } export interface FindSyncStatesArgs extends sdk.FindSincePagedArgs { partial: Partial<table.SyncState> } export interface FindTransactionsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.Transaction> status?: sdk.TransactionStatus[] noRawTx?: boolean } export interface FindTxLabelMapsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.TxLabelMap> labelIds?: number[] } export interface FindTxLabelsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.TxLabel> } export interface FindUsersArgs extends sdk.FindSincePagedArgs { partial: Partial<table.User> } export interface FindMonitorEventsArgs extends sdk.FindSincePagedArgs { partial: Partial<table.MonitorEvent> } /** * Place holder for the transaction control object used by actual storage provider implementation. */ // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface TrxToken {} export interface UpdateProvenTxReqWithNewProvenTxArgs { provenTxReqId: number txid: string attempts: number status: sdk.ProvenTxReqStatus history: string height: number index: number blockHash: string merkleRoot: string merklePath: number[] } export interface UpdateProvenTxReqWithNewProvenTxResult { status: sdk.ProvenTxReqStatus history: string provenTxId: number log?: string }