include fees in amounts being signed, check available balance on refresh

This commit is contained in:
Christian Grothoff 2015-03-22 16:09:01 +01:00
parent c2a42d5475
commit 1277f8445d
10 changed files with 183 additions and 111 deletions

View File

@ -131,6 +131,15 @@ struct TALER_WithdrawRequest
*/ */
struct GNUNET_CRYPTO_EddsaPublicKey reserve_pub; struct GNUNET_CRYPTO_EddsaPublicKey reserve_pub;
/**
* Value of the coin being minted (matching the denomination key)
* plus the transaction fee. We include this in what is being
* signed so that we can verify a reserve's remaining total balance
* without needing to access the respective denomination key
* information each time.
*/
struct TALER_AmountNBO amount_with_fee;
/** /**
* Hash of the denomination public key for the coin that is withdrawn. * Hash of the denomination public key for the coin that is withdrawn.
*/ */
@ -171,9 +180,11 @@ struct TALER_DepositRequest
uint64_t transaction_id GNUNET_PACKED; uint64_t transaction_id GNUNET_PACKED;
/** /**
* Amount to be deposited. * Amount to be deposited, including fee.
*/ */
struct TALER_AmountNBO amount; struct TALER_AmountNBO amount_with_fee;
/* FIXME: we should probably also include the value of
the depositing fee here as well! */
/** /**
* The coin's public key. * The coin's public key.
@ -211,9 +222,12 @@ struct TALER_DepositConfirmation
uint64_t transaction_id GNUNET_PACKED; uint64_t transaction_id GNUNET_PACKED;
/** /**
* Amount to be deposited. * Amount to be deposited, including fee.
*/ */
struct TALER_AmountNBO amount; struct TALER_AmountNBO amount_with_fee;
/* FIXME: we should probably also include the value of
the depositing fee here as well! */
/** /**
* The coin's public key. * The coin's public key.
@ -245,11 +259,17 @@ struct RefreshMeltCoinSignature
struct GNUNET_HashCode melt_hash; struct GNUNET_HashCode melt_hash;
/** /**
* How much of the value of the coin should be melted? * How much of the value of the coin should be melted? This amount
* This amount includes the fees, so the final amount contributed * includes the fees, so the final amount contributed to the melt is
* to the melt is this value minus the fee for melting the coin. * this value minus the fee for melting the coin. We include the
* fee in what is being signed so that we can verify a reserve's
* remaining total balance without needing to access the respective
* denomination key information each time.
*/ */
struct TALER_AmountNBO amount; struct TALER_AmountNBO amount_with_fee;
/* FIXME: we should probably also include the value of
the melting fee here as well! */
/** /**
* The coin's public key. * The coin's public key.
@ -282,9 +302,13 @@ struct RefreshMeltSessionSignature
/** /**
* What is the total value of the coins created during the * What is the total value of the coins created during the
* refresh, excluding fees? * refresh, including melting fee!
*/ */
struct TALER_AmountNBO amount; struct TALER_AmountNBO amount_with_fee;
/* FIXME: we should probably also include the value of
the melting fee here as well! */
}; };

View File

@ -1401,7 +1401,7 @@ postgres_insert_deposit (void *cls,
&denom_sig_enc); &denom_sig_enc);
json_wire_enc = json_dumps (deposit->wire, JSON_COMPACT); json_wire_enc = json_dumps (deposit->wire, JSON_COMPACT);
TALER_amount_hton (&amount_nbo, TALER_amount_hton (&amount_nbo,
&deposit->amount); &deposit->amount_with_fee);
struct TALER_DB_QueryParam params[]= { struct TALER_DB_QueryParam params[]= {
TALER_DB_QUERY_PARAM_PTR (&deposit->coin.coin_pub), TALER_DB_QUERY_PARAM_PTR (&deposit->coin.coin_pub),
TALER_DB_QUERY_PARAM_PTR_SIZED (denom_pub_enc, denom_pub_enc_size), TALER_DB_QUERY_PARAM_PTR_SIZED (denom_pub_enc, denom_pub_enc_size),

View File

@ -34,6 +34,64 @@
#include "plugin.h" #include "plugin.h"
/**
* Calculate the total value of all transactions performed.
* Stores @a off plus the cost of all transactions in @a tl
* in @a ret.
*
* @param pos transaction list to process
* @param off offset to use as the starting value
* @param ret where the resulting total is to be stored
* @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
*/
static int
calculate_transaction_list_totals (struct TALER_MINT_DB_TransactionList *tl,
const struct TALER_Amount *off,
struct TALER_Amount *ret)
{
struct TALER_Amount spent = *off;
struct TALER_MINT_DB_TransactionList *pos;
for (pos = tl; NULL != pos; pos = pos->next)
{
switch (pos->type)
{
case TALER_MINT_DB_TT_DEPOSIT:
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.deposit->amount_with_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_MINT_DB_TT_REFRESH_MELT:
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.melt->amount_with_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_MINT_DB_TT_LOCK:
/* should check if lock is still active,
and if it is for THIS operation; if
lock is inactive, delete it; if lock
is for THIS operation, ignore it;
if lock is for another operation,
count it! */
GNUNET_assert (0); // FIXME: not implemented! (#3625)
return GNUNET_SYSERR;
}
}
*ret = spent;
return GNUNET_OK;
}
/** /**
* Execute a deposit. The validity of the coin and signature * Execute a deposit. The validity of the coin and signature
* have already been checked. The database must now check that * have already been checked. The database must now check that
@ -50,11 +108,9 @@ TALER_MINT_db_execute_deposit (struct MHD_Connection *connection,
{ {
struct TALER_MINTDB_Session *session; struct TALER_MINTDB_Session *session;
struct TALER_MINT_DB_TransactionList *tl; struct TALER_MINT_DB_TransactionList *tl;
struct TALER_MINT_DB_TransactionList *pos;
struct TALER_Amount spent; struct TALER_Amount spent;
struct TALER_Amount value; struct TALER_Amount value;
struct TALER_Amount fee_deposit; struct TALER_Amount fee_deposit;
struct TALER_Amount fee_refresh;
struct MintKeyState *mks; struct MintKeyState *mks;
struct TALER_MINT_DenomKeyIssuePriv *dki; struct TALER_MINT_DenomKeyIssuePriv *dki;
int ret; int ret;
@ -76,7 +132,7 @@ TALER_MINT_db_execute_deposit (struct MHD_Connection *connection,
&deposit->h_contract, &deposit->h_contract,
deposit->transaction_id, deposit->transaction_id,
&deposit->merchant_pub, &deposit->merchant_pub,
&deposit->amount); &deposit->amount_with_fee);
} }
mks = TALER_MINT_key_state_acquire (); mks = TALER_MINT_key_state_acquire ();
dki = TALER_MINT_get_denom_key (mks, dki = TALER_MINT_get_denom_key (mks,
@ -85,8 +141,6 @@ TALER_MINT_db_execute_deposit (struct MHD_Connection *connection,
&dki->issue.value); &dki->issue.value);
TALER_amount_ntoh (&fee_deposit, TALER_amount_ntoh (&fee_deposit,
&dki->issue.fee_deposit); &dki->issue.fee_deposit);
TALER_amount_ntoh (&fee_refresh,
&dki->issue.fee_refresh);
TALER_MINT_key_state_release (mks); TALER_MINT_key_state_release (mks);
if (GNUNET_OK != if (GNUNET_OK !=
@ -96,69 +150,29 @@ TALER_MINT_db_execute_deposit (struct MHD_Connection *connection,
GNUNET_break (0); GNUNET_break (0);
return TALER_MINT_reply_internal_db_error (connection); return TALER_MINT_reply_internal_db_error (connection);
} }
/* fee for THIS transaction */
spent = deposit->amount_with_fee;
if (TALER_amount_cmp (&fee_deposit,
&spent) < 0)
{
return (MHD_YES ==
TALER_MINT_reply_external_error (connection,
"deposited amount smaller than depositing fee"))
? GNUNET_NO : GNUNET_SYSERR;
}
/* add cost of all previous transactions */
tl = plugin->get_coin_transactions (plugin->cls, tl = plugin->get_coin_transactions (plugin->cls,
session, session,
&deposit->coin.coin_pub); &deposit->coin.coin_pub);
spent = fee_deposit; /* fee for THIS transaction */
if (GNUNET_OK != if (GNUNET_OK !=
TALER_amount_add (&spent, calculate_transaction_list_totals (tl,
&spent, &spent,
&deposit->amount)) &spent))
{ {
GNUNET_break (0);
plugin->free_coin_transaction_list (plugin->cls, plugin->free_coin_transaction_list (plugin->cls,
tl); tl);
return TALER_MINT_reply_internal_db_error (connection); return TALER_MINT_reply_internal_db_error (connection);
} }
for (pos = tl; NULL != pos; pos = pos->next)
{
switch (pos->type)
{
case TALER_MINT_DB_TT_DEPOSIT:
if ( (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.deposit->amount)) ||
(GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&fee_deposit)) )
{
GNUNET_break (0);
plugin->free_coin_transaction_list (plugin->cls,
tl);
return TALER_MINT_reply_internal_db_error (connection);
}
break;
case TALER_MINT_DB_TT_REFRESH_MELT:
if ( (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.melt->amount)) ||
(GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&fee_refresh)) )
{
GNUNET_break (0);
plugin->free_coin_transaction_list (plugin->cls,
tl);
return TALER_MINT_reply_internal_db_error (connection);
}
break;
case TALER_MINT_DB_TT_LOCK:
/* should check if lock is still active,
and if it is for THIS operation; if
lock is inactive, delete it; if lock
is for THIS operation, ignore it;
if lock is for another operation,
count it! */
GNUNET_assert (0); // FIXME: not implemented! (#3625)
break;
}
}
if (0 < TALER_amount_cmp (&spent, if (0 < TALER_amount_cmp (&spent,
&value)) &value))
{ {
@ -197,7 +211,7 @@ TALER_MINT_db_execute_deposit (struct MHD_Connection *connection,
&deposit->h_contract, &deposit->h_contract,
deposit->transaction_id, deposit->transaction_id,
&deposit->merchant_pub, &deposit->merchant_pub,
&deposit->amount); &deposit->amount_with_fee);
} }
@ -501,8 +515,11 @@ refresh_accept_melts (struct MHD_Connection *connection,
{ {
struct TALER_MINT_DenomKeyIssue *dki; struct TALER_MINT_DenomKeyIssue *dki;
struct TALER_MINT_DB_TransactionList *tl; struct TALER_MINT_DB_TransactionList *tl;
struct TALER_Amount fee_deposit;
struct TALER_Amount fee_refresh;
struct TALER_Amount coin_value; struct TALER_Amount coin_value;
struct TALER_Amount coin_residual; struct TALER_Amount coin_residual;
struct TALER_Amount spent;
struct RefreshMelt melt; struct RefreshMelt melt;
int res; int res;
@ -518,26 +535,51 @@ refresh_accept_melts (struct MHD_Connection *connection,
"denom not found")) "denom not found"))
? GNUNET_NO : GNUNET_SYSERR; ? GNUNET_NO : GNUNET_SYSERR;
TALER_amount_ntoh (&fee_deposit,
&dki->fee_deposit);
TALER_amount_ntoh (&fee_refresh,
&dki->fee_refresh);
TALER_amount_ntoh (&coin_value, TALER_amount_ntoh (&coin_value,
&dki->value); &dki->value);
/* fee for THIS transaction; the melt amount includes the fee! */
spent = coin_details->melt_amount_with_fee;
if (TALER_amount_cmp (&fee_refresh,
&spent) < 0)
{
return (MHD_YES ==
TALER_MINT_reply_external_error (connection,
"melt amount smaller than melting fee"))
? GNUNET_NO : GNUNET_SYSERR;
}
/* add historic transaction costs of this coin */
tl = plugin->get_coin_transactions (plugin->cls, tl = plugin->get_coin_transactions (plugin->cls,
session, session,
&coin_public_info->coin_pub); &coin_public_info->coin_pub);
/* FIXME: #3636: compute how much value is left with this coin and if (GNUNET_OK !=
compare to `expected_value`! (subtract from "coin_value") */ calculate_transaction_list_totals (tl,
coin_residual = coin_value; &spent,
&spent))
{
GNUNET_break (0);
plugin->free_coin_transaction_list (plugin->cls,
tl);
return TALER_MINT_reply_internal_db_error (connection);
}
/* Refuse to refresh when the coin does not have enough money left to /* Refuse to refresh when the coin does not have enough money left to
* pay the refreshing fees of the coin. */ * pay the refreshing fees of the coin. */
if (TALER_amount_cmp (&coin_value,
if (TALER_amount_cmp (&coin_residual, &spent) < 0)
&coin_details->melt_amount) < 0)
{ {
GNUNET_assert (GNUNET_OK ==
TALER_amount_subtract (&coin_residual,
&spent,
&coin_details->melt_amount_with_fee));
res = (MHD_YES == res = (MHD_YES ==
TALER_MINT_reply_refresh_melt_insufficient_funds (connection, TALER_MINT_reply_refresh_melt_insufficient_funds (connection,
&coin_public_info->coin_pub, &coin_public_info->coin_pub,
coin_value, coin_value,
tl, tl,
coin_details->melt_amount, coin_details->melt_amount_with_fee,
coin_residual)) coin_residual))
? GNUNET_NO : GNUNET_SYSERR; ? GNUNET_NO : GNUNET_SYSERR;
plugin->free_coin_transaction_list (plugin->cls, plugin->free_coin_transaction_list (plugin->cls,
@ -550,7 +592,7 @@ refresh_accept_melts (struct MHD_Connection *connection,
melt.coin = *coin_public_info; melt.coin = *coin_public_info;
melt.coin_sig = coin_details->melt_sig; melt.coin_sig = coin_details->melt_sig;
melt.melt_hash = *melt_hash; melt.melt_hash = *melt_hash;
melt.amount = coin_details->melt_amount; melt.amount_with_fee = coin_details->melt_amount_with_fee;
if (GNUNET_OK != if (GNUNET_OK !=
plugin->insert_refresh_melt (plugin->cls, plugin->insert_refresh_melt (plugin->cls,
session, session,

View File

@ -95,7 +95,7 @@ struct MeltDetails
* This amount includes the fees, so the final amount contributed * This amount includes the fees, so the final amount contributed
* to the melt is this value minus the fee for melting the coin. * to the melt is this value minus the fee for melting the coin.
*/ */
struct TALER_Amount melt_amount; struct TALER_Amount melt_amount_with_fee;
}; };

View File

@ -65,8 +65,8 @@ verify_and_execute_deposit (struct MHD_Connection *connection,
dr.h_contract = deposit->h_contract; dr.h_contract = deposit->h_contract;
dr.h_wire = deposit->h_wire; dr.h_wire = deposit->h_wire;
dr.transaction_id = GNUNET_htonll (deposit->transaction_id); dr.transaction_id = GNUNET_htonll (deposit->transaction_id);
TALER_amount_hton (&dr.amount, TALER_amount_hton (&dr.amount_with_fee,
&deposit->amount); &deposit->amount_with_fee);
dr.coin_pub = deposit->coin.coin_pub; dr.coin_pub = deposit->coin.coin_pub;
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CRYPTO_ecdsa_verify (TALER_SIGNATURE_WALLET_DEPOSIT, GNUNET_CRYPTO_ecdsa_verify (TALER_SIGNATURE_WALLET_DEPOSIT,
@ -167,7 +167,7 @@ parse_and_handle_deposit_request (struct MHD_Connection *connection,
GNUNET_free (wire_enc); GNUNET_free (wire_enc);
deposit.wire = wire; deposit.wire = wire;
deposit.amount = *amount; deposit.amount_with_fee = *amount;
res = verify_and_execute_deposit (connection, res = verify_and_execute_deposit (connection,
&deposit); &deposit);
TALER_MINT_release_parsed_data (spec); TALER_MINT_release_parsed_data (spec);

View File

@ -109,8 +109,8 @@ handle_refresh_melt_binary (struct MHD_Connection *connection,
body.purpose.purpose = htonl (TALER_SIGNATURE_REFRESH_MELT_SESSION); body.purpose.purpose = htonl (TALER_SIGNATURE_REFRESH_MELT_SESSION);
body.purpose.size = htonl (sizeof (struct RefreshMeltSessionSignature)); body.purpose.size = htonl (sizeof (struct RefreshMeltSessionSignature));
body.melt_hash = melt_hash; body.melt_hash = melt_hash;
TALER_amount_hton (&body.amount, TALER_amount_hton (&body.amount_with_fee,
&coin_melt_details->melt_amount); &coin_melt_details->melt_amount_with_fee);
if (GNUNET_OK != GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_REFRESH_MELT_SESSION, if (GNUNET_OK != GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_REFRESH_MELT_SESSION,
&body.purpose, &body.purpose,
@ -252,7 +252,7 @@ get_coin_public_info (struct MHD_Connection *connection,
? GNUNET_NO : GNUNET_SYSERR; ? GNUNET_NO : GNUNET_SYSERR;
} }
r_melt_detail->melt_sig = melt_sig; r_melt_detail->melt_sig = melt_sig;
r_melt_detail->melt_amount = amount; r_melt_detail->melt_amount_with_fee = amount;
TALER_MINT_release_parsed_data (spec); TALER_MINT_release_parsed_data (spec);
return GNUNET_OK; return GNUNET_OK;
} }
@ -288,8 +288,8 @@ verify_coin_public_info (struct MHD_Connection *connection,
body.purpose.size = htonl (sizeof (struct RefreshMeltCoinSignature)); body.purpose.size = htonl (sizeof (struct RefreshMeltCoinSignature));
body.purpose.purpose = htonl (TALER_SIGNATURE_REFRESH_MELT_COIN); body.purpose.purpose = htonl (TALER_SIGNATURE_REFRESH_MELT_COIN);
body.melt_hash = *melt_hash; body.melt_hash = *melt_hash;
TALER_amount_hton (&body.amount, TALER_amount_hton (&body.amount_with_fee,
&r_melt_detail->melt_amount); &r_melt_detail->melt_amount_with_fee);
body.coin_pub = r_public_info->coin_pub; body.coin_pub = r_public_info->coin_pub;
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CRYPTO_ecdsa_verify (TALER_SIGNATURE_REFRESH_MELT_COIN, GNUNET_CRYPTO_ecdsa_verify (TALER_SIGNATURE_REFRESH_MELT_COIN,

View File

@ -299,7 +299,7 @@ TALER_MINT_reply_deposit_success (struct MHD_Connection *connection,
dc.h_contract = *h_contract; dc.h_contract = *h_contract;
dc.h_wire = *h_wire; dc.h_wire = *h_wire;
dc.transaction_id = GNUNET_htonll (transaction_id); dc.transaction_id = GNUNET_htonll (transaction_id);
TALER_amount_hton (&dc.amount, TALER_amount_hton (&dc.amount_with_fee,
amount); amount);
dc.coin_pub = *coin_pub; dc.coin_pub = *coin_pub;
dc.merchant = *merchant; dc.merchant = *merchant;
@ -341,14 +341,14 @@ compile_transaction_history (const struct TALER_MINT_DB_TransactionList *tl)
const struct Deposit *deposit = pos->details.deposit; const struct Deposit *deposit = pos->details.deposit;
type = "deposit"; type = "deposit";
value = deposit->amount; value = deposit->amount_with_fee;
dr.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_DEPOSIT); dr.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_DEPOSIT);
dr.purpose.size = htonl (sizeof (struct TALER_DepositRequest)); dr.purpose.size = htonl (sizeof (struct TALER_DepositRequest));
dr.h_contract = deposit->h_contract; dr.h_contract = deposit->h_contract;
dr.h_wire = deposit->h_wire; dr.h_wire = deposit->h_wire;
dr.transaction_id = GNUNET_htonll (deposit->transaction_id); dr.transaction_id = GNUNET_htonll (deposit->transaction_id);
TALER_amount_hton (&dr.amount, TALER_amount_hton (&dr.amount_with_fee,
&deposit->amount); &deposit->amount_with_fee);
dr.coin_pub = deposit->coin.coin_pub; dr.coin_pub = deposit->coin.coin_pub;
transaction = TALER_JSON_from_ecdsa_sig (&dr.purpose, transaction = TALER_JSON_from_ecdsa_sig (&dr.purpose,
&deposit->csig); &deposit->csig);
@ -360,12 +360,12 @@ compile_transaction_history (const struct TALER_MINT_DB_TransactionList *tl)
const struct RefreshMelt *melt = pos->details.melt; const struct RefreshMelt *melt = pos->details.melt;
type = "melt"; type = "melt";
value = melt->amount; value = melt->amount_with_fee;
ms.purpose.purpose = htonl (TALER_SIGNATURE_REFRESH_MELT_COIN); ms.purpose.purpose = htonl (TALER_SIGNATURE_REFRESH_MELT_COIN);
ms.purpose.size = htonl (sizeof (struct RefreshMeltCoinSignature)); ms.purpose.size = htonl (sizeof (struct RefreshMeltCoinSignature));
ms.melt_hash = melt->melt_hash; ms.melt_hash = melt->melt_hash;
TALER_amount_hton (&ms.amount, TALER_amount_hton (&ms.amount_with_fee,
&melt->amount); &melt->amount_with_fee);
ms.coin_pub = melt->coin.coin_pub; ms.coin_pub = melt->coin.coin_pub;
transaction = TALER_JSON_from_ecdsa_sig (&ms.purpose, transaction = TALER_JSON_from_ecdsa_sig (&ms.purpose,
&melt->coin_sig); &melt->coin_sig);

View File

@ -14,13 +14,13 @@
TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/> TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/>
*/ */
/** /**
* @file mint/mint_db.h * @file mint/taler_mintdb_plugin.h
* @brief Low-level (statement-level) database access for the mint * @brief Low-level (statement-level) database access for the mint
* @author Florian Dold * @author Florian Dold
* @author Christian Grothoff * @author Christian Grothoff
*/ */
#ifndef MINT_DB_H #ifndef TALER_MINTDB_PLUGIN_H
#define MINT_DB_H #define TALER_MINTDB_PLUGIN_H
#include <gnunet/gnunet_util_lib.h> #include <gnunet/gnunet_util_lib.h>
#include "taler_util.h" #include "taler_util.h"
@ -87,6 +87,9 @@ struct CollectableBlindcoin
/** /**
* Denomination key (which coin was generated). * Denomination key (which coin was generated).
* FIXME: we should probably instead have the
* AMOUNT *including* fee in what is being signed
* as well!
*/ */
struct GNUNET_CRYPTO_rsa_PublicKey *denom_pub; struct GNUNET_CRYPTO_rsa_PublicKey *denom_pub;
@ -217,10 +220,10 @@ struct Deposit
uint64_t transaction_id; uint64_t transaction_id;
/** /**
* Fraction of the coin's remaining value to be deposited. * Fraction of the coin's remaining value to be deposited, including
* The coin is identified by @e coin_pub. * depositing fee (if any). The coin is identified by @e coin_pub.
*/ */
struct TALER_Amount amount; struct TALER_Amount amount_with_fee;
}; };
@ -296,11 +299,14 @@ struct RefreshMelt
struct GNUNET_HashCode melt_hash; struct GNUNET_HashCode melt_hash;
/** /**
* How much value is being melted? * How much value is being melted? This amount includes the fees,
* This amount includes the fees, so the final amount contributed * so the final amount contributed to the melt is this value minus
* to the melt is this value minus the fee for melting the coin. * the fee for melting the coin. We include the fee in what is
* being signed so that we can verify a reserve's remaining total
* balance without needing to access the respective denomination key
* information each time.
*/ */
struct TALER_Amount amount; struct TALER_Amount amount_with_fee;
}; };
@ -397,7 +403,7 @@ struct Lock
const struct GNUNET_CRYPTO_EcdsaSignature coin_sig; const struct GNUNET_CRYPTO_EcdsaSignature coin_sig;
/** /**
* How much value is being melted? * How much value is being locked?
*/ */
struct TALER_Amount amount; struct TALER_Amount amount;

View File

@ -286,7 +286,7 @@ run (void *cls,
deposit.wire = wire; deposit.wire = wire;
deposit.transaction_id = deposit.transaction_id =
GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX); GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX);
deposit.amount = amount; deposit.amount_with_fee = amount;
FAILIF (GNUNET_OK != FAILIF (GNUNET_OK !=
plugin->insert_deposit (plugin->cls, plugin->insert_deposit (plugin->cls,
session, &deposit)); session, &deposit));

View File

@ -94,12 +94,12 @@ run (void *cls,
UINT64_MAX); UINT64_MAX);
deposit->transaction_id = GNUNET_htonll (transaction_id); deposit->transaction_id = GNUNET_htonll (transaction_id);
/* Random amount */ /* Random amount */
deposit->amount.value = deposit->amount_with_fee.value =
htonl (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, UINT32_MAX)); htonl (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, UINT32_MAX));
deposit->amount.fraction = deposit->amount_with_fee.fraction =
htonl (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, UINT32_MAX)); htonl (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, UINT32_MAX));
GNUNET_assert (strlen (MINT_CURRENCY) < sizeof (deposit->amount.currency)); GNUNET_assert (strlen (MINT_CURRENCY) < sizeof (deposit->amount_with_fee.currency));
strcpy (deposit->amount.currency, MINT_CURRENCY); strcpy (deposit->amount_with_fee.currency, MINT_CURRENCY);
/* Copy wireformat */ /* Copy wireformat */
deposit->wire = json_loads (wire, 0, NULL); deposit->wire = json_loads (wire, 0, NULL);
EXITIF (GNUNET_OK != EXITIF (GNUNET_OK !=