Stabilize oracle and relay status helpers
This commit is contained in:
@@ -24,10 +24,14 @@ while [[ $# -gt 0 ]]; do
|
||||
done
|
||||
|
||||
case "$TOKEN" in
|
||||
weth9) BRIDGE_ADDR="${CCIPWETH9_BRIDGE_MAINNET:?set in .env}";;
|
||||
weth10) BRIDGE_ADDR="${CCIPWETH10_BRIDGE_MAINNET:?set in .env}";;
|
||||
weth9) BRIDGE_ADDR="${CCIPWETH9_BRIDGE_MAINNET:-${MAINNET_CCIP_WETH9_BRIDGE:-}}";;
|
||||
weth10) BRIDGE_ADDR="${CCIPWETH10_BRIDGE_MAINNET:-${MAINNET_CCIP_WETH10_BRIDGE:-}}";;
|
||||
*) log_error "--token required as weth9|weth10"; exit 1;;
|
||||
esac
|
||||
if [ -z "$BRIDGE_ADDR" ]; then
|
||||
log_error "set CCIPWETH${TOKEN#weth}_BRIDGE_MAINNET or MAINNET_CCIP_WETH${TOKEN#weth}_BRIDGE in .env"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_section "CCIP STATUS ($TOKEN)"
|
||||
echo "Bridge: $BRIDGE_ADDR"
|
||||
|
||||
@@ -16,6 +16,7 @@ NC='\033[0m'
|
||||
PROXMOX_HOST="${PROXMOX_ORACLE_PUBLISHER_HOST:-192.168.11.12}"
|
||||
VMID=3500
|
||||
ORACLE_ADDRESS="0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6"
|
||||
AGGREGATOR_ADDRESS="${AGGREGATOR_ADDRESS:-}"
|
||||
RPC_URL="${RPC_URL:-${RPC_URL_138:-http://192.168.11.211:8545}}"
|
||||
|
||||
echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||
@@ -63,13 +64,19 @@ echo ""
|
||||
echo -e "${YELLOW}3. Checking configuration file...${NC}"
|
||||
if ssh "root@$PROXMOX_HOST" "pct exec $VMID -- test -f /opt/oracle-publisher/.env" 2>/dev/null; then
|
||||
echo -e "${GREEN}✓ Configuration file exists${NC}"
|
||||
|
||||
|
||||
# Check key configuration variables
|
||||
echo " Checking key variables..."
|
||||
ENV_VARS=("ORACLE_ADDRESS" "AGGREGATOR_ADDRESS" "RPC_URL" "CHAIN_ID" "PRIVATE_KEY" "UPDATE_INTERVAL")
|
||||
REMOTE_ORACLE_ADDRESS="$ORACLE_ADDRESS"
|
||||
REMOTE_AGGREGATOR_ADDRESS="$AGGREGATOR_ADDRESS"
|
||||
for VAR in "${ENV_VARS[@]}"; do
|
||||
VALUE=$(ssh "root@$PROXMOX_HOST" "pct exec $VMID -- grep '^${VAR}=' /opt/oracle-publisher/.env 2>/dev/null | cut -d= -f2-" || echo "")
|
||||
if [ -n "$VALUE" ]; then
|
||||
case "$VAR" in
|
||||
ORACLE_ADDRESS) REMOTE_ORACLE_ADDRESS="$VALUE" ;;
|
||||
AGGREGATOR_ADDRESS) REMOTE_AGGREGATOR_ADDRESS="$VALUE" ;;
|
||||
esac
|
||||
if [ "$VAR" = "PRIVATE_KEY" ]; then
|
||||
echo -e " ${GREEN}✓${NC} $VAR = [HIDDEN]"
|
||||
else
|
||||
@@ -104,21 +111,14 @@ echo ""
|
||||
|
||||
# Check oracle contract price
|
||||
echo -e "${YELLOW}5. Checking oracle contract price data...${NC}"
|
||||
ORACLE_DATA=$(cast call "$ORACLE_ADDRESS" "latestRoundData()" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
|
||||
ORACLE_READ_ADDRESS="${ORACLE_LATEST_ROUND_CONTRACT:-${REMOTE_AGGREGATOR_ADDRESS:-$REMOTE_ORACLE_ADDRESS}}"
|
||||
echo " Read contract: $ORACLE_READ_ADDRESS"
|
||||
ORACLE_DATA=$(cast call "$ORACLE_READ_ADDRESS" "latestRoundData()(uint80,int256,uint256,uint256,uint80)" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
|
||||
if [ -n "$ORACLE_DATA" ]; then
|
||||
# Parse the response (format: roundId, answer, startedAt, updatedAt, answeredInRound)
|
||||
# Extract answer (second field, bytes 131-194)
|
||||
ANSWER_HEX=$(echo "$ORACLE_DATA" | cut -c 131-194)
|
||||
|
||||
if [ "$ANSWER_HEX" != "00000000000000000000000000000000000000000000000000000000" ]; then
|
||||
# Convert hex to decimal
|
||||
ANSWER_DEC=$(printf "%d" "0x$ANSWER_HEX" 2>/dev/null || echo "0")
|
||||
|
||||
# Handle signed integer (if > 2^255, it's negative)
|
||||
if [ "$ANSWER_DEC" -gt 9223372036854775807 ] 2>/dev/null; then
|
||||
ANSWER_DEC=$((ANSWER_DEC - 18446744073709551616))
|
||||
fi
|
||||
|
||||
# Parse cast's typed output (roundId, answer, startedAt, updatedAt, answeredInRound).
|
||||
ANSWER_DEC=$(echo "$ORACLE_DATA" | awk 'NR==2 {print $1}')
|
||||
|
||||
if [ -n "$ANSWER_DEC" ] && [ "$ANSWER_DEC" != "0" ]; then
|
||||
# Convert from 8 decimals to USD
|
||||
PRICE=$(echo "scale=2; $ANSWER_DEC / 100000000" | bc 2>/dev/null || echo "0")
|
||||
|
||||
@@ -126,9 +126,7 @@ if [ -n "$ORACLE_DATA" ]; then
|
||||
echo -e "${GREEN}✓ Oracle has price data${NC}"
|
||||
echo " ETH/USD Price: \$$PRICE"
|
||||
|
||||
# Extract updatedAt (fourth field)
|
||||
UPDATED_AT_HEX=$(echo "$ORACLE_DATA" | cut -c 259-322)
|
||||
UPDATED_AT=$(printf "%d" "0x$UPDATED_AT_HEX" 2>/dev/null || echo "0")
|
||||
UPDATED_AT=$(echo "$ORACLE_DATA" | awk 'NR==4 {print $1}')
|
||||
|
||||
if [ "$UPDATED_AT" != "0" ]; then
|
||||
CURRENT_TIME=$(date +%s)
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
# PMM_MESH_POLL_POOLS — space-separated pool addresses (default: cUSDT/cUSDC PMM pool)
|
||||
# ENABLE_MESH_ORACLE_TICK=1 Run scripts/update-oracle-price.sh each tick (skips on-chain if <1% move)
|
||||
# ENABLE_MESH_KEEPER_TICK=1 Run keeper when checkUpkeep is true
|
||||
# ENABLE_MESH_WETH_MOCK_SYNC=0 Sync CHAIN138_WETH_MOCK_PRICE_FEED before keeper upkeep
|
||||
# MESH_WETH_MOCK_SYNC_EVERY_N=5 Only sync mock feed every N ticks (5 * 6s = 30s)
|
||||
# ENABLE_MESH_PMM_READS=1 eth_call getPoolPriceOrOracle per pool (warm path / observability)
|
||||
# ENABLE_MESH_WETH_READS=1 eth_call WETH9/WETH10 totalSupply (ETH mesh signal)
|
||||
# MESH_WETH_WRAP_WEI=0 If >0 and KEEPER_PRIVATE_KEY set: WETH9.deposit{value} (costs gas; rare)
|
||||
@@ -71,6 +73,8 @@ WETH10="${WETH10_ADDRESS:-0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f}"
|
||||
|
||||
ENABLE_ORACLE="${ENABLE_MESH_ORACLE_TICK:-1}"
|
||||
ENABLE_KEEPER="${ENABLE_MESH_KEEPER_TICK:-1}"
|
||||
ENABLE_WETH_MOCK_SYNC="${ENABLE_MESH_WETH_MOCK_SYNC:-0}"
|
||||
WETH_MOCK_SYNC_EVERY_N="${MESH_WETH_MOCK_SYNC_EVERY_N:-5}"
|
||||
ENABLE_PMM_READS="${ENABLE_MESH_PMM_READS:-1}"
|
||||
ENABLE_WETH_READS="${ENABLE_MESH_WETH_READS:-1}"
|
||||
WRAP_WEI="${MESH_WETH_WRAP_WEI:-0}"
|
||||
@@ -188,6 +192,48 @@ tick_keeper() {
|
||||
fi
|
||||
}
|
||||
|
||||
tick_weth_mock_sync() {
|
||||
[ "$ENABLE_WETH_MOCK_SYNC" = "1" ] || return 0
|
||||
[ -n "${CHAIN138_WETH_MOCK_PRICE_FEED:-}" ] || return 0
|
||||
[ -n "$ORACLE_PK" ] || { log "WETH mock sync skipped (set PRIVATE_KEY)"; return 0; }
|
||||
[ "$WETH_MOCK_SYNC_EVERY_N" -gt 0 ] || WETH_MOCK_SYNC_EVERY_N=1
|
||||
local n="${TICK_COUNT:-0}"
|
||||
if (( n % WETH_MOCK_SYNC_EVERY_N != 0 )); then
|
||||
return 0
|
||||
fi
|
||||
local now
|
||||
now="$(date +%s)"
|
||||
if (( now < NEXT_ORACLE_TX_AT )); then
|
||||
log "WETH mock sync cooling down until $(date -d "@$NEXT_ORACLE_TX_AT" -Iseconds)"
|
||||
return 0
|
||||
fi
|
||||
if account_has_pending_nonce_gap "$ORACLE_ADDR"; then
|
||||
NEXT_ORACLE_TX_AT=$(( now + MESH_TX_BACKOFF_SEC ))
|
||||
log "WETH mock sync tx already pending for $ORACLE_ADDR; backoff ${MESH_TX_BACKOFF_SEC}s"
|
||||
return 0
|
||||
fi
|
||||
if [ -n "${DRY_RUN:-}" ]; then
|
||||
log "[dry-run] sync-weth-mock-price.sh"
|
||||
return 0
|
||||
fi
|
||||
local out rc
|
||||
set +e
|
||||
out="$(MESH_CAST_GAS_PRICE="$MESH_CAST_GAS_PRICE" bash "$SMOM_ROOT/scripts/reserve/sync-weth-mock-price.sh" "$RPC" 2>&1)"
|
||||
rc=$?
|
||||
set -e
|
||||
if [ "$rc" -ne 0 ]; then
|
||||
echo "$out"
|
||||
if is_retryable_tx_error "$out"; then
|
||||
NEXT_ORACLE_TX_AT=$(( now + MESH_TX_BACKOFF_SEC ))
|
||||
log "WARN: WETH mock sync pending/underpriced; backoff ${MESH_TX_BACKOFF_SEC}s"
|
||||
else
|
||||
log "WARN: sync-weth-mock-price.sh failed; next tick in ${INTERVAL}s"
|
||||
fi
|
||||
else
|
||||
echo "$out"
|
||||
fi
|
||||
}
|
||||
|
||||
tick_oracle() {
|
||||
[ "$ENABLE_ORACLE" = "1" ] || return 0
|
||||
local now
|
||||
@@ -246,6 +292,7 @@ while true; do
|
||||
log "--- tick $TICK_COUNT ---"
|
||||
tick_pmm_reads
|
||||
tick_weth_reads
|
||||
tick_weth_mock_sync
|
||||
tick_keeper
|
||||
tick_oracle
|
||||
tick_weth_wrap
|
||||
|
||||
@@ -43,6 +43,14 @@ fetch_usd() {
|
||||
u=$(curl -s --max-time 20 -A "$CG_UA" 'https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd' | \
|
||||
python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('ethereum',{}).get('usd',0) or 0)" 2>/dev/null || echo 0)
|
||||
fi
|
||||
if [ "$u" = "0" ] || [ -z "$u" ]; then
|
||||
u=$(curl -s --max-time 20 -A "$CG_UA" 'https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD' | \
|
||||
python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('USD',0) or 0)" 2>/dev/null || echo 0)
|
||||
fi
|
||||
if [ "$u" = "0" ] || [ -z "$u" ]; then
|
||||
u=$(curl -s --max-time 20 -A "$CG_UA" 'https://api.coinbase.com/v2/prices/ETH-USD/spot' | \
|
||||
python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('data',{}).get('amount',0) or 0)" 2>/dev/null || echo 0)
|
||||
fi
|
||||
echo "$u"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user