#include "funding_tx.h" #include #include #include #include #include #include #include #ifndef SUPERVERBOSE #define SUPERVERBOSE(...) #endif struct bitcoin_tx *funding_tx(const tal_t *ctx, const struct chainparams *chainparams, u16 *outnum, const struct utxo **utxomap, struct amount_sat funding, const struct pubkey *local_fundingkey, const struct pubkey *remote_fundingkey, struct amount_sat change, const struct pubkey *changekey, const struct ext_key *bip32_base) { u8 *wscript; struct bitcoin_tx *tx; bool has_change = !amount_sat_eq(change, AMOUNT_SAT(0)); tx = tx_spending_utxos(ctx, chainparams, utxomap, bip32_base, has_change, 1, 0, BITCOIN_TX_DEFAULT_SEQUENCE); wscript = bitcoin_redeem_2of2(tx, local_fundingkey, remote_fundingkey); SUPERVERBOSE("# funding witness script = %s\n", tal_hex(wscript, wscript)); bitcoin_tx_add_output(tx, scriptpubkey_p2wsh(tx, wscript), wscript, funding); tal_free(wscript); if (has_change) { const void *map[2]; map[0] = int2ptr(0); map[1] = int2ptr(1); bitcoin_tx_add_output(tx, scriptpubkey_p2wpkh(tx, changekey), NULL, change); permute_outputs(tx, NULL, map); *outnum = (map[0] == int2ptr(0) ? 0 : 1); } else { *outnum = 0; } permute_inputs(tx, (const void **)utxomap); bitcoin_tx_finalize(tx); assert(bitcoin_tx_check(tx)); return tx; }