@bsv/wallet-toolbox 2.1.0-beta.3 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/docs/client.md +581 -199
  3. package/docs/monitor.md +30 -11
  4. package/docs/services.md +78 -27
  5. package/docs/storage.md +18 -82
  6. package/docs/wallet.md +581 -199
  7. package/out/src/Setup.js +1 -4
  8. package/out/src/Setup.js.map +1 -1
  9. package/out/src/WalletPermissionsManager.d.ts +4 -2
  10. package/out/src/WalletPermissionsManager.d.ts.map +1 -1
  11. package/out/src/WalletPermissionsManager.js +127 -35
  12. package/out/src/WalletPermissionsManager.js.map +1 -1
  13. package/out/src/__tests/WalletPermissionsManager.flows.test.js +113 -1
  14. package/out/src/__tests/WalletPermissionsManager.flows.test.js.map +1 -1
  15. package/out/src/mockchain/MockChainMigrations.js +1 -1
  16. package/out/src/mockchain/MockChainMigrations.js.map +1 -1
  17. package/out/src/sdk/WalletStorage.interfaces.d.ts +2 -0
  18. package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
  19. package/out/src/services/Services.d.ts +15 -0
  20. package/out/src/services/Services.d.ts.map +1 -1
  21. package/out/src/services/Services.js +59 -4
  22. package/out/src/services/Services.js.map +1 -1
  23. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
  24. package/out/src/services/chaintracker/chaintracks/Chaintracks.js +20 -4
  25. package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
  26. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js +1 -1
  27. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js.map +1 -1
  28. package/out/src/services/chaintracker/chaintracks/__tests/bulkIngestorFailures.test.d.ts +2 -0
  29. package/out/src/services/chaintracker/chaintracks/__tests/bulkIngestorFailures.test.d.ts.map +1 -0
  30. package/out/src/services/chaintracker/chaintracks/__tests/bulkIngestorFailures.test.js +109 -0
  31. package/out/src/services/chaintracker/chaintracks/__tests/bulkIngestorFailures.test.js.map +1 -0
  32. package/out/src/storage/StorageIdb.d.ts.map +1 -1
  33. package/out/src/storage/StorageIdb.js +4 -0
  34. package/out/src/storage/StorageIdb.js.map +1 -1
  35. package/out/src/storage/StorageKnex.d.ts +8 -0
  36. package/out/src/storage/StorageKnex.d.ts.map +1 -1
  37. package/out/src/storage/StorageKnex.js +125 -71
  38. package/out/src/storage/StorageKnex.js.map +1 -1
  39. package/out/src/storage/StorageProvider.d.ts +8 -0
  40. package/out/src/storage/StorageProvider.d.ts.map +1 -1
  41. package/out/src/storage/StorageProvider.js +42 -0
  42. package/out/src/storage/StorageProvider.js.map +1 -1
  43. package/out/src/storage/methods/ListOutputsSpecOp.d.ts.map +1 -1
  44. package/out/src/storage/methods/ListOutputsSpecOp.js +24 -7
  45. package/out/src/storage/methods/ListOutputsSpecOp.js.map +1 -1
  46. package/out/src/storage/methods/createAction.d.ts.map +1 -1
  47. package/out/src/storage/methods/createAction.js +69 -32
  48. package/out/src/storage/methods/createAction.js.map +1 -1
  49. package/out/src/storage/methods/listActionsIdb.d.ts.map +1 -1
  50. package/out/src/storage/methods/listActionsIdb.js +17 -3
  51. package/out/src/storage/methods/listActionsIdb.js.map +1 -1
  52. package/out/src/storage/methods/listActionsKnex.d.ts.map +1 -1
  53. package/out/src/storage/methods/listActionsKnex.js +28 -2
  54. package/out/src/storage/methods/listActionsKnex.js.map +1 -1
  55. package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -1
  56. package/out/src/storage/methods/listOutputsKnex.js +83 -50
  57. package/out/src/storage/methods/listOutputsKnex.js.map +1 -1
  58. package/out/src/storage/remoting/StorageServer.d.ts +1 -0
  59. package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
  60. package/out/src/storage/remoting/StorageServer.js +58 -8
  61. package/out/src/storage/remoting/StorageServer.js.map +1 -1
  62. package/out/src/storage/remoting/__test/StorageClient.man.test.js +361 -96
  63. package/out/src/storage/remoting/__test/StorageClient.man.test.js.map +1 -1
  64. package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
  65. package/out/src/storage/schema/KnexMigrations.js +41 -1
  66. package/out/src/storage/schema/KnexMigrations.js.map +1 -1
  67. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts.map +1 -1
  68. package/out/src/storage/sync/StorageMySQLDojoReader.js +4 -0
  69. package/out/src/storage/sync/StorageMySQLDojoReader.js.map +1 -1
  70. package/out/src/utility/brc114ActionTimeLabels.d.ts +9 -0
  71. package/out/src/utility/brc114ActionTimeLabels.d.ts.map +1 -0
  72. package/out/src/utility/brc114ActionTimeLabels.js +51 -0
  73. package/out/src/utility/brc114ActionTimeLabels.js.map +1 -0
  74. package/package.json +3 -3
  75. package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.d.ts +0 -2
  76. package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.d.ts.map +0 -1
  77. package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.js +0 -102
  78. package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.js.map +0 -1
package/docs/monitor.md CHANGED
@@ -100,7 +100,7 @@ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](
100
100
  ```ts
101
101
  export interface MonitorOptions {
102
102
  chain: Chain;
103
- services: Services;
103
+ services: Services | WalletServices;
104
104
  storage: MonitorStorage;
105
105
  chaintracks: ChaintracksClientApi;
106
106
  chaintracksWithEvents?: Chaintracks;
@@ -114,7 +114,7 @@ export interface MonitorOptions {
114
114
  }
115
115
  ```
116
116
 
117
- See also: [Chain](./client.md#type-chain), [Chaintracks](./services.md#class-chaintracks), [ChaintracksClientApi](./services.md#interface-chaintracksclientapi), [MonitorStorage](./monitor.md#type-monitorstorage), [ProvenTransactionStatus](./client.md#interface-proventransactionstatus), [ReviewActionResult](./client.md#interface-reviewactionresult), [Services](./services.md#class-services)
117
+ See also: [Chain](./client.md#type-chain), [Chaintracks](./services.md#class-chaintracks), [ChaintracksClientApi](./services.md#interface-chaintracksclientapi), [MonitorStorage](./monitor.md#type-monitorstorage), [ProvenTransactionStatus](./client.md#interface-proventransactionstatus), [ReviewActionResult](./client.md#interface-reviewactionresult), [Services](./services.md#class-services), [WalletServices](./client.md#interface-walletservices)
118
118
 
119
119
  ###### Property msecsWaitPerMerkleProofServiceReq
120
120
 
@@ -176,14 +176,14 @@ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](
176
176
 
177
177
  | | |
178
178
  | --- | --- |
179
- | [Monitor](#class-monitor) | [TaskPurge](#class-taskpurge) |
180
- | [MonitorDaemon](#class-monitordaemon) | [TaskReorg](#class-taskreorg) |
181
- | [TaskCheckForProofs](#class-taskcheckforproofs) | [TaskReviewStatus](#class-taskreviewstatus) |
182
- | [TaskCheckNoSends](#class-taskchecknosends) | [TaskSendWaiting](#class-tasksendwaiting) |
183
- | [TaskClock](#class-taskclock) | [TaskSyncWhenIdle](#class-tasksyncwhenidle) |
184
- | [TaskFailAbandoned](#class-taskfailabandoned) | [TaskUnFail](#class-taskunfail) |
179
+ | [Monitor](#class-monitor) | [TaskNewHeader](#class-tasknewheader) |
180
+ | [MonitorDaemon](#class-monitordaemon) | [TaskPurge](#class-taskpurge) |
181
+ | [TaskCheckForProofs](#class-taskcheckforproofs) | [TaskReorg](#class-taskreorg) |
182
+ | [TaskCheckNoSends](#class-taskchecknosends) | [TaskReviewStatus](#class-taskreviewstatus) |
183
+ | [TaskClock](#class-taskclock) | [TaskSendWaiting](#class-tasksendwaiting) |
184
+ | [TaskFailAbandoned](#class-taskfailabandoned) | [TaskSyncWhenIdle](#class-tasksyncwhenidle) |
185
+ | [TaskMineBlock](#class-taskmineblock) | [TaskUnFail](#class-taskunfail) |
185
186
  | [TaskMonitorCallHistory](#class-taskmonitorcallhistory) | [WalletMonitorTask](#class-walletmonitortask) |
186
- | [TaskNewHeader](#class-tasknewheader) | |
187
187
 
188
188
  Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
189
189
 
@@ -198,7 +198,7 @@ and potentially that reorgs update proofs that were already received.
198
198
  export class Monitor {
199
199
  static createDefaultWalletMonitorOptions(chain: Chain, storage: MonitorStorage, services?: Services, chaintracks?: Chaintracks): MonitorOptions
200
200
  options: MonitorOptions;
201
- services: Services;
201
+ services: Services | WalletServices;
202
202
  chain: Chain;
203
203
  storage: MonitorStorage;
204
204
  chaintracks: ChaintracksClientApi;
@@ -249,7 +249,7 @@ export class Monitor {
249
249
  }
250
250
  ```
251
251
 
252
- See also: [BlockHeader](./client.md#interface-blockheader), [Chain](./client.md#type-chain), [Chaintracks](./services.md#class-chaintracks), [ChaintracksClientApi](./services.md#interface-chaintracksclientapi), [DeactivedHeader](./monitor.md#interface-deactivedheader), [MonitorOptions](./monitor.md#interface-monitoroptions), [MonitorStorage](./monitor.md#type-monitorstorage), [ProvenTransactionStatus](./client.md#interface-proventransactionstatus), [ReviewActionResult](./client.md#interface-reviewactionresult), [Services](./services.md#class-services), [TaskPurgeParams](./monitor.md#interface-taskpurgeparams), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
252
+ See also: [BlockHeader](./client.md#interface-blockheader), [Chain](./client.md#type-chain), [Chaintracks](./services.md#class-chaintracks), [ChaintracksClientApi](./services.md#interface-chaintracksclientapi), [DeactivedHeader](./monitor.md#interface-deactivedheader), [MonitorOptions](./monitor.md#interface-monitoroptions), [MonitorStorage](./monitor.md#type-monitorstorage), [ProvenTransactionStatus](./client.md#interface-proventransactionstatus), [ReviewActionResult](./client.md#interface-reviewactionresult), [Services](./services.md#class-services), [TaskPurgeParams](./monitor.md#interface-taskpurgeparams), [WalletMonitorTask](./monitor.md#class-walletmonitortask), [WalletServices](./client.md#interface-walletservices)
253
253
 
254
254
  ###### Property _otherTasks
255
255
 
@@ -516,6 +516,25 @@ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.m
516
516
 
517
517
  Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
518
518
 
519
+ ---
520
+ ##### Class: TaskMineBlock
521
+
522
+ ```ts
523
+ export class TaskMineBlock extends WalletMonitorTask {
524
+ static taskName = "MineBlock";
525
+ static mineNow = false;
526
+ constructor(monitor: Monitor, public triggerMsecs = 10 * Monitor.oneMinute)
527
+ trigger(nowMsecsSinceEpoch: number): {
528
+ run: boolean;
529
+ }
530
+ async runTask(): Promise<string>
531
+ }
532
+ ```
533
+
534
+ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
535
+
536
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
537
+
519
538
  ---
520
539
  ##### Class: TaskMonitorCallHistory
521
540
 
package/docs/services.md CHANGED
@@ -3457,19 +3457,28 @@ export class Chaintracks implements ChaintracksManagementApi {
3457
3457
  async startListening(): Promise<void>
3458
3458
  private async syncBulkStorageNoLock(presentHeight: number, initialRanges: HeightRanges): Promise<void> {
3459
3459
  let newLiveHeaders: BlockHeader[] = [];
3460
- let bulkDone = false;
3461
3460
  let before = initialRanges;
3462
3461
  let after = before;
3463
3462
  let added = HeightRange.empty;
3463
+ const maxSyncRounds = Math.max(1, this.bulkIngestors.length * 2);
3464
3464
  let done = false;
3465
- for (; !done;) {
3465
+ for (let round = 1; !done && round <= maxSyncRounds; round++) {
3466
3466
  let bulkSyncError: WalletError | undefined;
3467
+ let roundMadeProgress = false;
3468
+ let roundHadSuccess = false;
3467
3469
  for (const bulk of this.bulkIngestors) {
3468
3470
  try {
3471
+ const beforeBulkMax = before.bulk.maxHeight;
3472
+ const beforeLiveRange = HeightRange.from(newLiveHeaders);
3469
3473
  const r = await bulk.synchronize(presentHeight, before, newLiveHeaders);
3474
+ roundHadSuccess = true;
3470
3475
  newLiveHeaders = r.liveHeaders;
3471
3476
  after = await this.storage.getAvailableHeightRanges();
3472
3477
  added = after.bulk.above(before.bulk);
3478
+ const afterLiveRange = HeightRange.from(newLiveHeaders);
3479
+ if (after.bulk.maxHeight > beforeBulkMax || afterLiveRange.maxHeight > beforeLiveRange.maxHeight) {
3480
+ roundMadeProgress = true;
3481
+ }
3473
3482
  before = after;
3474
3483
  this.log(`Bulk Ingestor: ${added.length} added with ${newLiveHeaders.length} live headers from ${bulk.constructor.name}`);
3475
3484
  if (r.done) {
@@ -3484,12 +3493,19 @@ export class Chaintracks implements ChaintracksManagementApi {
3484
3493
  break;
3485
3494
  }
3486
3495
  }
3487
- if (!bulkDone && !this.available && bulkSyncError) {
3496
+ if (!this.available && bulkSyncError && !roundHadSuccess) {
3488
3497
  this.startupError = bulkSyncError;
3489
3498
  break;
3490
3499
  }
3491
- if (bulkDone)
3500
+ if (done)
3501
+ break;
3502
+ if (!roundMadeProgress) {
3503
+ this.log(`Bulk sync stalled after round ${round}. Deferring further bulk sync attempts to continue live header processing.`);
3492
3504
  break;
3505
+ }
3506
+ if (round === maxSyncRounds) {
3507
+ this.log(`Bulk sync paused after ${maxSyncRounds} rounds to avoid runaway retries. Will retry in a later sync cycle.`);
3508
+ }
3493
3509
  }
3494
3510
  if (!this.startupError) {
3495
3511
  this.liveHeaders.unshift(...newLiveHeaders);
@@ -4465,7 +4481,7 @@ export default class SdkWhatsOnChain implements ChainTracker {
4465
4481
  readonly apiKey: string;
4466
4482
  protected readonly URL: string;
4467
4483
  protected readonly httpClient: HttpClient;
4468
- constructor(network: "main" | "test" | "stn" = "main", config: WhatsOnChainConfig = {})
4484
+ constructor(network: "main" | "test" | "stn" | "teratest" = "main", config: WhatsOnChainConfig = {})
4469
4485
  async isValidRootForHeight(root: string, height: number): Promise<boolean>
4470
4486
  async currentHeight(): Promise<number>
4471
4487
  protected getHttpHeaders(): Record<string, string>
@@ -4477,7 +4493,7 @@ export default class SdkWhatsOnChain implements ChainTracker {
4477
4493
  Constructs an instance of the WhatsOnChain ChainTracker.
4478
4494
 
4479
4495
  ```ts
4480
- constructor(network: "main" | "test" | "stn" = "main", config: WhatsOnChainConfig = {})
4496
+ constructor(network: "main" | "test" | "stn" | "teratest" = "main", config: WhatsOnChainConfig = {})
4481
4497
  ```
4482
4498
 
4483
4499
  Argument Details
@@ -4598,6 +4614,9 @@ export class Services implements WalletServices {
4598
4614
  async getUtxoStatus(output: string, outputFormat?: GetUtxoStatusOutputFormat, outpoint?: string, useNext?: boolean, logger?: WalletLoggerInterface): Promise<GetUtxoStatusResult>
4599
4615
  async getScriptHashHistory(hash: string, useNext?: boolean, logger?: WalletLoggerInterface): Promise<GetScriptHashHistoryResult>
4600
4616
  postBeefMode: "PromiseAll" | "UntilSuccess" = "UntilSuccess";
4617
+ postBeefUntilSuccessSoftTimeoutMs = 5000;
4618
+ postBeefUntilSuccessSoftTimeoutPerKbMs = 50;
4619
+ postBeefUntilSuccessSoftTimeoutMaxMs = 30000;
4601
4620
  async postBeef(beef: Beef, txids: string[], logger?: WalletLoggerInterface): Promise<PostBeefResult[]>
4602
4621
  async getRawTx(txid: string, useNext?: boolean): Promise<GetRawTxResult>
4603
4622
  async invokeChaintracksWithRetry<R>(method: () => Promise<R>): Promise<R>
@@ -4613,6 +4632,32 @@ export class Services implements WalletServices {
4613
4632
 
4614
4633
  See also: [ARC](./services.md#class-arc), [Bitails](./services.md#class-bitails), [BlockHeader](./client.md#interface-blockheader), [Chain](./client.md#type-chain), [FiatCurrencyCode](./client.md#type-fiatcurrencycode), [FiatExchangeRates](./client.md#interface-fiatexchangerates), [GetMerklePathResult](./client.md#interface-getmerklepathresult), [GetMerklePathService](./client.md#type-getmerklepathservice), [GetRawTxResult](./client.md#interface-getrawtxresult), [GetRawTxService](./client.md#type-getrawtxservice), [GetScriptHashHistoryResult](./client.md#interface-getscripthashhistoryresult), [GetScriptHashHistoryService](./client.md#type-getscripthashhistoryservice), [GetStatusForTxidsResult](./client.md#interface-getstatusfortxidsresult), [GetStatusForTxidsService](./client.md#type-getstatusfortxidsservice), [GetUtxoStatusOutputFormat](./client.md#type-getutxostatusoutputformat), [GetUtxoStatusResult](./client.md#interface-getutxostatusresult), [GetUtxoStatusService](./client.md#type-getutxostatusservice), [PostBeefResult](./client.md#interface-postbeefresult), [PostBeefService](./client.md#type-postbeefservice), [ServiceCollection](./services.md#class-servicecollection), [ServicesCallHistory](./client.md#type-servicescallhistory), [TableOutput](./storage.md#interface-tableoutput), [UpdateFiatExchangeRateService](./client.md#type-updatefiatexchangerateservice), [WalletServices](./client.md#interface-walletservices), [WalletServicesOptions](./client.md#interface-walletservicesoptions), [WhatsOnChain](./services.md#class-whatsonchain), [getBeefForTxid](./services.md#function-getbeeffortxid), [logger](./client.md#variable-logger)
4615
4634
 
4635
+ ###### Property postBeefUntilSuccessSoftTimeoutMaxMs
4636
+
4637
+ Upper bound for adaptive soft-timeout in `UntilSuccess` mode.
4638
+
4639
+ ```ts
4640
+ postBeefUntilSuccessSoftTimeoutMaxMs = 30000
4641
+ ```
4642
+
4643
+ ###### Property postBeefUntilSuccessSoftTimeoutMs
4644
+
4645
+ Soft timeout used for each provider call in `UntilSuccess` mode.
4646
+ This bounds request latency when a provider hangs before failover.
4647
+
4648
+ ```ts
4649
+ postBeefUntilSuccessSoftTimeoutMs = 5000
4650
+ ```
4651
+
4652
+ ###### Property postBeefUntilSuccessSoftTimeoutPerKbMs
4653
+
4654
+ Additional soft-timeout budget (ms) per KiB of serialized Beef payload.
4655
+ Helps avoid false timeout failover on legitimately large submissions.
4656
+
4657
+ ```ts
4658
+ postBeefUntilSuccessSoftTimeoutPerKbMs = 50
4659
+ ```
4660
+
4616
4661
  ###### Method hashOutputScript
4617
4662
 
4618
4663
  ```ts
@@ -5294,27 +5339,33 @@ Returns the genesis block for the specified chain.
5294
5339
 
5295
5340
  ```ts
5296
5341
  export function genesisHeader(chain: Chain): BlockHeader {
5297
- return chain === "main"
5298
- ? {
5299
- version: 1,
5300
- previousHash: "0000000000000000000000000000000000000000000000000000000000000000",
5301
- merkleRoot: "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
5302
- time: 1231006505,
5303
- bits: 486604799,
5304
- nonce: 2083236893,
5305
- height: 0,
5306
- hash: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
5307
- }
5308
- : {
5309
- version: 1,
5310
- previousHash: "0000000000000000000000000000000000000000000000000000000000000000",
5311
- merkleRoot: "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
5312
- time: 1296688602,
5313
- bits: 486604799,
5314
- nonce: 414098458,
5315
- height: 0,
5316
- hash: "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"
5317
- };
5342
+ switch (chain) {
5343
+ case "main":
5344
+ return {
5345
+ version: 1,
5346
+ previousHash: "0000000000000000000000000000000000000000000000000000000000000000",
5347
+ merkleRoot: "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
5348
+ time: 1231006505,
5349
+ bits: 486604799,
5350
+ nonce: 2083236893,
5351
+ height: 0,
5352
+ hash: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
5353
+ };
5354
+ case "test":
5355
+ case "teratest":
5356
+ return {
5357
+ version: 1,
5358
+ previousHash: "0000000000000000000000000000000000000000000000000000000000000000",
5359
+ merkleRoot: "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
5360
+ time: 1296688602,
5361
+ bits: 486604799,
5362
+ nonce: 414098458,
5363
+ height: 0,
5364
+ hash: "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"
5365
+ };
5366
+ case "mock":
5367
+ throw new Error(`genesisHeader does not support 'mock' chain. Mock chain generates its own genesis block.`);
5368
+ }
5318
5369
  }
5319
5370
  ```
5320
5371
 
package/docs/storage.md CHANGED
@@ -3570,87 +3570,15 @@ export class StorageKnex extends StorageProvider implements WalletStorageProvide
3570
3570
  log: string;
3571
3571
  }>
3572
3572
  async countChangeInputs(userId: number, basketId: number, excludeSending: boolean): Promise<number>
3573
- async allocateChangeInput(userId: number, basketId: number, targetSatoshis: number, exactSatoshis: number | undefined, excludeSending: boolean, transactionId: number): Promise<TableOutput | undefined> {
3574
- const status: TransactionStatus[] = ["completed", "unproven"];
3575
- if (!excludeSending)
3576
- status.push("sending");
3577
- const statusText = status.map(s => `'${s}'`).join(",");
3578
- const r: TableOutput | undefined = await this.knex.transaction(async (trx) => {
3579
- const txStatusCondition = `AND (SELECT status FROM transactions WHERE outputs.transactionId = transactions.transactionId) in (${statusText})`;
3580
- let outputId: number | undefined;
3581
- const setOutputId = async (rawQuery: string): Promise<void> => {
3582
- let oidr = await trx.raw(rawQuery);
3583
- outputId = undefined;
3584
- if (!oidr["outputId"] && oidr.length > 0)
3585
- oidr = oidr[0];
3586
- if (!oidr["outputId"] && oidr.length > 0)
3587
- oidr = oidr[0];
3588
- if (oidr["outputId"])
3589
- outputId = Number(oidr["outputId"]);
3590
- };
3591
- if (exactSatoshis !== undefined) {
3592
- await setOutputId(`
3593
- SELECT outputId
3594
- FROM outputs
3595
- WHERE userId = ${userId}
3596
- AND spendable = 1
3597
- AND basketId = ${basketId}
3598
- ${txStatusCondition}
3599
- AND satoshis = ${exactSatoshis}
3600
- LIMIT 1;
3601
- `);
3602
- }
3603
- if (outputId === undefined) {
3604
- await setOutputId(`
3605
- SELECT outputId
3606
- FROM outputs
3607
- WHERE userId = ${userId}
3608
- AND spendable = 1
3609
- AND basketId = ${basketId}
3610
- ${txStatusCondition}
3611
- AND satoshis - ${targetSatoshis} = (
3612
- SELECT MIN(satoshis - ${targetSatoshis})
3613
- FROM outputs
3614
- WHERE userId = ${userId}
3615
- AND spendable = 1
3616
- AND basketId = ${basketId}
3617
- ${txStatusCondition}
3618
- AND satoshis - ${targetSatoshis} >= 0
3619
- )
3620
- LIMIT 1;
3621
- `);
3622
- }
3623
- if (outputId === undefined) {
3624
- await setOutputId(`
3625
- SELECT outputId
3626
- FROM outputs
3627
- WHERE userId = ${userId}
3628
- AND spendable = 1
3629
- AND basketId = ${basketId}
3630
- ${txStatusCondition}
3631
- AND satoshis - ${targetSatoshis} = (
3632
- SELECT MAX(satoshis - ${targetSatoshis})
3633
- FROM outputs
3634
- WHERE userId = ${userId}
3635
- AND spendable = 1
3636
- AND basketId = ${basketId}
3637
- ${txStatusCondition}
3638
- AND satoshis - ${targetSatoshis} < 0
3639
- )
3640
- LIMIT 1;
3641
- `);
3642
- }
3643
- if (outputId === undefined)
3644
- return undefined;
3645
- await this.updateOutput(outputId, {
3646
- spendable: false,
3647
- spentBy: transactionId
3648
- }, trx);
3649
- const r = verifyTruthy(await this.findOutputById(outputId, trx));
3650
- return r;
3651
- });
3652
- return r;
3653
- }
3573
+ override async findOutputsByIds(outputIds: number[], trx?: TrxToken): Promise<Record<number, TableOutput>>
3574
+ override async findOutputsByOutpoints(userId: number, outpoints: Array<{
3575
+ txid: string;
3576
+ vout: number;
3577
+ }>, trx?: TrxToken): Promise<Record<string, TableOutput>>
3578
+ override async findOrInsertOutputBasketsBulk(userId: number, names: string[], trx?: TrxToken): Promise<Record<string, TableOutputBasket>>
3579
+ override async findOrInsertOutputTagsBulk(userId: number, tags: string[], trx?: TrxToken): Promise<Record<string, TableOutputTag>>
3580
+ override async sumSpendableSatoshisInBasket(userId: number, basketId: number, excludeSending: boolean, trx?: TrxToken): Promise<number>
3581
+ async allocateChangeInput(userId: number, basketId: number, targetSatoshis: number, exactSatoshis: number | undefined, excludeSending: boolean, transactionId: number): Promise<TableOutput | undefined>
3654
3582
  validateEntity<T extends EntityTimeStamp>(entity: T, dateFields?: string[], booleanFields?: string[]): T
3655
3583
  validateEntities<T extends EntityTimeStamp>(entities: T[], dateFields?: string[], booleanFields?: string[]): T[]
3656
3584
  async adminStats(adminIdentityKey: string): Promise<AdminStatsResult> {
@@ -3815,7 +3743,7 @@ select
3815
3743
  }
3816
3744
  ```
3817
3745
 
3818
- See also: [AdminStatsResult](./storage.md#interface-adminstatsresult), [AuthId](./client.md#interface-authid), [DBType](./storage.md#type-dbtype), [EntityTimeStamp](./client.md#interface-entitytimestamp), [FindCertificateFieldsArgs](./client.md#interface-findcertificatefieldsargs), [FindCertificatesArgs](./client.md#interface-findcertificatesargs), [FindCommissionsArgs](./client.md#interface-findcommissionsargs), [FindForUserSincePagedArgs](./client.md#interface-findforusersincepagedargs), [FindMonitorEventsArgs](./client.md#interface-findmonitoreventsargs), [FindOutputBasketsArgs](./client.md#interface-findoutputbasketsargs), [FindOutputTagMapsArgs](./client.md#interface-findoutputtagmapsargs), [FindOutputTagsArgs](./client.md#interface-findoutputtagsargs), [FindOutputsArgs](./client.md#interface-findoutputsargs), [FindPartialSincePagedArgs](./client.md#interface-findpartialsincepagedargs), [FindProvenTxReqsArgs](./client.md#interface-findproventxreqsargs), [FindProvenTxsArgs](./client.md#interface-findproventxsargs), [FindSyncStatesArgs](./client.md#interface-findsyncstatesargs), [FindTransactionsArgs](./client.md#interface-findtransactionsargs), [FindTxLabelMapsArgs](./client.md#interface-findtxlabelmapsargs), [FindTxLabelsArgs](./client.md#interface-findtxlabelsargs), [FindUsersArgs](./client.md#interface-findusersargs), [ProvenOrRawTx](./client.md#interface-provenorrawtx), [PurgeParams](./client.md#interface-purgeparams), [PurgeResults](./client.md#interface-purgeresults), [ServicesCallHistory](./client.md#type-servicescallhistory), [StorageKnexOptions](./storage.md#interface-storageknexoptions), [StorageProvider](./storage.md#class-storageprovider), [TableCertificate](./storage.md#interface-tablecertificate), [TableCertificateField](./storage.md#interface-tablecertificatefield), [TableCertificateX](./storage.md#interface-tablecertificatex), [TableCommission](./storage.md#interface-tablecommission), [TableMonitorEvent](./storage.md#interface-tablemonitorevent), [TableOutput](./storage.md#interface-tableoutput), [TableOutputBasket](./storage.md#interface-tableoutputbasket), [TableOutputTag](./storage.md#interface-tableoutputtag), [TableOutputTagMap](./storage.md#interface-tableoutputtagmap), [TableProvenTx](./storage.md#interface-tableproventx), [TableProvenTxReq](./storage.md#interface-tableproventxreq), [TableSettings](./storage.md#interface-tablesettings), [TableSyncState](./storage.md#interface-tablesyncstate), [TableTransaction](./storage.md#interface-tabletransaction), [TableTxLabel](./storage.md#interface-tabletxlabel), [TableTxLabelMap](./storage.md#interface-tabletxlabelmap), [TableUser](./storage.md#interface-tableuser), [TransactionStatus](./client.md#type-transactionstatus), [TrxToken](./client.md#interface-trxtoken), [WERR_NOT_IMPLEMENTED](./client.md#class-werr_not_implemented), [WalletStorageProvider](./client.md#interface-walletstorageprovider), [listActions](./storage.md#function-listactions), [listOutputs](./storage.md#function-listoutputs), [purgeData](./storage.md#function-purgedata), [reviewStatus](./storage.md#function-reviewstatus), [verifyOneOrNone](./client.md#function-verifyoneornone), [verifyTruthy](./client.md#function-verifytruthy)
3746
+ See also: [AdminStatsResult](./storage.md#interface-adminstatsresult), [AuthId](./client.md#interface-authid), [DBType](./storage.md#type-dbtype), [EntityTimeStamp](./client.md#interface-entitytimestamp), [FindCertificateFieldsArgs](./client.md#interface-findcertificatefieldsargs), [FindCertificatesArgs](./client.md#interface-findcertificatesargs), [FindCommissionsArgs](./client.md#interface-findcommissionsargs), [FindForUserSincePagedArgs](./client.md#interface-findforusersincepagedargs), [FindMonitorEventsArgs](./client.md#interface-findmonitoreventsargs), [FindOutputBasketsArgs](./client.md#interface-findoutputbasketsargs), [FindOutputTagMapsArgs](./client.md#interface-findoutputtagmapsargs), [FindOutputTagsArgs](./client.md#interface-findoutputtagsargs), [FindOutputsArgs](./client.md#interface-findoutputsargs), [FindPartialSincePagedArgs](./client.md#interface-findpartialsincepagedargs), [FindProvenTxReqsArgs](./client.md#interface-findproventxreqsargs), [FindProvenTxsArgs](./client.md#interface-findproventxsargs), [FindSyncStatesArgs](./client.md#interface-findsyncstatesargs), [FindTransactionsArgs](./client.md#interface-findtransactionsargs), [FindTxLabelMapsArgs](./client.md#interface-findtxlabelmapsargs), [FindTxLabelsArgs](./client.md#interface-findtxlabelsargs), [FindUsersArgs](./client.md#interface-findusersargs), [ProvenOrRawTx](./client.md#interface-provenorrawtx), [PurgeParams](./client.md#interface-purgeparams), [PurgeResults](./client.md#interface-purgeresults), [ServicesCallHistory](./client.md#type-servicescallhistory), [StorageKnexOptions](./storage.md#interface-storageknexoptions), [StorageProvider](./storage.md#class-storageprovider), [TableCertificate](./storage.md#interface-tablecertificate), [TableCertificateField](./storage.md#interface-tablecertificatefield), [TableCertificateX](./storage.md#interface-tablecertificatex), [TableCommission](./storage.md#interface-tablecommission), [TableMonitorEvent](./storage.md#interface-tablemonitorevent), [TableOutput](./storage.md#interface-tableoutput), [TableOutputBasket](./storage.md#interface-tableoutputbasket), [TableOutputTag](./storage.md#interface-tableoutputtag), [TableOutputTagMap](./storage.md#interface-tableoutputtagmap), [TableProvenTx](./storage.md#interface-tableproventx), [TableProvenTxReq](./storage.md#interface-tableproventxreq), [TableSettings](./storage.md#interface-tablesettings), [TableSyncState](./storage.md#interface-tablesyncstate), [TableTransaction](./storage.md#interface-tabletransaction), [TableTxLabel](./storage.md#interface-tabletxlabel), [TableTxLabelMap](./storage.md#interface-tabletxlabelmap), [TableUser](./storage.md#interface-tableuser), [TrxToken](./client.md#interface-trxtoken), [WERR_NOT_IMPLEMENTED](./client.md#class-werr_not_implemented), [WalletStorageProvider](./client.md#interface-walletstorageprovider), [listActions](./storage.md#function-listactions), [listOutputs](./storage.md#function-listoutputs), [purgeData](./storage.md#function-purgedata), [reviewStatus](./storage.md#function-reviewstatus), [verifyOneOrNone](./client.md#function-verifyoneornone)
3819
3747
 
3820
3748
  ###### Method allocateChangeInput
3821
3749
 
@@ -3937,6 +3865,14 @@ export abstract class StorageProvider extends StorageReaderWriter implements Wal
3937
3865
  abstract listActions(auth: AuthId, args: Validation.ValidListActionsArgs): Promise<ListActionsResult>;
3938
3866
  abstract listOutputs(auth: AuthId, args: Validation.ValidListOutputsArgs): Promise<ListOutputsResult>;
3939
3867
  abstract countChangeInputs(userId: number, basketId: number, excludeSending: boolean): Promise<number>;
3868
+ async findOutputsByIds(outputIds: number[], trx?: TrxToken): Promise<Record<number, TableOutput>>
3869
+ async findOutputsByOutpoints(userId: number, outpoints: Array<{
3870
+ txid: string;
3871
+ vout: number;
3872
+ }>, trx?: TrxToken): Promise<Record<string, TableOutput>>
3873
+ async findOrInsertOutputBasketsBulk(userId: number, names: string[], trx?: TrxToken): Promise<Record<string, TableOutputBasket>>
3874
+ async findOrInsertOutputTagsBulk(userId: number, tags: string[], trx?: TrxToken): Promise<Record<string, TableOutputTag>>
3875
+ async sumSpendableSatoshisInBasket(userId: number, basketId: number, excludeSending: boolean, trx?: TrxToken): Promise<number>
3940
3876
  abstract findCertificatesAuth(auth: AuthId, args: FindCertificatesArgs): Promise<TableCertificateX[]>;
3941
3877
  abstract findOutputBasketsAuth(auth: AuthId, args: FindOutputBasketsArgs): Promise<TableOutputBasket[]>;
3942
3878
  abstract findOutputsAuth(auth: AuthId, args: FindOutputsArgs): Promise<TableOutput[]>;