diff options
author | Florian Dold <florian@dold.me> | 2023-11-14 17:05:13 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2023-11-14 17:05:50 +0100 |
commit | b911412ac51cd48ffb53111d2d1fe65a9ae1473a (patch) | |
tree | f67d1eff1dc8972be21f15d4d094efb0e4571fbc | |
parent | 23681bb251619bf9faabc448200db1366b89973e (diff) | |
download | wallet-core-b911412ac51cd48ffb53111d2d1fe65a9ae1473a.tar.xz |
wallet-core: make age restricted deposits work
5 files changed, 120 insertions, 0 deletions
diff --git a/packages/taler-harness/src/integrationtests/test-age-restrictions-deposit.ts b/packages/taler-harness/src/integrationtests/test-age-restrictions-deposit.ts new file mode 100644 index 000000000..d36ba0e61 --- /dev/null +++ b/packages/taler-harness/src/integrationtests/test-age-restrictions-deposit.ts @@ -0,0 +1,114 @@ +/* + This file is part of GNU Taler + (C) 2020 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** + * Imports. + */ +import { + AmountString, + NotificationType, + TransactionMajorState, + TransactionMinorState, +} from "@gnu-taler/taler-util"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { GlobalTestState, generateRandomPayto } from "../harness/harness.js"; +import { + createSimpleTestkudosEnvironmentV2, + withdrawViaBankV2, +} from "../harness/helpers.js"; +import { defaultCoinConfig } from "../harness/denomStructures.js"; + +/** + * Run test for basic, bank-integrated withdrawal and payment. + */ +export async function runAgeRestrictionsDepositTest(t: GlobalTestState) { + // Set up test environment + + const { walletClient, bank, exchange } = + await createSimpleTestkudosEnvironmentV2( + t, + defaultCoinConfig.map((x) => x("TESTKUDOS")), + { + ageMaskSpec: "8:10:12:14:16:18:21", + }, + ); + + // Withdraw digital cash into the wallet. + + const withdrawalResult = await withdrawViaBankV2(t, { + walletClient, + bank, + exchange, + amount: "TESTKUDOS:20", + }); + + await withdrawalResult.withdrawalFinishedCond; + + const dgIdResp = await walletClient.client.call( + WalletApiOperation.GenerateDepositGroupTxId, + {}, + ); + + const depositTxId = dgIdResp.transactionId; + + const depositTrack = walletClient.waitForNotificationCond( + (n) => + n.type == NotificationType.TransactionStateTransition && + n.transactionId == depositTxId && + n.newTxState.major == TransactionMajorState.Pending && + n.newTxState.minor == TransactionMinorState.Track, + ); + + const depositDone = walletClient.waitForNotificationCond( + (n) => + n.type == NotificationType.TransactionStateTransition && + n.transactionId == depositTxId && + n.newTxState.major == TransactionMajorState.Done, + ); + + const depositGroupResult = await walletClient.client.call( + WalletApiOperation.CreateDepositGroup, + { + amount: "TESTKUDOS:10" as AmountString, + depositPaytoUri: generateRandomPayto("foo"), + transactionId: depositTxId, + }, + ); + + t.assertDeepEqual(depositGroupResult.transactionId, depositTxId); + + await depositTrack; + + await exchange.runAggregatorOnceWithTimetravel({ + timetravelMicroseconds: 1000 * 1000 * 60 * 60 * 3, + }); + + await depositDone; + + const transactions = await walletClient.client.call( + WalletApiOperation.GetTransactions, + {}, + ); + + console.log("transactions", JSON.stringify(transactions, undefined, 2)); + t.assertDeepEqual(transactions.transactions[0].type, "withdrawal"); + t.assertDeepEqual(transactions.transactions[1].type, "deposit"); + // The raw amount is what ends up on the bank account, which includes + // deposit and wire fees. + t.assertDeepEqual(transactions.transactions[1].amountRaw, "TESTKUDOS:9.79"); +} + +runAgeRestrictionsDepositTest.suites = ["wallet"]; diff --git a/packages/taler-harness/src/integrationtests/test-deposit.ts b/packages/taler-harness/src/integrationtests/test-deposit.ts index 1f50377f2..4339e75db 100644 --- a/packages/taler-harness/src/integrationtests/test-deposit.ts +++ b/packages/taler-harness/src/integrationtests/test-deposit.ts @@ -29,6 +29,7 @@ import { createSimpleTestkudosEnvironmentV2, withdrawViaBankV2, } from "../harness/helpers.js"; +import { defaultCoinConfig } from "../harness/denomStructures.js"; /** * Run test for basic, bank-integrated withdrawal and payment. diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts index 968204d78..25bce5712 100644 --- a/packages/taler-harness/src/integrationtests/testrunner.ts +++ b/packages/taler-harness/src/integrationtests/testrunner.ts @@ -94,6 +94,7 @@ import { runWithdrawalManualTest } from "./test-withdrawal-manual.js"; import { runWalletGenDbTest } from "./test-wallet-gendb.js"; import { runLibeufinBankTest } from "./test-libeufin-bank.js"; import { runMultiExchangeTest } from "./test-multiexchange.js"; +import { runAgeRestrictionsDepositTest } from "./test-age-restrictions-deposit.js"; /** * Test runner. @@ -114,6 +115,7 @@ const allTests: TestMainFunction[] = [ runAgeRestrictionsMerchantTest, runAgeRestrictionsMixedMerchantTest, runAgeRestrictionsPeerTest, + runAgeRestrictionsDepositTest, runBankApiTest, runClaimLoopTest, runClauseSchnorrTest, diff --git a/packages/taler-util/src/taler-types.ts b/packages/taler-util/src/taler-types.ts index 87925a3a4..c0c8cc17d 100644 --- a/packages/taler-util/src/taler-types.ts +++ b/packages/taler-util/src/taler-types.ts @@ -2275,6 +2275,8 @@ export interface BatchDepositRequestCoin { // Signature over `TALER_DepositRequestPS`, made by the customer with the // `coin's private key <coin-priv>`. coin_sig: EddsaSignatureString; + + h_age_commitment?: string; } export interface WalletKycUuid { diff --git a/packages/taler-wallet-core/src/operations/deposits.ts b/packages/taler-wallet-core/src/operations/deposits.ts index 111d15989..de413a514 100644 --- a/packages/taler-wallet-core/src/operations/deposits.ts +++ b/packages/taler-wallet-core/src/operations/deposits.ts @@ -954,6 +954,7 @@ async function processDepositGroupPendingDeposit( contribution: Amounts.stringify(perm.contribution), denom_pub_hash: perm.h_denom, ub_sig: perm.ub_sig, + h_age_commitment: perm.h_age_commitment, }); batchIndexes.push(i); } |