Stabilize oracle and relay status helpers

This commit is contained in:
defiQUG
2026-04-28 23:33:58 -07:00
parent 4bf669b667
commit 68cd541265
4 changed files with 77 additions and 20 deletions

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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"
}