Compare commits

...

6 commits

Author SHA1 Message Date
e062743e5a feat: implement automatic crediting of new accounts with 1 million satoshis
- Modified the user account creation process to automatically credit new
accounts with 1,000,000 satoshis upon creation.
- Updated the `create_user_account_no_ckeck` function to include error
handling and logging for the credit operation.
- Enhanced tests to verify the balance for newly registered users,
ensuring the correct credit amount is applied.
- Documented affected account creation paths and testing instructions in
the new `AUTO_CREDIT_CHANGES.md` file.

fix: pass db connection to update_wallet_balance to prevent SQLite deadlock

The auto-credit feature was causing a deadlock on SQLite because
update_wallet_balance was opening a new database connection while
already inside a transaction. By passing conn=conn, we reuse the
existing connection and avoid the deadlock.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 00:13:37 +01:00
359e9d8b29 fix(lndrest): use boolean for allow_self_payment instead of integer
Some checks failed
LNbits CI / test-api (, 3.10) (push) Has been cancelled
LNbits CI / test-api (, 3.11) (push) Has been cancelled
LNbits CI / test-api (, 3.12) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-unit (, 3.11) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / test-wallets (, 3.10) (push) Has been cancelled
LNbits CI / test-wallets (, 3.11) (push) Has been cancelled
LNbits CI / test-wallets (, 3.12) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / test-unit (, 3.10) (push) Has been cancelled
LNbits CI / test-unit (, 3.12) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / migration (3.10) (push) Has been cancelled
LNbits CI / migration (3.11) (push) Has been cancelled
LNbits CI / migration (3.12) (push) Has been cancelled
LNbits CI / openapi (push) Has been cancelled
LNbits CI / regtest (BoltzWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (CoreLightningRestWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (CoreLightningWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (EclairWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LNbitsWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LndRestWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LndWallet, 3.10) (push) Has been cancelled
LNbits CI / jmeter (3.10) (push) Has been cancelled
LND's /v2/router/send endpoint expects allow_self_payment to be a JSON
boolean, not an integer. Sending 1 instead of true causes a 400 error:
'proto: invalid value for bool type: 1'

Fixes payments failing when lnd_rest_allow_self_payment is enabled.
2026-01-07 00:12:07 +01:00
b3817959a0 update nostrrelay to v0.0.2
Some checks are pending
codeql / analyze (push) Waiting to run
LNbits CI / test-api (, 3.11) (push) Blocked by required conditions
LNbits CI / test-api (, 3.12) (push) Blocked by required conditions
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Blocked by required conditions
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Blocked by required conditions
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Blocked by required conditions
LNbits CI / test-wallets (, 3.10) (push) Blocked by required conditions
LNbits CI / test-wallets (, 3.11) (push) Blocked by required conditions
LNbits CI / test-wallets (, 3.12) (push) Blocked by required conditions
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Blocked by required conditions
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Blocked by required conditions
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Blocked by required conditions
LNbits CI / test-unit (, 3.10) (push) Blocked by required conditions
LNbits CI / test-unit (, 3.11) (push) Blocked by required conditions
LNbits CI / test-unit (, 3.12) (push) Blocked by required conditions
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Blocked by required conditions
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Blocked by required conditions
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Blocked by required conditions
LNbits CI / migration (3.10) (push) Blocked by required conditions
LNbits CI / migration (3.11) (push) Blocked by required conditions
LNbits CI / migration (3.12) (push) Blocked by required conditions
LNbits CI / openapi (push) Blocked by required conditions
LNbits CI / regtest (BoltzWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (CoreLightningRestWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (CoreLightningWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (EclairWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (LNbitsWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (LndRestWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (LndWallet, 3.10) (push) Blocked by required conditions
LNbits CI / jmeter (3.10) (push) Blocked by required conditions
this fixes critical bug stopping order invoices from beings sent
following purchase
2026-01-06 23:13:17 +01:00
1074ca4d9a update satmachineadmin to v0.0.3 to fix
Some checks failed
LNbits CI / test-api (, 3.10) (push) Has been cancelled
LNbits CI / test-api (, 3.11) (push) Has been cancelled
LNbits CI / test-api (, 3.12) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / test-wallets (, 3.10) (push) Has been cancelled
LNbits CI / test-wallets (, 3.11) (push) Has been cancelled
LNbits CI / test-wallets (, 3.12) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / test-unit (, 3.10) (push) Has been cancelled
LNbits CI / test-unit (, 3.11) (push) Has been cancelled
LNbits CI / test-unit (, 3.12) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / migration (3.10) (push) Has been cancelled
LNbits CI / migration (3.11) (push) Has been cancelled
LNbits CI / migration (3.12) (push) Has been cancelled
LNbits CI / openapi (push) Has been cancelled
LNbits CI / regtest (BoltzWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (CoreLightningRestWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (CoreLightningWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (EclairWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LNbitsWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LndRestWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LndWallet, 3.10) (push) Has been cancelled
LNbits CI / jmeter (3.10) (push) Has been cancelled
2026-01-05 12:19:35 +01:00
41c0dcfdcd updated satmachineadmin v0.0.2 important fix for 1.4
Some checks are pending
LNbits CI / lint (push) Waiting to run
LNbits CI / test-api (, 3.10) (push) Blocked by required conditions
LNbits CI / test-api (, 3.11) (push) Blocked by required conditions
LNbits CI / test-api (, 3.12) (push) Blocked by required conditions
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Blocked by required conditions
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Blocked by required conditions
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Blocked by required conditions
LNbits CI / test-wallets (, 3.10) (push) Blocked by required conditions
LNbits CI / test-wallets (, 3.11) (push) Blocked by required conditions
LNbits CI / test-wallets (, 3.12) (push) Blocked by required conditions
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Blocked by required conditions
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Blocked by required conditions
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Blocked by required conditions
LNbits CI / test-unit (, 3.10) (push) Blocked by required conditions
LNbits CI / test-unit (, 3.11) (push) Blocked by required conditions
LNbits CI / test-unit (, 3.12) (push) Blocked by required conditions
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Blocked by required conditions
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Blocked by required conditions
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Blocked by required conditions
LNbits CI / migration (3.10) (push) Blocked by required conditions
LNbits CI / migration (3.11) (push) Blocked by required conditions
LNbits CI / migration (3.12) (push) Blocked by required conditions
LNbits CI / openapi (push) Blocked by required conditions
LNbits CI / regtest (BoltzWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (CoreLightningRestWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (CoreLightningWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (EclairWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (LNbitsWallet, 3.10) (push) Blocked by required conditions
LNbits CI / regtest (LndRestWallet, 3.10) (push) Blocked by required conditions
codeql / analyze (push) Waiting to run
2026-01-05 11:34:06 +01:00
5bec5f9c5f update events to v0.0.2
Some checks failed
LNbits CI / test-api (, 3.10) (push) Has been cancelled
LNbits CI / test-api (, 3.11) (push) Has been cancelled
LNbits CI / test-api (, 3.12) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-api (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / test-wallets (, 3.10) (push) Has been cancelled
LNbits CI / test-wallets (, 3.11) (push) Has been cancelled
LNbits CI / test-wallets (, 3.12) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-wallets (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / test-unit (, 3.10) (push) Has been cancelled
LNbits CI / test-unit (, 3.11) (push) Has been cancelled
LNbits CI / test-unit (, 3.12) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.10) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.11) (push) Has been cancelled
LNbits CI / test-unit (postgres://lnbits:lnbits@0.0.0.0:5432/lnbits, 3.12) (push) Has been cancelled
LNbits CI / migration (3.10) (push) Has been cancelled
LNbits CI / migration (3.11) (push) Has been cancelled
LNbits CI / migration (3.12) (push) Has been cancelled
LNbits CI / openapi (push) Has been cancelled
LNbits CI / regtest (BoltzWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (CoreLightningRestWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (CoreLightningWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (EclairWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LNbitsWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LndRestWallet, 3.10) (push) Has been cancelled
LNbits CI / regtest (LndWallet, 3.10) (push) Has been cancelled
LNbits CI / jmeter (3.10) (push) Has been cancelled
2026-01-03 18:11:27 +01:00
5 changed files with 130 additions and 4 deletions

88
AUTO_CREDIT_CHANGES.md Normal file
View file

@ -0,0 +1,88 @@
# LNBits Auto-Credit Changes
## Overview
Modified LNBits server to automatically credit new accounts with 1 million satoshis (1,000,000 sats) when they are created.
## Changes Made
### 1. Modified `lnbits/core/services/users.py`
**Added imports:**
- `get_wallet` from `..crud`
- `update_wallet_balance` from `.payments`
**Modified `create_user_account_no_ckeck` function:**
- Changed `create_wallet` call to capture the returned wallet object
- Added automatic credit of 1,000,000 sats after wallet creation
- Added error handling and logging for the credit operation
**Code changes:**
```python
# Before:
await create_wallet(
user_id=account.id,
wallet_name=wallet_name or settings.lnbits_default_wallet_name,
)
# After:
wallet = await create_wallet(
user_id=account.id,
wallet_name=wallet_name or settings.lnbits_default_wallet_name,
)
# Credit new account with 1 million satoshis
try:
await update_wallet_balance(wallet, 1_000_000)
logger.info(f"Credited new account {account.id} with 1,000,000 sats")
except Exception as e:
logger.error(f"Failed to credit new account {account.id} with 1,000,000 sats: {e}")
```
### 2. Updated Tests in `tests/api/test_auth.py`
**Modified test functions:**
- `test_register_ok`: Added balance verification for regular user registration
- `test_register_nostr_ok`: Added balance verification for Nostr authentication
**Added assertions:**
```python
# Check that the wallet has 1 million satoshis
wallet = user.wallets[0]
assert wallet.balance == 1_000_000, f"Expected 1,000,000 sats balance, got {wallet.balance} sats"
```
## Affected Account Creation Paths
The automatic credit will be applied to all new accounts created through:
1. **Regular user registration** (`/api/v1/auth/register`)
2. **Nostr authentication** (`/api/v1/auth/nostr`)
3. **SSO login** (when new account is created)
4. **API account creation** (`/api/v1/account`)
5. **Admin user creation** (via admin interface)
## Excluded Paths
- **Superuser/Admin account creation** (`init_admin_settings`): This function creates the admin account directly and bypasses the user creation flow, so it won't receive the automatic credit.
## Testing
To test the changes:
1. Install dependencies: `poetry install`
2. Run the modified tests: `poetry run pytest tests/api/test_auth.py::test_register_ok -v`
3. Run Nostr test: `poetry run pytest tests/api/test_auth.py::test_register_nostr_ok -v`
## Logging
The system will log:
- Success: `"Credited new account {account.id} with 1,000,000 sats"`
- Failure: `"Failed to credit new account {account.id} with 1,000,000 sats: {error}"`
## Notes
- The credit uses the existing `update_wallet_balance` function which creates an internal payment record
- The credit is applied after wallet creation but before user extensions are set up
- Error handling ensures that account creation continues even if the credit fails
- The credit amount is hardcoded to 1,000,000 sats (1MM sats)

View file

@ -14,6 +14,17 @@
"archive": "https://git.atitlan.io/aiolabs/satmachineadmin/archive/v0.0.1.zip",
"hash": "e9b61de40e940f05aca460a0560cd3cc8b98f2f0d861e37cef13b046eaec0b7c"
},
{
"id": "satmachineadmin",
"repo": "https://git.atitlan.io/aiolabs/satmachineadmin",
"name": "Satoshi Machine Admin",
"min_lnbits_version": "1.4.0",
"version": "0.0.3",
"short_description": "Admin Dashboard for Satoshi Machine",
"icon": "https://git.atitlan.io/aiolabs/satmachineadmin/raw/branch/main/static/image/aio.png",
"archive": "https://git.atitlan.io/aiolabs/satmachineadmin/archive/v0.0.3.zip",
"hash": "0cf520ee62037298320d8c0caa6f15d89858447d826af53472cb369023eda46d"
},
{
"id": "satmachineclient",
"repo": "https://git.atitlan.io/aiolabs/satmachineclient",
@ -34,6 +45,16 @@
"archive": "https://git.atitlan.io/aiolabs/events/archive/v0.0.1.zip",
"hash": "410ac9c340551aabe88e0dc7393ed30dc7f4703f1345af5e6b02b0ebc5337d52"
},
{
"id": "events",
"repo": "https://git.atitlan.io/aiolabs/events",
"name": "AIO Events",
"version": "0.0.2",
"short_description": "AIO fork of aiolabs/events",
"icon": "https://git.atitlan.io/aiolabs/events/raw/branch/main/static/image/events.png",
"archive": "https://git.atitlan.io/aiolabs/events/archive/v0.0.2.zip",
"hash": "4ac140b97b164f81c482cc19da07a79e961685ae146dc89cba6d12e7d5e80716"
},
{
"id": "nostrclient",
"repo": "https://git.atitlan.io/aiolabs/nostrclient",
@ -58,11 +79,11 @@
"id": "nostrrelay",
"repo": "https://git.atitlan.io/aiolabs/nostrrelay",
"name": "AIO Nostrrelay",
"version": "0.0.1",
"version": "0.0.2",
"short_description": "AIO fork of aiolabs/nostrrelay",
"icon": "https://git.atitlan.io/aiolabs/nostrrelay/raw/branch/main/static/image/nostrrelay.png",
"archive": "https://git.atitlan.io/aiolabs/nostrrelay/archive/v0.0.1.zip",
"hash": "2b1ba6a3b7a79f6595f075c332b82a0ba64c608637ad5bcf23182e40fdf7f68f"
"archive": "https://git.atitlan.io/aiolabs/nostrrelay/archive/v0.0.2.zip",
"hash": "6e353358314b740679e55e2ff98c7024a97c6df8bf27d1784e8cee448407bebd"
},
{
"id": "castle",

View file

@ -26,6 +26,7 @@ from ..crud import (
get_super_settings,
get_user_extensions,
get_user_from_account,
get_wallet,
update_account,
update_super_user,
update_user_extension,
@ -37,6 +38,7 @@ from ..models import (
UserExtra,
)
from .settings import update_cached_settings
from .payments import update_wallet_balance
async def create_user_account(
@ -80,6 +82,13 @@ async def create_user_account_no_ckeck(
conn=conn,
)
# Credit new account with 1 million satoshis
try:
await update_wallet_balance(wallet, 1_000_000, conn=conn)
logger.info(f"Credited new account {account.id} with 1,000,000 sats")
except Exception as e:
logger.error(f"Failed to credit new account {account.id} with 1,000,000 sats: {e}")
user_extensions = (default_exts or []) + settings.lnbits_user_default_extensions
for ext_id in user_extensions:
try:

View file

@ -178,7 +178,7 @@ class LndRestWallet(Wallet):
"no_inflight_updates": True,
}
if settings.lnd_rest_allow_self_payment:
req["allow_self_payment"] = 1
req["allow_self_payment"] = True
try:
r = await self.client.post(

View file

@ -295,6 +295,10 @@ async def test_register_ok(http_client: AsyncClient):
assert (
len(user.wallets) == 1
), f"Expected 1 default wallet, not {len(user.wallets)}."
# Check that the wallet has 1 million satoshis
wallet = user.wallets[0]
assert wallet.balance == 1_000_000, f"Expected 1,000,000 sats balance, got {wallet.balance} sats"
@pytest.mark.anyio
@ -588,6 +592,10 @@ async def test_register_nostr_ok(http_client: AsyncClient, settings: Settings):
assert (
len(user.wallets) == 1
), f"Expected 1 default wallet, not {len(user.wallets)}."
# Check that the wallet has 1 million satoshis
wallet = user.wallets[0]
assert wallet.balance == 1_000_000, f"Expected 1,000,000 sats balance, got {wallet.balance} sats"
@pytest.mark.anyio