aboutsummaryrefslogtreecommitdiff
path: root/src/exchange
diff options
context:
space:
mode:
Diffstat (limited to 'src/exchange')
-rw-r--r--src/exchange/taler-exchange-httpd_purses_create.c7
-rw-r--r--src/exchange/taler-exchange-httpd_purses_merge.c42
-rw-r--r--src/exchange/taler-exchange-httpd_reserves_purse.c32
3 files changed, 62 insertions, 19 deletions
diff --git a/src/exchange/taler-exchange-httpd_purses_create.c b/src/exchange/taler-exchange-httpd_purses_create.c
index 4034978b..a5702ffe 100644
--- a/src/exchange/taler-exchange-httpd_purses_create.c
+++ b/src/exchange/taler-exchange-httpd_purses_create.c
@@ -55,7 +55,7 @@ struct Coin
struct TALER_Amount amount;
/**
- * Deposit fee applicable for this coin.
+ * Deposit fee applicable to this coin.
*/
struct TALER_Amount deposit_fee;
@@ -220,8 +220,11 @@ create_transaction (void *cls,
{
struct PurseCreateContext *pcc = cls;
enum GNUNET_DB_QueryStatus qs;
+ struct TALER_Amount purse_fee;
bool in_conflict = true;
+ TALER_amount_set_zero (pcc->amount.currency,
+ &purse_fee);
/* 1) create purse */
qs = TEH_plugin->insert_purse_request (TEH_plugin->cls,
pcc->purse_pub,
@@ -229,7 +232,9 @@ create_transaction (void *cls,
pcc->purse_expiration,
&pcc->h_contract_terms,
pcc->min_age,
+ TALER_WAMF_MODE_MERGE_FULLY_PAID_PURSE,
&pcc->amount,
+ &purse_fee,
&pcc->purse_sig,
&in_conflict);
if (qs < 0)
diff --git a/src/exchange/taler-exchange-httpd_purses_merge.c b/src/exchange/taler-exchange-httpd_purses_merge.c
index a95f4ce4..c2b11ca3 100644
--- a/src/exchange/taler-exchange-httpd_purses_merge.c
+++ b/src/exchange/taler-exchange-httpd_purses_merge.c
@@ -497,24 +497,32 @@ TEH_handler_purses_merge (
TALER_EC_EXCHANGE_PURSE_MERGE_INVALID_MERGE_SIGNATURE,
NULL);
}
- if (GNUNET_OK !=
- TALER_wallet_account_merge_verify (
- pcc.merge_timestamp,
- pcc.purse_pub,
- pcc.purse_expiration,
- &pcc.h_contract_terms,
- &pcc.target_amount,
- pcc.min_age,
- &pcc.reserve_pub,
- &pcc.reserve_sig))
{
- GNUNET_break_op (0);
- GNUNET_free (pcc.provider_url);
- return TALER_MHD_reply_with_error (
- connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_EXCHANGE_PURSE_MERGE_INVALID_RESERVE_SIGNATURE,
- NULL);
+ struct TALER_Amount zero_purse_fee;
+
+ TALER_amount_set_zero (pcc.target_amount.currency,
+ &zero_purse_fee);
+ if (GNUNET_OK !=
+ TALER_wallet_account_merge_verify (
+ pcc.merge_timestamp,
+ pcc.purse_pub,
+ pcc.purse_expiration,
+ &pcc.h_contract_terms,
+ &pcc.target_amount,
+ &zero_purse_fee,
+ pcc.min_age,
+ TALER_WAMF_MODE_MERGE_FULLY_PAID_PURSE,
+ &pcc.reserve_pub,
+ &pcc.reserve_sig))
+ {
+ GNUNET_break_op (0);
+ GNUNET_free (pcc.provider_url);
+ return TALER_MHD_reply_with_error (
+ connection,
+ MHD_HTTP_BAD_REQUEST,
+ TALER_EC_EXCHANGE_PURSE_MERGE_INVALID_RESERVE_SIGNATURE,
+ NULL);
+ }
}
/* execute transaction */
diff --git a/src/exchange/taler-exchange-httpd_reserves_purse.c b/src/exchange/taler-exchange-httpd_reserves_purse.c
index 3991b416..5556f78d 100644
--- a/src/exchange/taler-exchange-httpd_reserves_purse.c
+++ b/src/exchange/taler-exchange-httpd_reserves_purse.c
@@ -61,6 +61,11 @@ struct ReservePurseContext
struct TALER_Amount amount;
/**
+ * Purse fee the client is willing to pay.
+ */
+ struct TALER_Amount purse_fee;
+
+ /**
* Total amount already put into the purse.
*/
struct TALER_Amount deposit_total;
@@ -129,6 +134,11 @@ struct ReservePurseContext
* Minimum age for deposits into this purse.
*/
uint32_t min_age;
+
+ /**
+ * Flags for the operation.
+ */
+ enum TALER_WalletAccountMergeFlags flags;
};
@@ -209,6 +219,8 @@ purse_transaction (void *cls,
rpc->purse_expiration,
&rpc->h_contract_terms,
rpc->min_age,
+ rpc->flags,
+ &rpc->purse_fee,
&rpc->amount,
&rpc->purse_sig,
&in_conflict);
@@ -449,6 +461,7 @@ TEH_handler_reserves_purse (
.reserve_pub = reserve_pub,
.exchange_timestamp = GNUNET_TIME_timestamp_get ()
};
+ bool no_purse_fee = true;
struct GNUNET_JSON_Specification spec[] = {
TALER_JSON_spec_amount ("purse_value",
TEH_currency,
@@ -456,6 +469,11 @@ TEH_handler_reserves_purse (
GNUNET_JSON_spec_uint32 ("min_age",
&rpc.min_age),
GNUNET_JSON_spec_mark_optional (
+ TALER_JSON_spec_amount ("purse_fee",
+ TEH_currency,
+ &rpc.purse_fee),
+ &no_purse_fee),
+ GNUNET_JSON_spec_mark_optional (
GNUNET_JSON_spec_varsize ("econtract",
&rpc.econtract,
&rpc.econtract_size),
@@ -538,7 +556,17 @@ TEH_handler_reserves_purse (
TALER_EC_EXCHANGE_GENERIC_GLOBAL_FEES_MISSING,
NULL);
}
-
+ if (no_purse_fee)
+ {
+ rpc.flags = TALER_WAMF_MODE_CREATE_FROM_PURSE_QUOTA;
+ TALER_amount_set_zero (TEH_currency,
+ &rpc.purse_fee);
+ }
+ else
+ {
+ rpc.flags = TALER_WAMF_MODE_CREATE_WITH_PURSE_FEE;
+ // FIXME: check rpc.purse_fee is at or above gf.fees.purse!
+ }
TEH_METRICS_num_verifications[TEH_MT_SIGNATURE_EDDSA]++;
if (GNUNET_OK !=
TALER_wallet_purse_create_verify (rpc.purse_expiration,
@@ -578,7 +606,9 @@ TEH_handler_reserves_purse (
rpc.purse_expiration,
&rpc.h_contract_terms,
&rpc.amount,
+ &rpc.purse_fee,
rpc.min_age,
+ rpc.flags,
rpc.reserve_pub,
&rpc.reserve_sig))
{