- 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
149 lines
4.6 KiB
Bash
Executable File
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
|