diff options
author | Christian Grothoff <christian@grothoff.org> | 2022-06-05 21:00:41 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2022-06-05 21:00:49 +0200 |
commit | bdbd2a464df579c014d71800cf72571dc73ed645 (patch) | |
tree | 2c68b7a2b7bc95c2aaca0b4500fc79b4658d7d30 | |
parent | 60f609135d04ce3bb4ecad6405572bb6d601fa43 (diff) | |
download | exchange-bdbd2a464df579c014d71800cf72571dc73ed645.tar.xz |
no purse fee if purse is successfully merged
-rw-r--r-- | src/auditor/auditor-basedb.conf | 6 | ||||
-rw-r--r-- | src/exchange/taler-exchange-httpd_responses.c | 7 | ||||
-rw-r--r-- | src/exchangedb/exchange-0001-part.sql | 36 | ||||
-rw-r--r-- | src/exchangedb/plugin_exchangedb_postgres.c | 2 | ||||
-rw-r--r-- | src/lib/exchange_api_common.c | 28 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_purse_deposit.c | 9 |
6 files changed, 44 insertions, 44 deletions
diff --git a/src/auditor/auditor-basedb.conf b/src/auditor/auditor-basedb.conf index a67f2bf1a..197e6d951 100644 --- a/src/auditor/auditor-basedb.conf +++ b/src/auditor/auditor-basedb.conf @@ -113,7 +113,7 @@ currency = TESTKUDOS [merchant-exchange-default] CURRENCY = TESTKUDOS EXCHANGE_BASE_URL = http://localhost:8081/ -MASTER_KEY = W2824S2YNKFZDR0P57Q005J23XGFWSE2GB24A1YS0157NE3F24NG +MASTER_KEY = EQ73PAPVK53KV6QPBDXPD0DTAWR2TPTQQFFTT9AYSB73ZNYW0AD0 [merchant-account-merchant] ACTIVE_default = YES @@ -157,7 +157,7 @@ CONFIG = postgres:///auditor-basedb [exchange] LOOKAHEAD_SIGN = 32 weeks 1 day SIGNKEY_DURATION = 4 weeks -MASTER_PUBLIC_KEY = W2824S2YNKFZDR0P57Q005J23XGFWSE2GB24A1YS0157NE3F24NG +MASTER_PUBLIC_KEY = EQ73PAPVK53KV6QPBDXPD0DTAWR2TPTQQFFTT9AYSB73ZNYW0AD0 SIGNKEY_LEGAL_DURATION = 4 weeks UNIXPATH = ${TALER_RUNTIME_DIR}/exchange.http @@ -175,7 +175,7 @@ DATABASE = postgres:///auditor-basedb CONFIG = postgres:///auditor-basedb [auditor] -PUBLIC_KEY = MSF4QDJMZTT9CC5EMHS480F652QAS40SEXEPAW0GGB9G9RB9B5T0 +PUBLIC_KEY = AAJ7CB4EV8MRZVCAR57B549SX1W7SPR50RFQ1ZV0GKZQMTJB4Z5G TINY_AMOUNT = TESTKUDOS:0.01 BASE_URL = http://localhost:8083/ diff --git a/src/exchange/taler-exchange-httpd_responses.c b/src/exchange/taler-exchange-httpd_responses.c index e5309f9e3..429647e16 100644 --- a/src/exchange/taler-exchange-httpd_responses.c +++ b/src/exchange/taler-exchange-httpd_responses.c @@ -778,12 +778,7 @@ TEH_RESPONSE_compile_reserve_history ( { const struct TALER_EXCHANGEDB_PurseMerge *merge = pos->details.merge; - struct TALER_Amount amount; - GNUNET_assert (0 <= - TALER_amount_subtract (&amount, - &merge->amount_with_fee, - &merge->purse_fee)); if (0 != json_array_append_new ( json_history, @@ -807,7 +802,7 @@ TEH_RESPONSE_compile_reserve_history ( GNUNET_JSON_pack_timestamp ("purse_expiration", merge->purse_expiration), TALER_JSON_pack_amount ("amount", - &amount), + &merge->amount_with_fee), TALER_JSON_pack_amount ("purse_fee", &merge->purse_fee), GNUNET_JSON_pack_bool ("merged", diff --git a/src/exchangedb/exchange-0001-part.sql b/src/exchangedb/exchange-0001-part.sql index c79fdf840..75f65ffb6 100644 --- a/src/exchangedb/exchange-0001-part.sql +++ b/src/exchangedb/exchange-0001-part.sql @@ -1354,7 +1354,7 @@ CREATE OR REPLACE FUNCTION purse_requests_on_update_trigger() LANGUAGE plpgsql AS $$ BEGIN - IF (NEW.finished) + IF (NEW.finished AND NOT OLD.finished) THEN -- If this purse counted against the reserve's -- quota of purses, decrement the reserve accounting. @@ -3099,9 +3099,13 @@ CREATE OR REPLACE FUNCTION exchange_do_purse_merge( LANGUAGE plpgsql AS $$ DECLARE - amount_val INT8; + my_amount_val INT8; DECLARE - amount_frac INT4; + my_amount_frac INT4; +DECLARE + my_purse_fee_val INT8; +DECLARE + my_purse_fee_frac INT4; DECLARE my_partner_serial_id INT8; DECLARE @@ -3136,9 +3140,13 @@ out_no_partner=FALSE; -- Check purse is 'full'. SELECT amount_with_fee_val ,amount_with_fee_frac + ,purse_fee_val + ,purse_fee_frac ,finished - INTO amount_val - ,amount_frac + INTO my_amount_val + ,my_amount_frac + ,my_purse_fee_val + ,my_purse_fee_frac ,my_finished FROM purse_requests WHERE purse_pub=in_purse_pub @@ -3246,18 +3254,26 @@ THEN ,partner_serial_id=my_partner_serial_id WHERE purse_pub=in_purse_pub; ELSE - -- This is a local reserve, update balance immediately. + -- This is a local reserve, update reserve balance immediately. + + -- Refund the purse fee, by adding it to the purse value: + my_amount_val = my_amount_val + my_purse_fee_val; + my_amount_frac = my_amount_frac + my_purse_fee_frac; + -- normalize result + my_amount_val = my_amount_val + my_amount_frac / 100000000; + my_amount_frac = my_amount_frac % 100000000; + UPDATE reserves SET - current_balance_frac=current_balance_frac+amount_frac + current_balance_frac=current_balance_frac+my_amount_frac - CASE - WHEN current_balance_frac + amount_frac >= 100000000 + WHEN current_balance_frac + my_amount_frac >= 100000000 THEN 100000000 ELSE 0 END, - current_balance_val=current_balance_val+amount_val + current_balance_val=current_balance_val+my_amount_val + CASE - WHEN current_balance_frac + amount_frac >= 100000000 + WHEN current_balance_frac + my_amount_frac >= 100000000 THEN 1 ELSE 0 END diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index 4ff51ebcb..0dbd804bb 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -14149,7 +14149,7 @@ postgres_insert_purse_request ( enum GNUNET_DB_QueryStatus qs; struct GNUNET_TIME_Timestamp now = GNUNET_TIME_timestamp_get (); uint32_t flags32 = (uint32_t) flags; - bool in_reserve_quota = (TALER_WAMF_MODE_CREATE_WITH_PURSE_FEE + bool in_reserve_quota = (TALER_WAMF_MODE_CREATE_FROM_PURSE_QUOTA == (flags & TALER_WAMF_MERGE_MODE_MASK)); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_auto_from_type (purse_pub), diff --git a/src/lib/exchange_api_common.c b/src/lib/exchange_api_common.c index 59f5bab8a..79e5a31dd 100644 --- a/src/lib/exchange_api_common.c +++ b/src/lib/exchange_api_common.c @@ -399,7 +399,6 @@ parse_merge (struct TALER_EXCHANGE_ReserveHistoryEntry *rh, const json_t *transaction) { uint32_t flags32; - struct TALER_Amount total; struct GNUNET_JSON_Specification merge_spec[] = { GNUNET_JSON_spec_fixed_auto ("h_contract_terms", &rh->details.merge_details.h_contract_terms), @@ -435,21 +434,13 @@ parse_merge (struct TALER_EXCHANGE_ReserveHistoryEntry *rh, } rh->details.merge_details.flags = (enum TALER_WalletAccountMergeFlags) flags32; - if (0 > - TALER_amount_add (&total, - &rh->amount, - &rh->details.merge_details.purse_fee)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } if (GNUNET_OK != TALER_wallet_account_merge_verify ( rh->details.merge_details.merge_timestamp, &rh->details.merge_details.purse_pub, rh->details.merge_details.purse_expiration, &rh->details.merge_details.h_contract_terms, - &total, + &rh->amount, &rh->details.merge_details.purse_fee, rh->details.merge_details.min_age, rh->details.merge_details.flags, @@ -471,14 +462,17 @@ parse_merge (struct TALER_EXCHANGE_ReserveHistoryEntry *rh, return GNUNET_SYSERR; } } - if (0 > - TALER_amount_add (uc->total_out, - uc->total_out, - &rh->details.merge_details.purse_fee)) + else { - /* overflow in history already!? inconceivable! Bad exchange! */ - GNUNET_break_op (0); - return GNUNET_SYSERR; + if (0 > + TALER_amount_add (uc->total_out, + uc->total_out, + &rh->details.merge_details.purse_fee)) + { + /* overflow in history already!? inconceivable! Bad exchange! */ + GNUNET_break_op (0); + return GNUNET_SYSERR; + } } return GNUNET_OK; } diff --git a/src/testing/testing_api_cmd_purse_deposit.c b/src/testing/testing_api_cmd_purse_deposit.c index 862163c6b..57cc48cf8 100644 --- a/src/testing/testing_api_cmd_purse_deposit.c +++ b/src/testing/testing_api_cmd_purse_deposit.c @@ -212,19 +212,14 @@ deposit_cb (void *cls, GNUNET_assert (NULL != gf); /* Note: change when flags below changes! */ + ds->reserve_history.amount + = dr->details.success.purse_value_after_fees; if (true) { - /* If we paid a purse fee, we need to subtract the - purse fee from the reserve history amount */ - TALER_amount_subtract (&ds->reserve_history.amount, - &dr->details.success.purse_value_after_fees, - &gf->fees.purse); ds->reserve_history.details.merge_details.purse_fee = gf->fees.purse; } else { - ds->reserve_history.amount - = dr->details.success.purse_value_after_fees; TALER_amount_set_zero ( ds->reserve_history.amount.currency, &ds->reserve_history.details.merge_details.purse_fee); |