diff --git a/bitcoin/tx.c b/bitcoin/tx.c index 318a2ec94..76d47b173 100644 --- a/bitcoin/tx.c +++ b/bitcoin/tx.c @@ -457,7 +457,18 @@ size_t wally_tx_weight(const struct wally_tx *wtx) size_t bitcoin_tx_weight(const struct bitcoin_tx *tx) { - return wally_tx_weight(tx->wtx); + size_t extra; + size_t num_witnesses; + + /* If we don't have witnesses *yet*, libwally doesn't encode + * in BIP 141 style, omitting the flag and marker bytes */ + wally_tx_get_witness_count(tx->wtx, &num_witnesses); + if (num_witnesses == 0) + extra = 2; + else + extra = 0; + + return extra + wally_tx_weight(tx->wtx); } void wally_txid(const struct wally_tx *wtx, struct bitcoin_txid *txid) diff --git a/bitcoin/tx.h b/bitcoin/tx.h index 85bb38444..5bccaf7b6 100644 --- a/bitcoin/tx.h +++ b/bitcoin/tx.h @@ -57,7 +57,7 @@ void wally_txid(const struct wally_tx *wtx, struct bitcoin_txid *txid); u8 *linearize_tx(const tal_t *ctx, const struct bitcoin_tx *tx); u8 *linearize_wtx(const tal_t *ctx, const struct wally_tx *wtx); -/* Get weight of tx in Sipa. */ +/* Get weight of tx in Sipa; assumes it will have witnesses! */ size_t bitcoin_tx_weight(const struct bitcoin_tx *tx); size_t wally_tx_weight(const struct wally_tx *wtx);