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