@@ -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,57 @@ 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 vss_xprv = xprv
544+ . derive_priv ( & Secp256k1 :: new ( ) , & [ ChildNumber :: Hardened { index : 877 } ] ) // todo use const
545+ . map_err ( |e| {
546+ log_error ! ( logger, "Failed to derive VSS secret: {}" , e) ;
547+ BuildError :: InvalidSeedBytes
548+ } ) ?;
549+
550+ let vss_seed_bytes: [ u8 ; 32 ] = vss_xprv. private_key . secret_bytes ( ) ;
551+
552+ let headers: Arc < dyn VssHeaderProvider > = match vss_cfg. headers {
553+ VssAuth :: FixedHeaders ( h) => Arc :: new ( FixedHeaders :: new ( h) ) ,
554+ VssAuth :: LNURLAuthServer ( url, headers) => {
555+ let lnurl_auth_xprv = vss_xprv
556+ . derive_priv ( & Secp256k1 :: new ( ) , & [ ChildNumber :: Hardened { index : 138 } ] ) // todo use const
557+ . map_err ( |e| {
558+ log_error ! ( logger, "Failed to derive VSS secret: {}" , e) ;
559+ BuildError :: KVStoreSetupFailed
560+ } ) ?;
561+
562+ let lnurl_auth_jwt_provider = LnurlAuthToJwtProvider :: new (
563+ lnurl_auth_xprv,
564+ url,
565+ headers,
566+ )
567+ . map_err ( |e| {
568+ log_error ! ( logger, "Failed to create LnurlAuthToJwtProvider: {e}" ) ;
569+ BuildError :: KVStoreSetupFailed
570+ } ) ?;
571+
572+ Arc :: new ( lnurl_auth_jwt_provider)
573+ } ,
574+ } ;
575+ Arc :: new ( VssStore :: new ( vss_cfg. vss_url , vss_cfg. store_id , vss_seed_bytes, headers) ?)
576+ } ,
525577 } ;
526578
527579 let event_queue = Arc :: new ( EventQueue :: new ( Arc :: clone ( & store) , Arc :: clone ( & logger) ) ) ;
0 commit comments