mirror of
https://github.com/sonr-io/sonr.git
synced 2026-08-02 17:31:39 +00:00
392 lines
9.6 KiB
Bash
392 lines
9.6 KiB
Bash
#!/bin/bash
|
|
|
|
# Setup IBC channels between Cosmos Hub testnet and Sonr chain
|
|
# for Identity DAO cross-chain communication
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Helper functions
|
|
log_info() {
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
log_debug() {
|
|
echo -e "${BLUE}[DEBUG]${NC} $1"
|
|
}
|
|
|
|
# Configuration
|
|
# Cosmos Hub testnet
|
|
HUB_CHAIN_ID="theta-testnet-001"
|
|
HUB_RPC="https://rpc.sentry-01.theta-testnet.polypore.xyz:443"
|
|
HUB_GRPC="grpc.sentry-01.theta-testnet.polypore.xyz:9090"
|
|
HUB_PREFIX="cosmos"
|
|
HUB_DENOM="uatom"
|
|
HUB_GAS_PRICES="0.025uatom"
|
|
|
|
# Sonr testnet
|
|
SONR_CHAIN_ID="sonrtest_1-1"
|
|
SONR_RPC="http://localhost:26657"
|
|
SONR_GRPC="localhost:9090"
|
|
SONR_PREFIX="sonr"
|
|
SONR_DENOM="usnr"
|
|
SONR_GAS_PRICES="0.025usnr"
|
|
|
|
# IBC Configuration
|
|
IBC_VERSION="ics20-1"
|
|
RELAYER_NAME="identity-dao-relayer"
|
|
RELAYER_HOME="${HOME}/.relayer"
|
|
PATH_NAME="hub-sonr"
|
|
|
|
# Contract ports (from deployment)
|
|
VOTING_PORT="wasm.cosmos1voting_contract_address" # Will be replaced with actual address
|
|
PROPOSALS_PORT="wasm.cosmos1proposals_contract_address"
|
|
|
|
# Check if Hermes relayer is installed
|
|
check_hermes() {
|
|
if ! command -v hermes &> /dev/null; then
|
|
log_error "Hermes relayer not found. Installing..."
|
|
|
|
# Install Hermes based on OS
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
brew install hermes
|
|
else
|
|
# Linux installation
|
|
curl -L https://github.com/informalsystems/hermes/releases/download/v1.8.0/hermes-v1.8.0-x86_64-unknown-linux-gnu.tar.gz | tar xz
|
|
sudo mv hermes /usr/local/bin/
|
|
fi
|
|
fi
|
|
|
|
log_info "Found Hermes: $(hermes version)"
|
|
}
|
|
|
|
# Initialize Hermes configuration
|
|
init_hermes_config() {
|
|
log_info "Initializing Hermes configuration..."
|
|
|
|
mkdir -p "${RELAYER_HOME}"
|
|
|
|
cat > "${RELAYER_HOME}/config.toml" << EOF
|
|
[global]
|
|
log_level = 'info'
|
|
|
|
[mode]
|
|
|
|
[mode.clients]
|
|
enabled = true
|
|
refresh = true
|
|
misbehaviour = true
|
|
|
|
[mode.connections]
|
|
enabled = true
|
|
|
|
[mode.channels]
|
|
enabled = true
|
|
|
|
[mode.packets]
|
|
enabled = true
|
|
clear_interval = 100
|
|
clear_on_start = true
|
|
tx_confirmation = true
|
|
|
|
[rest]
|
|
enabled = true
|
|
host = '127.0.0.1'
|
|
port = 3000
|
|
|
|
[telemetry]
|
|
enabled = false
|
|
host = '127.0.0.1'
|
|
port = 3001
|
|
|
|
# Cosmos Hub testnet configuration
|
|
[[chains]]
|
|
id = '${HUB_CHAIN_ID}'
|
|
type = 'CosmosSdk'
|
|
rpc_addr = '${HUB_RPC}'
|
|
grpc_addr = '${HUB_GRPC}'
|
|
event_source = { mode = 'push', url = '${HUB_RPC/https/wss}/websocket', batch_delay = '500ms' }
|
|
rpc_timeout = '10s'
|
|
account_prefix = '${HUB_PREFIX}'
|
|
key_name = 'hub-relayer'
|
|
store_prefix = 'ibc'
|
|
gas_price = { price = 0.025, denom = '${HUB_DENOM}' }
|
|
max_gas = 6000000
|
|
default_gas = 1000000
|
|
gas_multiplier = 1.2
|
|
max_msg_num = 30
|
|
max_tx_size = 2097152
|
|
clock_drift = '5s'
|
|
max_block_time = '30s'
|
|
memo_prefix = 'Identity DAO IBC'
|
|
trusting_period = '14days'
|
|
trust_threshold = { numerator = '1', denominator = '3' }
|
|
|
|
[chains.packet_filter]
|
|
policy = 'allow'
|
|
list = [
|
|
['wasm*', '*'], # Allow all CosmWasm IBC traffic
|
|
]
|
|
|
|
# Sonr testnet configuration
|
|
[[chains]]
|
|
id = '${SONR_CHAIN_ID}'
|
|
type = 'CosmosSdk'
|
|
rpc_addr = '${SONR_RPC}'
|
|
grpc_addr = '${SONR_GRPC}'
|
|
event_source = { mode = 'push', url = '${SONR_RPC/http/ws}/websocket', batch_delay = '500ms' }
|
|
rpc_timeout = '10s'
|
|
account_prefix = '${SONR_PREFIX}'
|
|
key_name = 'sonr-relayer'
|
|
store_prefix = 'ibc'
|
|
gas_price = { price = 0.025, denom = '${SONR_DENOM}' }
|
|
max_gas = 6000000
|
|
default_gas = 1000000
|
|
gas_multiplier = 1.2
|
|
max_msg_num = 30
|
|
max_tx_size = 2097152
|
|
clock_drift = '5s'
|
|
max_block_time = '30s'
|
|
memo_prefix = 'Identity DAO IBC'
|
|
trusting_period = '14days'
|
|
trust_threshold = { numerator = '1', denominator = '3' }
|
|
|
|
[chains.packet_filter]
|
|
policy = 'allow'
|
|
list = [
|
|
['transfer', 'channel-*'],
|
|
['wasm*', '*'],
|
|
]
|
|
EOF
|
|
|
|
log_info "Hermes config created at ${RELAYER_HOME}/config.toml"
|
|
}
|
|
|
|
# Add relayer keys
|
|
add_relayer_keys() {
|
|
log_info "Adding relayer keys..."
|
|
|
|
# Add Cosmos Hub key
|
|
log_info "Adding Cosmos Hub relayer key..."
|
|
hermes keys add \
|
|
--chain "${HUB_CHAIN_ID}" \
|
|
--mnemonic-file hub-relayer.mnemonic \
|
|
--key-name hub-relayer
|
|
|
|
# Add Sonr key
|
|
log_info "Adding Sonr relayer key..."
|
|
hermes keys add \
|
|
--chain "${SONR_CHAIN_ID}" \
|
|
--mnemonic-file sonr-relayer.mnemonic \
|
|
--key-name sonr-relayer
|
|
}
|
|
|
|
# Create IBC clients
|
|
create_clients() {
|
|
log_info "Creating IBC clients..."
|
|
|
|
# Create client on Cosmos Hub for Sonr
|
|
log_info "Creating Sonr client on Cosmos Hub..."
|
|
hermes create client \
|
|
--host-chain "${HUB_CHAIN_ID}" \
|
|
--reference-chain "${SONR_CHAIN_ID}"
|
|
|
|
# Create client on Sonr for Cosmos Hub
|
|
log_info "Creating Cosmos Hub client on Sonr..."
|
|
hermes create client \
|
|
--host-chain "${SONR_CHAIN_ID}" \
|
|
--reference-chain "${HUB_CHAIN_ID}"
|
|
}
|
|
|
|
# Create IBC connection
|
|
create_connection() {
|
|
log_info "Creating IBC connection..."
|
|
|
|
hermes create connection \
|
|
--a-chain "${HUB_CHAIN_ID}" \
|
|
--b-chain "${SONR_CHAIN_ID}"
|
|
}
|
|
|
|
# Create IBC channels for contracts
|
|
create_channels() {
|
|
log_info "Creating IBC channels for Identity DAO contracts..."
|
|
|
|
# Load deployed contract addresses
|
|
if [ -f "deployment_ids.env" ]; then
|
|
source deployment_ids.env
|
|
else
|
|
log_error "deployment_ids.env not found. Please deploy contracts first."
|
|
exit 1
|
|
fi
|
|
|
|
# Channel for Voting contract to query x/did module
|
|
log_info "Creating channel for Voting contract..."
|
|
hermes create channel \
|
|
--a-chain "${HUB_CHAIN_ID}" \
|
|
--a-port "wasm.${VOTING_ADDR}" \
|
|
--b-port "did" \
|
|
--order unordered \
|
|
--version "did-ibc-v1"
|
|
|
|
# Channel for Proposals contract
|
|
log_info "Creating channel for Proposals contract..."
|
|
hermes create channel \
|
|
--a-chain "${HUB_CHAIN_ID}" \
|
|
--a-port "wasm.${PROPOSALS_ADDR}" \
|
|
--b-port "dwn" \
|
|
--order unordered \
|
|
--version "dwn-ibc-v1"
|
|
|
|
# Standard transfer channel for treasury operations
|
|
log_info "Creating transfer channel..."
|
|
hermes create channel \
|
|
--a-chain "${HUB_CHAIN_ID}" \
|
|
--a-port "transfer" \
|
|
--b-port "transfer" \
|
|
--order unordered \
|
|
--version "${IBC_VERSION}"
|
|
}
|
|
|
|
# Start relayer
|
|
start_relayer() {
|
|
log_info "Starting Hermes relayer..."
|
|
|
|
# Start in background
|
|
hermes start &
|
|
RELAYER_PID=$!
|
|
|
|
log_info "Relayer started with PID: ${RELAYER_PID}"
|
|
echo "${RELAYER_PID}" > relayer.pid
|
|
|
|
# Give it time to establish connections
|
|
sleep 10
|
|
|
|
# Check if relayer is running
|
|
if ps -p ${RELAYER_PID} > /dev/null; then
|
|
log_info "Relayer is running successfully"
|
|
else
|
|
log_error "Relayer failed to start"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Query IBC channels
|
|
query_channels() {
|
|
log_info "Querying established IBC channels..."
|
|
|
|
# Query channels on Cosmos Hub
|
|
log_info "Channels on Cosmos Hub:"
|
|
hermes query channels --chain "${HUB_CHAIN_ID}"
|
|
|
|
# Query channels on Sonr
|
|
log_info "Channels on Sonr:"
|
|
hermes query channels --chain "${SONR_CHAIN_ID}"
|
|
}
|
|
|
|
# Test IBC connectivity
|
|
test_ibc() {
|
|
log_info "Testing IBC connectivity..."
|
|
|
|
# Test transfer channel
|
|
log_info "Testing transfer channel..."
|
|
|
|
# Get channel IDs
|
|
TRANSFER_CHANNEL=$(hermes query channels --chain "${HUB_CHAIN_ID}" | grep transfer | head -1 | awk '{print $1}')
|
|
|
|
if [ -n "$TRANSFER_CHANNEL" ]; then
|
|
log_info "Transfer channel: ${TRANSFER_CHANNEL}"
|
|
|
|
# Send test transfer
|
|
gaiad tx ibc-transfer transfer \
|
|
transfer "${TRANSFER_CHANNEL}" \
|
|
sonr1test_address \
|
|
1000uatom \
|
|
--from hub-relayer \
|
|
--chain-id "${HUB_CHAIN_ID}" \
|
|
--node "${HUB_RPC}" \
|
|
--gas-prices "${HUB_GAS_PRICES}" \
|
|
--packet-timeout-height 0-1000 \
|
|
-y
|
|
|
|
log_info "Test transfer sent"
|
|
else
|
|
log_warning "No transfer channel found"
|
|
fi
|
|
}
|
|
|
|
# Monitor IBC packets
|
|
monitor_packets() {
|
|
log_info "Monitoring IBC packet flow..."
|
|
|
|
hermes query packet pending \
|
|
--chain "${HUB_CHAIN_ID}" \
|
|
--port transfer \
|
|
--channel "${TRANSFER_CHANNEL}"
|
|
}
|
|
|
|
# Main IBC setup flow
|
|
main() {
|
|
log_info "Starting IBC setup for Identity DAO..."
|
|
|
|
# Check requirements
|
|
check_hermes
|
|
|
|
# Initialize configuration
|
|
init_hermes_config
|
|
|
|
# Check if keys exist or need to be created
|
|
if [ ! -f "hub-relayer.mnemonic" ] || [ ! -f "sonr-relayer.mnemonic" ]; then
|
|
log_error "Relayer mnemonics not found. Please create:"
|
|
log_info "1. hub-relayer.mnemonic - Funded account on Cosmos Hub testnet"
|
|
log_info "2. sonr-relayer.mnemonic - Funded account on Sonr testnet"
|
|
exit 1
|
|
fi
|
|
|
|
# Add keys
|
|
add_relayer_keys
|
|
|
|
# Create IBC infrastructure
|
|
create_clients
|
|
create_connection
|
|
create_channels
|
|
|
|
# Start relayer
|
|
start_relayer
|
|
|
|
# Query established channels
|
|
query_channels
|
|
|
|
# Test connectivity
|
|
test_ibc
|
|
|
|
# Monitor packets
|
|
monitor_packets
|
|
|
|
log_info "✅ IBC setup complete!"
|
|
log_info ""
|
|
log_info "=== IBC Summary ==="
|
|
log_info "Relayer PID: $(cat relayer.pid)"
|
|
log_info "Config: ${RELAYER_HOME}/config.toml"
|
|
log_info ""
|
|
log_info "Next steps:"
|
|
log_info "1. Monitor relayer logs: hermes start"
|
|
log_info "2. Query channels: hermes query channels --chain ${HUB_CHAIN_ID}"
|
|
log_info "3. Test cross-chain queries: ./scripts/test_did_query.sh"
|
|
}
|
|
|
|
# Run main IBC setup
|
|
main "$@" |