mirror of
https://github.com/luxfi/dex.git
synced 2026-09-24 00:26:31 +00:00
luxd serves chain routes under /v1/chain, and the node, cli and sdk releases already ship it. The deployed gateways still answer the old prefix, so remote reads break until they are redeployed; the estate moves together rather than sitting half converted. Lines that record an observation - a probe, a status code, a past release - keep the prefix they were written against, as do URLs on hosts that are not ours. Avalanche endpoints move to /ext/bc, which is the path that host serves. Co-authored-by: Hanzo Dev <[email protected]>
230 lines
6.7 KiB
Bash
Executable File
230 lines
6.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# Run Local Lux Network for DEX Testing
|
|
|
|
set -e
|
|
|
|
echo "🚀 Starting Local Lux Network..."
|
|
echo "================================"
|
|
|
|
# Configuration
|
|
LUXD_PATH="${HOME}/work/lux/node/luxd"
|
|
DATA_DIR="/tmp/lux-local"
|
|
NETWORK_ID=96369 # Lux testnet ID
|
|
CHAIN_ID=96369
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m'
|
|
|
|
# Check if luxd exists
|
|
if [ ! -f "$LUXD_PATH" ]; then
|
|
echo -e "${RED}❌ luxd not found at $LUXD_PATH${NC}"
|
|
echo "Building luxd..."
|
|
cd ~/work/lux/node
|
|
./scripts/build.sh
|
|
cd -
|
|
fi
|
|
|
|
# Clean previous data
|
|
echo "Cleaning previous data..."
|
|
rm -rf $DATA_DIR
|
|
mkdir -p $DATA_DIR/staking
|
|
|
|
# Generate staking keys
|
|
echo "Generating staking keys..."
|
|
cd $DATA_DIR/staking
|
|
openssl genrsa -out staker.key 4096 2>/dev/null
|
|
openssl req -new -x509 -key staker.key -out staker.crt -days 365 \
|
|
-subj '/C=US/ST=NY/O=LuxDEX/CN=lux' 2>/dev/null
|
|
cd -
|
|
|
|
echo -e "${GREEN}✅ Staking keys generated${NC}"
|
|
|
|
# Create genesis file for local network
|
|
cat > $DATA_DIR/genesis.json << 'EOF'
|
|
{
|
|
"networkID": 96369,
|
|
"allocations": [
|
|
{
|
|
"ethAddr": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb7",
|
|
"avaxAddr": "X-lux18jma8ppw3nhx5r4ap8clazz0dps7rv5u6wdp",
|
|
"initialAmount": 100000000000000000000000000,
|
|
"unlockSchedule": []
|
|
}
|
|
],
|
|
"startTime": 1630000000,
|
|
"initialStakeDuration": 31536000,
|
|
"initialStakeDurationOffset": 5400,
|
|
"initialStakedFunds": [],
|
|
"initialStakers": [],
|
|
"cChainGenesis": "{\"config\":{\"chainId\":96369,\"homesteadBlock\":0,\"eip150Block\":0,\"eip150Hash\":\"0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0\",\"eip155Block\":0,\"eip158Block\":0,\"byzantiumBlock\":0,\"constantinopleBlock\":0,\"petersburgBlock\":0,\"istanbulBlock\":0,\"muirGlacierBlock\":0,\"subnetEVMTimestamp\":0},\"nonce\":\"0x0\",\"timestamp\":\"0x0\",\"extraData\":\"0x00\",\"gasLimit\":\"0x5f5e100\",\"difficulty\":\"0x0\",\"mixHash\":\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"coinbase\":\"0x0000000000000000000000000000000000000000\",\"alloc\":{\"742d35Cc6634C0532925a3b844Bc9e7595f0bEb7\":{\"balance\":\"0x52b7d2dcc80cd2e4000000\"}},\"number\":\"0x0\",\"gasUsed\":\"0x0\",\"parentHash\":\"0x0000000000000000000000000000000000000000000000000000000000000000\"}",
|
|
"message": "Local DEX Test Network"
|
|
}
|
|
EOF
|
|
|
|
echo -e "${GREEN}✅ Genesis file created${NC}"
|
|
|
|
# Start the node
|
|
echo ""
|
|
echo -e "${YELLOW}Starting Lux Node...${NC}"
|
|
echo "Network ID: $NETWORK_ID"
|
|
echo "Data Directory: $DATA_DIR"
|
|
echo ""
|
|
|
|
# Run luxd with local network configuration
|
|
$LUXD_PATH \
|
|
--network-id=$NETWORK_ID \
|
|
--data-dir=$DATA_DIR \
|
|
--api-admin-enabled=true \
|
|
--api-ipcs-enabled=true \
|
|
--api-keystore-enabled=true \
|
|
--api-metrics-enabled=true \
|
|
--http-host=0.0.0.0 \
|
|
--http-port=9650 \
|
|
--staking-port=9651 \
|
|
--log-level=info \
|
|
--bootstrap-ips="" \
|
|
--bootstrap-ids="" \
|
|
--staking-enabled=false \
|
|
--network-id-override=$NETWORK_ID \
|
|
--public-ip=127.0.0.1 \
|
|
--health-check-frequency=2s \
|
|
--network-initial-timeout=10s \
|
|
--network-minimum-timeout=5s \
|
|
--network-maximum-timeout=15s \
|
|
--snow-sample-size=1 \
|
|
--snow-quorum-size=1 \
|
|
--snow-concurrent-repolls=1 \
|
|
--index-enabled=true \
|
|
--chain-config-dir=$DATA_DIR/chains \
|
|
&
|
|
|
|
NODE_PID=$!
|
|
echo "Node PID: $NODE_PID"
|
|
|
|
# Wait for node to start
|
|
echo "Waiting for node to start..."
|
|
sleep 5
|
|
|
|
# Check if node is running
|
|
for i in {1..30}; do
|
|
if curl -s -X POST --data '{
|
|
"jsonrpc":"2.0",
|
|
"id":1,
|
|
"method":"info.isBootstrapped",
|
|
"params": {"chain":"X"}
|
|
}' -H 'content-type:application/json;' http://127.0.0.1:9650/v1/info 2>/dev/null | grep -q "true"; then
|
|
echo -e "${GREEN}✅ Node is bootstrapped and ready!${NC}"
|
|
break
|
|
fi
|
|
echo "Waiting for bootstrap... ($i/30)"
|
|
sleep 2
|
|
done
|
|
|
|
# Test RPC endpoints
|
|
echo ""
|
|
echo "Testing RPC Endpoints..."
|
|
echo "========================"
|
|
|
|
# Test info endpoint
|
|
echo -n "1. Info endpoint: "
|
|
if curl -s -X POST --data '{
|
|
"jsonrpc":"2.0",
|
|
"id":1,
|
|
"method":"info.getNetworkID"
|
|
}' -H 'content-type:application/json;' http://127.0.0.1:9650/v1/info | grep -q "$NETWORK_ID"; then
|
|
echo -e "${GREEN}✅ Working${NC}"
|
|
else
|
|
echo -e "${RED}❌ Failed${NC}"
|
|
fi
|
|
|
|
# Test health endpoint
|
|
echo -n "2. Health endpoint: "
|
|
if curl -s http://127.0.0.1:9650/v1/health | grep -q "healthy"; then
|
|
echo -e "${GREEN}✅ Healthy${NC}"
|
|
else
|
|
echo -e "${RED}❌ Not healthy${NC}"
|
|
fi
|
|
|
|
# Test X-Chain RPC
|
|
echo -n "3. X-Chain RPC: "
|
|
if curl -s -X POST --data '{
|
|
"jsonrpc":"2.0",
|
|
"id":1,
|
|
"method":"avm.getBalance",
|
|
"params":{
|
|
"address":"X-lux18jma8ppw3nhx5r4ap8clazz0dps7rv5u6wdp",
|
|
"assetID":"LUX"
|
|
}
|
|
}' -H 'content-type:application/json;' http://127.0.0.1:9650/v1/chain/X 2>/dev/null | grep -q "balance"; then
|
|
echo -e "${GREEN}✅ Working${NC}"
|
|
else
|
|
echo -e "${RED}❌ Failed${NC}"
|
|
fi
|
|
|
|
# Test C-Chain RPC (EVM)
|
|
echo -n "4. C-Chain RPC: "
|
|
if curl -s -X POST --data '{
|
|
"jsonrpc":"2.0",
|
|
"method":"eth_chainId",
|
|
"params":[],
|
|
"id":1
|
|
}' -H 'content-type:application/json;' http://127.0.0.1:9650/v1/chain/C/rpc 2>/dev/null | grep -q "result"; then
|
|
echo -e "${GREEN}✅ Working${NC}"
|
|
else
|
|
echo -e "${RED}❌ Failed${NC}"
|
|
fi
|
|
|
|
# Test block production
|
|
echo -n "5. Block production: "
|
|
BLOCK_HEIGHT=$(curl -s -X POST --data '{
|
|
"jsonrpc":"2.0",
|
|
"method":"eth_blockNumber",
|
|
"params":[],
|
|
"id":1
|
|
}' -H 'content-type:application/json;' http://127.0.0.1:9650/v1/chain/C/rpc 2>/dev/null | grep -o '"result":"[^"]*"' | sed 's/"result":"//;s/"//')
|
|
|
|
if [ ! -z "$BLOCK_HEIGHT" ]; then
|
|
echo -e "${GREEN}✅ Current block: $BLOCK_HEIGHT${NC}"
|
|
else
|
|
echo -e "${RED}❌ No blocks${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "================================"
|
|
echo -e "${GREEN}✅ Local Lux Network is running!${NC}"
|
|
echo ""
|
|
echo "RPC Endpoints:"
|
|
echo " Info API: http://localhost:9650/v1/info"
|
|
echo " Health: http://localhost:9650/v1/health"
|
|
echo " X-Chain: http://localhost:9650/v1/chain/X"
|
|
echo " C-Chain: http://localhost:9650/v1/chain/C/rpc"
|
|
echo " P-Chain: http://localhost:9650/v1/chain/P"
|
|
echo ""
|
|
echo "WebSocket:"
|
|
echo " C-Chain WS: ws://localhost:9650/v1/chain/C/ws"
|
|
echo ""
|
|
echo "Node PID: $NODE_PID"
|
|
echo "To stop: kill $NODE_PID"
|
|
echo ""
|
|
echo "Monitoring blocks..."
|
|
echo "Press Ctrl+C to stop"
|
|
echo ""
|
|
|
|
# Monitor block production
|
|
while true; do
|
|
BLOCK=$(curl -s -X POST --data '{
|
|
"jsonrpc":"2.0",
|
|
"method":"eth_blockNumber",
|
|
"params":[],
|
|
"id":1
|
|
}' -H 'content-type:application/json;' http://127.0.0.1:9650/v1/chain/C/rpc 2>/dev/null | grep -o '"result":"[^"]*"' | sed 's/"result":"//;s/"//')
|
|
|
|
if [ ! -z "$BLOCK" ]; then
|
|
BLOCK_DEC=$((16#${BLOCK#0x}))
|
|
echo -e "Block #$BLOCK_DEC produced at $(date '+%H:%M:%S')"
|
|
fi
|
|
sleep 5
|
|
done |