Skip to content

Commit 7f638ea

Browse files
committed
feat: support push_asset_amount when opening RGB channels
1 parent 5a5aa12 commit 7f638ea

12 files changed

Lines changed: 218 additions & 6 deletions

.gitmodules

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[submodule "rust-lightning"]
22
path = rust-lightning
3-
url = https://github.com/RGB-Tools/rust-lightning.git
4-
branch = rgb
3+
url = git@github.com:bitwalt/rust-lightning.git
4+
branch = feat/push-asset-amount-rln
55
shallow = true

openapi.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1923,6 +1923,9 @@ components:
19231923
push_msat:
19241924
type: integer
19251925
example: 1394000
1926+
push_asset_amount:
1927+
type: integer
1928+
example: 100
19261929
asset_amount:
19271930
type: integer
19281931
example: 333

src/routes.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,7 @@ pub(crate) struct OpenChannelRequest {
839839
pub(crate) push_msat: u64,
840840
pub(crate) asset_amount: Option<u64>,
841841
pub(crate) asset_id: Option<String>,
842+
pub(crate) push_asset_amount: Option<u64>,
842843
pub(crate) public: bool,
843844
pub(crate) with_anchors: bool,
844845
pub(crate) fee_base_msat: Option<u32>,
@@ -3044,6 +3045,24 @@ pub(crate) async fn open_channel(
30443045
)));
30453046
}
30463047

3048+
// Validate push_asset_amount
3049+
if let Some(push_asset_amount) = payload.push_asset_amount {
3050+
// push_asset_amount can only be used with RGB channels
3051+
if colored_info.is_none() {
3052+
return Err(APIError::InvalidAmount(s!(
3053+
"push_asset_amount can only be used with RGB channels (asset_id must be specified)"
3054+
)));
3055+
}
3056+
3057+
if let Some((_, asset_amount)) = &colored_info {
3058+
if push_asset_amount > *asset_amount {
3059+
return Err(APIError::InvalidAmount(s!(
3060+
"push_asset_amount cannot be higher than asset_amount"
3061+
)));
3062+
}
3063+
}
3064+
}
3065+
30473066
if colored_info.is_some() && !payload.with_anchors {
30483067
return Err(APIError::AnchorsRequired);
30493068
}
@@ -3175,6 +3194,7 @@ pub(crate) async fn open_channel(
31753194
temporary_channel_id,
31763195
Some(config),
31773196
consignment_endpoint,
3197+
payload.push_asset_amount,
31783198
)
31793199
.map_err(|e| {
31803200
*unlocked_state.rgb_send_lock.lock().unwrap() = false;
@@ -3201,11 +3221,18 @@ pub(crate) async fn open_channel(
32013221
tracing::info!("EVENT: initiated channel with peer {}", peer_pubkey);
32023222

32033223
if let Some((contract_id, asset_amount)) = &colored_info {
3224+
// Calculate local and remote amounts based on push_asset_amount
3225+
let (local_amount, remote_amount) = if let Some(push_amount) = payload.push_asset_amount {
3226+
(*asset_amount - push_amount, push_amount)
3227+
} else {
3228+
(*asset_amount, 0)
3229+
};
3230+
32043231
let rgb_info = RgbInfo {
32053232
contract_id: *contract_id,
32063233
schema: schema.unwrap(),
3207-
local_rgb_amount: *asset_amount,
3208-
remote_rgb_amount: 0,
3234+
local_rgb_amount: local_amount,
3235+
remote_rgb_amount: remote_amount,
32093236
};
32103237
write_rgb_channel_info(
32113238
&get_rgb_channel_info_path(

src/test/close_coop_vanilla.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ async fn without_anchors() {
138138
None,
139139
None,
140140
None,
141+
None,
141142
false,
142143
)
143144
.await;

src/test/concurrent_openchannel.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ async fn concurrent_openchannel() {
5959
Some(PUSH_MSAT),
6060
Some(ASSET_AMOUNT),
6161
Some(&asset_id),
62+
None,
6263
20,
6364
),
6465
open_channel_with_retry(
@@ -69,6 +70,7 @@ async fn concurrent_openchannel() {
6970
Some(PUSH_MSAT),
7071
Some(ASSET_AMOUNT),
7172
Some(&asset_id),
73+
None,
7274
20,
7375
),
7476
open_channel_with_retry(
@@ -79,6 +81,7 @@ async fn concurrent_openchannel() {
7981
Some(PUSH_MSAT),
8082
Some(ASSET_AMOUNT),
8183
Some(&asset_id),
84+
None,
8285
20,
8386
),
8487
open_channel_with_retry(
@@ -89,6 +92,7 @@ async fn concurrent_openchannel() {
8992
Some(PUSH_MSAT),
9093
Some(ASSET_AMOUNT),
9194
Some(&asset_id),
95+
None,
9296
20,
9397
),
9498
open_channel_with_retry(
@@ -99,6 +103,7 @@ async fn concurrent_openchannel() {
99103
Some(PUSH_MSAT),
100104
Some(ASSET_AMOUNT),
101105
Some(&asset_id),
106+
None,
102107
20,
103108
)
104109
);

src/test/getchannelid.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ async fn getchannelid_success() {
3737
Some(&asset_id),
3838
None,
3939
None,
40+
None,
4041
Some(&temporary_channel_id),
4142
true,
4243
)

src/test/mod.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,7 @@ async fn open_channel(
10841084
None,
10851085
None,
10861086
None,
1087+
None,
10871088
true,
10881089
)
10891090
.await
@@ -1098,6 +1099,7 @@ async fn open_channel_with_retry(
10981099
push_msat: Option<u64>,
10991100
asset_amount: Option<u64>,
11001101
asset_id: Option<&str>,
1102+
push_asset_amount: Option<u64>,
11011103
max_retries: u32,
11021104
) -> Channel {
11031105
let mut attempt = 0;
@@ -1111,6 +1113,7 @@ async fn open_channel_with_retry(
11111113
push_msat,
11121114
asset_amount,
11131115
asset_id,
1116+
push_asset_amount,
11141117
None,
11151118
None,
11161119
None,
@@ -1146,6 +1149,7 @@ async fn open_channel_raw(
11461149
push_msat: Option<u64>,
11471150
asset_amount: Option<u64>,
11481151
asset_id: Option<&str>,
1152+
push_asset_amount: Option<u64>,
11491153
fee_base_msat: Option<u32>,
11501154
fee_proportional_millionths: Option<u32>,
11511155
temporary_channel_id: Option<&str>,
@@ -1180,6 +1184,7 @@ async fn open_channel_raw(
11801184
push_msat: push_msat.unwrap_or(0),
11811185
asset_amount,
11821186
asset_id: asset_id.map(|a| a.to_string()),
1187+
push_asset_amount,
11831188
public: true,
11841189
with_anchors,
11851190
fee_base_msat,
@@ -1207,10 +1212,18 @@ async fn open_channel_raw(
12071212
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
12081213
let channels = list_channels(node_address).await;
12091214
if let Some(channel) = channels.iter().find(|c| {
1215+
let asset_amounts_match = if asset_id.is_some() {
1216+
let local_amount = asset_amount.unwrap_or(0) - push_asset_amount.unwrap_or(0);
1217+
let remote_amount = push_asset_amount.unwrap_or(0);
1218+
c.asset_local_amount == Some(local_amount)
1219+
&& c.asset_remote_amount == Some(remote_amount)
1220+
} else {
1221+
c.asset_local_amount.is_none() && c.asset_remote_amount.is_none()
1222+
};
12101223
!c.ready
12111224
&& c.peer_pubkey == dest_peer_pubkey
12121225
&& c.asset_id == asset_id.map(|id| id.to_string())
1213-
&& c.asset_local_amount == asset_amount
1226+
&& asset_amounts_match
12141227
}) {
12151228
if let Some(txid) = &channel.funding_txid {
12161229
let txout = _get_txout(txid);
@@ -1254,6 +1267,7 @@ async fn open_channel_with_custom_data(
12541267
push_msat: Option<u64>,
12551268
asset_amount: Option<u64>,
12561269
asset_id: Option<&str>,
1270+
push_asset_amount: Option<u64>,
12571271
fee_base_msat: Option<u32>,
12581272
fee_proportional_millionths: Option<u32>,
12591273
temporary_channel_id: Option<&str>,
@@ -1267,6 +1281,7 @@ async fn open_channel_with_custom_data(
12671281
push_msat,
12681282
asset_amount,
12691283
asset_id,
1284+
push_asset_amount,
12701285
fee_base_msat,
12711286
fee_proportional_millionths,
12721287
temporary_channel_id,
@@ -1871,6 +1886,7 @@ mod open_after_double_send;
18711886
mod openchannel_fail;
18721887
mod openchannel_optional_addr;
18731888
mod payment;
1889+
mod push_rgb_assets;
18741890
mod refuse_high_fees;
18751891
mod restart;
18761892
mod send_receive;

src/test/openchannel_fail.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ async fn open_fail() {
2929
push_msat: 3_500_000,
3030
asset_amount: Some(100),
3131
asset_id: Some(asset_id.clone()),
32+
push_asset_amount: None,
3233
public: true,
3334
with_anchors: true,
3435
fee_base_msat: None,
@@ -63,6 +64,7 @@ async fn open_fail() {
6364
push_msat: 3_500_000,
6465
asset_amount: Some(100),
6566
asset_id: Some(s!("rgb:EIkAVQvq-WbAb5JG-CYxbUER-oqDNwne-ZNxBDID-p0cpf9U")),
67+
push_asset_amount: None,
6668
public: true,
6769
with_anchors: true,
6870
fee_base_msat: None,
@@ -90,6 +92,7 @@ async fn open_fail() {
9092
push_msat: 3_500_000,
9193
asset_amount: Some(0),
9294
asset_id: Some(asset_id.clone()),
95+
push_asset_amount: None,
9396
public: true,
9497
with_anchors: true,
9598
fee_base_msat: None,
@@ -122,6 +125,7 @@ async fn open_fail() {
122125
push_msat: 3_500_000,
123126
asset_amount: Some(100),
124127
asset_id: Some(s!("bad asset ID")),
128+
push_asset_amount: None,
125129
public: true,
126130
with_anchors: true,
127131
fee_base_msat: None,
@@ -154,6 +158,7 @@ async fn open_fail() {
154158
push_msat: 3_500_000,
155159
asset_amount: None,
156160
asset_id: None,
161+
push_asset_amount: None,
157162
public: true,
158163
with_anchors: true,
159164
fee_base_msat: None,
@@ -186,6 +191,7 @@ async fn open_fail() {
186191
push_msat: 3_500_000,
187192
asset_amount: Some(100),
188193
asset_id: Some(asset_id.clone()),
194+
push_asset_amount: None,
189195
public: true,
190196
with_anchors: true,
191197
fee_base_msat: None,
@@ -220,6 +226,7 @@ async fn open_fail() {
220226
push_msat: 100_000_000,
221227
asset_amount: Some(100),
222228
asset_id: Some(asset_id.clone()),
229+
push_asset_amount: None,
223230
public: true,
224231
with_anchors: true,
225232
fee_base_msat: None,
@@ -252,6 +259,7 @@ async fn open_fail() {
252259
push_msat: 100_000_001,
253260
asset_amount: Some(100),
254261
asset_id: Some(asset_id.clone()),
262+
push_asset_amount: None,
255263
public: true,
256264
with_anchors: true,
257265
fee_base_msat: None,
@@ -284,6 +292,7 @@ async fn open_fail() {
284292
push_msat: 3_500_000,
285293
asset_amount: Some(100),
286294
asset_id: Some(asset_id.clone()),
295+
push_asset_amount: None,
287296
public: true,
288297
with_anchors: false,
289298
fee_base_msat: None,
@@ -318,6 +327,7 @@ async fn open_fail() {
318327
push_msat: 0,
319328
asset_amount: None,
320329
asset_id: None,
330+
push_asset_amount: None,
321331
public: true,
322332
with_anchors: true,
323333
fee_base_msat: None,
@@ -350,6 +360,7 @@ async fn open_fail() {
350360
push_msat: 3_500_000,
351361
asset_amount: Some(2000),
352362
asset_id: Some(asset_id.clone()),
363+
push_asset_amount: None,
353364
public: true,
354365
with_anchors: true,
355366
fee_base_msat: None,
@@ -382,6 +393,7 @@ async fn open_fail() {
382393
push_msat: 3_500_000,
383394
asset_amount: Some(100),
384395
asset_id: Some(asset_id.clone()),
396+
push_asset_amount: None,
385397
public: true,
386398
with_anchors: true,
387399
fee_base_msat: None,
@@ -414,6 +426,7 @@ async fn open_fail() {
414426
push_msat: 3_500_000,
415427
asset_amount: Some(100),
416428
asset_id: Some(asset_id.clone()),
429+
push_asset_amount: None,
417430
public: true,
418431
with_anchors: true,
419432
fee_base_msat: None,
@@ -434,6 +447,7 @@ async fn open_fail() {
434447
push_msat: 3_500_000,
435448
asset_amount: Some(100),
436449
asset_id: Some(asset_id),
450+
push_asset_amount: None,
437451
public: true,
438452
with_anchors: true,
439453
fee_base_msat: None,

src/test/openchannel_optional_addr.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ async fn openchannel_optional_addr_forward() {
3030
push_msat: 3_500_000,
3131
asset_amount: Some(600),
3232
asset_id: Some(asset_id.clone()),
33+
push_asset_amount: None,
3334
public: true,
3435
with_anchors: true,
3536
fee_base_msat: None,
@@ -113,6 +114,7 @@ async fn openchannel_optional_addr_reverse() {
113114
push_msat: 3_500_000,
114115
asset_amount: Some(600),
115116
asset_id: Some(asset_id.clone()),
117+
push_asset_amount: None,
116118
public: true,
117119
with_anchors: true,
118120
fee_base_msat: None,

0 commit comments

Comments
 (0)