* feat: implement exponential backoff for paid_invoices_stream across all Lightning backends
- Add exponential backoff retry logic to CLN REST, LND REST, and LND gRPC backends
- Start with 1 second delay, exponentially increase up to 5 minutes maximum
- Reset delay to 1 second on successful reconnection
- Improve error logging to include retry delay information
- Replace fixed delays with adaptive backoff to handle network issues gracefully
- Prevents system overload during persistent connection problems
Resolves issues with rapid reconnection attempts that could overwhelm Lightning nodes during network instability.
* remove unused import
* feat: extend exponential backoff to all remaining backends and invoice listener
- Implement exponential backoff in LNbits paid_invoices_stream for both SSE and WebSocket modes
- Add exponential backoff guidance comments to Blink and Strike backends (not implemented)
- Apply exponential backoff to invoice_listener in tasks.py that calls paid_invoices_stream
- Ensure consistent retry behavior across all Lightning backend integrations
- Improve system resilience during network interruptions and backend failures
All backends and the invoice listener now use the same exponential backoff strategy:
- Start with 1 second delay, exponentially increase up to 5 minutes maximum
- Reset delay to 1 second on successful reconnection
- Enhanced error logging with retry delay information
* blink + strike remove comments
* remove hardcoded values in favor of settings
* immediate first retry
* wip store balance
* store balances in watchdog worker
* move mint_auth_database setting
* auth db
* balances returned as Amount (instead of int)
* add test for balance change on invoice receive
* fix 1 test
* cancel tasks on shutdown
* watchdog can now abort
* remove wallet api server
* fix lndgrpc
* fix lnbits balance
* disable watchdog
* balance lnbits msat
* test db watcher with its own database connection
* init superclass only once
* wip: log balance in keysets table
* check max balance using new keyset balance
* fix test
* fix another test
* store fees in keysets
* format
* cleanup
* shorter
* add keyset migration to auth server
* fix fakewallet
* fix db tests
* fix postgres problems during migration 26 (mint)
* fix cln
* ledger
* working with pending
* super fast watchdog, errors
* test new pipeline
* delete walletapi
* delete unneeded files
* revert workflows
* WIP settle different units externally
* mint melt externally different units
* deprecated route return only sat
* comment
---------
Co-authored-by: callebtc <93376500+callebtc@users.noreply.github.com>
* wallet: add fees to outputs for melt that requires a split
* add test that requires a swap
* verify test fails, will revert
* revert true
* hopefully fix the tests
* fix default fee selection
* cleanup and renamings
* cleanup coinselect function, estimate fees
* fix test
* add comments
* weird error
* `PaymentResult`
* ledger: rely on PaymentResult instead of paid flag. Double check for payments marked pending.
* `None` is `PENDING`
* make format
* reflected changes API tests where `PaymentStatus` is used + reflected changes in lnbits
* reflect changes in blink backend and tests
* fix lnbits get_payment_status
* remove paid flag
* fix mypy
* remove more paid flags
* fix strike mypy
* green
* shorten all state checks
* fix
* fix some tests
* gimme ✅
* fix............
* fix lnbits
* fix error
* lightning refactor
* add more regtest tests
* add tests for pending state and failure
* shorten checks
* use match case for startup check - and remember modified checking_id from pay_invoice
* fix strike pending return
* new tests?
* refactor startup routine into get_melt_quote
* test with purge
* refactor blink
* cleanup responses
* blink: return checking_id on failure
* fix lndgrpc try except
* add more testing for melt branches
* speed things up a bit
* remove comments
* remove comments
* block pending melt quotes
* remove comments
---------
Co-authored-by: lollerfirst <lollerfirst@gmail.com>
* NUT-04: add description
* skip test for deprecated api
* fix for lndgrpc
* add test for cli
* add two random tests
* add max length to request model validator
* skip cli test with description for deprecated api
* add cli test for invoice command
* default value to None
* clean up db
* db: table lock
* db.table_with_schema
* fix encrypt.py
* postgres nowait
* add timeout to lock
* melt quote state in db
* kinda working
* kinda working with postgres
* remove dispose
* getting there
* porperly clean up db for tests
* faster tests
* configure connection pooling
* try github with connection pool
* invoice dispatcher does not lock db
* fakewallet: pay_if_regtest waits
* pay fakewallet invoices
* add more
* faster
* slower
* pay_if_regtest async
* do not lock the invoice dispatcher
* test: do I get disk I/O errors if we disable the invoice_callback_dispatcher?
* fix fake so it workss without a callback dispatchert
* test on github
* readd tasks
* refactor
* increase time for lock invoice disatcher
* try avoiding a race
* remove task
* github actions: test regtest with postgres
* mint per module
* no connection pool for testing
* enable pool
* do not resend paid event
* reuse connection
* close db connections
* sessions
* enable debug
* dispose engine
* disable connection pool for tests
* enable connection pool for postgres only
* clean up shutdown routine
* remove wait for lightning fakewallet lightning invoice
* cancel invoice listener tasks on shutdown
* fakewallet conftest: decrease outgoing delay
* delay payment and set postgres only if needed
* disable fail fast for regtest
* clean up regtest.yml
* change order of tests_db.py
* row-specific mint_quote locking
* refactor
* fix lock statement
* refactor swap
* refactor
* remove psycopg2
* add connection string example to .env.example
* remove unnecessary pay
* shorter sleep in test_wallet_subscription_swap
* log cln error
* return a string
* update corelightningrest to work with latest ver using rune
* fix mpp spec and backend support check
* refactor validation in ledger
* remove weird error
* fix mpp melt model
* corelightningrest.py: Added Multi-Mint payout support
lndrest.py: fix `quote.amount` is not always in sats + better checks
* small fix
* Fix quote.unit str2unit conversion + add missing imports
* settings enable mpp corelightning (default false)
* small fix
* fix `paid_invoice_stream`
* make format
* handle runes
* load rune
* rename to MINT_CORELIGHTNING_REST_RUNE
* try without cert
* port
* try except callback dispatcher
* clean up cln-rest streaming parser
* conftest: mint_corelightning_enable_mpp
* enable mpp in regtest.yaml
* fix error handling clnrest, remove lndrest changes
* CLNRest + CoreLightningRest
* clean up corelightningrest and get last index before starting the stream
* clean up
---------
Co-authored-by: callebtc <93376500+callebtc@users.noreply.github.com>
Co-authored-by: Richard Bensberg <r@coinbatsu.com>
* LND Backend
- Add MINT_LND_REST_CERT_VERIFY bool variable that when set to False allows
verify=False for httpx and ignore LND selfsigned certificate validation
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
modified: .env.example
modified: cashu/core/settings.py
modified: cashu/lightning/lndrest.py
* Update .env.example
---------
Co-authored-by: callebtc <93376500+callebtc@users.noreply.github.com>
* add websockets for quote updates
* add test (not working)
* wip: emit events to everyone
* wip: emit events to everyone
* wip, lots of things broken but invoice callback works
* wip
* add wip files
* tests almost passing
* add task
* refactor nut constants
* startup fix
* works with old mints
* wip cli
* fix mypy
* remove automatic invoice test now with websockets
* remove comment
* better logging
* send back response
* add rate limiter to websocket
* add rate limiter to subscriptions
* refactor websocket ratelimit
* websocket tests
* subscription kinds
* doesnt start
* remove circular import
* update
* fix mypy
* move test file in test because it fails if it runs later... dunno why
* adjust websocket NUT-06 settings
* local import and small fix
* disable websockets in CLI if "no_check" is selected
* move subscription test to where it was
* check proof state with callback, add tests
* tests: run mint fixture per module instead of per session
* subscription command name fix
* test per session again
* update test race conditions
* fix tests
* clean up
* tmp
* fix db issues and remove cached secrets
* fix tests
* blindly try pipeline
* remove comments
* comments
* wip
* wip
* model
* refactor wallet transactions
* refactor wallet
* sending with fees works and outputs fill up the wallet
* wip work
* ok
* comments
* receive with amount=0
* correctly import postmeltrequest
* fix melt amount
* tests working
* remove mint_loaded decorator in deprecated wallet api
* wallet works with units
* refactor: melt_quote
* fix fees
* add file
* fees for melt inputs
* set default input fee for internal quotes to 0
* fix coinselect
* coin selection working
* yo
* fix all tests
* clean up
* last commit added fees for inputs for melt transactions - this commit adds a blanace too low exception
* fix fee return and melt quote max allowed amount check during creation of melt quote
* clean up code
* add tests for fees
* add melt tests
* update wallet fee information
* amount in melt request
* apply fee limit
* more error handling
* wip: signal flag in /info
* clean up multinut
* decode mypy error lndrest
* fix test
* fix tests
* signal feature and blindmessages_deprecated
* setting
* fix blindedsignature method
* fix tests
* mint info file
* test mpp with lnd regtest
* nuts optionsl mint
info
* try to enable mpp with lnd
* test mpp with third payment
* wip works with fakewallet
* startup refactor
* add tests
* regtest tests for pending melts
* wip CLN
* remove db migration
* remove foreign key relation to keyset id
* fix: get_promise from db and restore DLEQs
* test: check for keyset not found error
* fix migrations
* lower-case all db column names
* add more tests for regtest
* simlate failure for lightning
* test wallet spent state with hodl invoices
* retry
* regtest with postgres
* retry postgres
* add sleeps
* longer sleep on github
* more sleep for github sigh
* increase sleep ffs
* add sleep loop
* try something
* do not pay with wallet but with ledger
* fix lnbits pending state
* fix pipeline to use fake admin from docker
* wip blink
* Blink working
* check fee correctly
* add comment
* unfix lnbits
* unit test blink backend
* make format
* mypy
* settings
* add error if blink key not set