From 693e7c92e0dd23ee0577dea7d5f5a44eee1fa5be Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 29 Sep 2016 01:40:29 +0200 Subject: history aggregation --- lib/wallet/wallet.ts | 59 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/wallet/wallet.ts b/lib/wallet/wallet.ts index 0a2c07673..45d083570 100644 --- a/lib/wallet/wallet.ts +++ b/lib/wallet/wallet.ts @@ -56,8 +56,20 @@ interface ReserveRecord { exchange_base_url: string, created: number, last_query: number|null, - current_amount: null, + /** + * Current amount left in the reserve + */ + current_amount: AmountJson|null, + /** + * Amount requested when the reserve was created. + * When a reserve is re-used (rare!) the current_amount can + * be higher than the requested_amount + */ requested_amount: AmountJson, + /** + * Amount we've already withdrawn from the reserve. + */ + withdrawn_amount: AmountJson; confirmed: boolean, } @@ -139,6 +151,7 @@ export interface HistoryRecord { timestamp: number; subjectId?: string; detail: any; + level: HistoryLevel; } @@ -154,6 +167,13 @@ interface Transaction { merchantSig: string; } +export enum HistoryLevel { + Trace = 1, + Developer = 2, + Expert = 3, + User = 4, +} + export interface Badge { setText(s: string): void; @@ -531,6 +551,7 @@ export class Wallet { async putHistory(historyEntry: HistoryRecord): Promise { await Query(this.db).put("history", historyEntry).finish(); + this.notifier.notify(); } @@ -632,17 +653,21 @@ export class Wallet { let exchange = await this.updateExchangeFromUrl(reserveRecord.exchange_base_url); let reserve = await this.updateReserve(reserveRecord.reserve_pub, exchange); - await this.depleteReserve(reserve, exchange); - let depleted = { - type: "depleted-reserve", - subjectId: `reserve-progress-${reserveRecord.reserve_pub}`, - timestamp: (new Date).getTime(), - detail: { - reservePub: reserveRecord.reserve_pub, - currentAmount: reserveRecord.current_amount, - } - }; - await Query(this.db).put("history", depleted).finish(); + let n = await this.depleteReserve(reserve, exchange); + + if (n != 0) { + let depleted = { + type: "depleted-reserve", + subjectId: `reserve-progress-${reserveRecord.reserve_pub}`, + timestamp: (new Date).getTime(), + detail: { + reservePub: reserveRecord.reserve_pub, + requestedAmount: reserveRecord.requested_amount, + currentAmount: reserveRecord.current_amount, + } + }; + await Query(this.db).put("history", depleted).finish(); + } } catch (e) { // random, exponential backoff truncated at 3 minutes let nextDelay = Math.min(2 * retryDelayMs + retryDelayMs * Math.random(), @@ -656,7 +681,7 @@ export class Wallet { } - private async processPreCoin(preCoin: any, + private async processPreCoin(preCoin: PreCoin, retryDelayMs = 100): Promise { try { const coin = await this.withdrawExecute(preCoin); @@ -690,6 +715,7 @@ export class Wallet { current_amount: null, requested_amount: req.amount, confirmed: false, + withdrawn_amount: Amounts.getZero(req.amount.currency) }; const historyEntry = { @@ -787,9 +813,11 @@ export class Wallet { async storeCoin(coin: Coin): Promise { console.log("storing coin", new Date()); - let historyEntry = { + + let historyEntry: HistoryRecord = { type: "withdraw", timestamp: (new Date).getTime(), + level: HistoryLevel.Expert, detail: { coinPub: coin.coinPub, } @@ -821,13 +849,14 @@ export class Wallet { * Withdraw coins from a reserve until it is empty. */ private async depleteReserve(reserve: any, - exchange: IExchangeInfo): Promise { + exchange: IExchangeInfo): Promise { let denomsAvailable: Denomination[] = copy(exchange.active_denoms); let denomsForWithdraw = getWithdrawDenomList(reserve.current_amount, denomsAvailable); let ps = denomsForWithdraw.map((denom) => this.withdraw(denom, reserve)); await Promise.all(ps); + return ps.length; } -- cgit v1.2.3