Skip to content

Commit 79d8923

Browse files
committed
add assignment to /rgbinvoice
1 parent 8189d94 commit 79d8923

File tree

6 files changed

+111
-3
lines changed

6 files changed

+111
-3
lines changed

openapi.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2038,6 +2038,8 @@ components:
20382038
asset_id:
20392039
type: string
20402040
example: rgb:CJkb4YZw-jRiz2sk-~PARPio-wtVYI1c-XAEYCqO-wTfvRZ8
2041+
assignment:
2042+
$ref: '#/components/schemas/Assignment'
20412043
duration_seconds:
20422044
type: integer
20432045
example: 86400

src/ldk.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1282,7 +1282,13 @@ impl OutputSpender for RgbOutputSpender {
12821282
new_asset = true;
12831283
let receive_data = self
12841284
.rgb_wallet_wrapper
1285-
.witness_receive(None, None, vec![self.proxy_endpoint.clone()], 0)
1285+
.witness_receive(
1286+
None,
1287+
Assignment::Any,
1288+
None,
1289+
vec![self.proxy_endpoint.clone()],
1290+
0,
1291+
)
12861292
.unwrap();
12871293
let script_pubkey = script_buf_from_recipient_id(receive_data.recipient_id.clone())
12881294
.unwrap()

src/rgb.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ impl UnlockedAppState {
3434
pub(crate) fn rgb_blind_receive(
3535
&self,
3636
asset_id: Option<String>,
37+
assignment: Assignment,
3738
duration_seconds: Option<u32>,
3839
transport_endpoints: Vec<String>,
3940
min_confirmations: u8,
4041
) -> Result<ReceiveData, RgbLibError> {
4142
self.rgb_wallet_wrapper.blind_receive(
4243
asset_id,
44+
assignment,
4345
duration_seconds,
4446
transport_endpoints,
4547
min_confirmations,
@@ -280,12 +282,14 @@ impl UnlockedAppState {
280282
pub(crate) fn rgb_witness_receive(
281283
&self,
282284
asset_id: Option<String>,
285+
assignment: Assignment,
283286
duration_seconds: Option<u32>,
284287
transport_endpoints: Vec<String>,
285288
min_confirmations: u8,
286289
) -> Result<ReceiveData, RgbLibError> {
287290
self.rgb_wallet_wrapper.witness_receive(
288291
asset_id,
292+
assignment,
289293
duration_seconds,
290294
transport_endpoints,
291295
min_confirmations,
@@ -314,13 +318,14 @@ impl RgbLibWalletWrapper {
314318
pub(crate) fn blind_receive(
315319
&self,
316320
asset_id: Option<String>,
321+
assignment: Assignment,
317322
duration_seconds: Option<u32>,
318323
transport_endpoints: Vec<String>,
319324
min_confirmations: u8,
320325
) -> Result<ReceiveData, RgbLibError> {
321326
self.get_rgb_wallet().blind_receive(
322327
asset_id,
323-
Assignment::Any,
328+
assignment,
324329
duration_seconds,
325330
transport_endpoints,
326331
min_confirmations,
@@ -614,13 +619,14 @@ impl RgbLibWalletWrapper {
614619
pub(crate) fn witness_receive(
615620
&self,
616621
asset_id: Option<String>,
622+
assignment: Assignment,
617623
duration_seconds: Option<u32>,
618624
transport_endpoints: Vec<String>,
619625
min_confirmations: u8,
620626
) -> Result<ReceiveData, RgbLibError> {
621627
self.get_rgb_wallet().witness_receive(
622628
asset_id,
623-
Assignment::Any,
629+
assignment,
624630
duration_seconds,
625631
transport_endpoints,
626632
min_confirmations,

src/routes.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -911,6 +911,7 @@ pub(crate) struct RgbAllocation {
911911
#[derive(Deserialize, Serialize)]
912912
pub(crate) struct RgbInvoiceRequest {
913913
pub(crate) asset_id: Option<String>,
914+
pub(crate) assignment: Option<Assignment>,
914915
pub(crate) duration_seconds: Option<u32>,
915916
pub(crate) min_confirmations: u8,
916917
pub(crate) witness: bool,
@@ -3226,16 +3227,20 @@ pub(crate) async fn rgb_invoice(
32263227
return Err(APIError::OpenChannelInProgress);
32273228
}
32283229

3230+
let assignment = payload.assignment.unwrap_or(Assignment::Any).into();
3231+
32293232
let receive_data = if payload.witness {
32303233
unlocked_state.rgb_witness_receive(
32313234
payload.asset_id,
3235+
assignment,
32323236
payload.duration_seconds,
32333237
vec![unlocked_state.proxy_endpoint.clone()],
32343238
payload.min_confirmations,
32353239
)?
32363240
} else {
32373241
unlocked_state.rgb_blind_receive(
32383242
payload.asset_id,
3243+
assignment,
32393244
payload.duration_seconds,
32403245
vec![unlocked_state.proxy_endpoint.clone()],
32413246
payload.min_confirmations,

src/test/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,6 +1217,15 @@ async fn rgb_invoice(
12171217
node_address: SocketAddr,
12181218
asset_id: Option<String>,
12191219
witness: bool,
1220+
) -> RgbInvoiceResponse {
1221+
rgb_invoice_with_assignment(node_address, asset_id, None, witness).await
1222+
}
1223+
1224+
async fn rgb_invoice_with_assignment(
1225+
node_address: SocketAddr,
1226+
asset_id: Option<String>,
1227+
assignment: Option<Assignment>,
1228+
witness: bool,
12201229
) -> RgbInvoiceResponse {
12211230
println!(
12221231
"generating RGB invoice{} for node {node_address}",
@@ -1229,6 +1238,7 @@ async fn rgb_invoice(
12291238
let payload = RgbInvoiceRequest {
12301239
min_confirmations: 1,
12311240
asset_id,
1241+
assignment,
12321242
duration_seconds: None,
12331243
witness,
12341244
};
@@ -1723,6 +1733,7 @@ mod openchannel_optional_addr;
17231733
mod payment;
17241734
mod refuse_high_fees;
17251735
mod restart;
1736+
mod rgb_invoice_assignment;
17261737
mod send_receive;
17271738
mod swap_assets_liquidity_both_ways;
17281739
mod swap_reverse_same_channel;

src/test/rgb_invoice_assignment.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
use super::*;
2+
3+
const TEST_DIR_BASE: &str = "tmp/rgb_invoice_assignment/";
4+
5+
#[serial_test::serial]
6+
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
7+
#[traced_test]
8+
async fn rgb_invoice_assignment() {
9+
initialize();
10+
11+
let test_dir_node1 = format!("{TEST_DIR_BASE}node1");
12+
let test_dir_node2 = format!("{TEST_DIR_BASE}node2");
13+
let (node1_addr, _) = start_node(&test_dir_node1, NODE1_PEER_PORT, false).await;
14+
let (node2_addr, _) = start_node(&test_dir_node2, NODE2_PEER_PORT, false).await;
15+
16+
fund_and_create_utxos(node1_addr, None).await;
17+
fund_and_create_utxos(node2_addr, None).await;
18+
19+
let asset_id = issue_asset_nia(node1_addr).await.asset_id;
20+
21+
let requested_amount = 400;
22+
let RgbInvoiceResponse {
23+
recipient_id,
24+
invoice,
25+
..
26+
} = rgb_invoice_with_assignment(
27+
node1_addr,
28+
None,
29+
Some(Assignment::Fungible(requested_amount)),
30+
true,
31+
)
32+
.await;
33+
34+
let decoded = decode_rgb_invoice(node1_addr, &invoice).await;
35+
assert_eq!(decoded.recipient_id, recipient_id);
36+
assert!(decoded.asset_schema.is_none());
37+
assert!(decoded.asset_id.is_none());
38+
assert_eq!(decoded.assignment, Assignment::Fungible(requested_amount));
39+
40+
let RgbInvoiceResponse {
41+
recipient_id,
42+
invoice,
43+
..
44+
} = rgb_invoice_with_assignment(
45+
node2_addr,
46+
None,
47+
Some(Assignment::Fungible(requested_amount)),
48+
false,
49+
)
50+
.await;
51+
52+
let decoded = decode_rgb_invoice(node1_addr, &invoice).await;
53+
assert_eq!(decoded.recipient_id, recipient_id);
54+
assert!(decoded.asset_schema.is_none());
55+
assert!(decoded.asset_id.is_none());
56+
assert_eq!(decoded.assignment, Assignment::Fungible(requested_amount));
57+
58+
send_asset(
59+
node1_addr,
60+
&asset_id,
61+
Assignment::Fungible(requested_amount),
62+
recipient_id,
63+
)
64+
.await;
65+
mine(false);
66+
refresh_transfers(node2_addr).await;
67+
refresh_transfers(node2_addr).await;
68+
refresh_transfers(node1_addr).await;
69+
70+
assert_eq!(
71+
asset_balance_spendable(node1_addr, &asset_id).await,
72+
1000 - requested_amount
73+
);
74+
assert_eq!(
75+
asset_balance_spendable(node2_addr, &asset_id).await,
76+
requested_amount
77+
);
78+
}

0 commit comments

Comments
 (0)