* feat(rt-sync): add persistency layer (#555)
* feat(rt-sync): add pull and merge (#556)
* feat(rt-sync): add push logic and run method (#568)
* feat(rt-sync): integrate rt-sync with the sdk
fix: add formatting command to build
feat: add secondary trigger to sync
deps: add tonic tls-webpki-roots
feat: prevent double claiming on status stream handlers
fix: add tx commit to chain swap update (#588)
fix: ensure we pull records before prepare_send
fix: fmt and tests
* fix: set initial pulled state to `Recoverable`
* feat(rt-sync): add `last_derivation_index` to sync service
* Single chain source
* Handle Recoverable state
* fix(rt-sync): chain recovery integration (#590)
Co-authored-by: yse <hydra_yse@proton.me>
* feat(rt-sync): add `pair_fees_json`
* fix(rt-sync): clean already persisted incoming records
* feat: cache wallet info (#591)
* log: add status-stream logging for non-local swaps
* Sync improvements (#598)
* Full sync on new Bitcoin block
* Track the last unconfirmed refund tx
* Trigger synced event on partial sync
* fix: remove `REPLACE` clause from swap insert/update
* fix(rt-sync): update chain swap payer/receiver amount (#604)
* Fix syncing last derivation index
* fix: update bindings and lockfile
* remove logs
* fix(rt-sync): avoid reuse of derivation index update logic (#608)
* Add 5 index buffer to full scan
* Fix storing claim_address (#609)
* Filter incoming MRH txs by swap timestamp
* fix liquid panding timestamp
* persist tx data timestamp
* Update unconfirmed transactions
* feat: add API key (#618)
* Use configured lazy connect channel in sync service
* fix: set lower-case header (#624)
* fix error message
* Store & Sync LNURL info (#617)
* Persist and decrypt LNURL info
* Update Notification Plugin
* Sync payment details
* Update list payments to include chain swaps with only user lockup (#620)
* Update payments query to include chain swaps without txs
* Allow emitting a payment event without tx_id
* fix: bindings
---------
Co-authored-by: Ross Savage <hello@satimoto.com>
Co-authored-by: Ross Savage <551697+dangeross@users.noreply.github.com>
Co-authored-by: Roei Erez <roeierez@gmail.com>
* Attempt drain using liquid or lightning payment
* Optimize estimation handling, use address in drain estimation
* Add drain option to PrepareSendRequest
* Block draining while there are pending payments
* Apply suggestions from code review
* Rename PayOnchainAmount to PayAmount
* prepare-pay-onchain: add option for drain in req
* Fix clippy
* ChainSwapStateHandler: gracefully handle building both drain and non-drain lockups
* Send Chain swap: use standard feerate when estimating lockup tx fee
* UDL: move new drain field above the last PreparePayOnchainRequest optional field
* UDL: move new drain field optional
* prepare-pay-onchain: treat normal payment as drain if receiver amount is high enough
If the receiver amount is as high as it would be in case of drain, treat the current prepare-pay-onchain as drain, even if the drain flag is not set.
* build_drain_tx: add optional amount validation
* Add PayOnchainAmount enum to cover amount types (drain, receiver)
* Add ability to find max_receiver_amount_sat for non-drain sends
* Revert "Add ability to find max_receiver_amount_sat for non-drain sends"
This reverts commit 60ee1c768021810f72bc64a8ada69d35b638185e.
* prepare_pay_onchain: treat drain and non-drain cases separately
If the non-drain case is chosen with a receiver_amount equivalent to what drain would have calculated, it results in an error. For drain, the caller has to explicitly choose PayOnchainAmount::Drain.
* CLI: send-onchain-payment accepts optional amount
* CLI: add docs for send-onchain-payment drain arg
* SDK: expand docs for prepare_pay_onchain
* Re-generate RN bindings
* Re-generate flutter bindings
* Integrate webhooks
* Make hash_swap_id optional
* Hash and store the swap id
* Add webhook status include lists
* Remove superfluous webhook statuses
* Verify and fetch user_lockup_tx_id if missing
* Fix tests
* Use bitcoin sha256
* Fix flutter CI
* List payments in reverse chonological order
* Add payment filtering and paging
* Fix examples
* Apply suggestions from code review
Co-authored-by: Erdem Yerebasmaz <erdem@yerebasmaz.com>
* Set timestamp for pseudo payments
* Filter by the first non-null timestamp from the join query
---------
Co-authored-by: Erdem Yerebasmaz <erdem@yerebasmaz.com>
* Check chain swap addresses for unspent outputs
* Monitoring expired swaps up to 4320 blocks after expiration
* Refactor chain swap monitoring
* Handle the error to prevent the loop exiting
* Add RefundPending state
* Check if RefundPendingbefore setting to Refundable
* Use script_get_balance to determine spent state
* Use unconfirmed balance to check if RefundPending should be reset to Refundable
* Implement Chain Swaps for receiving
* Send: validate if we have sufficient funds (#321)
* Implement Chain Swaps for receiving
* Fix rebase of flutter_rust_bridge version
* Send: validate if we have sufficient funds
* Re-generate FRB
---------
Co-authored-by: Ross Savage <hello@satimoto.com>
* Chaim swap claim: remove refund_tx arg (#328)
---------
Co-authored-by: ok300 <106775972+ok300@users.noreply.github.com>
* Add SDK global logger
* Add bindings
* Fix path to internal uniffi log
* Exclude "set_log_stream" from generated RN methods
* Move logger-specific structs to a separate module
* Delegate init_logging to method in logger.rs
* Rename uniffi BindingLogger to UniffiBindingLogger
* Add set_log_stream for dart bindings
* Add SDK logger to Dart bindings
* Rename dart binding logger to DartBindingLogger
* Add rustdocs
* RN bindings: Add manual handling for setLogStream()
* Re-generate dart bindings
* Re-generate RN bindings
* Remove LOG_INIT cell
* Set global maximum log level once on initialization
Return a LiquidSdkError::Generic instead of Anyhow error when initializing log stream on Dart bindings
* Do not panic when initializing binding loggers
* Rename LogStream to Logger
---------
Co-authored-by: Erdem Yerebasmaz <erdem@yerebasmaz.com>
* Add shutdown signal handling
Revert periodic sync interval change
Revert keep-alive interval change
CLI: Add disconnect command
SDK: Add scaffolding for is_started, shutdown()
Simplify instance init
* Rebase on savage-async-ws branch
* Avoid waiting when shutdown signal is received in the sync loop
* Directly use shutdown signal in background threads
* Acquire is_started lock at the very beginning of start()
* Fix cargo clippy warnings
* Update RN generator (kt): set bindingLiquidSdk to null on disconnect()
* Update RN generator (swift): set bindingLiquidSdk to nil on disconnect()
* Startup: only run foreground sync() if this could be the first run
* Start a sync() in background, before regular sync() loop
* Remove ensure_started check from start()
* Add bindings for disconnect()
* Remove foreground sync condition from startup
* Simplify background sync loop
* Rename swap tables: remove ongoing_ prefix
* Add swap status enums and filtering
* Swap-in: add claim_txid
* Swap-out: add claim_txid
* resolve_swap: Don't remove swap when complete
* Fixups after rebase
* Remove unused method
* Consider payment as pending based on confirmations
An onchain payment with no confirmations is considered
pending. The previous logic of converting pending swaps
into pending payments is removed, since we may have
pending swaps that should not result in pending
payments (for example on Receive, before the invoice
is paid).
* Fix swap-in query
* GetInfoResponse: fix balance, include pending
* Remove unused method
* Re-generate flutter bridge files
* Re-generate RN bindings
* Fix payment_type detection in list_payments
* Send: persist to DB when claim tx is seen
* Receive: fix occasional error when broadcasting claim
* Remove fixed TODO
* Receive: only rescan on testnet, where Electrum is used to broadcast
* Log more details when broadcasting fails
* Improve AlreadyClaimed error detection and handling
* Rename SubmarineSwapStatus::Initial to Created
* Split pending payment types into separate field status
* Rename swap status enums
* Fix INSERT query
* Bump lwk libraries
* Simplify Receive try_handle_reverse_swap_status loop
* Change resolve_swap to insert_or_update_payment
* Refactor payment data persistence
* Remove unused dependency
* Bump LWK dependencies
* Rename reconcile_payments_with_onchain
* Rename try_claim_v2
* Rename address() to next_unused_address()
* Move all claim persistence writes in try_claim
* Flatten Payment struct
* Re-generate bindings
* Expose sync() in service interface
* Set Send ws stream as nonblocking, use singleton stream
* Send_payment: sync() before handling new state
* Sync() on sdk.connect()
* Remove unused args from list_payments()
* Receive: rename DB field redeem_script to response JSON
* Convert to and from internal structs to persist CreateResponse JSON
* De-duplicate internal CreateResponse structs to prevent storing same field twice
* Schedule a periodic sync() thread on startup
* Persist swap states and add methods to transition between them
* Handle unwrap() when subscribing for WS updates
* Status Stream: handle remaining unwraps() and TODOs
* Consolidate status transitions into two SDK methods
* Status Stream: reconnect and resume tracking on disconnect
* Remove superfluous TODO
* Send swaps: correctly transition to Complete even if app killed during send_payment()
* State transitions: Move SQL queries to persistence layer
* Send: handle edge TransactionClaimed edge-case
* Send: mark as Complete after we check the preimage
* Send: remove marking as Complete on TransactionClaimed