refactor(dev): rename the lamassu-* dev-infra containers, databases and credentials to bitspire-*

Container names (relay, bitcoind, lnd, lnd-alice, lightning-pub, miner,
postgres), the regtest bitcoind rpcuser/rpcpassword, the postgres role and
database (bitspire_dev), the dev admin token, BITSPIRE_HOST_IP, the devenv
project name, and the banners/log prefixes in the scripts. Credentials
are dev-only regtest values and are consistent across all 31 sites
(rpcuser=, rpcpassword=, rpcpass=, --user) — the containers would not
talk to each other otherwise.

Anyone with the old stack running needs `docker compose down` once before
`up`: the container names changed, so compose will otherwise see a conflict.

Secret-scanner allowlist markers added on the credential lines, and on two
pre-existing dev.sh comments ("private key") the hook flags as PRIVATE KEY
— prose, no key material; this diff introduced neither.
This commit is contained in:
Padreug 2026-10-09 21:58:55 +02:00
commit 561fd35aed
11 changed files with 143 additions and 143 deletions

View file

@ -2,7 +2,7 @@
{
# Project metadata
name = "lamassu-next";
name = "bitspire-next";
# ============================================
# Languages
@ -65,7 +65,7 @@
services.postgres = {
enable = true;
initialDatabases = [{ name = "lamassu_dev"; }];
initialDatabases = [{ name = "bitspire_dev"; }];
listen_addresses = "127.0.0.1";
};
@ -97,7 +97,7 @@
env = {
RUST_BACKTRACE = "1";
DATABASE_URL = "postgresql://localhost/lamassu_dev";
DATABASE_URL = "postgresql://localhost/bitspire_dev";
# Nostr development relay
NOSTR_RELAY_URL = "ws://localhost:7777";
@ -130,7 +130,7 @@
# Wait for strfry
echo -n "strfry relay: "
until docker exec lamassu-relay nc -z localhost 7777 2>/dev/null; do
until docker exec bitspire-relay nc -z localhost 7777 2>/dev/null; do
echo -n "."
sleep 2
done
@ -138,7 +138,7 @@
# Wait for bitcoind
echo -n "bitcoind: "
until docker exec lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu getblockchaininfo >/dev/null 2>&1; do
until docker exec bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire getblockchaininfo >/dev/null 2>&1; do # pragma: allowlist secret
echo -n "."
sleep 2
done
@ -146,7 +146,7 @@
# Wait for LND
echo -n "LND: "
until docker exec lamassu-lnd lncli --network=regtest getinfo >/dev/null 2>&1; do
until docker exec bitspire-lnd lncli --network=regtest getinfo >/dev/null 2>&1; do
echo -n "."
sleep 3
done
@ -154,7 +154,7 @@
# Wait for Alice's LND
echo -n "LND (Alice): "
until docker exec lamassu-lnd-alice lncli --network=regtest getinfo >/dev/null 2>&1; do
until docker exec bitspire-lnd-alice lncli --network=regtest getinfo >/dev/null 2>&1; do
echo -n "."
sleep 3
done
@ -196,7 +196,7 @@
mine-blocks.exec = ''
BLOCKS=''${1:-1}
echo "Mining $BLOCKS regtest block(s)..."
docker exec lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu -generate "$BLOCKS"
docker exec bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire -generate "$BLOCKS" # pragma: allowlist secret
'';
# Start auto-miner (mines 1 block every 30 seconds)
@ -211,19 +211,19 @@
# Stop auto-miner
auto-mine-stop.exec = ''
echo "Stopping auto-miner..."
docker stop lamassu-miner 2>/dev/null || true
docker rm lamassu-miner 2>/dev/null || true
docker stop bitspire-miner 2>/dev/null || true
docker rm bitspire-miner 2>/dev/null || true
echo "Auto-miner stopped."
'';
# Connect to LND CLI
lncli.exec = ''
docker exec -it lamassu-lnd lncli --network=regtest "$@"
docker exec -it bitspire-lnd lncli --network=regtest "$@"
'';
# Connect to Bitcoin CLI
btccli.exec = ''
docker exec -it lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu "$@"
docker exec -it bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire "$@" # pragma: allowlist secret
'';
# Test relay connection
@ -234,7 +234,7 @@
# Connect to Alice's LND CLI (second node for testing payments)
lncli-alice.exec = ''
docker exec -it lamassu-lnd-alice lncli --network=regtest "$@"
docker exec -it bitspire-lnd-alice lncli --network=regtest "$@"
'';
# Setup Lightning channel between Alice and the main LND node
@ -243,46 +243,46 @@
echo ""
# Get LND's pubkey and address
LND_INFO=$(docker exec lamassu-lnd lncli --network=regtest getinfo 2>/dev/null)
LND_INFO=$(docker exec bitspire-lnd lncli --network=regtest getinfo 2>/dev/null)
LND_PUBKEY=$(echo "$LND_INFO" | jq -r '.identity_pubkey')
echo "LND pubkey: $LND_PUBKEY"
# Connect Alice to LND
echo "Connecting Alice to LND..."
docker exec lamassu-lnd-alice lncli --network=regtest connect "$LND_PUBKEY@lnd:9735" 2>/dev/null || true
docker exec bitspire-lnd-alice lncli --network=regtest connect "$LND_PUBKEY@lnd:9735" 2>/dev/null || true
# Check if Alice has enough funds
ALICE_BALANCE=$(docker exec lamassu-lnd-alice lncli --network=regtest walletbalance 2>/dev/null | jq -r '.confirmed_balance')
ALICE_BALANCE=$(docker exec bitspire-lnd-alice lncli --network=regtest walletbalance 2>/dev/null | jq -r '.confirmed_balance')
echo "Alice's on-chain balance: $ALICE_BALANCE sats"
if [ "$ALICE_BALANCE" -lt 1000000 ]; then
echo ""
echo "Alice needs funds. Getting new address..."
ALICE_ADDR=$(docker exec lamassu-lnd-alice lncli --network=regtest newaddress p2wkh | jq -r '.address')
ALICE_ADDR=$(docker exec bitspire-lnd-alice lncli --network=regtest newaddress p2wkh | jq -r '.address')
echo "Alice's address: $ALICE_ADDR"
echo ""
echo "Sending 5 BTC to Alice..."
docker exec lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu sendtoaddress "$ALICE_ADDR" 5
docker exec bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire sendtoaddress "$ALICE_ADDR" 5 # pragma: allowlist secret
echo "Mining 6 blocks for confirmation..."
docker exec lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu -generate 6 >/dev/null
docker exec bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire -generate 6 >/dev/null # pragma: allowlist secret
sleep 2
ALICE_BALANCE=$(docker exec lamassu-lnd-alice lncli --network=regtest walletbalance 2>/dev/null | jq -r '.confirmed_balance')
ALICE_BALANCE=$(docker exec bitspire-lnd-alice lncli --network=regtest walletbalance 2>/dev/null | jq -r '.confirmed_balance')
echo "Alice's new balance: $ALICE_BALANCE sats"
fi
# Open channel from Alice to LND (1M sats)
echo ""
echo "Opening 1M sat channel from Alice to LND..."
docker exec lamassu-lnd-alice lncli --network=regtest openchannel --node_key="$LND_PUBKEY" --local_amt=1000000
docker exec bitspire-lnd-alice lncli --network=regtest openchannel --node_key="$LND_PUBKEY" --local_amt=1000000
echo ""
echo "Mining 6 blocks to confirm channel..."
docker exec lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu -generate 6 >/dev/null
docker exec bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire -generate 6 >/dev/null # pragma: allowlist secret
sleep 3
echo ""
echo "Channel status:"
docker exec lamassu-lnd-alice lncli --network=regtest listchannels | jq '.channels[] | {remote_pubkey, capacity, local_balance, remote_balance, active}'
docker exec bitspire-lnd-alice lncli --network=regtest listchannels | jq '.channels[] | {remote_pubkey, capacity, local_balance, remote_balance, active}'
echo ""
echo "Channel setup complete! Alice can now pay invoices to Lightning.Pub."
'';
@ -294,14 +294,14 @@
exit 1
fi
echo "Paying invoice from Alice's node..."
docker exec lamassu-lnd-alice lncli --network=regtest payinvoice --force "$1"
docker exec bitspire-lnd-alice lncli --network=regtest payinvoice --force "$1"
'';
# Create invoice on Alice's node (for testing ATM payouts)
alice-invoice.exec = ''
AMOUNT=''${1:-1000}
MEMO=''${2:-"Test invoice"}
docker exec lamassu-lnd-alice lncli --network=regtest addinvoice --amt="$AMOUNT" --memo="$MEMO" | jq -r '.payment_request'
docker exec bitspire-lnd-alice lncli --network=regtest addinvoice --amt="$AMOUNT" --memo="$MEMO" | jq -r '.payment_request'
'';
# Fund ATM account in Lightning.Pub
@ -324,7 +324,7 @@
echo ""
echo "Invoice created. Paying from Alice..."
docker exec lamassu-lnd-alice lncli --network=regtest payinvoice --force "$INVOICE"
docker exec bitspire-lnd-alice lncli --network=regtest payinvoice --force "$INVOICE"
echo ""
echo "ATM account funded with $AMOUNT sats!"
@ -334,14 +334,14 @@
test-setup.exec = ''
echo ""
echo "═══════════════════════════════════════════════════════════"
echo " Lamassu Next - Test Setup Validation"
echo " bitSpire - Test Setup Validation"
echo "═══════════════════════════════════════════════════════════"
echo ""
# Mine a block to wake up LND sync (regtest quirk: LND reports
# "not synced" when no blocks mined recently)
echo "Mining block to sync nodes..."
docker exec lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu -generate 1 >/dev/null 2>&1
docker exec bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire -generate 1 >/dev/null 2>&1 # pragma: allowlist secret
sleep 1
echo ""
@ -362,19 +362,19 @@
echo "───────────────────────────────────────────────────────────"
# Check containers
docker ps --format '{{.Names}}' | grep -q lamassu-relay
docker ps --format '{{.Names}}' | grep -q bitspire-relay
check $? "strfry relay running"
docker ps --format '{{.Names}}' | grep -q lamassu-bitcoind
docker ps --format '{{.Names}}' | grep -q bitspire-bitcoind
check $? "bitcoind running"
docker ps --format '{{.Names}}' | grep -q lamassu-lnd
docker ps --format '{{.Names}}' | grep -q bitspire-lnd
check $? "LND running"
docker ps --format '{{.Names}}' | grep -q lamassu-lnd-alice
docker ps --format '{{.Names}}' | grep -q bitspire-lnd-alice
check $? "LND Alice running"
docker ps --format '{{.Names}}' | grep -q lamassu-lightning-pub
docker ps --format '{{.Names}}' | grep -q bitspire-lightning-pub
check $? "Lightning.Pub running"
echo ""
@ -386,32 +386,32 @@
check $? "Nostr relay port open"
# Check bitcoind RPC
docker exec lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu getblockchaininfo >/dev/null 2>&1
docker exec bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire getblockchaininfo >/dev/null 2>&1 # pragma: allowlist secret
check $? "Bitcoin RPC responding"
# Check LND
docker exec lamassu-lnd lncli --network=regtest getinfo >/dev/null 2>&1
docker exec bitspire-lnd lncli --network=regtest getinfo >/dev/null 2>&1
check $? "LND RPC responding"
# Check Alice
docker exec lamassu-lnd-alice lncli --network=regtest getinfo >/dev/null 2>&1
docker exec bitspire-lnd-alice lncli --network=regtest getinfo >/dev/null 2>&1
check $? "LND Alice RPC responding"
echo ""
echo "3. Blockchain State"
echo "───────────────────────────────────────────────────────────"
BLOCKS=$(docker exec lamassu-bitcoind bitcoin-cli -regtest -rpcuser=lamassu -rpcpassword=lamassu getblockcount 2>/dev/null)
BLOCKS=$(docker exec bitspire-bitcoind bitcoin-cli -regtest -rpcuser=bitspire -rpcpassword=bitspire getblockcount 2>/dev/null) # pragma: allowlist secret
[ "$BLOCKS" -ge 100 ]
check $? "Block height >= 100 (current: $BLOCKS)"
# Check LND synced
LND_SYNCED=$(docker exec lamassu-lnd lncli --network=regtest getinfo 2>/dev/null | jq -r '.synced_to_chain')
LND_SYNCED=$(docker exec bitspire-lnd lncli --network=regtest getinfo 2>/dev/null | jq -r '.synced_to_chain')
[ "$LND_SYNCED" = "true" ]
check $? "LND synced to chain"
# Check Alice synced
ALICE_SYNCED=$(docker exec lamassu-lnd-alice lncli --network=regtest getinfo 2>/dev/null | jq -r '.synced_to_chain')
ALICE_SYNCED=$(docker exec bitspire-lnd-alice lncli --network=regtest getinfo 2>/dev/null | jq -r '.synced_to_chain')
[ "$ALICE_SYNCED" = "true" ]
check $? "LND Alice synced to chain"
@ -420,17 +420,17 @@
echo "───────────────────────────────────────────────────────────"
# Check Alice has active channels
ALICE_CHANNELS=$(docker exec lamassu-lnd-alice lncli --network=regtest listchannels 2>/dev/null | jq '.channels | length')
ALICE_CHANNELS=$(docker exec bitspire-lnd-alice lncli --network=regtest listchannels 2>/dev/null | jq '.channels | length')
[ "$ALICE_CHANNELS" -ge 1 ]
check $? "Alice has active channels (count: $ALICE_CHANNELS)"
# Check channel is active
ACTIVE_CHANNEL=$(docker exec lamassu-lnd-alice lncli --network=regtest listchannels 2>/dev/null | jq '.channels[0].active')
ACTIVE_CHANNEL=$(docker exec bitspire-lnd-alice lncli --network=regtest listchannels 2>/dev/null | jq '.channels[0].active')
[ "$ACTIVE_CHANNEL" = "true" ]
check $? "Channel is active"
# Check Alice has outbound capacity
ALICE_LOCAL=$(docker exec lamassu-lnd-alice lncli --network=regtest listchannels 2>/dev/null | jq -r '.channels[0].local_balance // 0')
ALICE_LOCAL=$(docker exec bitspire-lnd-alice lncli --network=regtest listchannels 2>/dev/null | jq -r '.channels[0].local_balance // 0')
[ "$ALICE_LOCAL" -ge 10000 ]
check $? "Alice has outbound capacity ($ALICE_LOCAL sats)"
@ -439,12 +439,12 @@
echo "───────────────────────────────────────────────────────────"
# Create test invoice on LND and pay from Alice
TEST_INVOICE=$(docker exec lamassu-lnd lncli --network=regtest addinvoice --amt=100 --memo="test-setup validation" 2>/dev/null | jq -r '.payment_request')
TEST_INVOICE=$(docker exec bitspire-lnd lncli --network=regtest addinvoice --amt=100 --memo="test-setup validation" 2>/dev/null | jq -r '.payment_request')
if [ -n "$TEST_INVOICE" ]; then
check 0 "Created 100 sat test invoice"
# Pay it
PAY_RESULT=$(docker exec lamassu-lnd-alice lncli --network=regtest payinvoice --force "$TEST_INVOICE" 2>&1)
PAY_RESULT=$(docker exec bitspire-lnd-alice lncli --network=regtest payinvoice --force "$TEST_INVOICE" 2>&1)
if echo "$PAY_RESULT" | grep -q "SUCCEEDED"; then
check 0 "Payment Alice → LND succeeded"
else
@ -478,7 +478,7 @@
# Create invoice on Alice (simulating customer's wallet)
echo "1. Creating invoice on Alice's wallet..."
INVOICE=$(docker exec lamassu-lnd-alice lncli --network=regtest addinvoice --amt="$AMOUNT" --memo="E2E test" | jq -r '.payment_request')
INVOICE=$(docker exec bitspire-lnd-alice lncli --network=regtest addinvoice --amt="$AMOUNT" --memo="E2E test" | jq -r '.payment_request')
echo " Invoice: ''${INVOICE:0:40}..."
# Use test-pay.mjs to pay via Lightning.Pub
@ -490,7 +490,7 @@
echo ""
echo "3. Verifying payment on Alice..."
sleep 2
PAID=$(docker exec lamassu-lnd-alice lncli --network=regtest listinvoices 2>/dev/null | jq '.invoices[-1].settled')
PAID=$(docker exec bitspire-lnd-alice lncli --network=regtest listinvoices 2>/dev/null | jq '.invoices[-1].settled')
if [ "$PAID" = "true" ]; then
echo " ✓ Payment received!"
else
@ -507,15 +507,15 @@
echo ""
echo "LND (Lightning.Pub's node):"
docker exec lamassu-lnd lncli --network=regtest getinfo 2>/dev/null | jq '{pubkey: .identity_pubkey, alias: .alias, channels: .num_active_channels, peers: .num_peers}'
docker exec bitspire-lnd lncli --network=regtest getinfo 2>/dev/null | jq '{pubkey: .identity_pubkey, alias: .alias, channels: .num_active_channels, peers: .num_peers}'
echo ""
echo "LND Alice (Payment source):"
docker exec lamassu-lnd-alice lncli --network=regtest getinfo 2>/dev/null | jq '{pubkey: .identity_pubkey, alias: .alias, channels: .num_active_channels, peers: .num_peers}'
docker exec bitspire-lnd-alice lncli --network=regtest getinfo 2>/dev/null | jq '{pubkey: .identity_pubkey, alias: .alias, channels: .num_active_channels, peers: .num_peers}'
echo ""
echo "Channel Details:"
docker exec lamassu-lnd-alice lncli --network=regtest listchannels 2>/dev/null | jq '.channels[] | {peer: .remote_pubkey[0:16], capacity, local: .local_balance, remote: .remote_balance, active}'
docker exec bitspire-lnd-alice lncli --network=regtest listchannels 2>/dev/null | jq '.channels[] | {peer: .remote_pubkey[0:16], capacity, local: .local_balance, remote: .remote_balance, active}'
echo ""
echo "Lightning.Pub Nostr pubkey:"
@ -533,7 +533,7 @@
enterShell = ''
echo ""
echo " ⚡ Lamassu Next - Nostr-Native Lightning ATM"
echo " ⚡ bitSpire - Nostr-Native Lightning ATM"
echo " ─────────────────────────────────────────────"
echo " Node.js: $(node --version)"
echo " Rust: $(rustc --version | cut -d' ' -f2)"

View file

@ -1,6 +1,6 @@
#!/bin/bash
#
# Lamassu Next Development Environment
# bitSpire Development Environment
#
# Single command to manage the complete development stack:
# - Regtest Bitcoin/Lightning network (from ~/dev/local/docker/regtest)
@ -67,7 +67,7 @@ success() { echo -e "${GREEN}✓${NC} $1"; }
# Ensure state directory exists
mkdir -p "$STATE_DIR"
# Get ATM pubkey from its private key
# Get ATM pubkey from its private key # pragma: allowlist secret
get_atm_pubkey() {
local env_file="$PROJECT_DIR/apps/machine/.env"
if [[ ! -f "$env_file" ]]; then
@ -96,8 +96,8 @@ get_atm_pubkey() {
get_local_ip() {
# Allow explicit override via env var
if [[ -n "${LAMASSU_HOST_IP:-}" ]]; then
echo "$LAMASSU_HOST_IP"
if [[ -n "${BITSPIRE_HOST_IP:-}" ]]; then
echo "$BITSPIRE_HOST_IP"
return
fi
@ -146,7 +146,7 @@ lnd4_has_active_channels() {
}
is_lightning_pub_ready() {
docker logs lamassu-lightning-pub 2>&1 | grep -q "LightningPub listening"
docker logs bitspire-lightning-pub 2>&1 | grep -q "LightningPub listening"
}
get_lnd4_balance() {
@ -422,8 +422,8 @@ wait_for_lightning_pub() {
local attempts=0
while ! is_lightning_pub_ready && [[ $attempts -lt 45 ]]; do
# Check for errors
if docker logs lamassu-lightning-pub 2>&1 | grep -q "Error:"; then
local err=$(docker logs lamassu-lightning-pub 2>&1 | grep "Error:" | tail -1)
if docker logs bitspire-lightning-pub 2>&1 | grep -q "Error:"; then
local err=$(docker logs bitspire-lightning-pub 2>&1 | grep "Error:" | tail -1)
error "Lightning.Pub error: $err"
return 1
fi
@ -437,14 +437,14 @@ wait_for_lightning_pub() {
return 0
else
error "Lightning.Pub failed to start (timeout)"
docker logs lamassu-lightning-pub 2>&1 | tail -10
docker logs bitspire-lightning-pub 2>&1 | tail -10
return 1
fi
}
extract_lightning_pub_info() {
local pubkey=$(docker logs lamassu-lightning-pub 2>&1 | grep -oP 'pubkey:\s*\K[a-f0-9]+' | tail -1)
local nprofile=$(docker logs lamassu-lightning-pub 2>&1 | grep -oP 'nprofile:\s*\K\S+' | tail -1)
local pubkey=$(docker logs bitspire-lightning-pub 2>&1 | grep -oP 'pubkey:\s*\K[a-f0-9]+' | tail -1)
local nprofile=$(docker logs bitspire-lightning-pub 2>&1 | grep -oP 'nprofile:\s*\K\S+' | tail -1)
echo "$pubkey" > "$PUBKEY_FILE"
echo "$nprofile" > "$NPROFILE_FILE"
@ -467,7 +467,7 @@ update_atm_env() {
VITE_RELAY_URL=ws://localhost:7777
VITE_LIGHTNING_PUB_PUBKEY=$pubkey
VITE_LIGHTNING_PUB_API_URL=http://localhost:1776
VITE_ADMIN_TOKEN=lamassu-dev-admin-token
VITE_ADMIN_TOKEN=bitspire-dev-admin-token
VITE_ATM_PRIVATE_KEY=f391a2c3fc734f443b0f685688a0441b5fb9805853c0023f570c5a3c6412b136
# Extension API (for LNURL-withdraw)
@ -486,7 +486,7 @@ EOF
setup_atm_app() {
# Use a fixed app name so we reuse the same app across restarts
local app_name="lamassu-atm-dev"
local app_name="bitspire-atm-dev"
# Check if we already have valid app state
if [[ -f "$APP_ID_FILE" ]]; then
@ -501,7 +501,7 @@ setup_atm_app() {
local response=$(curl -s -X POST http://localhost:1776/api/admin/app/add \
-H "Content-Type: application/json" \
-H "Authorization: Bearer lamassu-dev-admin-token" \
-H "Authorization: Bearer bitspire-dev-admin-token" \
-d "{\"name\":\"$app_name\",\"allow_user_creation\":true}" 2>/dev/null)
if echo "$response" | grep -q '"status":"OK"'; then
@ -566,8 +566,8 @@ get_atm_balance() {
}
show_status() {
local pubkey=$(cat "$PUBKEY_FILE" 2>/dev/null || docker logs lamassu-lightning-pub 2>&1 | grep -oP 'pubkey:\s*\K[a-f0-9]+' | tail -1)
local nprofile=$(cat "$NPROFILE_FILE" 2>/dev/null || docker logs lamassu-lightning-pub 2>&1 | grep -oP 'nprofile:\s*\K\S+' | tail -1)
local pubkey=$(cat "$PUBKEY_FILE" 2>/dev/null || docker logs bitspire-lightning-pub 2>&1 | grep -oP 'pubkey:\s*\K[a-f0-9]+' | tail -1)
local nprofile=$(cat "$NPROFILE_FILE" 2>/dev/null || docker logs bitspire-lightning-pub 2>&1 | grep -oP 'nprofile:\s*\K\S+' | tail -1)
local local_ip=$(get_local_ip)
local lndconnect=$(generate_lndconnect 2>/dev/null || echo "")
local lnd4_balance=$(get_lnd4_balance)
@ -575,7 +575,7 @@ show_status() {
echo ""
echo -e "${BOLD}╔═══════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BOLD}║ LAMASSU NEXT - DEVELOPMENT ENVIRONMENT ║${NC}"
echo -e "${BOLD}║ BITSPIRE - DEVELOPMENT ENVIRONMENT ║${NC}"
echo -e "${BOLD}╚═══════════════════════════════════════════════════════════════════╝${NC}"
echo ""
@ -663,7 +663,7 @@ cmd_up() {
fi
echo ""
log "Starting Lamassu development environment..."
log "Starting bitSpire development environment..."
echo ""
# 1. Start shared regtest if needed (not in standalone mode)
@ -696,7 +696,7 @@ cmd_up() {
log "Using Lightning.Pub image: $image"
# 4. Start lamassu services
# 4. Start bitspire services
export REGTEST_DATA_DIR="$REGTEST_DIR/data"
export LIGHTNING_PUB_IMAGE="$image"
export HOST_IP=$(get_local_ip)
@ -708,7 +708,7 @@ cmd_up() {
echo "unified" > "$MODE_FILE"
fi
log "Starting lamassu services..."
log "Starting bitspire services..."
docker compose -f "$SCRIPT_DIR/$compose_file" up -d
# 5. Wait for Lightning.Pub
@ -746,7 +746,7 @@ cmd_up() {
cmd_down() {
local compose_file=$(get_compose_file)
log "Stopping lamassu services..."
log "Stopping bitspire services..."
docker compose -f "$SCRIPT_DIR/$compose_file" down 2>/dev/null || true
if [[ "$1" == "--all" ]]; then
@ -757,7 +757,7 @@ cmd_down() {
}
cmd_reset() {
warn "This will delete all lamassu state (Lightning.Pub identity, ATM app, etc.)"
warn "This will delete all bitspire state (Lightning.Pub identity, ATM app, etc.)"
read -p "Continue? [y/N] " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
@ -782,7 +782,7 @@ cmd_logs() {
}
cmd_status() {
if ! docker ps --format '{{.Names}}' | grep -q lamassu-lightning-pub; then
if ! docker ps --format '{{.Names}}' | grep -q bitspire-lightning-pub; then
error "Services not running. Start with: ./dev.sh up"
exit 1
fi
@ -806,7 +806,7 @@ cmd_fund() {
local lp_pubkey=$(cat "$PUBKEY_FILE")
local env_file="$PROJECT_DIR/apps/machine/.env"
# Get ATM private key from .env
# Get ATM private key from .env # pragma: allowlist secret
if [[ ! -f "$env_file" ]]; then
error "ATM not configured. Run './dev.sh up' first."
exit 1
@ -952,7 +952,7 @@ cmd_atm() {
fi
# Check if services are running
if ! docker ps --format '{{.Names}}' | grep -q lamassu-lightning-pub; then
if ! docker ps --format '{{.Names}}' | grep -q bitspire-lightning-pub; then
warn "Services not running. Start with: ./dev.sh up"
read -p "Start services first? [Y/n] " -n 1 -r
echo
@ -1013,7 +1013,7 @@ case "${1:-help}" in
shift
cmd_logs "$@"
;;
# Internal command for external orchestration (called by regtest-start --with-lamassu)
# Internal command for external orchestration (called by regtest-start --with-bitspire)
_setup_after_start)
if ! is_lightning_pub_ready; then
wait_for_lightning_pub || exit 1
@ -1041,7 +1041,7 @@ case "${1:-help}" in
cmd_zeus
;;
*)
echo "Lamassu Next Development Environment"
echo "bitSpire Development Environment"
echo ""
echo "Usage: $0 <command> [options]"
echo ""
@ -1069,7 +1069,7 @@ case "${1:-help}" in
echo " --machine Launch ATM app after startup"
echo ""
echo "Environment variables:"
echo " LAMASSU_HOST_IP Override auto-detected LAN IP (for VPN/multi-NIC)"
echo " BITSPIRE_HOST_IP Override auto-detected LAN IP (for VPN/multi-NIC)"
echo ""
echo "Examples:"
echo " $0 up # Start (uses shared regtest)"
@ -1082,6 +1082,6 @@ case "${1:-help}" in
echo " $0 fund 200000 # Add 200k more sats"
echo " $0 logs lightning-pub"
echo " $0 reset && $0 up --fund # Fresh start with funding"
echo " LAMASSU_HOST_IP=192.168.1.50 $0 up # Override LAN IP"
echo " BITSPIRE_HOST_IP=192.168.1.50 $0 up # Override LAN IP"
;;
esac

View file

@ -1,11 +1,11 @@
# Lamassu Next Development Infrastructure
# bitSpire Development Infrastructure
# Usage: docker compose -f docker-compose.dev.yml up -d
services:
# Private Nostr relay for ATM communication
strfry:
image: ghcr.io/hoytech/strfry:latest
container_name: lamassu-relay
container_name: bitspire-relay
ports:
- '7777:7777'
volumes:
@ -25,7 +25,7 @@ services:
# Bitcoin Core in regtest mode
bitcoind:
image: lncm/bitcoind:v27.0
container_name: lamassu-bitcoind
container_name: bitspire-bitcoind
volumes:
- bitcoind-data:/data/.bitcoin
environment:
@ -33,8 +33,8 @@ services:
command:
- -regtest
- -server
- -rpcuser=lamassu
- -rpcpassword=lamassu
- -rpcuser=bitspire
- -rpcpassword=bitspire # pragma: allowlist secret
- -rpcallowip=0.0.0.0/0
- -rpcbind=0.0.0.0
- -zmqpubrawblock=tcp://0.0.0.0:28332
@ -51,8 +51,8 @@ services:
'CMD',
'bitcoin-cli',
'-regtest',
'-rpcuser=lamassu',
'-rpcpassword=lamassu',
'-rpcuser=bitspire',
'-rpcpassword=bitspire', # pragma: allowlist secret
'getblockchaininfo',
]
interval: 10s
@ -63,7 +63,7 @@ services:
# LND Lightning node
lnd:
image: lightninglabs/lnd:v0.18.0-beta
container_name: lamassu-lnd
container_name: bitspire-lnd
depends_on:
bitcoind:
condition: service_healthy
@ -76,8 +76,8 @@ services:
- --bitcoin.regtest
- --bitcoin.node=bitcoind
- --bitcoind.rpchost=bitcoind:18443
- --bitcoind.rpcuser=lamassu
- --bitcoind.rpcpass=lamassu
- --bitcoind.rpcuser=bitspire
- --bitcoind.rpcpass=bitspire # pragma: allowlist secret
- --bitcoind.zmqpubrawblock=tcp://bitcoind:28332
- --bitcoind.zmqpubrawtx=tcp://bitcoind:28333
- --rpclisten=0.0.0.0:10009
@ -104,7 +104,7 @@ services:
# Using patched image with Kind 0 profile publishing support
lightning-pub:
image: lightning-pub-patched:latest
container_name: lamassu-lightning-pub
container_name: bitspire-lightning-pub
depends_on:
lnd:
condition: service_healthy
@ -126,14 +126,14 @@ services:
# Disable external liquidity provider for regtest
- DISABLE_LIQUIDITY_PROVIDER=true
# Admin token for HTTP API access (development only)
- ADMIN_TOKEN=lamassu-dev-admin-token
- ADMIN_TOKEN=bitspire-dev-admin-token
restart: unless-stopped
# Second LND node (Alice) for payment testing
# This node can pay invoices to Lightning.Pub's LND
lnd-alice:
image: lightninglabs/lnd:v0.18.0-beta
container_name: lamassu-lnd-alice
container_name: bitspire-lnd-alice
depends_on:
bitcoind:
condition: service_healthy
@ -146,8 +146,8 @@ services:
- --bitcoin.regtest
- --bitcoin.node=bitcoind
- --bitcoind.rpchost=bitcoind:18443
- --bitcoind.rpcuser=lamassu
- --bitcoind.rpcpass=lamassu
- --bitcoind.rpcuser=bitspire
- --bitcoind.rpcpass=bitspire # pragma: allowlist secret
- --bitcoind.zmqpubrawblock=tcp://bitcoind:28332
- --bitcoind.zmqpubrawtx=tcp://bitcoind:28333
- --rpclisten=0.0.0.0:10009
@ -174,7 +174,7 @@ services:
# Mines 1 block every 30 seconds
miner:
image: alpine:latest
container_name: lamassu-miner
container_name: bitspire-miner
depends_on:
bitcoind:
condition: service_healthy
@ -186,11 +186,11 @@ services:
echo "Starting auto-miner (1 block every 30 seconds)..."
while true; do
# Create wallet if not exists
curl -s --user lamassu:lamassu --data-binary '{"jsonrpc":"1.0","method":"createwallet","params":["miner"]}' http://bitcoind:18443/ > /dev/null 2>&1
curl -s --user bitspire:bitspire --data-binary '{"jsonrpc":"1.0","method":"createwallet","params":["miner"]}' http://bitcoind:18443/ > /dev/null 2>&1
# Mine a block
ADDR=$$(curl -s --user lamassu:lamassu --data-binary '{"jsonrpc":"1.0","method":"getnewaddress","params":[]}' http://bitcoind:18443/ | jq -r '.result // empty')
ADDR=$$(curl -s --user bitspire:bitspire --data-binary '{"jsonrpc":"1.0","method":"getnewaddress","params":[]}' http://bitcoind:18443/ | jq -r '.result // empty')
if [ -n "$$ADDR" ]; then
curl -s --user lamassu:lamassu --data-binary "{\"jsonrpc\":\"1.0\",\"method\":\"generatetoaddress\",\"params\":[1,\"$$ADDR\"]}" http://bitcoind:18443/ > /dev/null
curl -s --user bitspire:bitspire --data-binary "{\"jsonrpc\":\"1.0\",\"method\":\"generatetoaddress\",\"params\":[1,\"$$ADDR\"]}" http://bitcoind:18443/ > /dev/null
fi
sleep 30
done
@ -201,17 +201,17 @@ services:
# PostgreSQL for optional server-side state
postgres:
image: postgres:16-alpine
container_name: lamassu-postgres
container_name: bitspire-postgres
ports:
- '5432:5432'
environment:
POSTGRES_DB: lamassu_dev
POSTGRES_USER: lamassu
POSTGRES_PASSWORD: lamassu_dev_password
POSTGRES_DB: bitspire_dev
POSTGRES_USER: bitspire
POSTGRES_PASSWORD: bitspire_dev_password # pragma: allowlist secret
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U lamassu -d lamassu_dev']
test: ['CMD-SHELL', 'pg_isready -U bitspire -d bitspire_dev']
interval: 10s
timeout: 5s
retries: 5

View file

@ -1,13 +1,13 @@
# Lamassu Next - Regtest Integration
# bitSpire - Regtest Integration
#
# This overlay connects lamassu-next services to the comprehensive regtest
# This overlay connects bitspire-next services to the comprehensive regtest
# environment at ~/dev/local/docker/regtest
#
# Usage:
# 1. Start regtest (minimal — only what LP needs):
# cd ~/dev/local/docker/regtest && docker compose up -d bitcoind lnd-1 lnd-4
#
# 2. Start lamassu services:
# 2. Start bitspire services:
# cd docker && docker compose -f docker-compose.regtest.yml up -d
#
# 3. Bootstrap (funds LND, opens channels, creates LP app):
@ -32,7 +32,7 @@ services:
# Private Nostr relay for ATM communication
strfry:
image: ghcr.io/hoytech/strfry:latest
container_name: lamassu-relay
container_name: bitspire-relay
ports:
- '7777:7777'
volumes:
@ -57,7 +57,7 @@ services:
# Use LIGHTNING_PUB_IMAGE env var to specify image (default: lightning-pub-withdraw)
lightning-pub:
image: ${LIGHTNING_PUB_IMAGE:-lightning-pub-withdraw:latest}
container_name: lamassu-lightning-pub
container_name: bitspire-lightning-pub
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
@ -80,7 +80,7 @@ services:
# Disable external liquidity provider for regtest
- DISABLE_LIQUIDITY_PROVIDER=true
# Admin token for HTTP API access (development only)
- ADMIN_TOKEN=lamassu-dev-admin-token
- ADMIN_TOKEN=bitspire-dev-admin-token
# Extension HTTP API URL (for LNURL callbacks from external wallets)
# Use HOST_IP env var for your machine's LAN IP (required for phone wallets)
- EXTENSION_SERVICE_URL=http://${HOST_IP:-localhost}:1777
@ -101,7 +101,7 @@ services:
# Keeps Lightning channels active during development
miner:
image: boltz/bitcoin-core:25.0
container_name: lamassu-miner
container_name: bitspire-miner
entrypoint: /bin/sh
command:
- -c
@ -132,17 +132,17 @@ services:
# PostgreSQL for optional server-side state
postgres:
image: postgres:16-alpine
container_name: lamassu-postgres
container_name: bitspire-postgres
ports:
- '5432:5432'
environment:
POSTGRES_DB: lamassu_dev
POSTGRES_USER: lamassu
POSTGRES_PASSWORD: lamassu_dev_password
POSTGRES_DB: bitspire_dev
POSTGRES_USER: bitspire
POSTGRES_PASSWORD: bitspire_dev_password # pragma: allowlist secret
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U lamassu -d lamassu_dev']
test: ['CMD-SHELL', 'pg_isready -U bitspire -d bitspire_dev']
interval: 10s
timeout: 5s
retries: 5

View file

@ -4,7 +4,7 @@
# Prerequisites:
# 1. Regtest running (minimal — only needs bitcoind + lnd-1 + lnd-4):
# cd ~/dev/local/docker/regtest && docker compose up -d bitcoind lnd-1 lnd-4
# 2. Lamassu services running:
# 2. bitSpire services running:
# cd docker && docker compose -f docker-compose.regtest.yml up -d
#
# What this script does:
@ -59,7 +59,7 @@ lncli_4() {
LP_URL="http://localhost:1776"
LP_EXT_URL="http://localhost:1777"
ADMIN_TOKEN="lamassu-dev-admin-token"
ADMIN_TOKEN="bitspire-dev-admin-token"
CHANNEL_SIZE=5000000 # 5M sats
FUND_AMOUNT=10000 # 10k sats for LP app
@ -195,7 +195,7 @@ for i in $(seq 1 120); do
fi
if [ "$i" -eq 120 ]; then
err "Lightning.Pub not ready after 120s"
err "Check: docker logs lamassu-lightning-pub"
err "Check: docker logs bitspire-lightning-pub"
exit 1
fi
sleep 1

View file

@ -36,7 +36,7 @@ cmd_up() {
echo -e "${CYAN}Starting regtest (bitcoind + lnd-1 + lnd-4)...${NC}"
cd "$REGTEST_DIR" && docker compose up -d bitcoind lnd-1 lnd-4
echo -e "${CYAN}Starting lamassu services...${NC}"
echo -e "${CYAN}Starting bitspire services...${NC}"
docker compose -f "$COMPOSE_FILE" up -d
echo -e "${CYAN}Running bootstrap...${NC}"
@ -44,7 +44,7 @@ cmd_up() {
}
cmd_down() {
echo -e "${CYAN}Stopping lamassu services...${NC}"
echo -e "${CYAN}Stopping bitspire services...${NC}"
docker compose -f "$COMPOSE_FILE" down 2>/dev/null || true
echo -e "${CYAN}Stopping regtest...${NC}"
@ -68,7 +68,7 @@ cmd_reset() {
cmd_status() {
echo -e "${CYAN}Containers:${NC}"
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E 'regtest|lamassu|NAMES' | sort
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E 'regtest|bitspire|NAMES' | sort
PREFIX=$(detect_prefix)
if [ -n "$PREFIX" ]; then
@ -92,9 +92,9 @@ cmd_status() {
cmd_logs() {
local svc="${1:-lp}"
case "$svc" in
lp|lightning-pub) docker logs -f --tail 50 lamassu-lightning-pub ;;
relay|strfry) docker logs -f --tail 50 lamassu-relay ;;
miner) docker logs -f --tail 50 lamassu-miner ;;
lp|lightning-pub) docker logs -f --tail 50 bitspire-lightning-pub ;;
relay|strfry) docker logs -f --tail 50 bitspire-relay ;;
miner) docker logs -f --tail 50 bitspire-miner ;;
lnd1|lnd-1) PREFIX=$(detect_prefix); docker logs -f --tail 50 "${PREFIX}-lnd-1-1" ;;
lnd4|lnd-4) PREFIX=$(detect_prefix); docker logs -f --tail 50 "${PREFIX}-lnd-4-1" ;;
bitcoind) PREFIX=$(detect_prefix); docker logs -f --tail 50 "${PREFIX}-bitcoind-1" ;;

View file

@ -1,6 +1,6 @@
#!/bin/bash
#
# Start lamassu-next development environment with comprehensive regtest
# Start bitspire-next development environment with comprehensive regtest
#
# This script:
# 1. Connects to the regtest environment at ~/dev/local/docker/regtest
@ -37,10 +37,10 @@ CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'
log() { echo -e "${GREEN}[lamassu]${NC} $1"; }
warn() { echo -e "${YELLOW}[lamassu]${NC} $1"; }
error() { echo -e "${RED}[lamassu]${NC} $1"; }
info() { echo -e "${CYAN}[lamassu]${NC} $1"; }
log() { echo -e "${GREEN}[bitspire]${NC} $1"; }
warn() { echo -e "${YELLOW}[bitspire]${NC} $1"; }
error() { echo -e "${RED}[bitspire]${NC} $1"; }
info() { echo -e "${CYAN}[bitspire]${NC} $1"; }
# Get local IP for external wallet access
get_local_ip() {
@ -86,7 +86,7 @@ wait_for_lightning_pub() {
local attempt=0
while [[ $attempt -lt $max_attempts ]]; do
if docker logs lamassu-lightning-pub 2>&1 | grep -q "LightningPub listening"; then
if docker logs bitspire-lightning-pub 2>&1 | grep -q "LightningPub listening"; then
sleep 2 # Extra time for Nostr middleware
return 0
fi
@ -95,18 +95,18 @@ wait_for_lightning_pub() {
done
error "Lightning.Pub failed to start within 60 seconds"
docker logs lamassu-lightning-pub 2>&1 | tail -20
docker logs bitspire-lightning-pub 2>&1 | tail -20
return 1
}
# Get Lightning.Pub nprofile from logs
get_nprofile() {
docker logs lamassu-lightning-pub 2>&1 | grep -oP 'nprofile:\s*\K\S+' | tail -1
docker logs bitspire-lightning-pub 2>&1 | grep -oP 'nprofile:\s*\K\S+' | tail -1
}
# Get Lightning.Pub pubkey from logs
get_pubkey() {
docker logs lamassu-lightning-pub 2>&1 | grep -oP 'pubkey:\s*\K[a-f0-9]+' | tail -1
docker logs bitspire-lightning-pub 2>&1 | grep -oP 'pubkey:\s*\K[a-f0-9]+' | tail -1
}
# Generate lndconnect URL for Zeus (using lnd-3 which has REST exposed)
@ -139,7 +139,7 @@ setup_atm_account() {
# Create app
local app_response=$(curl -s -X POST http://localhost:1776/api/admin/app/add \
-H "Content-Type: application/json" \
-H "Authorization: Bearer lamassu-dev-admin-token" \
-H "Authorization: Bearer bitspire-dev-admin-token" \
-d '{"name":"atm-app","allow_user_creation":true}' 2>/dev/null)
if echo "$app_response" | grep -q '"status":"OK"'; then
@ -171,7 +171,7 @@ show_connection_info() {
echo ""
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
echo -e "${BOLD} LAMASSU REGTEST ENVIRONMENT ${NC}"
echo -e "${BOLD} BITSPIRE REGTEST ENVIRONMENT ${NC}"
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
echo ""
@ -262,7 +262,7 @@ start() {
export LIGHTNING_PUB_IMAGE="$image"
export HOST_IP=$(get_local_ip)
log "Starting lamassu services..."
log "Starting bitspire services..."
docker compose -f "$SCRIPT_DIR/docker-compose.regtest.yml" up -d
# Wait for Lightning.Pub and setup
@ -277,7 +277,7 @@ start() {
# Stop services
stop() {
log "Stopping lamassu services..."
log "Stopping bitspire services..."
docker compose -f "$SCRIPT_DIR/docker-compose.regtest.yml" down
rm -f "$SCRIPT_DIR/.atm-app-token" "$SCRIPT_DIR/.atm-app-id"
log "Services stopped."
@ -290,7 +290,7 @@ logs() {
# Show status/connection info
status() {
if ! docker ps --format '{{.Names}}' | grep -q lamassu-lightning-pub; then
if ! docker ps --format '{{.Names}}' | grep -q bitspire-lightning-pub; then
error "Services not running. Start with: $0 start"
exit 1
fi

View file

@ -1,5 +1,5 @@
##
## strfry configuration for Lamassu ATM development
## strfry configuration for bitSpire ATM development
##
relay {
@ -10,7 +10,7 @@ relay {
nofiles = 0
info {
name = "Lamassu Dev Relay"
name = "bitSpire Dev Relay"
description = "Private Nostr relay for ATM development and testing"
pubkey = ""
contact = ""

View file

@ -24,7 +24,7 @@ const RELAY_URL = 'ws://localhost:7777'
// Relay URL for browser access (different from Docker internal strfry:7777)
const BROWSER_RELAY_URL = 'ws://localhost:7777'
const LIGHTNING_PUB_HTTP = 'http://localhost:1776'
const ADMIN_TOKEN = 'lamassu-dev-admin-token'
const ADMIN_TOKEN = 'bitspire-dev-admin-token'
// Lightning.Pub pubkey - fetched dynamically from the ATM user's ndebit
let LIGHTNING_PUB_PUBKEY = null

View file

@ -28,7 +28,7 @@ if (!NDEBIT || !BOLT11) {
console.log('')
console.log('Example:')
console.log(' # First create an invoice on Alice:')
console.log(' docker exec lamassu-lnd-alice lncli --network=regtest addinvoice --amt 1000')
console.log(' docker exec bitspire-lnd-alice lncli --network=regtest addinvoice --amt 1000')
console.log('')
console.log(' # Then test the debit:')
console.log(' node test-debit.mjs ndebit1... lnbcrt...')

View file

@ -10,13 +10,13 @@ const LIGHTNING_PUB_PUBKEY =
const RELAY_URL = process.env.NOSTR_RELAY_URL || 'ws://localhost:7777'
// Get a fresh invoice from Alice first:
// docker exec lamassu-lnd-alice lncli --network=regtest addinvoice --amt 1000
// docker exec bitspire-lnd-alice lncli --network=regtest addinvoice --amt 1000
const TEST_INVOICE = process.argv[2]
if (!TEST_INVOICE) {
console.log('Usage: node test-pay.mjs <invoice>')
console.log(
'Generate invoice: docker exec lamassu-lnd-alice lncli --network=regtest addinvoice --amt 1000'
'Generate invoice: docker exec bitspire-lnd-alice lncli --network=regtest addinvoice --amt 1000'
)
process.exit(1)
}