From a2d673f9ede75de63026a322c4f9dc3b537b4a7c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 10 Mar 2023 00:27:22 -0600 Subject: [PATCH] batch address outspend lookups into <50 txids per request --- .../transactions-list.component.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.ts b/frontend/src/app/components/transactions-list/transactions-list.component.ts index afda646d7..f499300c1 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.ts +++ b/frontend/src/app/components/transactions-list/transactions-list.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, Input, ChangeDetectionStrategy, OnChanges, Output, EventEmitter, ChangeDetectorRef } from '@angular/core'; import { StateService } from '../../services/state.service'; import { CacheService } from '../../services/cache.service'; -import { Observable, ReplaySubject, BehaviorSubject, merge, Subscription, of } from 'rxjs'; +import { Observable, ReplaySubject, BehaviorSubject, merge, Subscription, of, forkJoin } from 'rxjs'; import { Outspend, Transaction, Vin, Vout } from '../../interfaces/electrs.interface'; import { ElectrsApiService } from '../../services/electrs-api.service'; import { environment } from '../../../environments/environment'; @@ -70,12 +70,19 @@ export class TransactionsListComponent implements OnInit, OnChanges { .pipe( switchMap((txIds) => { if (!this.cached) { - return this.apiService.getOutspendsBatched$(txIds); + // break list into batches of 50 (maximum supported by esplora) + const batches = []; + for (let i = 0; i < txIds.length; i += 50) { + batches.push(txIds.slice(i, i + 50)); + } + return forkJoin(batches.map(batch => this.apiService.getOutspendsBatched$(batch))); } else { return of([]); } }), - tap((outspends: Outspend[][]) => { + tap((batchedOutspends: Outspend[][][]) => { + // flatten batched results back into a single array + const outspends = batchedOutspends.flat(1); if (!this.transactions) { return; }