refactor /wire to include logic to return the wad fee (for W2W payments)

This commit is contained in:
Christian Grothoff 2022-03-05 14:36:49 +01:00
parent 8a906bf96c
commit 7ff58c3d8f
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
33 changed files with 504 additions and 278 deletions

View File

@ -305,14 +305,9 @@ struct WireFeeInfo
struct GNUNET_TIME_Timestamp end_date;
/**
* How high is the wire fee.
* How high are the wire fees.
*/
struct TALER_Amount wire_fee;
/**
* How high is the closing fee.
*/
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
};
@ -911,7 +906,7 @@ get_wire_fee (struct AggregationContext *ac,
GNUNET_TIME_timestamp_cmp (pos->end_date,
>,
timestamp) )
return &pos->wire_fee;
return &pos->fees.wire;
if (GNUNET_TIME_timestamp_cmp (pos->start_date,
>,
timestamp))
@ -926,8 +921,7 @@ get_wire_fee (struct AggregationContext *ac,
timestamp,
&wfi->start_date,
&wfi->end_date,
&wfi->wire_fee,
&wfi->closing_fee,
&wfi->fees,
&master_sig))
{
GNUNET_break (0);
@ -944,8 +938,7 @@ get_wire_fee (struct AggregationContext *ac,
method,
wfi->start_date,
wfi->end_date,
&wfi->wire_fee,
&wfi->closing_fee,
&wfi->fees,
&TALER_ARL_master_pub,
&master_sig))
{
@ -958,7 +951,7 @@ get_wire_fee (struct AggregationContext *ac,
/* Established fee, keep in sorted list */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Wire fee is %s starting at %s\n",
TALER_amount2s (&wfi->wire_fee),
TALER_amount2s (&wfi->fees.wire),
GNUNET_TIME_timestamp2s (wfi->start_date));
if ( (NULL == pos) ||
(NULL == pos->prev) )
@ -999,7 +992,7 @@ get_wire_fee (struct AggregationContext *ac,
TALER_JSON_pack_time_abs_human ("time",
wfi->end_date.abs_time)));
}
return &wfi->wire_fee;
return &wfi->fees.wire;
}

View File

@ -862,7 +862,7 @@ get_closing_fee (const char *receiver_account,
struct TALER_MasterSignatureP master_sig;
struct GNUNET_TIME_Timestamp start_date;
struct GNUNET_TIME_Timestamp end_date;
struct TALER_Amount wire_fee;
struct TALER_WireFeeSet fees;
char *method;
method = TALER_payto_get_method (receiver_account);
@ -875,8 +875,7 @@ get_closing_fee (const char *receiver_account,
atime,
&start_date,
&end_date,
&wire_fee,
fee,
&fees,
&master_sig))
{
char *diag;
@ -892,6 +891,7 @@ get_closing_fee (const char *receiver_account,
GNUNET_free (method);
return GNUNET_SYSERR;
}
*fee = fees.closing;
GNUNET_free (method);
return GNUNET_OK;
}

View File

@ -574,7 +574,7 @@ run (void *cls,
}
{
struct TALER_Amount wire_fee;
struct TALER_WireFeeSet fees;
struct TALER_MasterSignatureP master_sig;
unsigned int year;
struct GNUNET_TIME_Timestamp ws;
@ -585,7 +585,9 @@ run (void *cls,
{
ws = GNUNET_TIME_absolute_to_timestamp (GNUNET_TIME_year_to_time (y - 1));
we = GNUNET_TIME_absolute_to_timestamp (GNUNET_TIME_year_to_time (y));
make_amount (0, 5, &wire_fee);
make_amount (0, 5, &fees.wire);
make_amount (0, 5, &fees.wad);
make_amount (0, 5, &fees.closing);
memset (&master_sig,
0,
sizeof (master_sig));
@ -594,8 +596,7 @@ run (void *cls,
"x-taler-bank",
ws,
we,
&wire_fee,
&wire_fee,
&fees,
&master_sig))
{
GNUNET_break (0);

View File

@ -1491,8 +1491,7 @@ upload_wire_fee (const char *exchange_url,
struct WireFeeRequest *wfr;
const char *err_name;
unsigned int err_line;
struct TALER_Amount wire_fee;
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
struct GNUNET_TIME_Timestamp start_time;
struct GNUNET_TIME_Timestamp end_time;
struct GNUNET_JSON_Specification spec[] = {
@ -1500,10 +1499,13 @@ upload_wire_fee (const char *exchange_url,
&wire_method),
TALER_JSON_spec_amount ("wire_fee",
currency,
&wire_fee),
&fees.wire),
TALER_JSON_spec_amount ("wad_fee",
currency,
&fees.wad),
TALER_JSON_spec_amount ("closing_fee",
currency,
&closing_fee),
&fees.closing),
GNUNET_JSON_spec_timestamp ("start_time",
&start_time),
GNUNET_JSON_spec_timestamp ("end_time",
@ -1539,8 +1541,7 @@ upload_wire_fee (const char *exchange_url,
wire_method,
start_time,
end_time,
&wire_fee,
&closing_fee,
&fees,
&master_sig,
&wire_fee_cb,
wfr);
@ -2360,8 +2361,8 @@ do_del_wire (char *const *args)
* Set wire fees for the given year.
*
* @param args the array of command-line arguments to process next;
* args[0] must be the year, args[1] the wire fee and args[2]
* the closing fee.
* args[0] must be the year, args[1] the wire method, args[2] the wire fee and args[3]
* the closing fee and args[4] the wad fee.
*/
static void
do_set_wire_fee (char *const *args)
@ -2369,8 +2370,7 @@ do_set_wire_fee (char *const *args)
struct TALER_MasterSignatureP master_sig;
char dummy;
unsigned int year;
struct TALER_Amount wire_fee;
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
struct GNUNET_TIME_Timestamp start_time;
struct GNUNET_TIME_Timestamp end_time;
@ -2386,6 +2386,7 @@ do_set_wire_fee (char *const *args)
(NULL == args[1]) ||
(NULL == args[2]) ||
(NULL == args[3]) ||
(NULL == args[4]) ||
( (1 != sscanf (args[0],
"%u%c",
&year,
@ -2394,13 +2395,16 @@ do_set_wire_fee (char *const *args)
args[0])) ) ||
(GNUNET_OK !=
TALER_string_to_amount (args[2],
&wire_fee)) ||
&fees.wire)) ||
(GNUNET_OK !=
TALER_string_to_amount (args[3],
&closing_fee)) )
&fees.closing)) ||
(GNUNET_OK !=
TALER_string_to_amount (args[4],
&fees.wad)) )
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"You must use YEAR, METHOD, WIRE-FEE and CLOSING-FEE as arguments for this subcommand\n");
"You must use YEAR, METHOD, WIRE-FEE, CLOSING-FEE and WAD-FEE as arguments for this subcommand\n");
test_shutdown ();
global_ret = EXIT_INVALIDARGUMENT;
return;
@ -2419,8 +2423,7 @@ do_set_wire_fee (char *const *args)
TALER_exchange_offline_wire_fee_sign (args[1],
start_time,
end_time,
&wire_fee,
&closing_fee,
&fees,
&master_priv,
&master_sig);
output_operation (OP_SET_WIRE_FEE,
@ -2432,12 +2435,14 @@ do_set_wire_fee (char *const *args)
GNUNET_JSON_pack_timestamp ("end_time",
end_time),
TALER_JSON_pack_amount ("wire_fee",
&wire_fee),
&fees.wire),
TALER_JSON_pack_amount ("wad_fee",
&fees.wad),
TALER_JSON_pack_amount ("closing_fee",
&closing_fee),
&fees.closing),
GNUNET_JSON_pack_data_auto ("master_sig",
&master_sig)));
next (args + 4);
next (args + 5);
}

View File

@ -43,7 +43,7 @@ struct AggregationUnit
struct TALER_MerchantPublicKeyP merchant_pub;
/**
* Total amount to be transferred, before subtraction of @e wire_fee and rounding down.
* Total amount to be transferred, before subtraction of @e fees.wire and rounding down.
*/
struct TALER_Amount total_amount;
@ -55,7 +55,7 @@ struct AggregationUnit
/**
* Wire fee we charge for @e wp at @e execution_time.
*/
struct TALER_Amount wire_fee;
struct TALER_WireFeeSet fees;
/**
* Wire transfer identifier we use.
@ -454,7 +454,6 @@ deposit_cb (void *cls,
/* make sure we have current fees */
au->execution_time = GNUNET_TIME_timestamp_get ();
{
struct TALER_Amount closing_fee;
struct GNUNET_TIME_Timestamp start_date;
struct GNUNET_TIME_Timestamp end_date;
struct TALER_MasterSignatureP master_sig;
@ -465,8 +464,7 @@ deposit_cb (void *cls,
au->execution_time,
&start_date,
&end_date,
&au->wire_fee,
&closing_fee,
&au->fees,
&master_sig);
if (0 >= qs)
{
@ -482,7 +480,7 @@ deposit_cb (void *cls,
"Aggregator starts aggregation for deposit %llu to %s with wire fee %s\n",
(unsigned long long) row_id,
TALER_B2S (&au->wtid),
TALER_amount2s (&au->wire_fee));
TALER_amount2s (&au->fees.wire));
qs = db_plugin->insert_aggregation_tracking (db_plugin->cls,
&au->wtid,
row_id);
@ -820,7 +818,7 @@ run_aggregation (void *cls)
if ( (0 >=
TALER_amount_subtract (&au_active.final_amount,
&au_active.total_amount,
&au_active.wire_fee)) ||
&au_active.fees.wire)) ||
(GNUNET_SYSERR ==
TALER_amount_round_down (&au_active.final_amount,
&currency_round_unit)) ||

View File

@ -217,6 +217,7 @@ expired_reserve_cb (void *cls,
struct TALER_WireTransferIdentifierRawP wtid;
struct TALER_Amount amount_without_fee;
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
enum TALER_AmountArithmeticResult ret;
enum GNUNET_DB_QueryStatus qs;
const struct TALER_EXCHANGEDB_AccountInfo *wa;
@ -241,10 +242,9 @@ expired_reserve_cb (void *cls,
return GNUNET_DB_STATUS_HARD_ERROR;
}
/* lookup `closing_fee` from time of actual reserve expiration
/* lookup `fees` from time of actual reserve expiration
(we may be lagging behind!) */
{
struct TALER_Amount wire_fee;
struct GNUNET_TIME_Timestamp start_date;
struct GNUNET_TIME_Timestamp end_date;
struct TALER_MasterSignatureP master_sig;
@ -255,8 +255,7 @@ expired_reserve_cb (void *cls,
expiration_date,
&start_date,
&end_date,
&wire_fee,
&closing_fee,
&fees,
&master_sig);
if (0 >= qs)
{
@ -269,6 +268,7 @@ expired_reserve_cb (void *cls,
}
/* calculate transfer amount */
closing_fee = fees.closing;
ret = TALER_amount_subtract (&amount_without_fee,
left,
&closing_fee);

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2020, 2021 Taler Systems SA
Copyright (C) 2020, 2021, 2022 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free Software
@ -58,14 +58,9 @@ struct AddFeeContext
struct GNUNET_TIME_Timestamp end_time;
/**
* Wire fee amount.
* Wire fee amounts.
*/
struct TALER_Amount wire_fee;
/**
* Closing fee amount.
*/
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
};
@ -91,16 +86,14 @@ add_fee (void *cls,
{
struct AddFeeContext *afc = cls;
enum GNUNET_DB_QueryStatus qs;
struct TALER_Amount wire_fee;
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
qs = TEH_plugin->lookup_wire_fee_by_time (
TEH_plugin->cls,
afc->wire_method,
afc->start_time,
afc->end_time,
&wire_fee,
&closing_fee);
&fees);
if (qs < 0)
{
if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
@ -115,13 +108,10 @@ add_fee (void *cls,
if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != qs)
{
if ( (GNUNET_OK ==
TALER_amount_is_valid (&wire_fee)) &&
TALER_amount_is_valid (&fees.wire)) &&
(0 ==
TALER_amount_cmp (&wire_fee,
&afc->wire_fee)) &&
(0 ==
TALER_amount_cmp (&closing_fee,
&afc->closing_fee)) )
TALER_wire_fee_set_cmp (&fees,
&afc->fees)) )
{
/* this will trigger the 'success' response */
return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS;
@ -142,8 +132,7 @@ add_fee (void *cls,
afc->wire_method,
afc->start_time,
afc->end_time,
&afc->wire_fee,
&afc->closing_fee,
&afc->fees,
&afc->master_sig);
if (qs < 0)
{
@ -175,12 +164,15 @@ TEH_handler_management_post_wire_fees (
&afc.start_time),
GNUNET_JSON_spec_timestamp ("fee_end",
&afc.end_time),
TALER_JSON_spec_amount ("closing_fee",
TEH_currency,
&afc.closing_fee),
TALER_JSON_spec_amount ("wire_fee",
TEH_currency,
&afc.wire_fee),
&afc.fees.wire),
TALER_JSON_spec_amount ("closing_fee",
TEH_currency,
&afc.fees.closing),
TALER_JSON_spec_amount ("wad_fee",
TEH_currency,
&afc.fees.wad),
GNUNET_JSON_spec_end ()
};
@ -201,8 +193,7 @@ TEH_handler_management_post_wire_fees (
afc.wire_method,
afc.start_time,
afc.end_time,
&afc.wire_fee,
&afc.closing_fee,
&afc.fees,
&TEH_master_public_key,
&afc.master_sig))
{

View File

@ -211,9 +211,9 @@ struct WtidTransactionContext
struct TALER_MerchantPublicKeyP merchant_pub;
/**
* Wire fee applicable at @e exec_time.
* Wire fees applicable at @e exec_time.
*/
struct TALER_Amount wire_fee;
struct TALER_WireFeeSet fees;
/**
* Execution time of the wire transfer
@ -401,7 +401,6 @@ get_transfer_deposits (void *cls,
struct GNUNET_TIME_Timestamp wire_fee_start_date;
struct GNUNET_TIME_Timestamp wire_fee_end_date;
struct TALER_MasterSignatureP wire_fee_master_sig;
struct TALER_Amount closing_fee;
/* resetting to NULL/0 in case transaction was repeated after
serialization failure */
@ -457,8 +456,7 @@ get_transfer_deposits (void *cls,
ctx->exec_time,
&wire_fee_start_date,
&wire_fee_end_date,
&ctx->wire_fee,
&closing_fee,
&ctx->fees,
&wire_fee_master_sig);
GNUNET_free (wire_method);
}
@ -478,7 +476,7 @@ get_transfer_deposits (void *cls,
if (0 >
TALER_amount_subtract (&ctx->total,
&ctx->total,
&ctx->wire_fee))
&ctx->fees.wire))
{
GNUNET_break (0);
*mhd_ret = TALER_MHD_reply_with_error (connection,
@ -528,7 +526,7 @@ TEH_handler_transfers_get (struct TEH_RequestContext *rc,
&ctx.total,
&ctx.merchant_pub,
ctx.payto_uri,
&ctx.wire_fee,
&ctx.fees.wire,
ctx.exec_time,
ctx.wdd_head);
free_ctx (&ctx);

View File

@ -200,8 +200,7 @@ add_wire_account (void *cls,
* Add information about a wire account to @a cls.
*
* @param cls a `json_t *` array to expand with wire account details
* @param wire_fee the wire fee we charge
* @param closing_fee the closing fee we charge
* @param fees the wire fees we charge
* @param start_date from when are these fees valid (start date)
* @param end_date until when are these fees valid (end date, exclusive)
* @param master_sig master key signature affirming that this is the correct
@ -209,8 +208,7 @@ add_wire_account (void *cls,
*/
static void
add_wire_fee (void *cls,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
struct GNUNET_TIME_Timestamp start_date,
struct GNUNET_TIME_Timestamp end_date,
const struct TALER_MasterSignatureP *master_sig)
@ -222,9 +220,11 @@ add_wire_fee (void *cls,
a,
GNUNET_JSON_PACK (
TALER_JSON_pack_amount ("wire_fee",
wire_fee),
&fees->wire),
TALER_JSON_pack_amount ("wad_fee",
&fees->wad),
TALER_JSON_pack_amount ("closing_fee",
closing_fee),
&fees->closing),
GNUNET_JSON_pack_timestamp ("start_date",
start_date),
GNUNET_JSON_pack_timestamp ("end_date",

View File

@ -835,6 +835,8 @@ CREATE TABLE IF NOT EXISTS wire_fee
,wire_fee_frac INT4 NOT NULL
,closing_fee_val INT8 NOT NULL
,closing_fee_frac INT4 NOT NULL
,wad_fee_val INT8 NOT NULL
,wad_fee_frac INT4 NOT NULL
,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
,PRIMARY KEY (wire_method, start_date)
);
@ -848,6 +850,27 @@ CREATE INDEX IF NOT EXISTS wire_fee_by_end_date_index
(end_date);
CREATE TABLE IF NOT EXISTS global_fee
(global_fee_serial BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
,start_date INT8 NOT NULL
,end_date INT8 NOT NULL
,history_fee_val INT8 NOT NULL
,history_fee_frac INT4 NOT NULL
,kyc_fee_val INT8 NOT NULL
,kyc_fee_frac INT4 NOT NULL
,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
,PRIMARY KEY (start_date)
);
COMMENT ON TABLE global_fee
IS 'list of the global fees of this exchange, by date';
COMMENT ON COLUMN global_fee.global_fee_serial
IS 'needed for exchange-auditor replication logic';
CREATE INDEX IF NOT EXISTS global_fee_by_end_date_index
ON global_fee
(end_date);
CREATE TABLE IF NOT EXISTS recoup
(recoup_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY -- UNIQUE
,known_coin_id INT8 NOT NULL -- REFERENCES known_coins (known_coin_id)

View File

@ -635,8 +635,9 @@ irbt_cb_table_wire_fee (struct PostgresClosure *pg,
GNUNET_PQ_query_param_string (td->details.wire_fee.wire_method),
GNUNET_PQ_query_param_timestamp (&td->details.wire_fee.start_date),
GNUNET_PQ_query_param_timestamp (&td->details.wire_fee.end_date),
TALER_PQ_query_param_amount (&td->details.wire_fee.wire_fee),
TALER_PQ_query_param_amount (&td->details.wire_fee.closing_fee),
TALER_PQ_query_param_amount (&td->details.wire_fee.fees.wire),
TALER_PQ_query_param_amount (&td->details.wire_fee.fees.closing),
TALER_PQ_query_param_amount (&td->details.wire_fee.fees.wad),
GNUNET_PQ_query_param_auto_from_type (&td->details.wire_fee.master_sig),
GNUNET_PQ_query_param_end
};
@ -647,6 +648,32 @@ irbt_cb_table_wire_fee (struct PostgresClosure *pg,
}
/**
* Function called with wire_fee records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_global_fee (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_timestamp (&td->details.global_fee.start_date),
GNUNET_PQ_query_param_timestamp (&td->details.global_fee.end_date),
TALER_PQ_query_param_amount (&td->details.global_fee.fees.history),
TALER_PQ_query_param_amount (&td->details.global_fee.fees.kyc),
GNUNET_PQ_query_param_auto_from_type (&td->details.wire_fee.master_sig),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_global_fee",
params);
}
/**
* Function called with recoup records to insert into table.
*

View File

@ -1173,9 +1173,11 @@ lrbt_cb_table_wire_fee (void *cls,
GNUNET_PQ_result_spec_timestamp ("end_date",
&td.details.wire_fee.end_date),
TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee",
&td.details.wire_fee.wire_fee),
&td.details.wire_fee.fees.wire),
TALER_PQ_RESULT_SPEC_AMOUNT ("closing_fee",
&td.details.wire_fee.closing_fee),
&td.details.wire_fee.fees.closing),
TALER_PQ_RESULT_SPEC_AMOUNT ("wad_fee",
&td.details.wire_fee.fees.wad),
GNUNET_PQ_result_spec_auto_from_type ("master_sig",
&td.details.wire_fee.master_sig),
GNUNET_PQ_result_spec_end
@ -1197,6 +1199,58 @@ lrbt_cb_table_wire_fee (void *cls,
}
/**
* Function called with wire_fee table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_global_fee (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_GLOBAL_FEE
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 ("serial",
&td.serial),
GNUNET_PQ_result_spec_timestamp ("start_date",
&td.details.global_fee.start_date),
GNUNET_PQ_result_spec_timestamp ("end_date",
&td.details.global_fee.end_date),
TALER_PQ_RESULT_SPEC_AMOUNT ("history_fee",
&td.details.global_fee.fees.history),
TALER_PQ_RESULT_SPEC_AMOUNT ("kyc_fee",
&td.details.global_fee.fees.kyc),
GNUNET_PQ_result_spec_auto_from_type ("master_sig",
&td.details.global_fee.master_sig),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with recoup table entries.
*

View File

@ -1347,6 +1347,8 @@ prepare_statements (struct PostgresClosure *pg)
",wire_fee_frac"
",closing_fee_val"
",closing_fee_frac"
",wad_fee_val"
",wad_fee_frac"
",master_sig"
" FROM wire_fee"
" WHERE wire_method=$1"
@ -1364,10 +1366,12 @@ prepare_statements (struct PostgresClosure *pg)
",wire_fee_frac"
",closing_fee_val"
",closing_fee_frac"
",wad_fee_val"
",wad_fee_frac"
",master_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8);",
8),
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);",
10),
/* Used in #postgres_store_wire_transfer_out */
GNUNET_PQ_make_prepare (
"insert_wire_out",
@ -1826,6 +1830,8 @@ prepare_statements (struct PostgresClosure *pg)
",wire_fee_frac"
",closing_fee_val"
",closing_fee_frac"
",wad_fee_val"
",wad_fee_frac"
",start_date"
",end_date"
",master_sig"
@ -1936,6 +1942,8 @@ prepare_statements (struct PostgresClosure *pg)
",wire_fee_frac"
",closing_fee_val"
",closing_fee_frac"
",wad_fee_val"
",wad_fee_frac"
" FROM wire_fee"
" WHERE wire_method=$1"
" AND end_date > $2"
@ -2421,6 +2429,8 @@ prepare_statements (struct PostgresClosure *pg)
",wire_fee_frac"
",closing_fee_val"
",closing_fee_frac"
",wad_fee_val"
",wad_fee_frac"
",master_sig"
" FROM wire_fee"
" WHERE wire_fee_serial > $1"
@ -2711,10 +2721,12 @@ prepare_statements (struct PostgresClosure *pg)
",wire_fee_frac"
",closing_fee_val"
",closing_fee_frac"
",wad_fee_val"
",wad_fee_frac"
",master_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9);",
9),
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);",
11),
GNUNET_PQ_make_prepare (
"insert_into_table_recoup",
"INSERT INTO recoup"
@ -7554,8 +7566,7 @@ postgres_insert_aggregation_tracking (
* @param date for which date do we want the fee?
* @param[out] start_date when does the fee go into effect
* @param[out] end_date when does the fee end being valid
* @param[out] wire_fee how high is the wire transfer fee
* @param[out] closing_fee how high is the closing fee
* @param[out] fees how high are the wire fees
* @param[out] master_sig signature over the above by the exchange master key
* @return status of the transaction
*/
@ -7565,8 +7576,7 @@ postgres_get_wire_fee (void *cls,
struct GNUNET_TIME_Timestamp date,
struct GNUNET_TIME_Timestamp *start_date,
struct GNUNET_TIME_Timestamp *end_date,
struct TALER_Amount *wire_fee,
struct TALER_Amount *closing_fee,
struct TALER_WireFeeSet *fees,
struct TALER_MasterSignatureP *master_sig)
{
struct PostgresClosure *pg = cls;
@ -7576,11 +7586,18 @@ postgres_get_wire_fee (void *cls,
GNUNET_PQ_query_param_end
};
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_timestamp ("start_date", start_date),
GNUNET_PQ_result_spec_timestamp ("end_date", end_date),
TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee", wire_fee),
TALER_PQ_RESULT_SPEC_AMOUNT ("closing_fee", closing_fee),
GNUNET_PQ_result_spec_auto_from_type ("master_sig", master_sig),
GNUNET_PQ_result_spec_timestamp ("start_date",
start_date),
GNUNET_PQ_result_spec_timestamp ("end_date",
end_date),
TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee",
&fees->wire),
TALER_PQ_RESULT_SPEC_AMOUNT ("wad_fee",
&fees->wad),
TALER_PQ_RESULT_SPEC_AMOUNT ("closing_fee",
&fees->closing),
GNUNET_PQ_result_spec_auto_from_type ("master_sig",
master_sig),
GNUNET_PQ_result_spec_end
};
@ -7598,8 +7615,7 @@ postgres_get_wire_fee (void *cls,
* @param type type of wire transfer this fee applies for
* @param start_date when does the fee go into effect
* @param end_date when does the fee end being valid
* @param wire_fee how high is the wire transfer fee
* @param closing_fee how high is the closing fee
* @param fees how high are the wire fees
* @param master_sig signature over the above by the exchange master key
* @return transaction status code
*/
@ -7608,8 +7624,7 @@ postgres_insert_wire_fee (void *cls,
const char *type,
struct GNUNET_TIME_Timestamp start_date,
struct GNUNET_TIME_Timestamp end_date,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
const struct TALER_MasterSignatureP *master_sig)
{
struct PostgresClosure *pg = cls;
@ -7617,13 +7632,13 @@ postgres_insert_wire_fee (void *cls,
GNUNET_PQ_query_param_string (type),
GNUNET_PQ_query_param_timestamp (&start_date),
GNUNET_PQ_query_param_timestamp (&end_date),
TALER_PQ_query_param_amount (wire_fee),
TALER_PQ_query_param_amount (closing_fee),
TALER_PQ_query_param_amount (&fees->wire),
TALER_PQ_query_param_amount (&fees->closing),
TALER_PQ_query_param_amount (&fees->wad),
GNUNET_PQ_query_param_auto_from_type (master_sig),
GNUNET_PQ_query_param_end
};
struct TALER_Amount wf;
struct TALER_Amount cf;
struct TALER_WireFeeSet wx;
struct TALER_MasterSignatureP sig;
struct GNUNET_TIME_Timestamp sd;
struct GNUNET_TIME_Timestamp ed;
@ -7634,8 +7649,7 @@ postgres_insert_wire_fee (void *cls,
start_date,
&sd,
&ed,
&wf,
&cf,
&wx,
&sig);
if (qs < 0)
return qs;
@ -7647,14 +7661,9 @@ postgres_insert_wire_fee (void *cls,
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (0 != TALER_amount_cmp (wire_fee,
&wf))
{
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (0 != TALER_amount_cmp (closing_fee,
&cf))
if (0 !=
TALER_wire_fee_set_cmp (fees,
&wx))
{
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;
@ -10230,15 +10239,16 @@ get_wire_fees_cb (void *cls,
for (unsigned int i = 0; i < num_results; i++)
{
struct TALER_MasterSignatureP master_sig;
struct TALER_Amount wire_fee;
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
struct GNUNET_TIME_Timestamp start_date;
struct GNUNET_TIME_Timestamp end_date;
struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee",
&wire_fee),
&fees.wire),
TALER_PQ_RESULT_SPEC_AMOUNT ("closing_fee",
&closing_fee),
&fees.closing),
TALER_PQ_RESULT_SPEC_AMOUNT ("wad_fee",
&fees.wad),
GNUNET_PQ_result_spec_timestamp ("start_date",
&start_date),
GNUNET_PQ_result_spec_timestamp ("end_date",
@ -10258,8 +10268,7 @@ get_wire_fees_cb (void *cls,
return;
}
ctx->cb (ctx->cb_cls,
&wire_fee,
&closing_fee,
&fees,
start_date,
end_date,
&master_sig);
@ -10604,16 +10613,10 @@ struct WireFeeLookupContext
{
/**
* Set to the wire fee. Set to invalid if fees conflict over
* Set to the wire fees. Set to invalid if fees conflict over
* the given time period.
*/
struct TALER_Amount *wire_fee;
/**
* Set to the closing fee. Set to invalid if fees conflict over
* the given time period.
*/
struct TALER_Amount *closing_fee;
struct TALER_WireFeeSet *fees;
/**
* Plugin context.
@ -10640,13 +10643,14 @@ wire_fee_by_time_helper (void *cls,
for (unsigned int i = 0; i<num_results; i++)
{
struct TALER_Amount wf;
struct TALER_Amount cf;
struct TALER_WireFeeSet fs;
struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee",
&wf),
&fs.wire),
TALER_PQ_RESULT_SPEC_AMOUNT ("closing_fee",
&cf),
&fs.closing),
TALER_PQ_RESULT_SPEC_AMOUNT ("wad_fee",
&fs.wad),
GNUNET_PQ_result_spec_end
};
@ -10657,40 +10661,24 @@ wire_fee_by_time_helper (void *cls,
{
GNUNET_break (0);
/* invalidate */
memset (wlc->wire_fee,
memset (wlc->fees,
0,
sizeof (struct TALER_Amount));
memset (wlc->closing_fee,
0,
sizeof (struct TALER_Amount));
sizeof (struct TALER_WireFeeSet));
return;
}
if (0 == i)
{
*wlc->wire_fee = wf;
*wlc->closing_fee = cf;
*wlc->fees = fs;
continue;
}
if ( (GNUNET_YES !=
TALER_amount_cmp_currency (&wf,
wlc->wire_fee)) ||
(GNUNET_YES !=
TALER_amount_cmp_currency (&cf,
wlc->closing_fee)) ||
(0 !=
TALER_amount_cmp (&wf,
wlc->wire_fee)) ||
(0 !=
TALER_amount_cmp (&cf,
wlc->closing_fee)) )
if (0 !=
TALER_wire_fee_set_cmp (&fs,
wlc->fees))
{
/* invalidate */
memset (wlc->wire_fee,
memset (wlc->fees,
0,
sizeof (struct TALER_Amount));
memset (wlc->closing_fee,
0,
sizeof (struct TALER_Amount));
sizeof (struct TALER_WireFeeSet));
return;
}
}
@ -10700,7 +10688,7 @@ wire_fee_by_time_helper (void *cls,
/**
* Lookup information about known wire fees. Finds all applicable
* fees in the given range. If they are identical, returns the
* respective @a wire_fee and @a closing_fee. If any of the fees
* respective @a fees. If any of the fees
* differ between @a start_time and @a end_time, the transaction
* succeeds BUT returns an invalid amount for both fees.
*
@ -10708,11 +10696,8 @@ wire_fee_by_time_helper (void *cls,
* @param wire_method the wire method to lookup fees for
* @param start_time starting time of fee
* @param end_time end time of fee
* @param[out] wire_fee wire fee for that time period; if
* different wire fee exists within this time
* period, an 'invalid' amount is returned.
* @param[out] closing_fee wire fee for that time period; if
* different wire fee exists within this time
* @param[out] fees wire fees for that time period; if
* different fees exists within this time
* period, an 'invalid' amount is returned.
* @return transaction status code
*/
@ -10722,8 +10707,7 @@ postgres_lookup_wire_fee_by_time (
const char *wire_method,
struct GNUNET_TIME_Timestamp start_time,
struct GNUNET_TIME_Timestamp end_time,
struct TALER_Amount *wire_fee,
struct TALER_Amount *closing_fee)
struct TALER_WireFeeSet *fees)
{
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = {
@ -10733,9 +10717,8 @@ postgres_lookup_wire_fee_by_time (
GNUNET_PQ_query_param_end
};
struct WireFeeLookupContext wlc = {
.wire_fee = wire_fee,
.closing_fee = closing_fee,
.pg = pg,
.fees = fees,
.pg = pg
};
return GNUNET_PQ_eval_prepared_multi_select (pg->conn,
@ -10834,6 +10817,9 @@ postgres_lookup_serial_by_table (void *cls,
case TALER_EXCHANGEDB_RT_WIRE_FEE:
statement = "select_serial_by_table_wire_fee";
break;
case TALER_EXCHANGEDB_RT_GLOBAL_FEE:
statement = "select_serial_by_table_global_fee";
break;
case TALER_EXCHANGEDB_RT_RECOUP:
statement = "select_serial_by_table_recoup";
break;
@ -11003,6 +10989,10 @@ postgres_lookup_records_by_table (void *cls,
statement = "select_above_serial_by_table_wire_fee";
rh = &lrbt_cb_table_wire_fee;
break;
case TALER_EXCHANGEDB_RT_GLOBAL_FEE:
statement = "select_above_serial_by_table_global_fee";
rh = &lrbt_cb_table_global_fee;
break;
case TALER_EXCHANGEDB_RT_RECOUP:
statement = "select_above_serial_by_table_recoup";
rh = &lrbt_cb_table_recoup;
@ -11138,6 +11128,9 @@ postgres_insert_records_by_table (void *cls,
case TALER_EXCHANGEDB_RT_WIRE_FEE:
rh = &irbt_cb_table_wire_fee;
break;
case TALER_EXCHANGEDB_RT_GLOBAL_FEE:
rh = &irbt_cb_table_global_fee;
break;
case TALER_EXCHANGEDB_RT_RECOUP:
rh = &irbt_cb_table_recoup;
break;

View File

@ -915,23 +915,24 @@ test_wire_fees (void)
{
struct GNUNET_TIME_Timestamp start_date;
struct GNUNET_TIME_Timestamp end_date;
struct TALER_Amount wire_fee;
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
struct TALER_MasterSignatureP master_sig;
struct GNUNET_TIME_Timestamp sd;
struct GNUNET_TIME_Timestamp ed;
struct TALER_Amount fee;
struct TALER_Amount fee2;
struct TALER_WireFeeSet fees2;
struct TALER_MasterSignatureP ms;
start_date = GNUNET_TIME_timestamp_get ();
end_date = GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES);
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (CURRENCY ":1.424242",
&wire_fee));
&fees.wire));
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (CURRENCY ":2.424242",
&closing_fee));
&fees.closing));
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (CURRENCY ":3.424242",
&fees.wad));
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
&master_sig,
sizeof (master_sig));
@ -940,8 +941,7 @@ test_wire_fees (void)
"wire-method",
start_date,
end_date,
&wire_fee,
&closing_fee,
&fees,
&master_sig))
{
GNUNET_break (0);
@ -952,8 +952,7 @@ test_wire_fees (void)
"wire-method",
start_date,
end_date,
&wire_fee,
&closing_fee,
&fees,
&master_sig))
{
GNUNET_break (0);
@ -967,8 +966,7 @@ test_wire_fees (void)
end_date,
&sd,
&ed,
&fee,
&fee2,
&fees2,
&ms))
{
GNUNET_break (0);
@ -980,8 +978,7 @@ test_wire_fees (void)
start_date,
&sd,
&ed,
&fee,
&fee2,
&fees2,
&ms))
{
GNUNET_break (0);
@ -993,10 +990,8 @@ test_wire_fees (void)
(GNUNET_TIME_timestamp_cmp (ed,
!=,
end_date)) ||
(0 != TALER_amount_cmp (&fee,
&wire_fee)) ||
(0 != TALER_amount_cmp (&fee2,
&closing_fee)) ||
(0 != TALER_wire_fee_set_cmp (&fees,
&fees2)) ||
(0 != GNUNET_memcmp (&ms,
&master_sig)) )
{

View File

@ -830,6 +830,18 @@ TALER_global_fee_set_ntoh (struct TALER_GlobalFeeSet *fees,
const struct TALER_GlobalFeeSetNBOP *nbo);
/**
* Compare global fee sets.
*
* @param f1 first set to compare
* @param f2 second set to compare
* @return 0 if sets are equal
*/
int
TALER_global_fee_set_cmp (const struct TALER_GlobalFeeSet *f1,
const struct TALER_GlobalFeeSet *f2);
/**
* Convert wire fee set from host to network byte order.
*
@ -852,6 +864,18 @@ TALER_wire_fee_set_ntoh (struct TALER_WireFeeSet *fees,
const struct TALER_WireFeeSetNBOP *nbo);
/**
* Compare wire fee sets.
*
* @param f1 first set to compare
* @param f2 second set to compare
* @return 0 if sets are equal
*/
int
TALER_wire_fee_set_cmp (const struct TALER_WireFeeSet *f1,
const struct TALER_WireFeeSet *f2);
/**
* Hash @a rsa.
*
@ -3231,8 +3255,7 @@ TALER_auditor_denom_validity_verify (
* @param payment_method the payment method
* @param start_time when do the fees start to apply
* @param end_time when do the fees start to apply
* @param wire_fee the wire fee
* @param closing_fee the closing fee
* @param fees the wire fees
* @param master_priv private key to sign with
* @param[out] master_sig where to write the signature
*/
@ -3241,8 +3264,7 @@ TALER_exchange_offline_wire_fee_sign (
const char *payment_method,
struct GNUNET_TIME_Timestamp start_time,
struct GNUNET_TIME_Timestamp end_time,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
const struct TALER_MasterPrivateKeyP *master_priv,
struct TALER_MasterSignatureP *master_sig);
@ -3253,8 +3275,7 @@ TALER_exchange_offline_wire_fee_sign (
* @param payment_method the payment method
* @param start_time when do the fees start to apply
* @param end_time when do the fees start to apply
* @param wire_fee the wire fee
* @param closing_fee the closing fee
* @param fees the wire fees
* @param master_pub public key to verify against
* @param master_sig the signature the signature
* @return #GNUNET_OK if the signature is valid
@ -3264,8 +3285,7 @@ TALER_exchange_offline_wire_fee_verify (
const char *payment_method,
struct GNUNET_TIME_Timestamp start_time,
struct GNUNET_TIME_Timestamp end_time,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
const struct TALER_MasterPublicKeyP *master_pub,
const struct TALER_MasterSignatureP *master_sig);

View File

@ -642,13 +642,7 @@ struct TALER_EXCHANGE_WireAggregateFees
/**
* Fee to be paid whenever the exchange wires funds to the merchant.
*/
struct TALER_Amount wire_fee;
/**
* Fee to be paid when the exchange closes a reserve and wires funds
* back to a customer.
*/
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
/**
* Time when this fee goes into effect (inclusive)
@ -3501,8 +3495,7 @@ struct TALER_EXCHANGE_ManagementSetWireFeeHandle;
* @param wire_method for which wire method are fees provided
* @param validity_start start date for the provided wire fees
* @param validity_end end date for the provided wire fees
* @param wire_fee the wire fee for this time period
* @param closing_fee the closing fee for this time period
* @param fees the wire fees for this time period
* @param master_sig signature affirming the wire fees;
* of purpose #TALER_SIGNATURE_MASTER_WIRE_FEES
* @param cb function to call with the exchange's result
@ -3516,8 +3509,7 @@ TALER_EXCHANGE_management_set_wire_fees (
const char *wire_method,
struct GNUNET_TIME_Timestamp validity_start,
struct GNUNET_TIME_Timestamp validity_end,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
const struct TALER_MasterSignatureP *master_sig,
TALER_EXCHANGE_ManagementWireEnableCallback cb,
void *cb_cls);

View File

@ -168,6 +168,7 @@ enum TALER_EXCHANGEDB_ReplicatedTable
TALER_EXCHANGEDB_RT_WIRE_OUT,
TALER_EXCHANGEDB_RT_AGGREGATION_TRACKING,
TALER_EXCHANGEDB_RT_WIRE_FEE,
TALER_EXCHANGEDB_RT_GLOBAL_FEE,
TALER_EXCHANGEDB_RT_RECOUP,
TALER_EXCHANGEDB_RT_RECOUP_REFRESH,
TALER_EXCHANGEDB_RT_EXTENSIONS,
@ -384,11 +385,18 @@ struct TALER_EXCHANGEDB_TableData
char *wire_method;
struct GNUNET_TIME_Timestamp start_date;
struct GNUNET_TIME_Timestamp end_date;
struct TALER_Amount wire_fee;
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
struct TALER_MasterSignatureP master_sig;
} wire_fee;
struct
{
struct GNUNET_TIME_Timestamp start_date;
struct GNUNET_TIME_Timestamp end_date;
struct TALER_GlobalFeeSet fees;
struct TALER_MasterSignatureP master_sig;
} global_fee;
struct
{
uint64_t known_coin_id;
@ -1899,8 +1907,7 @@ typedef void
* Provide information about wire fees.
*
* @param cls closure
* @param wire_fee the wire fee we charge
* @param closing_fee the closing fee we charge
* @param fees the wire fees we charge
* @param start_date from when are these fees valid (start date)
* @param end_date until when are these fees valid (end date, exclusive)
* @param master_sig master key signature affirming that this is the correct
@ -1909,8 +1916,26 @@ typedef void
typedef void
(*TALER_EXCHANGEDB_WireFeeCallback)(
void *cls,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
struct GNUNET_TIME_Timestamp start_date,
struct GNUNET_TIME_Timestamp end_date,
const struct TALER_MasterSignatureP *master_sig);
/**
* Provide information about global fees.
*
* @param cls closure
* @param fees the global fees we charge
* @param start_date from when are these fees valid (start date)
* @param end_date until when are these fees valid (end date, exclusive)
* @param master_sig master key signature affirming that this is the correct
* fee (of purpose #TALER_SIGNATURE_MASTER_GLOBAL_FEES)
*/
typedef void
(*TALER_EXCHANGEDB_GlobalFeeCallback)(
void *cls,
const struct TALER_GlobalFeeSet *fees,
struct GNUNET_TIME_Timestamp start_date,
struct GNUNET_TIME_Timestamp end_date,
const struct TALER_MasterSignatureP *master_sig);
@ -3256,8 +3281,7 @@ struct TALER_EXCHANGEDB_Plugin
* @param wire_method which wire method is the fee about?
* @param start_date when does the fee go into effect
* @param end_date when does the fee end being valid
* @param wire_fee how high is the wire transfer fee
* @param closing_fee how high is the closing fee
* @param fees how high is are the wire fees
* @param master_sig signature over the above by the exchange master key
* @return transaction status code
*/
@ -3266,11 +3290,28 @@ struct TALER_EXCHANGEDB_Plugin
const char *wire_method,
struct GNUNET_TIME_Timestamp start_date,
struct GNUNET_TIME_Timestamp end_date,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
const struct TALER_MasterSignatureP *master_sig);
/**
* Insert global fee set into database.
*
* @param cls closure
* @param start_date when does the fee go into effect
* @param end_date when does the fee end being valid
* @param fees how high is are the global fees
* @param master_sig signature over the above by the exchange master key
* @return transaction status code
*/
enum GNUNET_DB_QueryStatus
(*insert_global_fee)(void *cls,
struct GNUNET_TIME_Timestamp start_date,
struct GNUNET_TIME_Timestamp end_date,
const struct TALER_GlobalFeeSet *fees,
const struct TALER_MasterSignatureP *master_sig);
/**
* Obtain wire fee from database.
*
@ -3279,8 +3320,7 @@ struct TALER_EXCHANGEDB_Plugin
* @param date for which date do we want the fee?
* @param[out] start_date when does the fee go into effect
* @param[out] end_date when does the fee end being valid
* @param[out] wire_fee how high is the wire transfer fee
* @param[out] closing_fee how high is the closing fee
* @param[out] fees how high are the wire fees
* @param[out] master_sig signature over the above by the exchange master key
* @return query status of the transaction
*/
@ -3290,11 +3330,31 @@ struct TALER_EXCHANGEDB_Plugin
struct GNUNET_TIME_Timestamp date,
struct GNUNET_TIME_Timestamp *start_date,
struct GNUNET_TIME_Timestamp *end_date,
struct TALER_Amount *wire_fee,
struct TALER_Amount *closing_fee,
struct TALER_WireFeeSet *fees,
struct TALER_MasterSignatureP *master_sig);
/**
* Obtain global fees from database.
*
* @param cls closure
* @param date for which date do we want the fee?
* @param[out] start_date when does the fee go into effect
* @param[out] end_date when does the fee end being valid
* @param[out] fees how high are the global fees
* @param[out] master_sig signature over the above by the exchange master key
* @return query status of the transaction
*/
enum GNUNET_DB_QueryStatus
(*get_global_fee)(void *cls,
const char *type,
struct GNUNET_TIME_Timestamp date,
struct GNUNET_TIME_Timestamp *start_date,
struct GNUNET_TIME_Timestamp *end_date,
struct TALER_GlobalFeeSet *fees,
struct TALER_MasterSignatureP *master_sig);
/**
* Obtain information about expired reserves and their
* remaining balances.
@ -3874,6 +3934,20 @@ struct TALER_EXCHANGEDB_Plugin
void *cb_cls);
/**
* Obtain information about the global fee structure of the exchange.
*
* @param cls closure
* @param cb function to call on each account
* @param cb_cls closure for @a cb
* @return transaction status code
*/
enum GNUNET_DB_QueryStatus
(*get_global_fees)(void *cls,
TALER_EXCHANGEDB_GlobalFeeCallback cb,
void *cb_cls);
/**
* Store information about a revoked online signing key.
*
@ -4012,10 +4086,7 @@ struct TALER_EXCHANGEDB_Plugin
* @param wire_method the wire method to lookup fees for
* @param start_time starting time of fee
* @param end_time end time of fee
* @param[out] wire_fee wire fee for that time period; if
* different wire fee exists within this time
* period, an 'invalid' amount is returned.
* @param[out] closing_fee wire fee for that time period; if
* @param[out] fees set to wire fees for that time period; if
* different wire fee exists within this time
* period, an 'invalid' amount is returned.
* @return transaction status code
@ -4026,8 +4097,7 @@ struct TALER_EXCHANGEDB_Plugin
const char *wire_method,
struct GNUNET_TIME_Timestamp start_time,
struct GNUNET_TIME_Timestamp end_time,
struct TALER_Amount *wire_fee,
struct TALER_Amount *closing_fee);
struct TALER_WireFeeSet *fees);
/**

View File

@ -1244,14 +1244,10 @@ struct TALER_MasterWireFeePS
struct GNUNET_TIME_TimestampNBO end_date;
/**
* Fee charged to the merchant per wire transfer.
* Fees charged for wire transfers using the
* given wire method.
*/
struct TALER_AmountNBO wire_fee;
/**
* Closing fee charged when we wire back funds of a reserve.
*/
struct TALER_AmountNBO closing_fee;
struct TALER_WireFeeSetNBOP fees;
};

View File

@ -2107,6 +2107,7 @@ TALER_TESTING_cmd_set_wire_fee (const char *label,
const char *wire_method,
const char *wire_fee,
const char *closing_fee,
const char *wad_fee,
unsigned int expected_http_status,
bool bad_sig);
@ -2180,13 +2181,15 @@ TALER_TESTING_cmd_exec_offline_sign_keys (const char *label,
* @param config_filename configuration filename.
* @param wire_fee the wire fee to affirm (for the current year)
* @param closing_fee the closing fee to affirm (for the current year)
* @param wad_fee the wad fee to affirm
* @return the command
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_exec_offline_sign_fees (const char *label,
const char *config_filename,
const char *wire_fee,
const char *closing_fee);
const char *closing_fee,
const char *wad_fee);
/**

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2020-2021 Taler Systems SA
Copyright (C) 2020-2022 Taler Systems SA
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
@ -129,8 +129,7 @@ TALER_EXCHANGE_management_set_wire_fees (
const char *wire_method,
struct GNUNET_TIME_Timestamp validity_start,
struct GNUNET_TIME_Timestamp validity_end,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
const struct TALER_MasterSignatureP *master_sig,
TALER_EXCHANGE_ManagementWireEnableCallback cb,
void *cb_cls)
@ -163,9 +162,11 @@ TALER_EXCHANGE_management_set_wire_fees (
GNUNET_JSON_pack_timestamp ("fee_end",
validity_end),
TALER_JSON_pack_amount ("closing_fee",
closing_fee),
&fees->closing),
TALER_JSON_pack_amount ("wad_fee",
&fees->wad),
TALER_JSON_pack_amount ("wire_fee",
wire_fee));
&fees->wire));
eh = TALER_EXCHANGE_curl_easy_get_ (swfh->url);
GNUNET_assert (NULL != eh);
if (GNUNET_OK !=

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2014-2020 Taler Systems SA
Copyright (C) 2014-2022 Taler Systems SA
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
@ -144,9 +144,11 @@ parse_fees (json_t *fees)
GNUNET_JSON_spec_fixed_auto ("sig",
&wa->master_sig),
TALER_JSON_spec_amount_any ("wire_fee",
&wa->wire_fee),
&wa->fees.wire),
TALER_JSON_spec_amount_any ("wad_fee",
&wa->fees.wad),
TALER_JSON_spec_amount_any ("closing_fee",
&wa->closing_fee),
&wa->fees.closing),
GNUNET_JSON_spec_timestamp ("start_date",
&wa->start_date),
GNUNET_JSON_spec_timestamp ("end_date",
@ -230,8 +232,10 @@ handle_wire_finished (void *cls,
struct FeeMap *fm;
const struct TALER_EXCHANGE_Keys *key_state;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_json ("accounts", &accounts),
GNUNET_JSON_spec_json ("fees", &fees),
GNUNET_JSON_spec_json ("accounts",
&accounts),
GNUNET_JSON_spec_json ("fees",
&fees),
GNUNET_JSON_spec_end ()
};
@ -277,8 +281,10 @@ handle_wire_finished (void *cls,
struct TALER_EXCHANGE_WireAccount *wa = &was[i];
json_t *account;
struct GNUNET_JSON_Specification spec_account[] = {
GNUNET_JSON_spec_string ("payto_uri", &wa->payto_uri),
GNUNET_JSON_spec_fixed_auto ("master_sig", &wa->master_sig),
GNUNET_JSON_spec_string ("payto_uri",
&wa->payto_uri),
GNUNET_JSON_spec_fixed_auto ("master_sig",
&wa->master_sig),
GNUNET_JSON_spec_end ()
};
char *method;

View File

@ -651,6 +651,7 @@ run (void *cls,
TALER_TESTING_cmd_exec_offline_sign_fees ("offline-sign-fees",
config_file,
"EUR:0.01",
"EUR:0.01",
"EUR:0.01"),
TALER_TESTING_cmd_auditor_add ("add-auditor-OK",
MHD_HTTP_NO_CONTENT,

View File

@ -1169,6 +1169,7 @@ run (void *cls,
TALER_TESTING_cmd_exec_offline_sign_fees ("offline-sign-fees",
config_file,
"EUR:0.01",
"EUR:0.01",
"EUR:0.01"),
TALER_TESTING_cmd_check_keys_pull_all_keys ("refetch /keys",
1),

View File

@ -69,6 +69,7 @@ run (void *cls,
TALER_TESTING_cmd_exec_offline_sign_fees ("offline-sign-fees",
config_file,
"EUR:0.01",
"EUR:0.01",
"EUR:0.01"),
TALER_TESTING_cmd_exec_offline_sign_keys ("offline-sign-future-keys",
config_file),

View File

@ -85,30 +85,35 @@ run (void *cls,
"foo-method",
"EUR:1",
"EUR:5",
"EUR:3",
MHD_HTTP_NO_CONTENT,
false),
TALER_TESTING_cmd_set_wire_fee ("set-fee-conflicting",
"foo-method",
"EUR:1",
"EUR:1",
"EUR:3",
MHD_HTTP_CONFLICT,
false),
TALER_TESTING_cmd_set_wire_fee ("set-fee-bad-signature",
"bar-method",
"EUR:1",
"EUR:1",
"EUR:3",
MHD_HTTP_FORBIDDEN,
true),
TALER_TESTING_cmd_set_wire_fee ("set-fee-other-method",
"bar-method",
"EUR:1",
"EUR:1",
"EUR:3",
MHD_HTTP_NO_CONTENT,
false),
TALER_TESTING_cmd_set_wire_fee ("set-fee-idempotent",
"bar-method",
"EUR:1",
"EUR:1",
"EUR:3",
MHD_HTTP_NO_CONTENT,
false),
TALER_TESTING_cmd_wire_add ("add-wire-account",

View File

@ -210,6 +210,7 @@ run (void *cls,
TALER_TESTING_cmd_exec_offline_sign_fees ("offline-sign-fees",
CONFIG_FILE,
"EUR:0.01",
"EUR:0.01",
"EUR:0.01"),
TALER_TESTING_cmd_auditor_add ("add-auditor-OK",
MHD_HTTP_NO_CONTENT,

View File

@ -99,6 +99,7 @@ run (void *cls,
TALER_TESTING_cmd_exec_offline_sign_fees ("offline-sign-fees",
config_filename,
"EUR:0.01",
"EUR:0.01",
"EUR:0.01"),
// check no aggregation happens on a empty database
CMD_EXEC_AGGREGATOR ("run-aggregator-on-empty-db",

View File

@ -85,6 +85,7 @@ run (void *cls,
TALER_TESTING_cmd_exec_offline_sign_fees ("offline-sign-fees",
config_filename,
"EUR:0.01",
"EUR:0.01",
"EUR:0.01"),
TALER_TESTING_cmd_auditor_add ("add-auditor-OK",
MHD_HTTP_NO_CONTENT,

View File

@ -51,6 +51,11 @@ struct OfflineSignState
*/
const char *wire_fee_s;
/**
* The wad fee to sign.
*/
const char *wad_fee_s;
/**
* The closing fee to sign.
*/
@ -86,6 +91,7 @@ offlinesign_run (void *cls,
"x-taler-bank",
ks->wire_fee_s,
ks->closing_fee_s,
ks->wad_fee_s,
"upload",
NULL);
if (NULL == ks->offlinesign_proc)
@ -157,13 +163,15 @@ struct TALER_TESTING_Command
TALER_TESTING_cmd_exec_offline_sign_fees (const char *label,
const char *config_filename,
const char *wire_fee,
const char *closing_fee)
const char *closing_fee,
const char *wad_fee)
{
struct OfflineSignState *ks;
ks = GNUNET_new (struct OfflineSignState);
ks->config_filename = config_filename;
ks->wire_fee_s = wire_fee;
ks->wad_fee_s = wad_fee;
ks->closing_fee_s = closing_fee;
{
struct TALER_TESTING_Command cmd = {

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2020 Taler Systems SA
Copyright (C) 2020, 2022 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
@ -60,6 +60,11 @@ struct WireFeeState
*/
const char *closing_fee;
/**
* Wad fee amount to use.
*/
const char *wad_fee;
/**
* Expected HTTP response code.
*/
@ -121,8 +126,7 @@ wire_add_run (void *cls,
struct GNUNET_TIME_Absolute now;
struct GNUNET_TIME_Timestamp start_time;
struct GNUNET_TIME_Timestamp end_time;
struct TALER_Amount wire_fee;
struct TALER_Amount closing_fee;
struct TALER_WireFeeSet fees;
(void) cmd;
ds->is = is;
@ -135,10 +139,13 @@ wire_add_run (void *cls,
GNUNET_TIME_UNIT_HOURS));
if ( (GNUNET_OK !=
TALER_string_to_amount (ds->closing_fee,
&closing_fee)) ||
&fees.closing)) ||
(GNUNET_OK !=
TALER_string_to_amount (ds->wad_fee,
&fees.wad)) ||
(GNUNET_OK !=
TALER_string_to_amount (ds->wire_fee,
&wire_fee)) )
&fees.wire)) )
{
GNUNET_break (0);
TALER_TESTING_interpreter_fail (is);
@ -156,8 +163,7 @@ wire_add_run (void *cls,
TALER_exchange_offline_wire_fee_sign (ds->wire_method,
start_time,
end_time,
&wire_fee,
&closing_fee,
&fees,
&is->master_priv,
&master_sig);
}
@ -167,8 +173,7 @@ wire_add_run (void *cls,
ds->wire_method,
start_time,
end_time,
&wire_fee,
&closing_fee,
&fees,
&master_sig,
&wire_add_cb,
ds);
@ -212,6 +217,7 @@ TALER_TESTING_cmd_set_wire_fee (const char *label,
const char *wire_method,
const char *wire_fee,
const char *closing_fee,
const char *wad_fee,
unsigned int expected_http_status,
bool bad_sig)
{
@ -223,6 +229,7 @@ TALER_TESTING_cmd_set_wire_fee (const char *label,
ds->wire_method = wire_method;
ds->wire_fee = wire_fee;
ds->closing_fee = closing_fee;
ds->wad_fee = wad_fee;
{
struct TALER_TESTING_Command cmd = {
.cls = ds,

View File

@ -119,7 +119,7 @@ wire_cb (void *cls,
NULL != waf;
waf = waf->next)
{
if (0 != TALER_amount_cmp (&waf->wire_fee,
if (0 != TALER_amount_cmp (&waf->fees.wire,
&expected_fee))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2020, 2021 Taler Systems SA
Copyright (C) 2020-2022 Taler Systems SA
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
@ -415,8 +415,7 @@ TALER_exchange_offline_wire_fee_sign (
const char *payment_method,
struct GNUNET_TIME_Timestamp start_time,
struct GNUNET_TIME_Timestamp end_time,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
const struct TALER_MasterPrivateKeyP *master_priv,
struct TALER_MasterSignatureP *master_sig)
{
@ -430,10 +429,8 @@ TALER_exchange_offline_wire_fee_sign (
GNUNET_CRYPTO_hash (payment_method,
strlen (payment_method) + 1,
&kv.h_wire_method);
TALER_amount_hton (&kv.wire_fee,
wire_fee);
TALER_amount_hton (&kv.closing_fee,
closing_fee);
TALER_wire_fee_set_hton (&kv.fees,
fees);
GNUNET_CRYPTO_eddsa_sign (&master_priv->eddsa_priv,
&kv,
&master_sig->eddsa_signature);
@ -445,8 +442,7 @@ TALER_exchange_offline_wire_fee_verify (
const char *payment_method,
struct GNUNET_TIME_Timestamp start_time,
struct GNUNET_TIME_Timestamp end_time,
const struct TALER_Amount *wire_fee,
const struct TALER_Amount *closing_fee,
const struct TALER_WireFeeSet *fees,
const struct TALER_MasterPublicKeyP *master_pub,
const struct TALER_MasterSignatureP *master_sig)
{
@ -460,10 +456,8 @@ TALER_exchange_offline_wire_fee_verify (
GNUNET_CRYPTO_hash (payment_method,
strlen (payment_method) + 1,
&wf.h_wire_method);
TALER_amount_hton (&wf.wire_fee,
wire_fee);
TALER_amount_hton (&wf.closing_fee,
closing_fee);
TALER_wire_fee_set_hton (&wf.fees,
fees);
return
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MASTER_WIRE_FEES,
&wf,

View File

@ -124,6 +124,46 @@ TALER_wire_fee_set_ntoh (struct TALER_WireFeeSet *fees,
}
int
TALER_global_fee_set_cmp (const struct TALER_GlobalFeeSet *f1,
const struct TALER_GlobalFeeSet *f2)
{
int ret;
ret = TALER_amount_cmp (&f1->history,
&f2->history);
if (0 != ret)
return ret;
ret = TALER_amount_cmp (&f1->kyc,
&f2->kyc);
if (0 != ret)
return ret;
return 0;
}
int
TALER_wire_fee_set_cmp (const struct TALER_WireFeeSet *f1,
const struct TALER_WireFeeSet *f2)
{
int ret;
ret = TALER_amount_cmp (&f1->wire,
&f2->wire);
if (0 != ret)
return ret;
ret = TALER_amount_cmp (&f1->closing,
&f2->closing);
if (0 != ret)
return ret;
ret = TALER_amount_cmp (&f1->wad,
&f2->wad);
if (0 != ret)
return ret;
return 0;
}
enum GNUNET_GenericReturnValue
TALER_denom_fee_check_currency (
const char *currency,