[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-wallet-core] 01/02: add restricted option to manual withdraw
From: |
gnunet |
Subject: |
[taler-wallet-core] 01/02: add restricted option to manual withdraw |
Date: |
Wed, 04 May 2022 21:27:04 +0200 |
This is an automated email from the git hooks/post-receive script.
sebasjm pushed a commit to branch master
in repository wallet-core.
commit 4491118494c332c9ce0a0c4533804744d63701f2
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Wed May 4 16:11:12 2022 -0300
add restricted option to manual withdraw
---
packages/taler-util/src/talerCrypto.ts | 6 ++--
packages/taler-util/src/talerTypes.ts | 7 +++-
packages/taler-util/src/walletTypes.ts | 2 ++
packages/taler-wallet-cli/src/index.ts | 2 ++
.../src/util/coinSelection.test.ts | 42 ++++++++++++++++++++++
packages/taler-wallet-core/src/wallet.ts | 5 +++
6 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/packages/taler-util/src/talerCrypto.ts
b/packages/taler-util/src/talerCrypto.ts
index 228dc326..e27e329a 100644
--- a/packages/taler-util/src/talerCrypto.ts
+++ b/packages/taler-util/src/talerCrypto.ts
@@ -664,7 +664,6 @@ export function hashDenomPub(pub: DenominationPubKey):
Uint8Array {
const hashInputBuf = new ArrayBuffer(pubBuf.length + 4 + 4);
const uint8ArrayBuf = new Uint8Array(hashInputBuf);
const dv = new DataView(hashInputBuf);
- logger.info("age_mask", pub.age_mask);
dv.setUint32(0, pub.age_mask ?? 0);
dv.setUint32(4, DenomKeyType.toIntTag(pub.cipher));
uint8ArrayBuf.set(pubBuf, 8);
@@ -680,8 +679,7 @@ export function hashDenomPub(pub: DenominationPubKey):
Uint8Array {
return nacl.hash(uint8ArrayBuf);
} else {
throw Error(
- `unsupported cipher (${
- (pub as DenominationPubKey).cipher
+ `unsupported cipher (${(pub as DenominationPubKey).cipher
}), unable to hash`,
);
}
@@ -785,7 +783,7 @@ export enum TalerSignaturePurpose {
export class SignaturePurposeBuilder {
private chunks: Uint8Array[] = [];
- constructor(private purposeNum: number) {}
+ constructor(private purposeNum: number) { }
put(bytes: Uint8Array): SignaturePurposeBuilder {
this.chunks.push(Uint8Array.from(bytes));
diff --git a/packages/taler-util/src/talerTypes.ts
b/packages/taler-util/src/talerTypes.ts
index ffc1f516..b21c6cae 100644
--- a/packages/taler-util/src/talerTypes.ts
+++ b/packages/taler-util/src/talerTypes.ts
@@ -47,7 +47,7 @@ import {
} from "./time.js";
import { codecForAmountString } from "./amounts.js";
import { strcmp } from "./helpers.js";
-import { Edx25519PublicKey } from "./talerCrypto.js";
+import { AgeCommitmentProof, Edx25519PublicKey } from "./talerCrypto.js";
/**
* Denomination as found in the /keys response from the exchange.
@@ -954,6 +954,11 @@ export interface CoinDumpJson {
* Suspended coins are not considered for payments.
*/
coin_suspended: boolean;
+
+ /**
+ * Information about the age restriction
+ */
+ ageCommitmentProof: AgeCommitmentProof | undefined;
}>;
}
diff --git a/packages/taler-util/src/walletTypes.ts
b/packages/taler-util/src/walletTypes.ts
index d8696377..a8946fbb 100644
--- a/packages/taler-util/src/walletTypes.ts
+++ b/packages/taler-util/src/walletTypes.ts
@@ -738,6 +738,7 @@ export const codecForGetExchangeTosRequest = ():
Codec<GetExchangeTosRequest> =>
export interface AcceptManualWithdrawalRequest {
exchangeBaseUrl: string;
amount: string;
+ restrictAge?: number,
}
export const codecForAcceptManualWithdrawalRequet =
@@ -745,6 +746,7 @@ export const codecForAcceptManualWithdrawalRequet =
buildCodecForObject<AcceptManualWithdrawalRequest>()
.property("exchangeBaseUrl", codecForString())
.property("amount", codecForString())
+ .property("restrictAge", codecOptional(codecForNumber()))
.build("AcceptManualWithdrawalRequest");
export interface GetWithdrawalDetailsForAmountRequest {
diff --git a/packages/taler-wallet-cli/src/index.ts
b/packages/taler-wallet-cli/src/index.ts
index a4c99902..5ba6e4bf 100644
--- a/packages/taler-wallet-cli/src/index.ts
+++ b/packages/taler-wallet-cli/src/index.ts
@@ -775,6 +775,7 @@ advancedCli
.requiredOption("amount", ["--amount"], clk.STRING, {
help: "Amount to withdraw",
})
+ .maybeOption("restrictAge", ["--restrict-age"], clk.INT)
.action(async (args) => {
await withWallet(args, async (wallet) => {
const exchangeBaseUrl = args.withdrawManually.exchange;
@@ -796,6 +797,7 @@ advancedCli
{
amount,
exchangeBaseUrl,
+ restrictAge: parseInt(String(args.withdrawManually.restrictAge), 10),
},
);
const reservePub = resp.reservePub;
diff --git a/packages/taler-wallet-core/src/util/coinSelection.test.ts
b/packages/taler-wallet-core/src/util/coinSelection.test.ts
index dc64a57d..ca7b76eb 100644
--- a/packages/taler-wallet-core/src/util/coinSelection.test.ts
+++ b/packages/taler-wallet-core/src/util/coinSelection.test.ts
@@ -43,6 +43,20 @@ function fakeAci(current: string, feeDeposit: string):
AvailableCoinInfo {
};
}
+function fakeAciWithAgeRestriction(current: string, feeDeposit: string):
AvailableCoinInfo {
+ return {
+ availableAmount: a(current),
+ coinPub: "foobar",
+ denomPub: {
+ cipher: DenomKeyType.Rsa,
+ rsa_public_key: "foobar",
+ age_mask: 2446657,
+ },
+ feeDeposit: a(feeDeposit),
+ exchangeBaseUrl: "https://example.com/",
+ };
+}
+
test("it should be able to pay if merchant takes the fees", (t) => {
const acis: AvailableCoinInfo[] = [
fakeAci("EUR:1.0", "EUR:0.1"),
@@ -267,3 +281,31 @@ test("coin selection 9", (t) => {
);
t.pass();
});
+
+
+test("it should be able to use unrestricted coins for age restricted
contract", (t) => {
+ const acis: AvailableCoinInfo[] = [
+ fakeAciWithAgeRestriction("EUR:1.0", "EUR:0.2"),
+ fakeAciWithAgeRestriction("EUR:0.2", "EUR:0.2"),
+ ];
+ const res = selectPayCoins({
+ candidates: {
+ candidateCoins: acis,
+ wireFeesPerExchange: {},
+ },
+ contractTermsAmount: a("EUR:1.2"),
+ depositFeeLimit: a("EUR:0.4"),
+ wireFeeLimit: a("EUR:0"),
+ wireFeeAmortization: 1,
+ requiredMinimumAge: 13
+ });
+ if (!res) {
+ t.fail();
+ return;
+ }
+ t.true(res.coinContributions.length === 2);
+ t.true(
+ Amounts.cmp(Amounts.sum(res.coinContributions).amount, "EUR:1.2") === 0,
+ );
+ t.pass();
+});
diff --git a/packages/taler-wallet-core/src/wallet.ts
b/packages/taler-wallet-core/src/wallet.ts
index fb61ae0d..053a0763 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -454,11 +454,14 @@ async function acceptManualWithdrawal(
ws: InternalWalletState,
exchangeBaseUrl: string,
amount: AmountJson,
+ restrictAge?: number,
+
): Promise<AcceptManualWithdrawalResult> {
try {
const resp = await createReserve(ws, {
amount,
exchange: exchangeBaseUrl,
+ restrictAge
});
const exchangePaytoUris = await ws.db
.mktx((x) => ({
@@ -690,6 +693,7 @@ async function dumpCoins(ws: InternalWalletState):
Promise<CoinDumpJson> {
remaining_value: Amounts.stringify(c.currentAmount),
withdrawal_reserve_pub: withdrawalReservePub,
coin_suspended: c.suspended,
+ ageCommitmentProof: c.ageCommitmentProof,
});
}
});
@@ -801,6 +805,7 @@ async function dispatchRequestInternal(
ws,
req.exchangeBaseUrl,
Amounts.parseOrThrow(req.amount),
+ req.restrictAge
);
return res;
}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.