@@ -23,8 +23,8 @@ use rgb_lib::{
2323 rust_only:: { AssetColoringInfo , ColoringInfo } ,
2424 DatabaseType , Outpoint , WalletData ,
2525 } ,
26- BitcoinNetwork , ConsignmentExt , ContractId , Error as RgbLibError , FileContent , RgbTransfer ,
27- RgbTransport , RgbTxid , Wallet , WitnessOrd ,
26+ AssetSchema , Assignment , BitcoinNetwork , ConsignmentExt , ContractId , Error as RgbLibError ,
27+ FileContent , RgbTransfer , RgbTransport , RgbTxid , Wallet , WitnessOrd ,
2828} ;
2929use serde:: { Deserialize , Serialize } ;
3030use tokio:: runtime:: Handle ;
@@ -47,6 +47,8 @@ pub const WALLET_FINGERPRINT_FNAME: &str = "wallet_fingerprint";
4747pub const WALLET_ACCOUNT_XPUB_VANILLA_FNAME : & str = "wallet_account_xpub_vanilla" ;
4848/// Name of the file containing the account-level xPub of the colored-side of the wallet
4949pub const WALLET_ACCOUNT_XPUB_COLORED_FNAME : & str = "wallet_account_xpub_colored" ;
50+ /// Name of the file containing the master fingerprint of the wallet
51+ pub const WALLET_MASTER_FINGERPRINT_FNAME : & str = "wallet_master_fingerprint" ;
5052const INBOUND_EXT : & str = "inbound" ;
5153const OUTBOUND_EXT : & str = "outbound" ;
5254
@@ -56,6 +58,8 @@ pub struct RgbInfo {
5658 /// Channel contract ID
5759 #[ serde( with = "contract_id_serde" ) ]
5860 pub contract_id : ContractId ,
61+ /// Channel schema
62+ pub schema : AssetSchema ,
5963 /// Channel RGB local amount
6064 pub local_rgb_amount : u64 ,
6165 /// Channel RGB remote amount
@@ -137,13 +141,17 @@ fn _get_account_xpub_vanilla(ldk_data_dir: &Path) -> String {
137141 _read_file_in_parent ( ldk_data_dir, WALLET_ACCOUNT_XPUB_VANILLA_FNAME )
138142}
139143
144+ fn _get_master_fingerprint ( ldk_data_dir : & Path ) -> String {
145+ _read_file_in_parent ( ldk_data_dir, WALLET_MASTER_FINGERPRINT_FNAME )
146+ }
147+
140148fn _get_indexer_url ( ldk_data_dir : & Path ) -> String {
141149 _read_file_in_parent ( ldk_data_dir, INDEXER_URL_FNAME )
142150}
143151
144152fn _new_rgb_wallet (
145153 data_dir : String , bitcoin_network : BitcoinNetwork , account_xpub_vanilla : String ,
146- account_xpub_colored : String ,
154+ account_xpub_colored : String , master_fingerprint : String ,
147155) -> Wallet {
148156 Wallet :: new ( WalletData {
149157 data_dir,
@@ -152,40 +160,54 @@ fn _new_rgb_wallet(
152160 max_allocations_per_utxo : 1 ,
153161 account_xpub_vanilla,
154162 account_xpub_colored,
163+ master_fingerprint,
155164 mnemonic : None ,
156165 vanilla_keychain : None ,
166+ supported_schemas : vec ! [ AssetSchema :: Nia , AssetSchema :: Cfa , AssetSchema :: Uda ] ,
157167 } )
158168 . expect ( "valid rgb-lib wallet" )
159169}
160170
161- fn _get_wallet_data ( ldk_data_dir : & Path ) -> ( String , BitcoinNetwork , String , String ) {
171+ fn _get_wallet_data ( ldk_data_dir : & Path ) -> ( String , BitcoinNetwork , String , String , String ) {
162172 let data_dir = ldk_data_dir. parent ( ) . unwrap ( ) . to_string_lossy ( ) . to_string ( ) ;
163173 let bitcoin_network = _get_bitcoin_network ( ldk_data_dir) ;
164174 let account_xpub_vanilla = _get_account_xpub_vanilla ( ldk_data_dir) ;
165175 let account_xpub_colored = _get_account_xpub_colored ( ldk_data_dir) ;
166- ( data_dir, bitcoin_network, account_xpub_vanilla, account_xpub_colored)
176+ let master_fingerprint = _get_master_fingerprint ( ldk_data_dir) ;
177+ ( data_dir, bitcoin_network, account_xpub_vanilla, account_xpub_colored, master_fingerprint)
167178}
168179
169180async fn _get_rgb_wallet ( ldk_data_dir : & Path ) -> Wallet {
170- let ( data_dir, bitcoin_network, account_xpub_vanilla, account_xpub_colored) =
181+ let ( data_dir, bitcoin_network, account_xpub_vanilla, account_xpub_colored, master_fingerprint ) =
171182 _get_wallet_data ( ldk_data_dir) ;
172183 tokio:: task:: spawn_blocking ( move || {
173- _new_rgb_wallet ( data_dir, bitcoin_network, account_xpub_vanilla, account_xpub_colored)
184+ _new_rgb_wallet (
185+ data_dir,
186+ bitcoin_network,
187+ account_xpub_vanilla,
188+ account_xpub_colored,
189+ master_fingerprint,
190+ )
174191 } )
175192 . await
176193 . unwrap ( )
177194}
178195
179196async fn _accept_transfer (
180197 ldk_data_dir : & Path , funding_txid : String , consignment_endpoint : RgbTransport ,
181- ) -> Result < ( RgbTransfer , u64 ) , RgbLibError > {
198+ ) -> Result < ( RgbTransfer , Vec < Assignment > ) , RgbLibError > {
182199 let funding_vout = 1 ;
183- let ( data_dir, bitcoin_network, account_xpub_vanilla, account_xpub_colored) =
200+ let ( data_dir, bitcoin_network, account_xpub_vanilla, account_xpub_colored, master_fingerprint ) =
184201 _get_wallet_data ( ldk_data_dir) ;
185202 let indexer_url = _get_indexer_url ( ldk_data_dir) ;
186203 tokio:: task:: spawn_blocking ( move || {
187- let mut wallet =
188- _new_rgb_wallet ( data_dir, bitcoin_network, account_xpub_vanilla, account_xpub_colored) ;
204+ let mut wallet = _new_rgb_wallet (
205+ data_dir,
206+ bitcoin_network,
207+ account_xpub_vanilla,
208+ account_xpub_colored,
209+ master_fingerprint,
210+ ) ;
189211 wallet. go_online ( true , indexer_url) . unwrap ( ) ;
190212 wallet. accept_transfer (
191213 funding_txid. clone ( ) ,
@@ -350,14 +372,8 @@ where
350372 output_map. insert ( vout_p2wsh as u32 , vout_p2wsh_amt) ;
351373 }
352374
353- let asset_coloring_info = AssetColoringInfo {
354- input_outpoints : vec ! [ Outpoint {
355- txid: funding_outpoint. txid. to_string( ) ,
356- vout: funding_outpoint. index as u32 ,
357- } ] ,
358- output_map,
359- static_blinding : Some ( STATIC_BLINDING ) ,
360- } ;
375+ let asset_coloring_info =
376+ AssetColoringInfo { output_map, static_blinding : Some ( STATIC_BLINDING ) } ;
361377 let coloring_info = ColoringInfo {
362378 asset_info_map : HashMap :: from_iter ( [ ( contract_id, asset_coloring_info) ] ) ,
363379 static_blinding : Some ( STATIC_BLINDING ) ,
@@ -417,10 +433,6 @@ pub(crate) fn color_htlc(
417433 let contract_id = transfer_info. contract_id ;
418434
419435 let asset_coloring_info = AssetColoringInfo {
420- input_outpoints : vec ! [ Outpoint {
421- txid: commitment_txid,
422- vout: consignment_htlc_outpoint. vout,
423- } ] ,
424436 output_map : HashMap :: from ( [ ( 0 , htlc_amount_rgb) ] ) ,
425437 static_blinding : Some ( STATIC_BLINDING ) ,
426438 } ;
@@ -492,14 +504,8 @@ pub(crate) fn color_closing(
492504 output_map. insert ( counterparty_vout as u32 , counterparty_vout_amount) ;
493505 }
494506
495- let asset_coloring_info = AssetColoringInfo {
496- input_outpoints : vec ! [ Outpoint {
497- txid: funding_outpoint. txid. to_string( ) ,
498- vout: funding_outpoint. index as u32 ,
499- } ] ,
500- output_map,
501- static_blinding : Some ( STATIC_BLINDING ) ,
502- } ;
507+ let asset_coloring_info =
508+ AssetColoringInfo { output_map, static_blinding : Some ( STATIC_BLINDING ) } ;
503509 let coloring_info = ColoringInfo {
504510 asset_info_map : HashMap :: from_iter ( [ ( contract_id, asset_coloring_info) ] ) ,
505511 static_blinding : Some ( STATIC_BLINDING ) ,
@@ -660,7 +666,7 @@ pub(crate) fn handle_funding(
660666 funding_txid. clone ( ) ,
661667 consignment_endpoint,
662668 ) ) ;
663- let ( consignment, remote_rgb_amount ) = match accept_res {
669+ let ( consignment, remote_rgb_assignments ) = match accept_res {
664670 Ok ( res) => res,
665671 Err ( RgbLibError :: InvalidConsignment ) => {
666672 return Err ( MsgHandleErrInternal :: send_err_msg_no_close (
@@ -676,7 +682,13 @@ pub(crate) fn handle_funding(
676682 } ,
677683 Err ( RgbLibError :: UnknownRgbSchema { schema_id } ) => {
678684 return Err ( MsgHandleErrInternal :: send_err_msg_no_close (
679- format ! ( "Unsupported RGB schema: {schema_id}" ) ,
685+ format ! ( "Unknown RGB schema: {schema_id}" ) ,
686+ * temporary_channel_id,
687+ ) )
688+ } ,
689+ Err ( RgbLibError :: UnsupportedSchema { asset_schema } ) => {
690+ return Err ( MsgHandleErrInternal :: send_err_msg_no_close (
691+ format ! ( "Unsupported RGB schema: {asset_schema}" ) ,
680692 * temporary_channel_id,
681693 ) )
682694 } ,
@@ -694,8 +706,23 @@ pub(crate) fn handle_funding(
694706 ldk_data_dir. join ( format ! ( "consignment_{}" , temporary_channel_id. 0 . as_hex( ) ) ) ;
695707 consignment. save_file ( consignment_path) . expect ( "unable to write file" ) ;
696708
697- let rgb_info =
698- RgbInfo { contract_id : consignment. contract_id ( ) , local_rgb_amount : 0 , remote_rgb_amount } ;
709+ if remote_rgb_assignments. len ( ) != 1 {
710+ return Err ( MsgHandleErrInternal :: send_err_msg_no_close (
711+ format ! ( "Unexpected number of RGB assignments: {}" , remote_rgb_assignments. len( ) ) ,
712+ * temporary_channel_id,
713+ ) ) ;
714+ }
715+ let remote_rgb_amount = match remote_rgb_assignments[ 0 ] {
716+ Assignment :: Fungible ( amt) => amt,
717+ Assignment :: NonFungible => 1 ,
718+ _ => unreachable ! ( "unsupported schema" ) ,
719+ } ;
720+ let rgb_info = RgbInfo {
721+ contract_id : consignment. contract_id ( ) ,
722+ schema : AssetSchema :: from_schema_id ( consignment. schema_id ( ) ) . unwrap ( ) ,
723+ local_rgb_amount : 0 ,
724+ remote_rgb_amount,
725+ } ;
699726 let temporary_channel_id_str = temporary_channel_id. 0 . as_hex ( ) . to_string ( ) ;
700727 write_rgb_channel_info (
701728 & get_rgb_channel_info_path ( & temporary_channel_id_str, ldk_data_dir, true ) ,
0 commit comments