Skip to content

Commit 970a63b

Browse files
committed
update rgb-lib to 0.3.0-beta.1
1 parent a14b850 commit 970a63b

File tree

1 file changed

+62
-35
lines changed

1 file changed

+62
-35
lines changed

lightning/src/rgb_utils/mod.rs

Lines changed: 62 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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
};
2929
use serde::{Deserialize, Serialize};
3030
use tokio::runtime::Handle;
@@ -47,6 +47,8 @@ pub const WALLET_FINGERPRINT_FNAME: &str = "wallet_fingerprint";
4747
pub 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
4949
pub 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";
5052
const INBOUND_EXT: &str = "inbound";
5153
const 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+
140148
fn _get_indexer_url(ldk_data_dir: &Path) -> String {
141149
_read_file_in_parent(ldk_data_dir, INDEXER_URL_FNAME)
142150
}
143151

144152
fn _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

169180
async 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

179196
async 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

Comments
 (0)