Browse Source
add the missing psbt helpers for adding and removing an input and outputnifty/pset-pre
niftynei
5 years ago
committed by
Rusty Russell
4 changed files with 118 additions and 0 deletions
@ -0,0 +1,90 @@ |
|||||
|
#include <assert.h> |
||||
|
#include <bitcoin/psbt.h> |
||||
|
#include <ccan/tal/tal.h> |
||||
|
#include <string.h> |
||||
|
#include <wally_psbt.h> |
||||
|
#include <wally_transaction.h> |
||||
|
|
||||
|
#define MAKE_ROOM(arr, pos, num) \ |
||||
|
memmove((arr) + (pos) + 1, (arr) + (pos), \ |
||||
|
sizeof(*(arr)) * ((num) - ((pos) + 1))) |
||||
|
|
||||
|
#define REMOVE_ELEM(arr, pos, num) \ |
||||
|
memmove((arr) + (pos), (arr) + (pos) + 1, \ |
||||
|
sizeof(*(arr)) * ((num) - ((pos) + 1))) |
||||
|
|
||||
|
struct wally_psbt_input *psbt_add_input(struct wally_psbt *psbt, |
||||
|
struct wally_tx_input *input, |
||||
|
size_t insert_at) |
||||
|
{ |
||||
|
struct wally_tx *tx; |
||||
|
struct wally_tx_input tmp_in; |
||||
|
|
||||
|
tx = psbt->tx; |
||||
|
assert(insert_at <= tx->num_inputs); |
||||
|
wally_tx_add_input(tx, input); |
||||
|
tmp_in = tx->inputs[tx->num_inputs - 1]; |
||||
|
MAKE_ROOM(tx->inputs, insert_at, tx->num_inputs); |
||||
|
tx->inputs[insert_at] = tmp_in; |
||||
|
|
||||
|
if (psbt->inputs_allocation_len < tx->num_inputs) { |
||||
|
struct wally_psbt_input *p = tal_arr(psbt, struct wally_psbt_input, tx->num_inputs); |
||||
|
memcpy(p, psbt->inputs, sizeof(*psbt->inputs) * psbt->inputs_allocation_len); |
||||
|
tal_free(psbt->inputs); |
||||
|
|
||||
|
psbt->inputs = p; |
||||
|
psbt->inputs_allocation_len = tx->num_inputs; |
||||
|
} |
||||
|
|
||||
|
psbt->num_inputs += 1; |
||||
|
MAKE_ROOM(psbt->inputs, insert_at, psbt->num_inputs); |
||||
|
memset(&psbt->inputs[insert_at], 0, sizeof(psbt->inputs[insert_at])); |
||||
|
return &psbt->inputs[insert_at]; |
||||
|
} |
||||
|
|
||||
|
void psbt_rm_input(struct wally_psbt *psbt, |
||||
|
size_t remove_at) |
||||
|
{ |
||||
|
assert(remove_at < psbt->tx->num_inputs); |
||||
|
wally_tx_remove_input(psbt->tx, remove_at); |
||||
|
REMOVE_ELEM(psbt->inputs, remove_at, psbt->num_inputs); |
||||
|
psbt->num_inputs -= 1; |
||||
|
} |
||||
|
|
||||
|
struct wally_psbt_output *psbt_add_output(struct wally_psbt *psbt, |
||||
|
struct wally_tx_output *output, |
||||
|
size_t insert_at) |
||||
|
{ |
||||
|
struct wally_tx *tx; |
||||
|
struct wally_tx_output tmp_out; |
||||
|
|
||||
|
tx = psbt->tx; |
||||
|
assert(insert_at <= tx->num_outputs); |
||||
|
wally_tx_add_output(tx, output); |
||||
|
tmp_out = tx->outputs[tx->num_outputs - 1]; |
||||
|
MAKE_ROOM(tx->outputs, insert_at, tx->num_outputs); |
||||
|
tx->outputs[insert_at] = tmp_out; |
||||
|
|
||||
|
if (psbt->outputs_allocation_len < tx->num_outputs) { |
||||
|
struct wally_psbt_output *p = tal_arr(psbt, struct wally_psbt_output, tx->num_outputs); |
||||
|
memcpy(p, psbt->outputs, sizeof(*psbt->outputs) * psbt->outputs_allocation_len); |
||||
|
tal_free(psbt->outputs); |
||||
|
|
||||
|
psbt->outputs = p; |
||||
|
psbt->outputs_allocation_len = tx->num_outputs; |
||||
|
} |
||||
|
|
||||
|
psbt->num_outputs += 1; |
||||
|
MAKE_ROOM(psbt->outputs, insert_at, psbt->num_outputs); |
||||
|
memset(&psbt->outputs[insert_at], 0, sizeof(psbt->outputs[insert_at])); |
||||
|
return &psbt->outputs[insert_at]; |
||||
|
} |
||||
|
|
||||
|
void psbt_rm_output(struct wally_psbt *psbt, |
||||
|
size_t remove_at) |
||||
|
{ |
||||
|
assert(remove_at < psbt->tx->num_outputs); |
||||
|
wally_tx_remove_output(psbt->tx, remove_at); |
||||
|
REMOVE_ELEM(psbt->outputs, remove_at, psbt->num_outputs); |
||||
|
psbt->num_outputs -= 1; |
||||
|
} |
@ -0,0 +1,25 @@ |
|||||
|
#ifndef LIGHTNING_BITCOIN_PSBT_H |
||||
|
#define LIGHTNING_BITCOIN_PSBT_H |
||||
|
#include "config.h" |
||||
|
#include <stddef.h> |
||||
|
|
||||
|
struct wally_tx_input; |
||||
|
struct wally_tx_output; |
||||
|
struct wally_psbt; |
||||
|
struct wally_psbt_input; |
||||
|
|
||||
|
struct wally_psbt_input *psbt_add_input(struct wally_psbt *psbt, |
||||
|
struct wally_tx_input *input, |
||||
|
size_t insert_at); |
||||
|
|
||||
|
void psbt_rm_input(struct wally_psbt *psbt, |
||||
|
size_t remove_at); |
||||
|
|
||||
|
struct wally_psbt_output *psbt_add_output(struct wally_psbt *psbt, |
||||
|
struct wally_tx_output *output, |
||||
|
size_t insert_at); |
||||
|
|
||||
|
void psbt_rm_output(struct wally_psbt *psbt, |
||||
|
size_t remove_at); |
||||
|
|
||||
|
#endif /* LIGHTNING_BITCOIN_PSBT_H */ |
Loading…
Reference in new issue