Skip to content

Commit 79462db

Browse files
authored
Verify and claim swap if not verifiable in swap loop (#681)
* Verify and claim swap if not verifiable in swap loop * Verify lockup amount * Tolerate overpayment * Adapt receive swap test * Separate verification functions and set swap Failed if underpaid
1 parent 386c62e commit 79462db

15 files changed

+325
-141
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ packages/flutter/ios/Classes/breez_sdk_liquidFFI.h
99
packages/flutter/macos/Classes/breez_sdk_liquidFFI.h
1010
# Miscellaneous
1111
.DS_Store
12+
*.sln
1213
.idea/
1314

1415
**/target

lib/core/src/chain_swap.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1549,6 +1549,7 @@ mod tests {
15491549
None,
15501550
false,
15511551
false,
1552+
None,
15521553
);
15531554
persister.insert_or_update_chain_swap(&chain_swap)?;
15541555

@@ -1582,6 +1583,7 @@ mod tests {
15821583
None,
15831584
false,
15841585
false,
1586+
None,
15851587
);
15861588
persister.insert_or_update_chain_swap(&chain_swap)?;
15871589

lib/core/src/persist/backup.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ mod tests {
4747
fn test_backup_and_restore() -> Result<()> {
4848
create_persister!(local);
4949

50-
local.insert_or_update_send_swap(&new_send_swap(Some(PaymentState::Pending)))?;
51-
local.insert_or_update_receive_swap(&new_receive_swap(Some(PaymentState::Pending)))?;
50+
local.insert_or_update_send_swap(&new_send_swap(Some(PaymentState::Pending), None))?;
51+
local
52+
.insert_or_update_receive_swap(&new_receive_swap(Some(PaymentState::Pending), None))?;
5253
assert_eq!(local.list_ongoing_swaps()?.len(), 2);
5354

5455
let backup_path = local.get_default_backup_path();

lib/core/src/persist/chain.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ mod tests {
548548
async fn test_writing_stale_swap() -> Result<()> {
549549
create_persister!(storage);
550550

551-
let chain_swap = new_chain_swap(Direction::Incoming, None, false, None, false, false);
551+
let chain_swap = new_chain_swap(Direction::Incoming, None, false, None, false, false, None);
552552
storage.insert_or_update_chain_swap(&chain_swap)?;
553553

554554
// read - update - write works if there are no updates in between
@@ -575,7 +575,7 @@ mod tests {
575575
create_persister!(storage);
576576

577577
let chain_swap_local_with_sync_state =
578-
new_chain_swap(Direction::Incoming, None, false, None, false, false);
578+
new_chain_swap(Direction::Incoming, None, false, None, false, false, None);
579579
storage.insert_or_update_chain_swap(&chain_swap_local_with_sync_state)?;
580580
storage.set_sync_state(SyncState {
581581
data_id: chain_swap_local_with_sync_state.id.clone(),
@@ -585,11 +585,11 @@ mod tests {
585585
})?;
586586

587587
let chain_swap_local_no_sync_state =
588-
new_chain_swap(Direction::Incoming, None, false, None, false, false);
588+
new_chain_swap(Direction::Incoming, None, false, None, false, false, None);
589589
storage.insert_or_update_chain_swap(&chain_swap_local_no_sync_state)?;
590590

591591
let chain_swap_not_local =
592-
new_chain_swap(Direction::Incoming, None, false, None, false, false);
592+
new_chain_swap(Direction::Incoming, None, false, None, false, false, None);
593593
storage.insert_or_update_chain_swap(&chain_swap_not_local)?;
594594
storage.set_sync_state(SyncState {
595595
data_id: chain_swap_not_local.id,

lib/core/src/persist/mod.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ impl Persister {
357357
.map(Swap::Send)
358358
.collect();
359359
let ongoing_receive_swaps: Vec<Swap> = self
360-
.list_ongoing_receive_swaps()?
360+
.list_ongoing_receive_swaps(None)?
361361
.into_iter()
362362
.map(Swap::Receive)
363363
.collect();
@@ -1022,8 +1022,9 @@ mod tests {
10221022
fn test_list_ongoing_swaps() -> Result<()> {
10231023
create_persister!(storage);
10241024

1025-
storage.insert_or_update_send_swap(&new_send_swap(None))?;
1026-
storage.insert_or_update_receive_swap(&new_receive_swap(Some(PaymentState::Pending)))?;
1025+
storage.insert_or_update_send_swap(&new_send_swap(None, None))?;
1026+
storage
1027+
.insert_or_update_receive_swap(&new_receive_swap(Some(PaymentState::Pending), None))?;
10271028

10281029
assert_eq!(storage.list_ongoing_swaps()?.len(), 2);
10291030

lib/core/src/persist/receive.rs

+23-9
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,12 @@ impl Persister {
156156
rs.created_at,
157157
rs.state,
158158
rs.pair_fees_json,
159-
rs.version
159+
rs.version,
160+
161+
-- Used for filtering
162+
sync_state.is_local
160163
FROM receive_swaps AS rs
164+
LEFT JOIN sync_state ON rs.id = sync_state.data_id
161165
{where_clause_str}
162166
ORDER BY rs.created_at
163167
"
@@ -222,12 +226,21 @@ impl Persister {
222226
Ok(ongoing_receive)
223227
}
224228

225-
pub(crate) fn list_ongoing_receive_swaps(&self) -> Result<Vec<ReceiveSwap>> {
229+
pub(crate) fn list_ongoing_receive_swaps(
230+
&self,
231+
is_local: Option<bool>,
232+
) -> Result<Vec<ReceiveSwap>> {
226233
let con = self.get_connection()?;
227-
let where_clause = vec![get_where_clause_state_in(&[
234+
let mut where_clause = vec![get_where_clause_state_in(&[
228235
PaymentState::Created,
229236
PaymentState::Pending,
230237
])];
238+
if let Some(is_local) = is_local {
239+
where_clause.push(format!(
240+
"(sync_state.is_local = {} OR sync_state.is_local IS NULL)",
241+
is_local as i8
242+
));
243+
}
231244

232245
self.list_receive_swaps_where(&con, where_clause)
233246
}
@@ -397,7 +410,7 @@ mod tests {
397410
fn test_fetch_receive_swap() -> Result<()> {
398411
create_persister!(storage);
399412

400-
let receive_swap = new_receive_swap(None);
413+
let receive_swap = new_receive_swap(None, None);
401414

402415
storage.insert_or_update_receive_swap(&receive_swap)?;
403416
// Fetch swap by id
@@ -417,16 +430,17 @@ mod tests {
417430
// List general receive swaps
418431
let range = 0..3;
419432
for _ in range.clone() {
420-
storage.insert_or_update_receive_swap(&new_receive_swap(None))?;
433+
storage.insert_or_update_receive_swap(&new_receive_swap(None, None))?;
421434
}
422435

423436
let con = storage.get_connection()?;
424437
let swaps = storage.list_receive_swaps_where(&con, vec![])?;
425438
assert_eq!(swaps.len(), range.len());
426439

427440
// List ongoing receive swaps
428-
storage.insert_or_update_receive_swap(&new_receive_swap(Some(PaymentState::Pending)))?;
429-
let ongoing_swaps = storage.list_ongoing_receive_swaps()?;
441+
storage
442+
.insert_or_update_receive_swap(&new_receive_swap(Some(PaymentState::Pending), None))?;
443+
let ongoing_swaps = storage.list_ongoing_receive_swaps(None)?;
430444
assert_eq!(ongoing_swaps.len(), 4);
431445

432446
Ok(())
@@ -436,7 +450,7 @@ mod tests {
436450
fn test_update_receive_swap() -> Result<()> {
437451
create_persister!(storage);
438452

439-
let receive_swap = new_receive_swap(None);
453+
let receive_swap = new_receive_swap(None, None);
440454
storage.insert_or_update_receive_swap(&receive_swap)?;
441455

442456
// Update metadata
@@ -466,7 +480,7 @@ mod tests {
466480
async fn test_writing_stale_swap() -> Result<()> {
467481
create_persister!(storage);
468482

469-
let receive_swap = new_receive_swap(None);
483+
let receive_swap = new_receive_swap(None, None);
470484
storage.insert_or_update_receive_swap(&receive_swap)?;
471485

472486
// read - update - write works if there are no updates in between

lib/core/src/persist/send.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ mod tests {
400400
#[test]
401401
fn test_fetch_send_swap() -> Result<()> {
402402
create_persister!(storage);
403-
let send_swap = new_send_swap(None);
403+
let send_swap = new_send_swap(None, None);
404404

405405
storage.insert_or_update_send_swap(&send_swap)?;
406406
// Fetch swap by id
@@ -420,15 +420,15 @@ mod tests {
420420
// List general send swaps
421421
let range = 0..3;
422422
for _ in range.clone() {
423-
storage.insert_or_update_send_swap(&new_send_swap(None))?;
423+
storage.insert_or_update_send_swap(&new_send_swap(None, None))?;
424424
}
425425

426426
let con = storage.get_connection()?;
427427
let swaps = storage.list_send_swaps_where(&con, vec![])?;
428428
assert_eq!(swaps.len(), range.len());
429429

430430
// List ongoing send swaps
431-
storage.insert_or_update_send_swap(&new_send_swap(Some(PaymentState::Pending)))?;
431+
storage.insert_or_update_send_swap(&new_send_swap(Some(PaymentState::Pending), None))?;
432432
let ongoing_swaps = storage.list_ongoing_send_swaps()?;
433433
assert_eq!(ongoing_swaps.len(), 4);
434434

@@ -443,7 +443,7 @@ mod tests {
443443
fn test_update_send_swap() -> Result<()> {
444444
create_persister!(storage);
445445

446-
let mut send_swap = new_send_swap(None);
446+
let mut send_swap = new_send_swap(None, None);
447447
storage.insert_or_update_send_swap(&send_swap)?;
448448

449449
// Update metadata
@@ -486,7 +486,7 @@ mod tests {
486486
async fn test_writing_stale_swap() -> Result<()> {
487487
create_persister!(storage);
488488

489-
let send_swap = new_send_swap(None);
489+
let send_swap = new_send_swap(None, None);
490490
storage.insert_or_update_send_swap(&send_swap)?;
491491

492492
// read - update - write works if there are no updates in between

0 commit comments

Comments
 (0)