aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2018-01-17 05:33:06 +0100
committerFlorian Dold <florian.dold@gmail.com>2018-01-17 05:33:06 +0100
commitd4c2f6f6f992c36609c4a029afcb378a7f839ddf (patch)
tree2c50f9f1fa65ccea77894460b9d2080184914ab2
parentc62ba4986fbfcb8637a3befadf3d3eddbd5348ca (diff)
use full amount with wire fees when creating deposit permission
-rw-r--r--src/crypto/cryptoApi.ts5
-rw-r--r--src/crypto/cryptoWorker.ts5
-rw-r--r--src/wallet.ts21
-rw-r--r--src/walletTypes.ts4
4 files changed, 25 insertions, 10 deletions
diff --git a/src/crypto/cryptoApi.ts b/src/crypto/cryptoApi.ts
index 1f45ba8eb..c1f3f4245 100644
--- a/src/crypto/cryptoApi.ts
+++ b/src/crypto/cryptoApi.ts
@@ -293,8 +293,9 @@ export class CryptoApi {
}
signDeposit(contractTerms: ContractTerms,
- cds: CoinWithDenom[]): Promise<PayCoinInfo> {
- return this.doRpc<PayCoinInfo>("signDeposit", 3, contractTerms, cds);
+ cds: CoinWithDenom[],
+ totalAmount: AmountJson): Promise<PayCoinInfo> {
+ return this.doRpc<PayCoinInfo>("signDeposit", 3, contractTerms, cds, totalAmount);
}
createEddsaKeypair(): Promise<{priv: string, pub: string}> {
diff --git a/src/crypto/cryptoWorker.ts b/src/crypto/cryptoWorker.ts
index b7c8e933f..6b82f6bc2 100644
--- a/src/crypto/cryptoWorker.ts
+++ b/src/crypto/cryptoWorker.ts
@@ -269,7 +269,8 @@ namespace RpcFunctions {
* and deposit permissions for each given coin.
*/
export function signDeposit(contractTerms: ContractTerms,
- cds: CoinWithDenom[]): PayCoinInfo {
+ cds: CoinWithDenom[],
+ totalAmount: AmountJson): PayCoinInfo {
const ret: PayCoinInfo = {
originalCoins: [],
sigs: [],
@@ -282,7 +283,7 @@ namespace RpcFunctions {
let fees = Amounts.add(Amounts.getZero(feeList[0].currency), ...feeList).amount;
// okay if saturates
fees = Amounts.sub(fees, contractTerms.max_fee).amount;
- const total = Amounts.add(fees, contractTerms.amount).amount;
+ const total = Amounts.add(fees, totalAmount).amount;
const amountSpent = native.Amount.getZero(cds[0].coin.currentAmount.currency);
const amountRemaining = new native.Amount(total);
diff --git a/src/wallet.ts b/src/wallet.ts
index 24fab9f86..91da5873b 100644
--- a/src/wallet.ts
+++ b/src/wallet.ts
@@ -593,15 +593,23 @@ export class Wallet {
continue;
}
+ console.log("payment coins: wireFeeLimit", wireFeeLimit);
+ console.log("payment coins: wireFeeAmortization", wireFeeAmortization);
+ console.log("payment coins: fees", fees);
+ console.log("payment coins: wireMethod", wireMethod);
+ console.log("payment coins: wireFeeTime", wireFeeTime);
+
let totalFees = Amounts.getZero(currency);
let wireFee: AmountJson|undefined;
for (const fee of (fees.feesForType[wireMethod] || [])) {
- if (fee.startStamp >= wireFeeTime && fee.endStamp <= wireFeeTime) {
+ if (fee.startStamp <= wireFeeTime && fee.endStamp >= wireFeeTime) {
wireFee = fee.wireFee;
break;
}
}
+ console.log("payment coins: current wire fees", wireFee);
+
if (wireFee) {
const amortizedWireFee = Amounts.divide(wireFee, wireFeeAmortization);
if (Amounts.cmp(wireFeeLimit, amortizedWireFee) < 0) {
@@ -616,6 +624,7 @@ export class Wallet {
return {
cds: res.cds,
exchangeUrl: exchange.baseUrl,
+ totalAmount: remainingAmount,
totalFees,
};
}
@@ -766,8 +775,8 @@ export class Wallet {
const sd = await this.getSpeculativePayData(proposalId);
if (!sd) {
- const { exchangeUrl, cds } = res;
- const payCoinInfo = await this.cryptoApi.signDeposit(proposal.contractTerms, cds);
+ const { exchangeUrl, cds, totalAmount } = res;
+ const payCoinInfo = await this.cryptoApi.signDeposit(proposal.contractTerms, cds, totalAmount);
purchase = await this.recordConfirmPay(proposal, payCoinInfo, exchangeUrl);
} else {
purchase = await this.recordConfirmPay(sd.proposal, sd.payCoinInfo, sd.exchangeUrl);
@@ -844,8 +853,8 @@ export class Wallet {
// Only create speculative signature if we don't already have one for this proposal
if ((!this.speculativePayData) || (this.speculativePayData && this.speculativePayData.proposalId !== proposalId)) {
- const { exchangeUrl, cds } = res;
- const payCoinInfo = await this.cryptoApi.signDeposit(proposal.contractTerms, cds);
+ const { exchangeUrl, cds, totalAmount } = res;
+ const payCoinInfo = await this.cryptoApi.signDeposit(proposal.contractTerms, cds, totalAmount);
this.speculativePayData = {
exchangeUrl,
payCoinInfo,
@@ -2456,7 +2465,7 @@ export class Wallet {
const contractTermsHash = await this.cryptoApi.hashString(canonicalJson(contractTerms));
- const payCoinInfo = await this.cryptoApi.signDeposit(contractTerms, cds);
+ const payCoinInfo = await this.cryptoApi.signDeposit(contractTerms, cds, contractTerms.amount);
console.log("pci", payCoinInfo);
diff --git a/src/walletTypes.ts b/src/walletTypes.ts
index d1a4f8746..45a795873 100644
--- a/src/walletTypes.ts
+++ b/src/walletTypes.ts
@@ -415,6 +415,10 @@ export interface CoinSelectionResult {
exchangeUrl: string;
cds: CoinWithDenom[];
totalFees: AmountJson;
+ /**
+ * Total amount, including wire fees payed by the customer.
+ */
+ totalAmount: AmountJson;
}