diff --git a/scripts/ccip/ccip-status.sh b/scripts/ccip/ccip-status.sh index 7865b81..ba779d4 100755 --- a/scripts/ccip/ccip-status.sh +++ b/scripts/ccip/ccip-status.sh @@ -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" diff --git a/scripts/check-oracle-publisher-status.sh b/scripts/check-oracle-publisher-status.sh index 30a5ee8..a42d4b4 100755 --- a/scripts/check-oracle-publisher-status.sh +++ b/scripts/check-oracle-publisher-status.sh @@ -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) diff --git a/scripts/reserve/pmm-mesh-6s-automation.sh b/scripts/reserve/pmm-mesh-6s-automation.sh index b3af700..07627ad 100755 --- a/scripts/reserve/pmm-mesh-6s-automation.sh +++ b/scripts/reserve/pmm-mesh-6s-automation.sh @@ -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 diff --git a/scripts/reserve/sync-weth-mock-price.sh b/scripts/reserve/sync-weth-mock-price.sh index 06d04c4..d7b0a49 100755 --- a/scripts/reserve/sync-weth-mock-price.sh +++ b/scripts/reserve/sync-weth-mock-price.sh @@ -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" }