Files
proxmox/scripts/omnl/omnl-chain138-attestation-tx.sh
defiQUG 7ac74f432b chore: sync docs, config schemas, scripts, and meta task alignment
- Institutional / JVMTM / reserve-provenance / GRU transport + standards JSON
- Validation and verify scripts (Blockscout labels, x402, GRU preflight, P1 local path)
- Wormhole wiring in AGENTS, MCP_SETUP, MASTER_INDEX, 04-configuration README
- Meta docs, integration gaps, live verification log, architecture updates
- CI validate-config workflow updates

Operator/LAN items, submodule working trees, and public token-aggregation edge
routes remain follow-up (see TODOS_CONSOLIDATED P1).

Made-with: Cursor
2026-03-31 22:31:39 -07:00

149 lines
4.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Broadcast minimal attestation transactions (0-value self-send) to anchor settlement finality
# when DBIS SettlementRouter is not deployed. Does NOT move 102B tokens.
#
# Default: Chain 138 only (RPC_URL_138 / LAN).
# Dual-anchor: also Ethereum mainnet (chain id 1) when ETHEREUM_MAINNET_RPC or RPC_URL_MAINNET
# is set — unless ATTEST_INCLUDE_MAINNET=0. Set ATTEST_INCLUDE_MAINNET=1 to force mainnet when
# RPC is configured; mainnet consumes real ETH gas.
#
# Prerequisites: PRIVATE_KEY (same deployer on both chains — ensure account has ETH on mainnet).
#
# Usage:
# CORRELATION_ID=uuid bash scripts/omnl/omnl-chain138-attestation-tx.sh
# ATTEST_INCLUDE_MAINNET=0 bash scripts/omnl/omnl-chain138-attestation-tx.sh # 138 only
# DRY_RUN=1 bash scripts/omnl/omnl-chain138-attestation-tx.sh
#
set -euo pipefail
REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
DRY_RUN="${DRY_RUN:-0}"
CORRELATION_ID="${CORRELATION_ID:-}"
if [ -f "${REPO_ROOT}/smom-dbis-138/.env" ]; then
set +u
set -a
# shellcheck disable=SC1090
source "${REPO_ROOT}/smom-dbis-138/.env" 2>/dev/null || true
set +a
set -u
fi
if [ -f "${REPO_ROOT}/.env" ]; then
set +u
set -a
# shellcheck disable=SC1090
source "${REPO_ROOT}/.env" 2>/dev/null || true
set +a
set -u
fi
RPC_138="${RPC_URL_138:-http://192.168.11.211:8545}"
MAINNET_RPC="${ETHEREUM_MAINNET_RPC:-${RPC_URL_MAINNET:-}}"
# Mainnet: auto-enable when RPC is configured, unless explicitly disabled.
if [ "${ATTEST_INCLUDE_MAINNET:-}" = "0" ]; then
DO_MAINNET=0
elif [ "${ATTEST_INCLUDE_MAINNET:-}" = "1" ]; then
DO_MAINNET=1
elif [ -n "$MAINNET_RPC" ]; then
DO_MAINNET=1
else
DO_MAINNET=0
fi
if [ "$DO_MAINNET" = "1" ] && [ -z "$MAINNET_RPC" ]; then
echo "ERROR: mainnet attestation requested (ATTEST_INCLUDE_MAINNET=1) but ETHEREUM_MAINNET_RPC / RPC_URL_MAINNET unset" >&2
exit 1
fi
if ! command -v cast &>/dev/null; then
echo "ERROR: cast (Foundry) not on PATH" >&2
exit 1
fi
if [ -z "${PRIVATE_KEY:-}" ] && [ "$DRY_RUN" != "1" ]; then
echo "ERROR: PRIVATE_KEY unset (set in smom-dbis-138/.env or .env)" >&2
exit 1
fi
ADDR="${ATTEST_FROM_ADDRESS:-}"
if [ -n "${PRIVATE_KEY:-}" ]; then
ADDR="$(cast wallet address --private-key "$PRIVATE_KEY")"
elif [ "$DRY_RUN" = "1" ]; then
ADDR="0x0000000000000000000000000000000000000001"
fi
FINGERPRINT=""
if [ -n "$CORRELATION_ID" ]; then
FINGERPRINT="$(cast keccak "$(printf '%s' "$CORRELATION_ID")")"
fi
extract_tx_hash() {
local out="$1"
local h
h="$(echo "$out" | sed -n 's/.*transactionHash[[:space:]]*//p' | head -1)"
if [ -z "$h" ]; then
h="$(echo "$out" | grep -oE '0x[a-fA-F0-9]{64}' | head -1 || true)"
fi
printf '%s' "$h"
}
LAST_TX_HASH=""
broadcast_one() {
local rpc="$1"
local chain_label="$2"
LAST_TX_HASH=""
echo "Attestation [$chain_label] From/To: $ADDR | RPC: $rpc | keccak(correlation_id): ${FINGERPRINT:0:18}..." >&2
if [ "$DRY_RUN" = "1" ]; then
echo "DRY_RUN: cast send $ADDR --value 0 --private-key <redacted> --rpc-url $rpc" >&2
LAST_TX_HASH=""
return 0
fi
local OUT
OUT="$(cast send "$ADDR" --value 0 --private-key "$PRIVATE_KEY" --rpc-url "$rpc" 2>&1)" || {
echo "$OUT" >&2
return 1
}
echo "$OUT"
LAST_TX_HASH="$(extract_tx_hash "$OUT")"
echo "chain_tx_hash[$chain_label]=$LAST_TX_HASH" >&2
}
TX_138=""
TX_MAINNET=""
broadcast_one "$RPC_138" "138" || exit 1
TX_138="$LAST_TX_HASH"
if [ "$DO_MAINNET" = "1" ]; then
echo "WARN: Also broadcasting on Ethereum mainnet (chain 1) — uses real ETH gas. Same PRIVATE_KEY / address as Chain 138." >&2
broadcast_one "$MAINNET_RPC" "1" || exit 1
TX_MAINNET="$LAST_TX_HASH"
fi
OUT_DIR="${REPO_ROOT}/output/jvmtm-evidence"
if [ "$DRY_RUN" != "1" ]; then
mkdir -p "$OUT_DIR"
GEN_AT="$(date -u -Iseconds)"
if command -v jq &>/dev/null; then
jq -n \
--arg h138 "$TX_138" \
--arg h1 "$TX_MAINNET" \
--arg gen "$GEN_AT" \
--arg corr "${CORRELATION_ID:-}" \
'{
generatedAtUtc: $gen,
correlationId: (if $corr != "" then $corr else null end),
attestations: [
{ chainId: 138, transactionHash: $h138, rpcKind: "RPC_URL_138" }
] + (if $h1 != "" then [{ chainId: 1, transactionHash: $h1, rpcKind: "ETHEREUM_MAINNET_RPC" }] else [] end)
}' > "${OUT_DIR}/latest-dual-attestation.json"
echo "Wrote ${OUT_DIR}/latest-dual-attestation.json" >&2
fi
{
echo "CHAIN_ATTESTATION_TX_HASH=${TX_138}"
echo "CHAIN_ATTESTATION_TX_HASH_MAINNET=${TX_MAINNET}"
} > "${OUT_DIR}/latest-dual-attestation.env"
echo "Wrote ${OUT_DIR}/latest-dual-attestation.env (source before build-omnl-e2e-settlement-audit-archive.sh)" >&2
fi