@@ -15,8 +15,9 @@ pub(crate) mod utils;
1515
1616use bitcoin:: secp256k1:: { self , PublicKey , Secp256k1 , SecretKey } ;
1717
18- use crate :: sign:: EntropySource ;
1918use crate :: ln:: msgs:: DecodeError ;
19+ use crate :: offers:: invoice:: BlindedPayInfo ;
20+ use crate :: sign:: EntropySource ;
2021use crate :: util:: ser:: { Readable , Writeable , Writer } ;
2122
2223use crate :: io;
@@ -75,25 +76,31 @@ impl BlindedPath {
7576 } )
7677 }
7778
78- /// Create a blinded path for a payment, to be forwarded along `path`. The last node
79- /// in `path` will be the destination node.
79+ /// Create a blinded path for a payment, to be forwarded along `intermediate_nodes`.
80+ ///
81+ /// Errors if:
82+ /// * a provided node id is invalid
83+ /// * [`BlindedPayInfo`] calculation results in an integer overflow
84+ /// * any unknown features are required in the provided [`ForwardTlvs`]
8085 ///
81- /// Errors if `path` is empty or a node id in `path` is invalid.
86+ /// [`ForwardTlvs`]: crate::blinded_path::payment::ForwardTlvs
8287 // TODO: make all payloads the same size with padding + add dummy hops
8388 pub fn new_for_payment < ES : EntropySource , T : secp256k1:: Signing + secp256k1:: Verification > (
84- intermediate_nodes : & [ ( PublicKey , payment:: ForwardTlvs ) ] , payee_node_id : PublicKey ,
85- payee_tlvs : payment:: ReceiveTlvs , entropy_source : & ES , secp_ctx : & Secp256k1 < T >
86- ) -> Result < Self , ( ) > {
89+ intermediate_nodes : & [ payment:: ForwardNode ] , payee_node_id : PublicKey ,
90+ payee_tlvs : payment:: ReceiveTlvs , htlc_maximum_msat : u64 , entropy_source : & ES ,
91+ secp_ctx : & Secp256k1 < T >
92+ ) -> Result < ( BlindedPayInfo , Self ) , ( ) > {
8793 let blinding_secret_bytes = entropy_source. get_secure_random_bytes ( ) ;
8894 let blinding_secret = SecretKey :: from_slice ( & blinding_secret_bytes[ ..] ) . expect ( "RNG is busted" ) ;
8995
90- Ok ( BlindedPath {
91- introduction_node_id : intermediate_nodes. first ( ) . map_or ( payee_node_id, |n| n. 0 ) ,
96+ let blinded_payinfo = payment:: compute_payinfo ( intermediate_nodes, & payee_tlvs, htlc_maximum_msat) ?;
97+ Ok ( ( blinded_payinfo, BlindedPath {
98+ introduction_node_id : intermediate_nodes. first ( ) . map_or ( payee_node_id, |n| n. node_id ) ,
9299 blinding_point : PublicKey :: from_secret_key ( secp_ctx, & blinding_secret) ,
93100 blinded_hops : payment:: blinded_hops (
94101 secp_ctx, intermediate_nodes, payee_node_id, payee_tlvs, & blinding_secret
95102 ) . map_err ( |_| ( ) ) ?,
96- } )
103+ } ) )
97104 }
98105}
99106
0 commit comments