//! let secp_ctx = Secp256k1::new();
//! let keys = KeyPair::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32])?);
//! let pubkey = PublicKey::from(keys);
-//! let wpubkey_hash = bitcoin::util::key::PublicKey::new(pubkey).wpubkey_hash().unwrap();
+//! let wpubkey_hash = bitcoin::key::PublicKey::new(pubkey).wpubkey_hash().unwrap();
//! let mut buffer = Vec::new();
//!
//! // Invoice for the "offer to be paid" flow.
//! # let secp_ctx = Secp256k1::new();
//! # let keys = KeyPair::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32])?);
//! # let pubkey = PublicKey::from(keys);
-//! # let wpubkey_hash = bitcoin::util::key::PublicKey::new(pubkey).wpubkey_hash().unwrap();
+//! # let wpubkey_hash = bitcoin::key::PublicKey::new(pubkey).wpubkey_hash().unwrap();
//! # let mut buffer = Vec::new();
//!
//! // Invoice for the "offer for money" flow.
use bitcoin::network::constants::Network;
use bitcoin::secp256k1::{KeyPair, PublicKey, Secp256k1, self};
use bitcoin::secp256k1::schnorr::Signature;
-use bitcoin::util::address::{Address, Payload, WitnessVersion};
-use bitcoin::util::schnorr::TweakedPublicKey;
+use bitcoin::address::{Address, Payload, WitnessProgram, WitnessVersion};
+use bitcoin::key::TweakedPublicKey;
use core::convert::{AsRef, Infallible, TryFrom};
use core::time::Duration;
use crate::io;
pub fn fallback_v0_p2wsh(mut self, script_hash: &WScriptHash) -> Self {
let address = FallbackAddress {
version: WitnessVersion::V0.to_num(),
- program: Vec::from(&script_hash.into_inner()[..]),
+ program: Vec::from(script_hash.to_byte_array()),
};
self.invoice.fields_mut().fallbacks.get_or_insert_with(Vec::new).push(address);
self
pub fn fallback_v0_p2wpkh(mut self, pubkey_hash: &WPubkeyHash) -> Self {
let address = FallbackAddress {
version: WitnessVersion::V0.to_num(),
- program: Vec::from(&pubkey_hash.into_inner()[..]),
+ program: Vec::from(pubkey_hash.to_byte_array()),
};
self.invoice.fields_mut().fallbacks.get_or_insert_with(Vec::new).push(address);
self
self.contents.verify(TlvStream::new(&self.bytes), key, secp_ctx)
}
- #[cfg(test)]
- pub(super) fn as_tlv_stream(&self) -> FullInvoiceTlvStreamRef {
+ pub(crate) fn as_tlv_stream(&self) -> FullInvoiceTlvStreamRef {
let (payer_tlv_stream, offer_tlv_stream, invoice_request_tlv_stream, invoice_tlv_stream) =
self.contents.as_tlv_stream();
let signature_tlv_stream = SignatureTlvStreamRef {
};
let program = &address.program;
- if program.len() < 2 || program.len() > 40 {
- return None;
- }
-
- let address = Address {
- payload: Payload::WitnessProgram {
- version,
- program: program.clone(),
- },
- network,
+ let witness_program = match WitnessProgram::new(version, program.clone()) {
+ Ok(witness_program) => witness_program,
+ Err(_) => return None,
};
-
- if !address.is_standard() && version == WitnessVersion::V0 {
- return None;
- }
-
- Some(address)
+ Some(Address::new(network, Payload::WitnessProgram(witness_program)))
};
self.fields().fallbacks
type FullInvoiceTlvStream =
(PayerTlvStream, OfferTlvStream, InvoiceRequestTlvStream, InvoiceTlvStream, SignatureTlvStream);
-#[cfg(test)]
type FullInvoiceTlvStreamRef<'a> = (
PayerTlvStreamRef<'a>,
OfferTlvStreamRef<'a>,
use super::{Bolt12Invoice, DEFAULT_RELATIVE_EXPIRY, FallbackAddress, FullInvoiceTlvStreamRef, InvoiceTlvStreamRef, SIGNATURE_TAG, UnsignedBolt12Invoice};
use bitcoin::blockdata::constants::ChainHash;
- use bitcoin::blockdata::script::Script;
+ use bitcoin::blockdata::script::ScriptBuf;
use bitcoin::hashes::Hash;
use bitcoin::network::constants::Network;
use bitcoin::secp256k1::{Message, Secp256k1, XOnlyPublicKey, self};
- use bitcoin::util::address::{Address, Payload, WitnessVersion};
- use bitcoin::util::schnorr::TweakedPublicKey;
+ use bitcoin::address::{Address, Payload, WitnessProgram, WitnessVersion};
+ use bitcoin::key::TweakedPublicKey;
use core::convert::TryFrom;
use core::time::Duration;
use crate::blinded_path::{BlindedHop, BlindedPath};
#[test]
fn builds_invoice_with_fallback_address() {
- let script = Script::new();
- let pubkey = bitcoin::util::key::PublicKey::new(recipient_pubkey());
+ let script = ScriptBuf::new();
+ let pubkey = bitcoin::key::PublicKey::new(recipient_pubkey());
let x_only_pubkey = XOnlyPublicKey::from_keypair(&recipient_keys()).0;
let tweaked_pubkey = TweakedPublicKey::dangerous_assume_tweaked(x_only_pubkey);
Some(&vec![
FallbackAddress {
version: WitnessVersion::V0.to_num(),
- program: Vec::from(&script.wscript_hash().into_inner()[..]),
+ program: Vec::from(script.wscript_hash().to_byte_array()),
},
FallbackAddress {
version: WitnessVersion::V0.to_num(),
- program: Vec::from(&pubkey.wpubkey_hash().unwrap().into_inner()[..]),
+ program: Vec::from(pubkey.wpubkey_hash().unwrap().to_byte_array()),
},
FallbackAddress {
version: WitnessVersion::V1.to_num(),
#[test]
fn parses_invoice_with_fallback_address() {
- let script = Script::new();
- let pubkey = bitcoin::util::key::PublicKey::new(recipient_pubkey());
+ let script = ScriptBuf::new();
+ let pubkey = bitcoin::key::PublicKey::new(recipient_pubkey());
let x_only_pubkey = XOnlyPublicKey::from_keypair(&recipient_keys()).0;
let tweaked_pubkey = TweakedPublicKey::dangerous_assume_tweaked(x_only_pubkey);
match Bolt12Invoice::try_from(buffer) {
Ok(invoice) => {
+ let v1_witness_program = WitnessProgram::new(WitnessVersion::V1, vec![0u8; 33]).unwrap();
+ let v2_witness_program = WitnessProgram::new(WitnessVersion::V2, vec![0u8; 40]).unwrap();
assert_eq!(
invoice.fallbacks(),
vec![
Address::p2wsh(&script, Network::Bitcoin),
Address::p2wpkh(&pubkey, Network::Bitcoin).unwrap(),
Address::p2tr_tweaked(tweaked_pubkey, Network::Bitcoin),
- Address {
- payload: Payload::WitnessProgram {
- version: WitnessVersion::V1,
- program: vec![0u8; 33],
- },
- network: Network::Bitcoin,
- },
- Address {
- payload: Payload::WitnessProgram {
- version: WitnessVersion::V2,
- program: vec![0u8; 40],
- },
- network: Network::Bitcoin,
- },
+ Address::new(Network::Bitcoin, Payload::WitnessProgram(v1_witness_program)),
+ Address::new(Network::Bitcoin, Payload::WitnessProgram(v2_witness_program)),
],
);
},