diff --git a/bitcoin/tx.c b/bitcoin/tx.c index 23bd5ea67..153d97991 100644 --- a/bitcoin/tx.c +++ b/bitcoin/tx.c @@ -93,6 +93,27 @@ void bitcoin_tx_output_set_amount(struct bitcoin_tx *tx, int outnum, tx->wtx->outputs[outnum].satoshi = amount->satoshis; /* Raw: low-level helper */ } +const u8 *bitcoin_tx_output_get_script(const tal_t *ctx, + const struct bitcoin_tx *tx, int outnum) +{ + const struct wally_tx_output *output; + u8 *res; + assert(outnum < tx->wtx->num_outputs); + output = &tx->wtx->outputs[outnum]; + res = tal_arr(ctx, u8, output->script_len); + memcpy(res, output->script, output->script_len); + return res; +} + +struct amount_sat bitcoin_tx_output_get_amount(const struct bitcoin_tx *tx, + int outnum) +{ + struct amount_sat amount; + assert(outnum < tx->wtx->num_outputs); + amount.satoshis = tx->wtx->outputs[outnum].satoshi; /* Raw: helper */ + return amount; +} + void bitcoin_tx_input_set_witness(struct bitcoin_tx *tx, int innum, u8 **witness) { @@ -120,6 +141,29 @@ void bitcoin_tx_input_set_script(struct bitcoin_tx *tx, int innum, u8 *script) wally_tx_set_input_script(tx->wtx, innum, script, tal_bytelen(script)); } +const u8 *bitcoin_tx_input_get_witness(const tal_t *ctx, + const struct bitcoin_tx *tx, int innum, + int witnum) +{ + const u8 *witness_item; + struct wally_tx_witness_item *item; + assert(innum < tx->wtx->num_inputs); + assert(witnum < tx->wtx->inputs[innum].witness->num_items); + item = &tx->wtx->inputs[innum].witness->items[witnum]; + witness_item = + tal_dup_arr(ctx, u8, item->witness, item->witness_len, 0); + return witness_item; +} + +void bitcoin_tx_input_get_txid(const struct bitcoin_tx *tx, int innum, + struct bitcoin_txid *out) +{ + assert(innum < tx->wtx->num_inputs); + assert(sizeof(struct bitcoin_txid) == + sizeof(tx->wtx->inputs[innum].txhash)); + memcpy(out, tx->wtx->inputs[innum].txhash, sizeof(struct bitcoin_txid)); +} + /* BIP 141: * It is followed by stack items, with each item starts with a var_int * to indicate the length. */ diff --git a/bitcoin/tx.h b/bitcoin/tx.h index be27c31e4..01fb5fecb 100644 --- a/bitcoin/tx.h +++ b/bitcoin/tx.h @@ -95,6 +95,22 @@ int bitcoin_tx_add_input(struct bitcoin_tx *tx, const struct bitcoin_txid *txid, void bitcoin_tx_output_set_amount(struct bitcoin_tx *tx, int outnum, struct amount_sat *amount); +/** + * Helper to get the script of a script's output as a tal_arr + * + * Internally we use a `wally_tx` to represent the transaction. The script + * attached to a `wally_tx_output` is not a `tal_arr`, so in order to keep the + * comfort of being able to call `tal_bytelen` and similar on a script we just + * return a `tal_arr` clone of the original script. + */ +const u8 *bitcoin_tx_output_get_script(const tal_t *ctx, const struct bitcoin_tx *tx, int outnum); + +/** + * Helper to just get an amount_sat for the output amount. + */ +struct amount_sat bitcoin_tx_output_get_amount(const struct bitcoin_tx *tx, + int outnum); + /** * Set the input witness. * @@ -109,6 +125,19 @@ void bitcoin_tx_input_set_witness(struct bitcoin_tx *tx, int innum, */ void bitcoin_tx_input_set_script(struct bitcoin_tx *tx, int innum, u8 *script); +/** + * Helper to get a witness as a tal_arr array. + */ +const u8 *bitcoin_tx_input_get_witness(const tal_t *ctx, + const struct bitcoin_tx *tx, int innum, + int witnum); + +/** + * Wrap the raw txhash in the wally_tx_input into a bitcoin_txid + */ +void bitcoin_tx_input_get_txid(const struct bitcoin_tx *tx, int innum, + struct bitcoin_txid *out); + /** * Check a transaction for consistency. *