9.7 KiB
9.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is the Satoshi Machine Admin Extension for LNBits - a Dollar Cost Averaging (DCA) administration system that integrates with Lamassu ATM machines to automatically distribute Bitcoin to registered clients based on their deposit balances.
Development Commands
Code Quality & Formatting
# Format all code
make format
# Check code quality
make check
# Individual commands
poetry run black . # Python formatting
poetry run ruff check . --fix # Python linting with auto-fix
poetry run ./node_modules/.bin/prettier --write . # JavaScript formatting
poetry run mypy . # Python type checking
poetry run ./node_modules/.bin/pyright # JavaScript type checking
Testing
# Run tests
make test
# or
PYTHONUNBUFFERED=1 DEBUG=true poetry run pytest
Pre-commit Hooks
# Install pre-commit hooks
make install-pre-commit-hook
# Run pre-commit on all files
make pre-commit
Architecture
Core Structure
The Satoshi Machine Admin extension follows LNBits architecture patterns:
-
Backend (Python/FastAPI):
__init__.py- Extension initialization and router setupmodels.py- Pydantic data models for DCA systemcrud.py- Database operations for all DCA entitiesviews.py- Admin dashboard page routeviews_api.py- DCA API endpointsmigrations.py- Database schema (condensed single migration)tasks.py- Background polling and invoice listeningtransaction_processor.py- Core Lamassu integration logic
-
Frontend (Vue.js 3 Options API + Quasar):
static/js/index.js- Admin dashboard Vue apptemplates/myextension/index.html- Admin interface template
Key Conventions
-
Template Syntax Rules:
- Use
{{ }}and{% %}ONLY inindex.htmlfiles (Jinja2) - In Vue components: Use
v-text='value'instead of{{ value }} - Use
:attribute='value'for binding,v-html='value'for HTML content
- Use
-
API Patterns:
- Always include wallet key (inkey/adminkey) as third parameter in API calls
- Use
LNbits.api.request()for all API calls - Destructure responses:
const {data} = await LNbits.api.request(...)
-
Component Registration:
- Templates must be included BEFORE scripts in HTML
- Components must be registered BEFORE app.mount()
The Magical G Object
The global this.g object provides access to:
this.g.user- Complete user data including wallets arraythis.g.user.wallets[0].inkey- Invoice key for API callsthis.g.user.wallets[0].adminkey- Admin key for privileged operationsthis.g.wallet- Currently selected wallet
Built-in Utilities
- Currency conversion:
/api/v1/currencies,/api/v1/conversion - QR code generation:
/api/v1/qrcode/{data}or Quasar VueQrcode component - WebSocket support:
wss://host/api/v1/ws/{id}with POST to/api/v1/ws/{id}/{data}
Configuration Files
config.json- Extension configuration (name: "DCA Client")manifest.json- Extension manifest for installationpyproject.toml- Python dependencies and tool configurationpackage.json- JavaScript dependencies
DCA System Architecture
Core Components
1. Lamassu ATM Integration
- Secure SSH connection to remote Lamassu PostgreSQL database
- Polls
cash_out_txstable for new confirmed transactions - Supports both SSH password and private key authentication
- Read-only database access for security
2. Commission Calculation Engine
- Formula:
base_amount = total_amount / (1 + effective_commission) - Effective commission:
commission_percentage * (100 - discount) / 100 - Supports discount percentages for promotional rates
- Separates commission earnings to configurable wallet
3. DCA Distribution System
- Flow Mode: Proportional distribution based on client balance ratios
- Fixed Mode: Daily limit-based allocation (future enhancement)
- Automatic Bitcoin transfers using LNBits internal payment system
- Real-time balance tracking and deduction
4. Audit and Compliance
- Complete transaction audit trail in
lamassu_transactionstable - Detailed distribution records in
dca_paymentstable - Clickable transaction history with distribution breakdowns
- CSV export capabilities for accounting
Database Schema
Core Tables:
dca_clients- Client registration and DCA mode settingsdca_deposits- Fiat deposit tracking and confirmation workflowdca_payments- Bitcoin payment records and status trackinglamassu_config- Database connection and polling configurationlamassu_transactions- Complete audit trail of processed ATM transactions
Key Features:
- Single migration (
m001_initial_dca_schema) creates complete schema - UTC timezone handling throughout
- Comprehensive indexing for performance
- Foreign key relationships maintained
API Endpoints
Client Management
GET /api/v1/dca/clients- List all DCA clientsGET /api/v1/dca/clients/{id}/balance- Get client balance summaryPOST /api/v1/dca/clients- Create test client (development)
Deposit Administration
GET /api/v1/dca/deposits- List all depositsPOST /api/v1/dca/deposits- Create new depositPUT /api/v1/dca/deposits/{id}/status- Confirm deposits
Transaction Processing
GET /api/v1/dca/transactions- List processed Lamassu transactionsGET /api/v1/dca/transactions/{id}/distributions- View distribution detailsPOST /api/v1/dca/manual-poll- Trigger manual database pollPOST /api/v1/dca/test-transaction- Process test transaction
Configuration
GET /api/v1/dca/config- Get Lamassu database configurationPOST /api/v1/dca/config- Save database and wallet settingsPOST /api/v1/dca/test-connection- Verify connectivity
Frontend Architecture
Vue.js Components
- Dashboard Overview - System status and recent activity
- Client Management - DCA client table with balance tracking
- Deposit Workflow - Quick deposit forms and confirmation
- Transaction History - Lamassu transaction audit with drill-down
- Configuration Panel - Database and wallet setup with testing
Key UX Features
- Real-time balance updates during polling
- Loading states for all async operations
- Error handling with user-friendly notifications
- Responsive design for mobile administration
- Export functionality for audit and compliance
Technical Implementation Details
SSH Connection Setup
# On Lamassu server:
sudo mkdir -p /var/lib/postgresql/.ssh
sudo echo "your-public-key" >> /var/lib/postgresql/.ssh/authorized_keys
sudo chown -R postgres:postgres /var/lib/postgresql/.ssh
sudo chmod 700 /var/lib/postgresql/.ssh
sudo chmod 600 /var/lib/postgresql/.ssh/authorized_keys
Commission Calculation Example
# Real transaction: 2000 GTQ → 266,800 sats (3% commission, 0% discount)
crypto_atoms = 266800 # Total sats from Lamassu
commission_percentage = 0.03 # 3%
discount = 0.0 # No discount
effective_commission = 0.03 * (100 - 0) / 100 = 0.03
base_amount = 266800 / (1 + 0.03) = 258,835 sats (for DCA)
commission_amount = 266800 - 258835 = 7,965 sats (to commission wallet)
Polling Strategy
- Automatic: Hourly background task via LNBits task system
- Manual: Admin-triggered polling for immediate processing
- Smart Recovery: Tracks last successful poll to prevent missed transactions
- Error Handling: Graceful failure with detailed logging
Security Considerations
- SSH tunnel encryption for database connectivity
- Read-only database permissions
- Wallet key validation for all financial operations
- Input sanitization and type validation
- Audit logging for all administrative actions
Development Workflow
Adding New Features
- Models: Update
models.pywith new Pydantic schemas - Database: Add migration to
migrations.py(append only) - CRUD: Implement database operations in
crud.py - API: Add endpoints to
views_api.py - Frontend: Update Vue.js components in
static/js/index.js - Templates: Modify HTML template if needed
Testing
- Use "Test Connection" for database connectivity verification
- Use "Test Transaction" for DCA flow validation
- Manual polling for real-world transaction testing
- Monitor LNBits logs for detailed error information
Debugging
- Enable debug logging:
DEBUG=true - Check SSH tunnel connectivity independently
- Verify Lamassu database query results
- Monitor wallet balance changes
- Review transaction audit trail
Key Files Reference
transaction_processor.py- Core Lamassu integration and DCA logicmodels.py- Complete data models for DCA systemcrud.py- Database operations with optimized queriesmigrations.py- Single condensed schema migrationstatic/js/index.js- Admin dashboard Vue.js applicationtemplates/myextension/index.html- Admin interface templateconfig.json- Extension metadata and configurationtasks.py- Background polling and invoice listeners
Important Notes
- Extension uses LNBits internal payment system for Bitcoin transfers
- All timestamps stored and processed in UTC timezone
- Commission calculations handle edge cases and rounding
- SSH authentication prefers private keys over passwords
- Database polling is stateful and resumable after downtime
- UI displays human-readable usernames where available
- Export functions generate CSV files for external analysis
Extension Status
Current Version: v0.0.1 (Initial Release)
Status: Production Ready
Dependencies: LNBits v1.0.0+, SSH access to Lamassu server
License: MIT