mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-12-29 01:55:45 +01:00
2d5c61dfc1
add the missing psbt helpers for adding and removing an input and output
91 lines
2.7 KiB
C
91 lines
2.7 KiB
C
#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;
|
|
}
|