@@ -18,15 +18,19 @@ use crate::trusted_wallet::spark::Spark;
1818use crate :: trusted_wallet:: { DynTrustedWalletInterface , WalletTrusted } ;
1919use graduated_rebalancer:: GraduatedRebalancer ;
2020use ldk_node:: bitcoin:: Network ;
21+ use ldk_node:: bitcoin:: bip32:: { ChildNumber , Xpriv } ;
2122use ldk_node:: bitcoin:: hashes:: Hash ;
2223use ldk_node:: bitcoin:: io;
24+ use ldk_node:: bitcoin:: key:: Secp256k1 ;
2325use ldk_node:: bitcoin:: secp256k1:: PublicKey ;
2426use ldk_node:: io:: sqlite_store:: SqliteStore ;
27+ use ldk_node:: io:: vss_store:: VssStore ;
2528use ldk_node:: lightning:: ln:: msgs:: SocketAddress ;
2629use ldk_node:: lightning:: util:: logger:: Logger as _;
2730use ldk_node:: lightning:: { log_debug, log_error, log_info, log_trace, log_warn} ;
2831use ldk_node:: lightning_invoice:: Bolt11Invoice ;
2932use ldk_node:: payment:: { PaymentDirection , PaymentKind } ;
33+ use ldk_node:: vss_client:: headers:: { FixedHeaders , LnurlAuthToJwtProvider , VssHeaderProvider } ;
3034use ldk_node:: { BuildError , ChannelDetails , DynStore , NodeError } ;
3135
3236use std:: collections:: HashMap ;
@@ -155,7 +159,7 @@ pub enum Seed {
155159#[ derive( Debug , Clone ) ]
156160pub enum VssAuth {
157161 /// Authentication using an LNURL-auth server.
158- LNURLAuthServer ( String ) ,
162+ LNURLAuthServer ( String , HashMap < String , String > ) ,
159163 /// Authentication using a fixed set of HTTP headers.
160164 FixedHeaders ( HashMap < String , String > ) ,
161165}
@@ -177,7 +181,8 @@ pub struct VssConfig {
177181pub enum StorageConfig {
178182 /// Local SQLite database configuration.
179183 LocalSQLite ( String ) ,
180- // todo VSS(VssConfig),
184+ /// Versioned Storage Service (VSS) configuration.
185+ VSS ( VssConfig ) ,
181186}
182187
183188/// Configuration for the blockchain data source.
@@ -518,10 +523,59 @@ impl Wallet {
518523 BuildError :: RuntimeSetupFailed
519524 } ) ?) ;
520525
521- let store: Arc < DynStore > = match & config. storage_config {
526+ let store: Arc < DynStore > = match config. storage_config . clone ( ) {
522527 StorageConfig :: LocalSQLite ( path) => {
523528 Arc :: new ( SqliteStore :: new ( path. into ( ) , Some ( "orange.sqlite" . to_owned ( ) ) , None ) ?)
524529 } ,
530+ StorageConfig :: VSS ( vss_cfg) => {
531+ let seed_bytes = match & config. seed {
532+ Seed :: Mnemonic { mnemonic, passphrase } => {
533+ mnemonic. to_seed ( passphrase. as_deref ( ) . unwrap_or ( "" ) )
534+ } ,
535+ Seed :: Seed64 ( bytes) => * bytes,
536+ } ;
537+
538+ let xprv = Xpriv :: new_master ( config. network , & seed_bytes) . map_err ( |e| {
539+ log_error ! ( logger, "Failed to derive master secret: {}" , e) ;
540+ BuildError :: InvalidSeedBytes
541+ } ) ?;
542+
543+ let secp = Secp256k1 :: new ( ) ;
544+
545+ let vss_xprv = xprv
546+ . derive_priv ( & secp, & [ ChildNumber :: Hardened { index : 877 } ] ) // todo use const
547+ . map_err ( |e| {
548+ log_error ! ( logger, "Failed to derive VSS secret: {}" , e) ;
549+ BuildError :: InvalidSeedBytes
550+ } ) ?;
551+
552+ let vss_seed_bytes: [ u8 ; 32 ] = vss_xprv. private_key . secret_bytes ( ) ;
553+
554+ let headers: Arc < dyn VssHeaderProvider > = match vss_cfg. headers {
555+ VssAuth :: FixedHeaders ( h) => Arc :: new ( FixedHeaders :: new ( h) ) ,
556+ VssAuth :: LNURLAuthServer ( url, headers) => {
557+ let lnurl_auth_xprv = vss_xprv
558+ . derive_priv ( & secp, & [ ChildNumber :: Hardened { index : 138 } ] ) // todo use const
559+ . map_err ( |e| {
560+ log_error ! ( logger, "Failed to derive VSS secret: {}" , e) ;
561+ BuildError :: KVStoreSetupFailed
562+ } ) ?;
563+
564+ let lnurl_auth_jwt_provider = LnurlAuthToJwtProvider :: new (
565+ lnurl_auth_xprv,
566+ url,
567+ headers,
568+ )
569+ . map_err ( |e| {
570+ log_error ! ( logger, "Failed to create LnurlAuthToJwtProvider: {e}" ) ;
571+ BuildError :: KVStoreSetupFailed
572+ } ) ?;
573+
574+ Arc :: new ( lnurl_auth_jwt_provider)
575+ } ,
576+ } ;
577+ Arc :: new ( VssStore :: new ( vss_cfg. vss_url , vss_cfg. store_id , vss_seed_bytes, headers) ?)
578+ } ,
525579 } ;
526580
527581 let event_queue = Arc :: new ( EventQueue :: new ( Arc :: clone ( & store) , Arc :: clone ( & logger) ) ) ;
0 commit comments