feat(machine): add SQLite persistence and remove npub linking

Add crash-safe persistence for cassette inventory, cashbox state, and
transaction history using better-sqlite3 in the Electron main process.
The state machine now loads inventory from the database at runtime
instead of using hardcoded values, and transactions are automatically
persisted on completion.

Remove the unnecessary npub linking code — Lightning.Pub auto-creates
and associates Nostr users when appId is included in RPC requests,
making the HTTP-based user creation and token linking redundant.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Patrick Mulligan 2026-02-19 11:45:09 -05:00
commit f37555565e
15 changed files with 739 additions and 171 deletions

View file

@ -37,9 +37,7 @@ DEFAULT_FUNDING_SATS=100000
STATE_DIR="$SCRIPT_DIR/.state"
PUBKEY_FILE="$STATE_DIR/lightning-pub-pubkey"
NPROFILE_FILE="$STATE_DIR/lightning-pub-nprofile"
APP_TOKEN_FILE="$STATE_DIR/atm-app-token"
APP_ID_FILE="$STATE_DIR/atm-app-id"
LINKING_TOKEN_FILE="$STATE_DIR/atm-linking-token"
MODE_FILE="$STATE_DIR/compose-mode" # "standalone" or "unified"
# Get current compose file based on last used mode
@ -491,7 +489,7 @@ setup_atm_app() {
local app_name="lamassu-atm-dev"
# Check if we already have valid app state
if [[ -f "$APP_ID_FILE" ]] && [[ -f "$APP_TOKEN_FILE" ]]; then
if [[ -f "$APP_ID_FILE" ]]; then
local existing_app_id=$(cat "$APP_ID_FILE")
if [[ -n "$existing_app_id" ]]; then
log "Using existing ATM app: ${existing_app_id:0:16}..."
@ -508,33 +506,25 @@ setup_atm_app() {
if echo "$response" | grep -q '"status":"OK"'; then
local app_id=$(echo "$response" | grep -oP '"id":"\K[^"]+')
local app_token=$(echo "$response" | grep -oP '"auth_token":"\K[^"]+')
echo "$app_id" > "$APP_ID_FILE"
echo "$app_token" > "$APP_TOKEN_FILE"
# Update ATM .env with app ID and token
# Update ATM .env with app ID
local env_file="$PROJECT_DIR/apps/machine/.env"
if [[ -f "$env_file" ]]; then
if grep -q "VITE_APP_ID" "$env_file"; then
sed -i "s/VITE_APP_ID=.*/VITE_APP_ID=$app_id/" "$env_file"
else
echo "" >> "$env_file"
echo "# ATM App ID for LNURL-withdraw" >> "$env_file"
echo "# ATM App ID" >> "$env_file"
echo "VITE_APP_ID=$app_id" >> "$env_file"
fi
if grep -q "VITE_APP_TOKEN" "$env_file"; then
sed -i "s|VITE_APP_TOKEN=.*|VITE_APP_TOKEN=$app_token|" "$env_file"
else
echo "VITE_APP_TOKEN=$app_token" >> "$env_file"
fi
fi
success "Created ATM app: ${app_id:0:16}..."
return 0
else
warn "Failed to create ATM app (may already exist)"
# Try to use existing app from state file
if [[ -f "$APP_ID_FILE" ]]; then
log "Using existing app ID from state"
return 0
@ -567,21 +557,12 @@ generate_lndconnect() {
#############################################################################
get_atm_balance() {
# Get ATM app owner balance from Lightning.Pub logs
local app_id=$(cat "$APP_ID_FILE" 2>/dev/null)
if [[ -z "$app_id" ]]; then
echo "not configured"
return
fi
# Query the app balance via admin API (if available)
# For now, just indicate it's configured
local app_token=$(cat "$APP_TOKEN_FILE" 2>/dev/null)
if [[ -n "$app_token" ]]; then
echo "configured (use './dev.sh fund' to add sats)"
else
echo "not configured"
fi
echo "configured (use './dev.sh fund' to add sats)"
}
show_status() {