Browse Source

common: `withdraw_tx()` now use the array of `struct bitcoin_tx_output` as parameter

pull/2803/head
trueptolemy 5 years ago
committed by neil saitug
parent
commit
b660531216
  1. 2
      common/funding_tx.c
  2. 8
      common/utxo.c
  3. 3
      common/utxo.h
  4. 8
      common/withdraw_tx.c
  5. 7
      common/withdraw_tx.h
  6. 11
      hsmd/hsmd.c
  7. 13
      wallet/walletrpc.c

2
common/funding_tx.c

@ -26,7 +26,7 @@ struct bitcoin_tx *funding_tx(const tal_t *ctx,
struct bitcoin_tx *tx;
bool has_change = !amount_sat_eq(change, AMOUNT_SAT(0));
tx = tx_spending_utxos(ctx, chainparams, utxomap, bip32_base, has_change);
tx = tx_spending_utxos(ctx, chainparams, utxomap, bip32_base, has_change, 1);
wscript = bitcoin_redeem_2of2(tx, local_fundingkey, remote_fundingkey);

8
common/utxo.c

@ -1,3 +1,4 @@
#include <assert.h>
#include <bitcoin/script.h>
#include <common/key_derive.h>
#include <common/utils.h>
@ -52,11 +53,14 @@ struct bitcoin_tx *tx_spending_utxos(const tal_t *ctx,
const struct chainparams *chainparams,
const struct utxo **utxos,
const struct ext_key *bip32_base,
bool add_change_output)
bool add_change_output,
size_t num_output)
{
struct pubkey key;
u8 *script;
size_t outcount = add_change_output ? 2 : 1;
assert(num_output);
size_t outcount = add_change_output ? 1 + num_output : num_output;
struct bitcoin_tx *tx = bitcoin_tx(ctx, chainparams, tal_count(utxos), outcount);
for (size_t i = 0; i < tal_count(utxos); i++) {

3
common/utxo.h

@ -50,6 +50,7 @@ struct bitcoin_tx *tx_spending_utxos(const tal_t *ctx,
const struct chainparams *chainparams,
const struct utxo **utxos,
const struct ext_key *bip32_base,
bool add_change_output);
bool add_change_output,
size_t num_output);
#endif /* LIGHTNING_COMMON_UTXO_H */

8
common/withdraw_tx.c

@ -11,8 +11,7 @@
struct bitcoin_tx *withdraw_tx(const tal_t *ctx,
const struct chainparams *chainparams,
const struct utxo **utxos,
const u8 *destination,
struct amount_sat withdraw_amount,
struct bitcoin_tx_output **outputs,
const struct pubkey *changekey,
struct amount_sat change,
const struct ext_key *bip32_base,
@ -21,9 +20,10 @@ struct bitcoin_tx *withdraw_tx(const tal_t *ctx,
struct bitcoin_tx *tx;
tx = tx_spending_utxos(ctx, chainparams, utxos, bip32_base,
!amount_sat_eq(change, AMOUNT_SAT(0)));
!amount_sat_eq(change, AMOUNT_SAT(0)),
tal_count(outputs));
bitcoin_tx_add_output(tx, destination, withdraw_amount);
bitcoin_tx_add_multi_outputs(tx, outputs);
if (!amount_sat_eq(change, AMOUNT_SAT(0))) {
const void *map[2];

7
common/withdraw_tx.h

@ -2,6 +2,7 @@
#define LIGHTNING_COMMON_WITHDRAW_TX_H
#include "config.h"
#include <bitcoin/chainparams.h>
#include <bitcoin/tx.h>
#include <ccan/short_types/short_types.h>
#include <ccan/tal/tal.h>
#include <common/amount.h>
@ -19,8 +20,7 @@ struct utxo;
* @ctx: context to tal from.
* @chainparams: (in) the params for the created transaction.
* @utxos: (in/out) tal_arr of UTXO pointers to spend (permuted to match)
* @destination: (in) tal_arr of u8, scriptPubKey to send to.
* @amount: (in) satoshis to send to the destination
* @outputs: (in) tal_arr of bitcoin_tx_output, scriptPubKeys with amount to send to.
* @changekey: (in) key to send change to (only used if change_satoshis != 0).
* @change: (in) amount to send as change.
* @bip32_base: (in) bip32 base for key derivation, or NULL.
@ -29,8 +29,7 @@ struct utxo;
struct bitcoin_tx *withdraw_tx(const tal_t *ctx,
const struct chainparams *chainparams,
const struct utxo **utxos,
const u8 *destination,
struct amount_sat withdraw_amount,
struct bitcoin_tx_output **outputs,
const struct pubkey *changekey,
struct amount_sat change,
const struct ext_key *bip32_base,

11
hsmd/hsmd.c

@ -1515,7 +1515,9 @@ static struct io_plan *handle_sign_withdrawal_tx(struct io_conn *conn,
struct bitcoin_tx *tx;
struct pubkey changekey;
u8 *scriptpubkey;
struct bitcoin_tx_output **outputs;
outputs = tal_arr(tmpctx, struct bitcoin_tx_output *, 0);
if (!fromwire_hsm_sign_withdrawal(tmpctx, msg_in, &satoshi_out,
&change_out, &change_keyindex,
&scriptpubkey, &utxos))
@ -1525,9 +1527,14 @@ static struct io_plan *handle_sign_withdrawal_tx(struct io_conn *conn,
return bad_req_fmt(conn, c, msg_in,
"Failed to get key %u", change_keyindex);
struct bitcoin_tx_output *output = tal(outputs,
struct bitcoin_tx_output);
output->script = tal_steal(output, scriptpubkey);
output->amount = satoshi_out;
tal_arr_expand(&outputs, output);
tx = withdraw_tx(tmpctx, c->chainparams,
cast_const2(const struct utxo **, utxos), scriptpubkey,
satoshi_out, &changekey, change_out, NULL, NULL);
cast_const2(const struct utxo **, utxos), outputs,
&changekey, change_out, NULL, NULL);
sign_all_inputs(tx, utxos);

13
wallet/walletrpc.c

@ -1,6 +1,7 @@
#include <bitcoin/address.h>
#include <bitcoin/base58.h>
#include <bitcoin/script.h>
#include <ccan/cast/cast.h>
#include <ccan/tal/str/str.h>
#include <common/addr.h>
#include <common/bech32.h>
@ -163,10 +164,12 @@ static struct command_result *json_prepare_tx(struct command *cmd,
struct command_result *res;
u32 *minconf, maxheight;
struct pubkey *changekey;
struct bitcoin_tx_output **outputs;
*utx = tal(cmd, struct unreleased_tx);
(*utx)->wtx = tal(*utx, struct wallet_tx);
wtx_init(cmd, (*utx)->wtx, AMOUNT_SAT(-1ULL));
outputs = tal_arr(tmpctx, struct bitcoin_tx_output *, 0);
if (!param(cmd, buffer, params,
p_req("destination", param_bitcoin_address,
@ -201,8 +204,14 @@ static struct command_result *json_prepare_tx(struct command *cmd,
} else
changekey = NULL;
(*utx)->tx = withdraw_tx(*utx, get_chainparams(cmd->ld), (*utx)->wtx->utxos,
(*utx)->destination, (*utx)->wtx->amount,
struct bitcoin_tx_output *output = tal(outputs,
struct bitcoin_tx_output);
output->script = tal_dup_arr(output, u8, (*utx)->destination,
tal_count((*utx)->destination), 0);
output->amount = (*utx)->wtx->amount;
tal_arr_expand(&outputs, output);
(*utx)->tx = withdraw_tx(*utx, get_chainparams(cmd->ld),
(*utx)->wtx->utxos, outputs,
changekey, (*utx)->wtx->change,
cmd->ld->wallet->bip32_base,
&(*utx)->change_outnum);

Loading…
Cancel
Save