diff options
Diffstat (limited to 'packages/taler-harness/src/index.ts')
-rw-r--r-- | packages/taler-harness/src/index.ts | 132 |
1 files changed, 110 insertions, 22 deletions
diff --git a/packages/taler-harness/src/index.ts b/packages/taler-harness/src/index.ts index bdcc72951..53a103629 100644 --- a/packages/taler-harness/src/index.ts +++ b/packages/taler-harness/src/index.ts @@ -19,6 +19,7 @@ */ import { AccessToken, + AmountJson, AmountString, Amounts, BalancesResponse, @@ -302,8 +303,6 @@ advancedCli const { walletClient, walletService, bank, exchange, merchant } = await createSimpleTestkudosEnvironmentV2(t); await walletClient.call(WalletApiOperation.RunIntegrationTestV2, { - amountToSpend: "TESTKUDOS:5" as AmountString, - amountToWithdraw: "TESTKUDOS:10" as AmountString, corebankApiBaseUrl: bank.corebankApiBaseUrl, exchangeBaseUrl: exchange.baseUrl, merchantBaseUrl: merchant.makeInstanceBaseUrl(), @@ -729,7 +728,7 @@ deploymentCli const bc = await bank.getConfig(); if (bc.type === "fail") { - logger.error(`couldn't get bank config. ${bc.detail.hint}`); + logger.error(`couldn't get bank config. ${bc.detail?.hint}`); return; } if (!bank.isCompatible(bc.body.version)) { @@ -740,7 +739,7 @@ deploymentCli } const mc = await merchantManager.getConfig(); if (mc.type === "fail") { - logger.error(`couldn't get merchant config. ${mc.detail.hint}`); + logger.error(`couldn't get merchant config. ${mc.detail?.hint}`); return; } if (!merchantManager.isCompatible(mc.body.version)) { @@ -782,7 +781,6 @@ deploymentCli */ let accountPayto: PaytoString; { - logger.info(`token: ${j2s(bankAdminToken)}`); const resp = await bank.createAccount(bankAdminToken, { name: name, password: password, @@ -1041,6 +1039,12 @@ deploymentCli .maybeOption("bankURL", ["--bankURL"], clk.STRING) .maybeOption("bankUser", ["--bankUser"], clk.STRING) .maybeOption("bankPassword", ["--bankPassword"], clk.STRING) + .maybeOption( + "defaultWireTransferDelay", + ["--default-wire-transfer-delay"], + clk.STRING, + ) + .maybeOption("defaultPayDelay", ["--default-pay-delay"], clk.STRING) .action(async (args) => { const httpLib = createPlatformHttpLib({}); const baseUrl = args.provisionMerchantInstance.merchantApiBaseUrl; @@ -1064,16 +1068,34 @@ deploymentCli const bankPassword = args.provisionMerchantInstance.bankPassword; const accountPayto = args.provisionMerchantInstance.payto as PaytoString; + let defaultWireTransferDelay: Duration; + if (args.provisionMerchantInstance.defaultWireTransferDelay) { + defaultWireTransferDelay = Duration.fromPrettyString( + args.provisionMerchantInstance.defaultWireTransferDelay, + ); + } else { + defaultWireTransferDelay = Duration.fromMilliseconds(1); + } + + let defaultPayDelay: Duration; + if (args.provisionMerchantInstance.defaultPayDelay) { + defaultPayDelay = Duration.fromPrettyString( + args.provisionMerchantInstance.defaultPayDelay, + ); + } else { + defaultPayDelay = Duration.fromSpec({ hours: 1 }); + } + const createResp = await managementApi.createInstance(managementToken, { address: {}, auth: { method: "token", token: instanceTokenPlain, }, - default_pay_delay: Duration.toTalerProtocolDuration( - Duration.fromSpec({ hours: 1 }), + default_pay_delay: Duration.toTalerProtocolDuration(defaultPayDelay), + default_wire_transfer_delay: Duration.toTalerProtocolDuration( + defaultWireTransferDelay, ), - default_wire_transfer_delay: { d_us: 1 }, id: instanceId, jurisdiction: {}, name: instancceName, @@ -1160,6 +1182,23 @@ deploymentCli process.exit(2); }); +function computeFee(args: { + currency: string; + spec: string; + coinMin: AmountJson; + coinMax: AmountJson; +}): string { + if (args.spec === "none") { + return `${args.currency}:0`; + } + + if (args.spec === "const") { + return Amounts.stringify(args.coinMin); + } + + throw Error(`unsupported fee spec (${args.spec})`); +} + deploymentCli .subcommand("coincfg", "gen-coin-config", { help: "Generate a coin/denomination configuration for the exchange.", @@ -1170,40 +1209,89 @@ deploymentCli .requiredOption("maxAmount", ["--max-amount"], clk.STRING, { help: "Largest denomination", }) + .maybeOption("feeWithdraw", ["--fee-deposit"], clk.STRING) + .maybeOption("feeDeposit", ["--fee-deposit"], clk.STRING) + .maybeOption("feeRefresh", ["--fee-refresh"], clk.STRING) + .maybeOption("feeRefund", ["--fee-refund"], clk.STRING) + .maybeOption("fees", ["--fees"], clk.STRING) .flag("noFees", ["--no-fees"]) .action(async (args) => { + let feespecWithdraw; + let feespecDeposit; + let feespecRefund; + let feespecRefresh; + + if (args.coincfg.noFees) { + feespecDeposit = "none"; + feespecWithdraw = "none"; + feespecRefund = "none"; + feespecRefresh = "none"; + } else if (args.coincfg.fees) { + feespecWithdraw = args.coincfg.fees; + feespecDeposit = args.coincfg.fees; + feespecRefund = args.coincfg.fees; + feespecRefresh = args.coincfg.fees; + } else { + // Default: Only deposit fees + feespecWithdraw = args.coincfg.feeWithdraw ?? "none"; + feespecDeposit = args.coincfg.feeDeposit ?? "const"; + feespecRefund = args.coincfg.feeRefund ?? "none"; + feespecRefresh = args.coincfg.feeRefresh ?? "none"; + } + let out = ""; const stamp = Math.floor(new Date().getTime() / 1000); - const min = Amounts.parseOrThrow(args.coincfg.minAmount); - const max = Amounts.parseOrThrow(args.coincfg.maxAmount); - if (min.currency != max.currency) { + const coinMin = Amounts.parseOrThrow(args.coincfg.minAmount); + const coinMax = Amounts.parseOrThrow(args.coincfg.maxAmount); + if (coinMin.currency != coinMax.currency) { console.error("currency mismatch"); process.exit(1); } - const currency = min.currency; - let x = min; + const currency = coinMin.currency; + let x = coinMin; let n = 1; out += "# Coin configuration for the exchange.\n"; out += '# Should be placed in "/etc/taler/conf.d/exchange-coins.conf".\n'; out += "\n"; - while (Amounts.cmp(x, max) < 0) { + while (Amounts.cmp(x, coinMax) < 0) { + const feeWithdraw = computeFee({ + currency, + coinMax, + coinMin, + spec: feespecWithdraw, + }); + const feeDeposit = computeFee({ + currency, + coinMax, + coinMin, + spec: feespecDeposit, + }); + const feeRefresh = computeFee({ + currency, + coinMax, + coinMin, + spec: feespecRefresh, + }); + const feeRefund = computeFee({ + currency, + coinMax, + coinMin, + spec: feespecRefund, + }); + out += `[COIN-${currency}-n${n}-t${stamp}]\n`; out += `VALUE = ${Amounts.stringify(x)}\n`; out += `DURATION_WITHDRAW = 7 days\n`; out += `DURATION_SPEND = 2 years\n`; out += `DURATION_LEGAL = 6 years\n`; - out += `FEE_WITHDRAW = ${currency}:0\n`; - if (args.coincfg.noFees) { - out += `FEE_DEPOSIT = ${currency}:0\n`; - } else { - out += `FEE_DEPOSIT = ${Amounts.stringify(min)}\n`; - } - out += `FEE_REFRESH = ${currency}:0\n`; - out += `FEE_REFUND = ${currency}:0\n`; + out += `FEE_WITHDRAW = ${feeWithdraw}\n`; + out += `FEE_DEPOSIT = ${feeDeposit}\n`; + out += `FEE_REFRESH = ${feeRefresh}\n`; + out += `FEE_REFUND = ${feeRefund}\n`; out += `RSA_KEYSIZE = 2048\n`; out += `CIPHER = RSA\n`; out += "\n"; |