113 lines
3.9 KiB
Bash
113 lines
3.9 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Start solana-test-validator with optional SPL token setup
|
|
#
|
|
# Environment variables:
|
|
# FACILITATOR_PUBKEY - facilitator fee-payer public key (base58)
|
|
# SERVER_PUBKEY - server/payee wallet public key (base58)
|
|
# CLIENT_PUBKEY - client/payer wallet public key (base58)
|
|
# MINT_DECIMALS - token decimals (default: 6, matching USDC)
|
|
# MINT_AMOUNT - amount to mint to client (default: 1000000000)
|
|
# LEDGER_DIR - ledger directory (default: /data/ledger)
|
|
# -----------------------------------------------------------------------
|
|
|
|
LEDGER_DIR="${LEDGER_DIR:-/data/ledger}"
|
|
MINT_DECIMALS="${MINT_DECIMALS:-6}"
|
|
MINT_AMOUNT="${MINT_AMOUNT:-1000000000}"
|
|
SETUP_MARKER="${LEDGER_DIR}/.setup-done"
|
|
|
|
sudo chown -R "$(id -u):$(id -g)" "$LEDGER_DIR" 2>/dev/null || true
|
|
|
|
# Start test-validator in the background
|
|
solana-test-validator \
|
|
--ledger "${LEDGER_DIR}" \
|
|
--rpc-port 8899 \
|
|
--bind-address 0.0.0.0 \
|
|
--quiet &
|
|
|
|
VALIDATOR_PID=$!
|
|
|
|
# Wait for RPC to become available
|
|
echo "Waiting for test-validator RPC..."
|
|
for i in $(seq 1 60); do
|
|
if solana cluster-version --url http://127.0.0.1:8899 >/dev/null 2>&1; then
|
|
echo "Test-validator is ready (attempt ${i})"
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
solana config set --url http://127.0.0.1:8899
|
|
|
|
# Only run setup once (idempotent via marker file)
|
|
if [ ! -f "${SETUP_MARKER}" ]; then
|
|
echo "Running first-time setup..."
|
|
|
|
# Airdrop SOL to all wallets for gas
|
|
for PUBKEY in "${FACILITATOR_PUBKEY:-}" "${SERVER_PUBKEY:-}" "${CLIENT_PUBKEY:-}"; do
|
|
if [ -n "${PUBKEY}" ]; then
|
|
echo "Airdropping 100 SOL to ${PUBKEY}..."
|
|
solana airdrop 100 "${PUBKEY}" --url http://127.0.0.1:8899 || true
|
|
fi
|
|
done
|
|
|
|
# Create a USDC-equivalent SPL token mint if any pubkeys are set
|
|
if [ -n "${CLIENT_PUBKEY:-}" ] || [ -n "${FACILITATOR_PUBKEY:-}" ] || [ -n "${SERVER_PUBKEY:-}" ]; then
|
|
MINT_AUTHORITY_FILE="${LEDGER_DIR}/mint-authority.json"
|
|
if [ ! -f "${MINT_AUTHORITY_FILE}" ]; then
|
|
solana-keygen new --no-bip39-passphrase --outfile "${MINT_AUTHORITY_FILE}" --force
|
|
MINT_AUTH_PUBKEY=$(solana-keygen pubkey "${MINT_AUTHORITY_FILE}")
|
|
solana airdrop 10 "${MINT_AUTH_PUBKEY}" --url http://127.0.0.1:8899
|
|
fi
|
|
|
|
MINT_ADDRESS_FILE="${LEDGER_DIR}/usdc-mint-address.txt"
|
|
if [ ! -f "${MINT_ADDRESS_FILE}" ]; then
|
|
spl-token create-token \
|
|
--decimals "${MINT_DECIMALS}" \
|
|
--mint-authority "${MINT_AUTHORITY_FILE}" \
|
|
--url http://127.0.0.1:8899 \
|
|
2>&1 | grep "Creating token" | awk '{print $3}' > "${MINT_ADDRESS_FILE}"
|
|
echo "Created USDC mint: $(cat "${MINT_ADDRESS_FILE}")"
|
|
fi
|
|
|
|
USDC_MINT=$(cat "${MINT_ADDRESS_FILE}")
|
|
|
|
# Create ATAs and mint tokens for the client
|
|
if [ -n "${CLIENT_PUBKEY:-}" ]; then
|
|
echo "Creating ATA for client ${CLIENT_PUBKEY}..."
|
|
spl-token create-account "${USDC_MINT}" \
|
|
--owner "${CLIENT_PUBKEY}" \
|
|
--fee-payer "${MINT_AUTHORITY_FILE}" \
|
|
--url http://127.0.0.1:8899 || true
|
|
|
|
echo "Minting ${MINT_AMOUNT} tokens to client..."
|
|
spl-token mint "${USDC_MINT}" "${MINT_AMOUNT}" \
|
|
--recipient-owner "${CLIENT_PUBKEY}" \
|
|
--mint-authority "${MINT_AUTHORITY_FILE}" \
|
|
--url http://127.0.0.1:8899 || true
|
|
fi
|
|
|
|
# Create ATAs for server and facilitator
|
|
for PUBKEY in "${SERVER_PUBKEY:-}" "${FACILITATOR_PUBKEY:-}"; do
|
|
if [ -n "${PUBKEY}" ]; then
|
|
echo "Creating ATA for ${PUBKEY}..."
|
|
spl-token create-account "${USDC_MINT}" \
|
|
--owner "${PUBKEY}" \
|
|
--fee-payer "${MINT_AUTHORITY_FILE}" \
|
|
--url http://127.0.0.1:8899 || true
|
|
fi
|
|
done
|
|
|
|
# Expose mint address for other containers
|
|
cp "${MINT_ADDRESS_FILE}" /tmp/usdc-mint-address.txt 2>/dev/null || true
|
|
fi
|
|
|
|
touch "${SETUP_MARKER}"
|
|
echo "Setup complete."
|
|
fi
|
|
|
|
echo "solana-test-validator running (PID ${VALIDATOR_PID})"
|
|
wait ${VALIDATOR_PID}
|