Browse Source

wallet: use amount_msat / amount_sat.

We change struct utxo to use amount_sat, and paper over the JSON APIs.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
confirmed-only
Rusty Russell 6 years ago
parent
commit
b5dcb93e5f
  1. 13
      common/test/run-funding_tx.c
  2. 6
      common/utxo.c
  3. 3
      common/utxo.h
  4. 9
      lightningd/invoice.c
  5. 2
      lightningd/onchain_control.c
  6. 6
      lightningd/opening_control.c
  7. 5
      lightningd/peer_control.c
  8. 7
      plugins/pay.c
  9. 2
      wallet/test/run-wallet.c
  10. 10
      wallet/wallet.c
  11. 14
      wallet/walletrpc.c

13
common/test/run-funding_tx.c

@ -17,6 +17,9 @@
#include "../utxo.c"
/* AUTOGENERATED MOCKS START */
/* Generated stub for fromwire_amount_sat */
struct amount_sat fromwire_amount_sat(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
{ fprintf(stderr, "fromwire_amount_sat called!\n"); abort(); }
/* Generated stub for fromwire_bitcoin_txid */
void fromwire_bitcoin_txid(const u8 **cursor UNNEEDED, size_t *max UNNEEDED,
struct bitcoin_txid *txid UNNEEDED)
@ -33,6 +36,9 @@ u32 fromwire_u32(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
/* Generated stub for fromwire_u64 */
u64 fromwire_u64(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
{ fprintf(stderr, "fromwire_u64 called!\n"); abort(); }
/* Generated stub for towire_amount_sat */
void towire_amount_sat(u8 **pptr UNNEEDED, const struct amount_sat sat UNNEEDED)
{ fprintf(stderr, "towire_amount_sat called!\n"); abort(); }
/* Generated stub for towire_bitcoin_txid */
void towire_bitcoin_txid(u8 **pptr UNNEEDED, const struct bitcoin_txid *txid UNNEEDED)
{ fprintf(stderr, "towire_bitcoin_txid called!\n"); abort(); }
@ -136,7 +142,7 @@ int main(void)
bitcoin_txid(input, &utxo.txid);
utxo.outnum = 0;
utxo.amount = 5000000000;
utxo.amount = AMOUNT_SAT(5000000000);
utxo.is_p2sh = false;
utxo.close_info = NULL;
funding_satoshis = 10000000;
@ -145,7 +151,8 @@ int main(void)
printf("input[0] txid: %s\n",
tal_hexstr(tmpctx, &utxo.txid, sizeof(utxo.txid)));
printf("input[0] input: %u\n", utxo.outnum);
printf("input[0] satoshis: %"PRIu64"\n", utxo.amount);
printf("input[0] satoshis: %s\n",
type_to_string(tmpctx, struct amount_sat, &utxo.amount));
printf("funding satoshis: %"PRIu64"\n", funding_satoshis);
utxomap = tal_arr(tmpctx, const struct utxo *, 1);
@ -154,7 +161,7 @@ int main(void)
funding_satoshis,
&local_funding_pubkey,
&remote_funding_pubkey,
utxo.amount - fee - funding_satoshis,
utxo.amount.satoshis - fee - funding_satoshis,
&inputkey, NULL);
printf("# fee: %"PRIu64"\n", fee);
printf("change satoshis: %"PRIu64"\n",

6
common/utxo.c

@ -10,7 +10,7 @@ void towire_utxo(u8 **pptr, const struct utxo *utxo)
bool is_unilateral_close = utxo->close_info != NULL;
towire_bitcoin_txid(pptr, &utxo->txid);
towire_u32(pptr, utxo->outnum);
towire_u64(pptr, utxo->amount);
towire_amount_sat(pptr, utxo->amount);
towire_u32(pptr, utxo->keyindex);
towire_bool(pptr, utxo->is_p2sh);
@ -28,7 +28,7 @@ struct utxo *fromwire_utxo(const tal_t *ctx, const u8 **ptr, size_t *max)
fromwire_bitcoin_txid(ptr, max, &utxo->txid);
utxo->outnum = fromwire_u32(ptr, max);
utxo->amount = fromwire_u64(ptr, max);
utxo->amount = fromwire_amount_sat(ptr, max);
utxo->keyindex = fromwire_u32(ptr, max);
utxo->is_p2sh = fromwire_bool(ptr, max);
if (fromwire_bool(ptr, max)) {
@ -53,7 +53,7 @@ struct bitcoin_tx *tx_spending_utxos(const tal_t *ctx,
for (size_t i = 0; i < tal_count(utxos); i++) {
tx->input[i].txid = utxos[i]->txid;
tx->input[i].index = utxos[i]->outnum;
tx->input[i].amount = tal_dup(tx, u64, &utxos[i]->amount);
tx->input[i].amount = tal_dup(tx, u64, &utxos[i]->amount.satoshis);
if (utxos[i]->is_p2sh && bip32_base) {
struct pubkey key;
bip32_pubkey(bip32_base, &key, utxos[i]->keyindex);

3
common/utxo.h

@ -6,6 +6,7 @@
#include <bitcoin/tx.h>
#include <ccan/short_types/short_types.h>
#include <ccan/tal/tal.h>
#include <common/amount.h>
#include <stdbool.h>
struct ext_key;
@ -20,7 +21,7 @@ struct unilateral_close_info {
struct utxo {
struct bitcoin_txid txid;
u32 outnum;
u64 amount;
struct amount_sat amount;
u32 keyindex;
bool is_p2sh;
u8 status;

9
lightningd/invoice.c

@ -47,12 +47,15 @@ static void json_add_invoice(struct json_stream *response,
json_add_string(response, "bolt11", inv->bolt11);
json_add_hex(response, "payment_hash", &inv->rhash, sizeof(inv->rhash));
if (inv->msatoshi)
json_add_u64(response, "msatoshi", *inv->msatoshi);
json_add_amount_msat(response,
(struct amount_msat){*inv->msatoshi},
"msatoshi", "amount_msat");
json_add_string(response, "status", invoice_status_str(inv));
if (inv->state == PAID) {
json_add_u64(response, "pay_index", inv->pay_index);
json_add_u64(response, "msatoshi_received",
inv->msatoshi_received);
json_add_amount_msat(response,
(struct amount_msat){inv->msatoshi_received},
"msatoshi_received", "amount_received_msat");
json_add_u64(response, "paid_at", inv->paid_timestamp);
}

2
lightningd/onchain_control.c

@ -275,7 +275,7 @@ static void onchain_add_utxo(struct channel *channel, const u8 *msg)
if (!fromwire_onchain_add_utxo(msg, &u->txid, &u->outnum,
&u->close_info->commitment_point,
&u->amount, &blockheight)) {
&u->amount.satoshis, &blockheight)) {
fatal("onchaind gave invalid add_utxo message: %s", tal_hex(msg, msg));
}
u->blockheight = blockheight>0?&blockheight:NULL;

6
lightningd/opening_control.c

@ -334,8 +334,10 @@ static void opening_funder_finished(struct subd *openingd, const u8 *resp,
tal_count(fundingtx->output));
for (size_t i = 0; i < tal_count(fundingtx->input); i++) {
log_debug(fc->uc->log, "%zi: %"PRIu64" satoshi (%s) %s\n",
i, fc->wtx.utxos[i]->amount,
log_debug(fc->uc->log, "%zi: %s (%s) %s\n",
i,
type_to_string(tmpctx, struct amount_sat,
&fc->wtx.utxos[i]->amount),
fc->wtx.utxos[i]->is_p2sh ? "P2SH" : "SEGWIT",
type_to_string(tmpctx, struct bitcoin_txid,
&fundingtx->input[i].txid));

5
lightningd/peer_control.c

@ -1270,8 +1270,9 @@ static struct command_result *json_getinfo(struct command *cmd,
json_add_string(response, "version", version());
json_add_num(response, "blockheight", get_block_height(cmd->ld->topology));
json_add_string(response, "network", get_chainparams(cmd->ld)->network_name);
json_add_u64(response, "msatoshi_fees_collected",
wallet_total_forward_fees(cmd->ld->wallet));
json_add_amount_msat(response,
(struct amount_msat){ wallet_total_forward_fees(cmd->ld->wallet) },
"msatoshi_fees_collected", "fees_collected_msat");
json_object_end(response);
return command_success(cmd, response);
}

7
plugins/pay.c

@ -634,10 +634,11 @@ static struct command_result *add_shadow_route(struct command *cmd,
u32 cltv, best_cltv;
json_for_each_arr(i, chan, channels) {
u64 sats, v;
struct amount_sat sats;
u64 v;
json_to_u64(buf, json_get_member(buf, chan, "satoshis"), &sats);
if (sats * 1000 < pc->msatoshi)
json_to_sat(buf, json_get_member(buf, chan, "satoshis"), &sats);
if (sats.satoshis * 1000 < pc->msatoshi)
continue;
/* Don't use if total would exceed 1/4 of our time allowance. */

2
wallet/test/run-wallet.c

@ -680,7 +680,7 @@ static bool test_wallet_outputs(struct lightningd *ld, const tal_t *ctx)
CHECK(w);
memset(&u, 0, sizeof(u));
u.amount = 1;
u.amount = AMOUNT_SAT(1);
pubkey_from_der(tal_hexdata(w, "02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc", 66), 33, &pk);
db_begin_transaction(w->db);

10
wallet/wallet.c

@ -78,7 +78,7 @@ bool wallet_add_utxo(struct wallet *w, struct utxo *utxo,
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
sqlite3_bind_blob(stmt, 1, &utxo->txid, sizeof(utxo->txid), SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 2, utxo->outnum);
sqlite3_bind_int64(stmt, 3, utxo->amount);
sqlite3_bind_amount_sat(stmt, 3, utxo->amount);
sqlite3_bind_int(stmt, 4, wallet_output_type_in_db(type));
sqlite3_bind_int(stmt, 5, output_state_available);
sqlite3_bind_int(stmt, 6, utxo->keyindex);
@ -116,7 +116,7 @@ static struct utxo *wallet_stmt2output(const tal_t *ctx, sqlite3_stmt *stmt)
u32 *blockheight, *spendheight;
sqlite3_column_sha256_double(stmt, 0, &utxo->txid.shad);
utxo->outnum = sqlite3_column_int(stmt, 1);
utxo->amount = sqlite3_column_int64(stmt, 2);
utxo->amount = sqlite3_column_amount_sat(stmt, 2);
utxo->is_p2sh = sqlite3_column_int(stmt, 3) == p2sh_wpkh;
utxo->status = sqlite3_column_int(stmt, 4);
utxo->keyindex = sqlite3_column_int(stmt, 5);
@ -305,7 +305,7 @@ static const struct utxo **wallet_select(const tal_t *ctx, struct wallet *w,
weight += input_weight;
*fee_estimate = weight * feerate_per_kw / 1000;
*satoshi_in += utxos[i]->amount;
*satoshi_in += utxos[i]->amount.satoshis;
if (*satoshi_in >= *fee_estimate + value)
break;
}
@ -1123,7 +1123,7 @@ int wallet_extract_owned_outputs(struct wallet *w, const struct bitcoin_tx *tx,
utxo = tal(w, struct utxo);
utxo->keyindex = index;
utxo->is_p2sh = is_p2sh;
utxo->amount = tx->output[output].amount;
utxo->amount.satoshis = tx->output[output].amount;
utxo->status = output_state_available;
bitcoin_txid(tx, &utxo->txid);
utxo->outnum = output;
@ -1151,7 +1151,7 @@ int wallet_extract_owned_outputs(struct wallet *w, const struct bitcoin_tx *tx,
}
outpointfilter_add(w->owned_outpoints, &utxo->txid, utxo->outnum);
*total_satoshi += utxo->amount;
*total_satoshi += utxo->amount.satoshis;
tal_free(utxo);
num_utxos++;
}

14
wallet/walletrpc.c

@ -422,7 +422,8 @@ static struct command_result *json_listfunds(struct command *cmd,
json_object_start(response, NULL);
json_add_txid(response, "txid", &utxos[i]->txid);
json_add_num(response, "output", utxos[i]->outnum);
json_add_u64(response, "value", utxos[i]->amount);
json_add_amount_sat(response, utxos[i]->amount,
"value", "amount_msat");
/* @close_info is for outputs that are not yet claimable */
if (utxos[i]->close_info == NULL) {
@ -461,11 +462,12 @@ static struct command_result *json_listfunds(struct command *cmd,
"short_channel_id",
c->scid);
/* Poor man's rounding to satoshis to match the unit for outputs */
json_add_u64(response, "channel_sat",
(c->our_msatoshi + 500)/1000);
json_add_u64(response, "channel_total_sat",
c->funding_satoshi);
json_add_amount_sat(response,
amount_msat_to_sat_round_down((struct amount_msat){c->our_msatoshi}),
"channel_sat", "our_amount_msat");
json_add_amount_sat(response,
(struct amount_sat){c->funding_satoshi},
"channel_total_sat", "amount_msat");
json_add_txid(response, "funding_txid",
&c->funding_txid);
json_object_end(response);

Loading…
Cancel
Save