diff --git a/common/psbt_open.c b/common/psbt_open.c index a83a8916e..3dc7942b9 100644 --- a/common/psbt_open.c +++ b/common/psbt_open.c @@ -483,3 +483,57 @@ void psbt_input_set_final_witness_stack(struct wally_psbt_input *in, elements[i]->witness, tal_bytelen(elements[i]->witness)); } + +const struct witness_stack ** +psbt_to_witness_stacks(const tal_t *ctx, + const struct wally_psbt *psbt, + enum tx_role side_to_stack) +{ + size_t stack_index; + u16 serial_id; + const struct witness_stack **stacks + = tal_arr(ctx, const struct witness_stack *, psbt->num_inputs); + + stack_index = 0; + for (size_t i = 0; i < psbt->num_inputs; i++) { + if (!psbt_get_serial_id(&psbt->inputs[i].unknowns, + &serial_id)) + /* FIXME: throw an error ? */ + return NULL; + + /* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2: + * - if is the `initiator`: + * - MUST send even `serial_id`s + */ + if (serial_id % 2 == side_to_stack) { + struct wally_tx_witness_stack *wtx_s = + psbt->inputs[i].final_witness; + struct witness_stack *stack = + tal(stacks, struct witness_stack); + /* Convert the wally_tx_witness_stack to + * a witness_stack entry */ + stack->witness_element = + tal_arr(stack, struct witness_element *, + wtx_s->num_items); + for (size_t j = 0; j < tal_count(stack->witness_element); j++) { + stack->witness_element[j] = tal(stack, + struct witness_element); + stack->witness_element[j]->witness = + tal_dup_arr(stack, u8, + wtx_s->items[j].witness, + wtx_s->items[j].witness_len, + 0); + + } + + stacks[stack_index++] = stack; + } + + } + + if (stack_index == 0) + return tal_free(stacks); + + tal_resize(&stacks, stack_index); + return stacks; +} diff --git a/common/psbt_open.h b/common/psbt_open.h index 6507e62c3..c97585985 100644 --- a/common/psbt_open.h +++ b/common/psbt_open.h @@ -3,6 +3,7 @@ #include "config.h" #include #include +#include #include #include #include @@ -148,4 +149,16 @@ bool psbt_has_required_fields(struct wally_psbt *psbt); */ void psbt_input_set_final_witness_stack(struct wally_psbt_input *in, const struct witness_element **elements); + +/* psbt_to_witness_stacks - Take all sigs on a PSBT and copy to a + * witness_stack + * + * @ctx - allocation context + * @psbt - PSBT to copy sigs from + * @opener - which side initiated this tx + */ +const struct witness_stack ** +psbt_to_witness_stacks(const tal_t *ctx, + const struct wally_psbt *psbt, + enum tx_role side_to_stack); #endif /* LIGHTNING_COMMON_PSBT_OPEN_H */