From b6605312169eb9f72ed3376283b45d36154e251c Mon Sep 17 00:00:00 2001 From: trueptolemy Date: Tue, 13 Aug 2019 03:29:13 +0800 Subject: [PATCH] common: `withdraw_tx()` now use the array of `struct bitcoin_tx_output` as parameter --- common/funding_tx.c | 2 +- common/utxo.c | 8 ++++++-- common/utxo.h | 3 ++- common/withdraw_tx.c | 8 ++++---- common/withdraw_tx.h | 7 +++---- hsmd/hsmd.c | 11 +++++++++-- wallet/walletrpc.c | 13 +++++++++++-- 7 files changed, 36 insertions(+), 16 deletions(-) diff --git a/common/funding_tx.c b/common/funding_tx.c index bcb93142b..5f7426e96 100644 --- a/common/funding_tx.c +++ b/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); diff --git a/common/utxo.c b/common/utxo.c index 19ea4d74a..41f286a28 100644 --- a/common/utxo.c +++ b/common/utxo.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -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++) { diff --git a/common/utxo.h b/common/utxo.h index 67dad1ba1..32ce97414 100644 --- a/common/utxo.h +++ b/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 */ diff --git a/common/withdraw_tx.c b/common/withdraw_tx.c index 98de861f8..2f6c52af4 100644 --- a/common/withdraw_tx.c +++ b/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]; diff --git a/common/withdraw_tx.h b/common/withdraw_tx.h index 5121ae82b..71e218589 100644 --- a/common/withdraw_tx.h +++ b/common/withdraw_tx.h @@ -2,6 +2,7 @@ #define LIGHTNING_COMMON_WITHDRAW_TX_H #include "config.h" #include +#include #include #include #include @@ -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, diff --git a/hsmd/hsmd.c b/hsmd/hsmd.c index 53f06b41a..402f4e814 100644 --- a/hsmd/hsmd.c +++ b/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); diff --git a/wallet/walletrpc.c b/wallet/walletrpc.c index e7bbf4718..e2c4e3598 100644 --- a/wallet/walletrpc.c +++ b/wallet/walletrpc.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -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);