Files
smom-dbis-138/scripts/reconcile-xau-deployer-chain138.sh
defiQUG 2a4753eb2d feat: restore operator WIP — PMM JSON sync entrypoint, dotenv RPC trim + secrets, pool env alignment
- Resolve stash: merge load_deployment_env path with secure-secrets and CR/LF RPC strip
- create-pmm-full-mesh-chain138.sh delegates to sync-chain138-pmm-pools-from-json.sh
- env.additions.example: canonical PMM pool defaults (cUSDT/USDT per crosscheck)
- Include Chain138 scripts, official mirror deploy scaffolding, and prior staged changes

Made-with: Cursor
2026-03-27 19:02:30 -07:00

127 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Burn deployer's full cXAUC + cXAUT balances, then remint using troy-ounce semantics
# (1 full token = 1 troy oz Au). Optional USD target + spot to derive ounces.
#
# Defaults (override with env):
# RETARGET_USD=50000000 Total USD notional (see RETARGET_MODE)
# RETARGET_MODE=split split = half USD to cXAUC, half to cXAUT | each = full USD per token
# XAU_SPOT_USD=4506.30 USD per troy oz (set from your pricing feed)
#
# Or set explicit troy ounces (skips USD math):
# TROY_OZ_CXAUC=1234.5 TROY_OZ_CXAUT=1234.5
#
# DRY_RUN=1 print actions only
# SKIP_BURN=1 only mint (dangerous if balance nonzero)
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
cd "$PROJECT_ROOT"
[ -f .env ] && set -a && source .env && set +a
CXAUC="0x290E52a8819A4fbD0714E517225429aA2B70EC6b"
CXAUT="0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E"
RPC="${RPC_URL_138:-${RPC_URL:-http://192.168.11.211:8545}}"
GAS_LIMIT="${GAS_LIMIT:-200000}"
RETARGET_USD="${RETARGET_USD:-50000000}"
RETARGET_MODE="${RETARGET_MODE:-split}"
XAU_SPOT_USD="${XAU_SPOT_USD:-4506.30}"
[ -n "${PRIVATE_KEY:-}" ] || { echo "PRIVATE_KEY not set"; exit 1; }
DEPLOYER="$(cast wallet address "$PRIVATE_KEY")" || exit 1
balance_of() {
local token="$1"
local data raw
data="$(cast calldata "balanceOf(address)" "$DEPLOYER")"
raw="$(cast rpc eth_call "{\"to\":\"$token\",\"data\":\"$data\"}" latest --rpc-url "$RPC" | tr -d '\n\"')"
python3 -c "print(int('$raw', 16))"
}
to_base_units() {
python3 -c "
from decimal import Decimal, ROUND_DOWN
import sys
oz = Decimal(sys.argv[1].strip())
if oz <= 0:
sys.exit('troy oz must be positive')
b = (oz * Decimal(10**6)).to_integral_value(rounding=ROUND_DOWN)
print(int(b))
" "$1"
}
run_burn() {
local token="$1" label="$2" bal="$3"
[ "$bal" != "0" ] || { echo " $label: balance 0, skip burn"; return 0; }
if [ -n "${DRY_RUN:-}" ]; then
echo "[dry-run] burn $label balance=$bal"
return 0
fi
cast send "$token" "burn(uint256)" "$bal" \
--rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit "$GAS_LIMIT"
}
run_mint() {
local token="$1" label="$2" oz="$3"
local base
base="$(to_base_units "$oz")"
if [ -n "${DRY_RUN:-}" ]; then
echo "[dry-run] mint $label ${oz} oz -> $base base to $DEPLOYER"
return 0
fi
cast send "$token" "mint(address,uint256)" "$DEPLOYER" "$base" \
--rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit "$GAS_LIMIT"
}
if [ -n "${TROY_OZ_CXAUC:-}" ] && [ -n "${TROY_OZ_CXAUT:-}" ]; then
OZ_CXAUC="$TROY_OZ_CXAUC"
OZ_CXAUT="$TROY_OZ_CXAUT"
else
read -r OZ_CXAUC OZ_CXAUT < <(RETARGET_USD="$RETARGET_USD" RETARGET_MODE="$RETARGET_MODE" XAU_SPOT_USD="$XAU_SPOT_USD" python3 <<'PY'
import os
from decimal import Decimal, ROUND_DOWN
spot = Decimal(os.environ["XAU_SPOT_USD"])
total = Decimal(os.environ["RETARGET_USD"])
mode = os.environ.get("RETARGET_MODE", "split")
if spot <= 0 or total <= 0:
raise SystemExit("RETARGET_USD and XAU_SPOT_USD must be positive")
if mode == "split":
usd_c = total / Decimal(2)
usd_t = total / Decimal(2)
elif mode == "each":
usd_c = total
usd_t = total
else:
raise SystemExit("RETARGET_MODE must be split or each")
oz_c = (usd_c / spot).quantize(Decimal("0.000001"), rounding=ROUND_DOWN)
oz_t = (usd_t / spot).quantize(Decimal("0.000001"), rounding=ROUND_DOWN)
print(f"{oz_c:f} {oz_t:f}")
PY
)
fi
echo "=== Reconcile cXAUC / cXAUT (deployer $DEPLOYER) ==="
echo " RPC: $RPC"
echo " Target: cXAUC=${OZ_CXAUC} oz cXAUT=${OZ_CXAUT} oz"
echo " (RETARGET_USD=$RETARGET_USD RETARGET_MODE=$RETARGET_MODE XAU_SPOT_USD=$XAU_SPOT_USD)"
echo ""
BAL_C="$(balance_of "$CXAUC")"
BAL_T="$(balance_of "$CXAUT")"
echo " Current balances (base units): cXAUC=$BAL_C cXAUT=$BAL_T"
if [ -z "${SKIP_BURN:-}" ]; then
echo "--- Burn ---"
run_burn "$CXAUC" "cXAUC" "$BAL_C"
run_burn "$CXAUT" "cXAUT" "$BAL_T"
else
echo "--- Skip burn (SKIP_BURN=1) ---"
fi
echo "--- Mint ---"
run_mint "$CXAUC" "cXAUC" "$OZ_CXAUC"
run_mint "$CXAUT" "cXAUT" "$OZ_CXAUT"
echo "Done."