diff options
| -rw-r--r-- | lib/wallet/wallet.ts | 226 | 
1 files changed, 109 insertions, 117 deletions
| diff --git a/lib/wallet/wallet.ts b/lib/wallet/wallet.ts index 987c46940..b87f2d489 100644 --- a/lib/wallet/wallet.ts +++ b/lib/wallet/wallet.ts @@ -333,9 +333,9 @@ export class Wallet {     * Get exchanges and associated coins that are still spendable,     * but only if the sum the coins' remaining value exceeds the payment amount.     */ -  private getPossibleExchangeCoins(paymentAmount: AmountJson, -                                   depositFeeLimit: AmountJson, -                                   allowedExchanges: ExchangeHandle[]): Promise<ExchangeCoins> { +  private async getPossibleExchangeCoins(paymentAmount: AmountJson, +                                         depositFeeLimit: AmountJson, +                                         allowedExchanges: ExchangeHandle[]): Promise<ExchangeCoins> {      // Mapping from exchange base URL to list of coins together with their      // denomination      let m: ExchangeCoins = {}; @@ -389,54 +389,54 @@ export class Wallet {        ];      }); -    return Promise.all(ps).then(() => { -      let ret: ExchangeCoins = {}; +    await Promise.all(ps); -      if (Object.keys(m).length == 0) { -        console.log("not suitable exchanges found"); -      } +    let ret: ExchangeCoins = {}; -      console.dir(m); - -      // We try to find the first exchange where we have -      // enough coins to cover the paymentAmount with fees -      // under depositFeeLimit - -      nextExchange: -        for (let key in m) { -          let coins = m[key]; -          // Sort by ascending deposit fee -          coins.sort((o1, o2) => Amounts.cmp(o1.denom.fee_deposit, -                                             o2.denom.fee_deposit)); -          let maxFee = Amounts.copy(depositFeeLimit); -          let minAmount = Amounts.copy(paymentAmount); -          let accFee = Amounts.copy(coins[0].denom.fee_deposit); -          let accAmount = Amounts.getZero(coins[0].coin.currentAmount.currency); -          let usableCoins: CoinWithDenom[] = []; -          nextCoin: -            for (let i = 0; i < coins.length; i++) { -              let coinAmount = Amounts.copy(coins[i].coin.currentAmount); -              let coinFee = coins[i].denom.fee_deposit; -              if (Amounts.cmp(coinAmount, coinFee) <= 0) { -                continue nextCoin; -              } -              accFee = Amounts.add(accFee, coinFee).amount; -              accAmount = Amounts.add(accAmount, coinAmount).amount; -              if (Amounts.cmp(accFee, maxFee) >= 0) { -                // FIXME: if the fees are too high, we have -                // to cover them ourselves .... -                console.log("too much fees"); -                continue nextExchange; -              } -              usableCoins.push(coins[i]); -              if (Amounts.cmp(accAmount, minAmount) >= 0) { -                ret[key] = usableCoins; -                continue nextExchange; -              } +    if (Object.keys(m).length == 0) { +      console.log("not suitable exchanges found"); +    } + +    console.dir(m); + +    // We try to find the first exchange where we have +    // enough coins to cover the paymentAmount with fees +    // under depositFeeLimit + +    nextExchange: +      for (let key in m) { +        let coins = m[key]; +        // Sort by ascending deposit fee +        coins.sort((o1, o2) => Amounts.cmp(o1.denom.fee_deposit, +                                           o2.denom.fee_deposit)); +        let maxFee = Amounts.copy(depositFeeLimit); +        let minAmount = Amounts.copy(paymentAmount); +        let accFee = Amounts.copy(coins[0].denom.fee_deposit); +        let accAmount = Amounts.getZero(coins[0].coin.currentAmount.currency); +        let usableCoins: CoinWithDenom[] = []; +        nextCoin: +          for (let i = 0; i < coins.length; i++) { +            let coinAmount = Amounts.copy(coins[i].coin.currentAmount); +            let coinFee = coins[i].denom.fee_deposit; +            if (Amounts.cmp(coinAmount, coinFee) <= 0) { +              continue nextCoin;              } -        } -      return ret; -    }); +            accFee = Amounts.add(accFee, coinFee).amount; +            accAmount = Amounts.add(accAmount, coinAmount).amount; +            if (Amounts.cmp(accFee, maxFee) >= 0) { +              // FIXME: if the fees are too high, we have +              // to cover them ourselves .... +              console.log("too much fees"); +              continue nextExchange; +            } +            usableCoins.push(coins[i]); +            if (Amounts.cmp(accAmount, minAmount) >= 0) { +              ret[key] = usableCoins; +              continue nextExchange; +            } +          } +      } +    return ret;    } @@ -691,14 +691,12 @@ export class Wallet {        return;      }      r.confirmed = true; -    return Query(this.db) +    await Query(this.db)        .put("reserves", r)        .put("history", historyEntry) -      .finish() -      .then(() => { -        // Do this in the background -        this.processReserve(r); -      }); +      .finish(); + +    this.processReserve(r);    } @@ -757,17 +755,14 @@ export class Wallet {    /**     * Withdraw one coin of the given denomination from the given reserve.     */ -  private withdraw(denom: Denomination, reserve: Reserve): Promise<void> { +  private async withdraw(denom: Denomination, reserve: Reserve): Promise<void> {      console.log("creating pre coin at", new Date()); -    return this.cryptoApi -               .createPreCoin(denom, reserve) -               .then((preCoin) => { -                 return Query(this.db) -                   .put("precoins", preCoin) -                   .finish() -                   .then(() => this.processPreCoin(preCoin)); -               }); - +    let preCoin = await this.cryptoApi +                            .createPreCoin(denom, reserve); +    await Query(this.db) +      .put("precoins", preCoin) +      .finish(); +    await this.processPreCoin(preCoin);    } @@ -791,37 +786,34 @@ export class Wallet {     */    private async updateReserve(reservePub: string,                                exchange: IExchangeInfo): Promise<Reserve> { -    return Query(this.db) -      .get("reserves", reservePub) -      .then((reserve) => { -        let reqUrl = URI("reserve/status").absoluteTo(exchange.baseUrl); -        reqUrl.query({'reserve_pub': reservePub}); -        return this.http.get(reqUrl).then(resp => { -          if (resp.status != 200) { -            throw Error(); -          } -          let reserveInfo = JSON.parse(resp.responseText); -          if (!reserveInfo) { -            throw Error(); -          } -          let oldAmount = reserve.current_amount; -          let newAmount = reserveInfo.balance; -          reserve.current_amount = reserveInfo.balance; -          let historyEntry = { -            type: "reserve-update", -            timestamp: (new Date).getTime(), -            detail: { -              reservePub, -              oldAmount, -              newAmount -            } -          }; -          return Query(this.db) -            .put("reserves", reserve) -            .finish() -            .then(() => reserve); -        }); -      }); +    let reserve = await Query(this.db) +      .get("reserves", reservePub); +    let reqUrl = URI("reserve/status").absoluteTo(exchange.baseUrl); +    reqUrl.query({'reserve_pub': reservePub}); +    let resp = await this.http.get(reqUrl); +    if (resp.status != 200) { +      throw Error(); +    } +    let reserveInfo = JSON.parse(resp.responseText); +    if (!reserveInfo) { +      throw Error(); +    } +    let oldAmount = reserve.current_amount; +    let newAmount = reserveInfo.balance; +    reserve.current_amount = reserveInfo.balance; +    let historyEntry = { +      type: "reserve-update", +      timestamp: (new Date).getTime(), +      detail: { +        reservePub, +        oldAmount, +        newAmount +      } +    }; +    await Query(this.db) +      .put("reserves", reserve) +      .finish(); +    return reserve;    } @@ -950,16 +942,15 @@ export class Wallet {    } -  private updateExchangeInfo(exchangeInfo: IExchangeInfo, -                             newKeys: KeysJson): Promise<IExchangeInfo> { - +  private async updateExchangeInfo(exchangeInfo: IExchangeInfo, +                                   newKeys: KeysJson): Promise<IExchangeInfo> {      if (exchangeInfo.masterPublicKey != newKeys.master_public_key) {        throw Error("public keys do not match");      }      exchangeInfo.active_denoms = []; -    let ps = newKeys.denoms.map((newDenom) => { +    let denomsToCheck = newKeys.denoms.filter((newDenom) => {        // did we find the new denom in the list of all (old) denoms?        let found = false;        for (let oldDenom of exchangeInfo.all_denoms) { @@ -983,28 +974,29 @@ export class Wallet {        if (found) {          exchangeInfo.active_denoms.push(newDenom);          // No need to check signatures -        return Promise.resolve(); +        return false;        } +      return true; +    }); -      return this.cryptoApi -                 .isValidDenom(newDenom, exchangeInfo.masterPublicKey) -                 .then((valid) => { -                   if (!valid) { -                     console.error("invalid denomination", -                                   newDenom, -                                   "with key", -                                   exchangeInfo.masterPublicKey); -                     // FIXME: report to auditors -                   } -                   return this.cryptoApi.hashRsaPub(newDenom.denom_pub); -                 }) -                 .then((h) => { -                   exchangeInfo.active_denoms.push(newDenom); -                   exchangeInfo.all_denoms.push(newDenom); -                 }); +    let ps = denomsToCheck.map(async(denom) => { +      let valid = await this.cryptoApi +                            .isValidDenom(denom, +                                          exchangeInfo.masterPublicKey); +      if (!valid) { +        console.error("invalid denomination", +                      denom, +                      "with key", +                      exchangeInfo.masterPublicKey); +        // FIXME: report to auditors +      } +      exchangeInfo.active_denoms.push(denom); +      exchangeInfo.all_denoms.push(denom);      }); -    return Promise.all(ps).then(() => exchangeInfo); +    await Promise.all(ps); + +    return exchangeInfo;    } | 
