aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-harness/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-harness/src/index.ts')
-rw-r--r--packages/taler-harness/src/index.ts132
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";