#include "common/psbt_internal.h" #include #include #include #include #include #if EXPERIMENTAL_FEATURES static void psbt_input_set_final_witness_stack(const tal_t *ctx, struct wally_psbt_input *in, const struct witness_element **elements) { tal_wally_start(); wally_tx_witness_stack_init_alloc(tal_count(elements), &in->final_witness); for (size_t i = 0; i < tal_count(elements); i++) wally_tx_witness_stack_add(in->final_witness, elements[i]->witness, tal_bytelen(elements[i]->witness)); tal_wally_end(ctx); } void psbt_finalize_input(const tal_t *ctx, struct wally_psbt_input *in, const struct witness_element **elements) { psbt_input_set_final_witness_stack(ctx, in, elements); /* There's this horrible edgecase where we set the final_witnesses * directly onto the PSBT, but the input is a P2SH-wrapped input * (which has redeemscripts that belong in the scriptsig). Because * of how the internal libwally stuff works calling 'finalize' * on these just .. ignores it!? Murder. Anyway, here we do a final * scriptsig check -- if there's a redeemscript field still around we * just go ahead and mush it into the final_scriptsig field. */ if (in->redeem_script) { u8 *redeemscript = tal_dup_arr(NULL, u8, in->redeem_script, in->redeem_script_len, 0); in->final_scriptsig = bitcoin_scriptsig_redeem(NULL, take(redeemscript)); in->final_scriptsig_len = tal_bytelen(in->final_scriptsig); in->redeem_script = tal_free(in->redeem_script); in->redeem_script_len = 0; } } 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; u64 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; } #endif /* EXPERIMENTAL_FEATURES */