[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [taler-wallet-webex] branch master updated: fix signature c
From: |
gnunet |
Subject: |
[GNUnet-SVN] [taler-wallet-webex] branch master updated: fix signature checks, add wire fee |
Date: |
Thu, 27 Apr 2017 04:06:51 +0200 |
This is an automated email from the git hooks/post-receive script.
dold pushed a commit to branch master
in repository wallet-webex.
The following commit(s) were added to refs/heads/master by this push:
new ce97b10 fix signature checks, add wire fee
ce97b10 is described below
commit ce97b1076b7e4a53b84d3fd34bf2047580ddeb22
Author: Florian Dold <address@hidden>
AuthorDate: Thu Apr 27 04:06:48 2017 +0200
fix signature checks, add wire fee
---
src/cryptoWorker.ts | 4 ++--
src/emscriptif.ts | 4 ++--
src/types.ts | 19 +++++++++++++++++--
src/wallet.ts | 36 ++++++++++++++++++++++++++++++++++--
4 files changed, 55 insertions(+), 8 deletions(-)
diff --git a/src/cryptoWorker.ts b/src/cryptoWorker.ts
index 4275d65..55c08d4 100644
--- a/src/cryptoWorker.ts
+++ b/src/cryptoWorker.ts
@@ -113,8 +113,8 @@ namespace RpcFunctions {
export function isValidWireFee(type: string, wf: WireFee, masterPub:
string): boolean {
let p = new native.MasterWireFeePS({
h_wire_method: native.ByteArray.fromStringWithNull(type).hash(),
- start_date: native.AbsoluteTimeNbo.fromStamp(wf.startStamp),
- end_date: native.AbsoluteTimeNbo.fromStamp(wf.endStamp),
+ start_date: native.AbsoluteTimeNbo.fromStampSeconds(wf.startStamp),
+ end_date: native.AbsoluteTimeNbo.fromStampSeconds(wf.endStamp),
wire_fee: (new native.Amount(wf.wireFee)).toNbo(),
closing_fee: (new native.Amount(wf.closingFee)).toNbo(),
});
diff --git a/src/emscriptif.ts b/src/emscriptif.ts
index 3f23476..347ee54 100644
--- a/src/emscriptif.ts
+++ b/src/emscriptif.ts
@@ -1038,11 +1038,11 @@ export class AbsoluteTimeNbo extends PackedArenaObject {
return x;
}
- static fromStamp(stamp: number): AbsoluteTimeNbo {
+ static fromStampSeconds(stamp: number): AbsoluteTimeNbo {
let x = new AbsoluteTimeNbo();
x.alloc();
// XXX: This only works up to 54 bit numbers.
- set64(x.nativePtr, stamp);
+ set64(x.nativePtr, stamp * 1000000);
return x;
}
diff --git a/src/types.ts b/src/types.ts
index c6111bd..5d53f8d 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -526,10 +526,10 @@ export class Contract {
fulfillment_url: string;
@Checkable.Number
- wire_fee_amortization: number;
+ wire_fee_amortization?: number;
@Checkable.Value(AmountJson)
- max_wire_fee: AmountJson;
+ max_wire_fee?: AmountJson;
@Checkable.Any
extra: any;
@@ -661,6 +661,21 @@ export namespace Amounts {
}
}
+ export function divide(a: AmountJson, n: number): AmountJson {
+ if (n == 0) {
+ throw Error(`Division by 0`);
+ }
+ if (n == 1) {
+ return {value: a.value, fraction: a.fraction, currency: a.currency};
+ }
+ let r = a.value % n;
+ return {
+ currency: a.currency,
+ value: Math.floor(a.value / n),
+ fraction: Math.floor(((r * fractionalBase) + a.fraction) / n),
+ }
+ }
+
export function isNonZero(a: AmountJson) {
return a.value > 0 || a.fraction > 0;
}
diff --git a/src/wallet.ts b/src/wallet.ts
index 8b220ec..982801f 100644
--- a/src/wallet.ts
+++ b/src/wallet.ts
@@ -601,7 +601,11 @@ export class Wallet {
* but only if the sum the coins' remaining value exceeds the payment amount.
*/
private async getCoinsForPayment(paymentAmount: AmountJson,
+ wireMethod: string,
+ wireFeeTime: number,
depositFeeLimit: AmountJson,
+ wireFeeLimit: AmountJson,
+ wireFeeAmortization: number,
allowedExchanges: ExchangeHandle[],
allowedAuditors: Auditor[]):
Promise<CoinSelectionResult> {
@@ -610,7 +614,6 @@ export class Wallet {
for (let exchange of exchanges) {
let isOkay: boolean = false;
-
// is the exchange explicitly allowed?
for (let allowedExchange of allowedExchanges) {
if (allowedExchange.master_pub == exchange.masterPublicKey) {
@@ -677,6 +680,27 @@ export class Wallet {
cds.push({coin, denom});
}
+ let fees = await this.q().get(Stores.exchangeWireFees, exchange.baseUrl);
+ if (!fees) {
+ console.error("no fees found for exchange", exchange);
+ continue;
+ }
+
+ let wireFee: AmountJson|undefined = undefined;
+ for (let fee of (fees.feesForType[wireMethod] || [])) {
+ if (fee.startStamp >= wireFeeTime && fee.endStamp <= wireFeeTime) {
+ wireFee = fee.wireFee;
+ break;
+ }
+ }
+
+ if (wireFee) {
+ let amortizedWireFee = Amounts.divide(wireFee, wireFeeAmortization);
+ if (Amounts.cmp(wireFeeLimit, amortizedWireFee) < 0) {
+ paymentAmount = Amounts.add(amortizedWireFee, paymentAmount).amount;
+ }
+ }
+
let res = selectCoins(cds, paymentAmount, depositFeeLimit);
if (res) {
return {
@@ -766,7 +790,11 @@ export class Wallet {
}
let res = await this.getCoinsForPayment(offer.contract.amount,
+ offer.contract.wire_method,
+
getTalerStampSec(offer.contract.timestamp) || 0,
offer.contract.max_fee,
+ offer.contract.max_wire_fee ||
Amounts.getZero(offer.contract.amount.currency),
+
offer.contract.wire_fee_amortization || 1,
offer.contract.exchanges,
offer.contract.auditors);
@@ -802,7 +830,11 @@ export class Wallet {
// If not already payed, check if we could pay for it.
let res = await this.getCoinsForPayment(offer.contract.amount,
+ offer.contract.wire_method,
+
getTalerStampSec(offer.contract.timestamp) || 0,
offer.contract.max_fee,
+ offer.contract.max_wire_fee ||
Amounts.getZero(offer.contract.amount.currency),
+
offer.contract.wire_fee_amortization || 1,
offer.contract.exchanges,
offer.contract.auditors);
@@ -1427,7 +1459,7 @@ export class Wallet {
let valid: boolean = await this.cryptoApi.isValidWireFee(detail.type,
wf, exchangeInfo.masterPublicKey);
if (!valid) {
console.error("fee signature invalid", fee);
- continue;
+ throw Error("fee signature invalid");
}
fees.push(wf);
}
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [taler-wallet-webex] branch master updated: fix signature checks, add wire fee,
gnunet <=