chore: update .env.master.example with new deployment scripts and treasury manager parameters; enhance AGENTS.md with GRU reference primacy details
- Added new deployment script references for Aave quote-push and treasury manager in .env.master.example. - Updated AGENTS.md to include information on GRU reference primacy versus public PMM mesh execution model. - Minor updates to various documentation files to reflect changes in policy and operational guidelines. Made-with: Cursor
This commit is contained in:
100
scripts/verify/check-gru-reference-primacy-integration.sh
Executable file
100
scripts/verify/check-gru-reference-primacy-integration.sh
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env bash
|
||||
# Verify GRU reference-primacy doc exists, peg-bands.json carries the machine hook
|
||||
# (when cross-chain-pmm-lps is present), and canonical consumers still link the doc.
|
||||
# Usage: bash scripts/verify/check-gru-reference-primacy-integration.sh
|
||||
# Exit: 0 ok, 1 failure
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
|
||||
DOC_REL="docs/04-configuration/GRU_REFERENCE_PRIMACY_AND_MESH_EXECUTION_MODEL.md"
|
||||
DOC="$PROJECT_ROOT/$DOC_REL"
|
||||
MARKER="GRU_REFERENCE_PRIMACY_AND_MESH_EXECUTION_MODEL.md"
|
||||
|
||||
err() { printf '[ERROR] %s\n' "$*" >&2; }
|
||||
ok() { printf '[OK] %s\n' "$*"; }
|
||||
|
||||
ERRORS=0
|
||||
|
||||
if [[ ! -f "$DOC" ]]; then
|
||||
err "Missing $DOC_REL"
|
||||
exit 1
|
||||
fi
|
||||
if ! grep -qi 'reference primacy' "$DOC"; then
|
||||
err "$DOC_REL: expected 'reference primacy' wording"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
ok "Found and scanned $DOC_REL"
|
||||
|
||||
# Parent-repo files that must keep a pointer to the canonical doc (integration, not orphan).
|
||||
REQUIRED_LINK_FILES=(
|
||||
"$PROJECT_ROOT/docs/04-configuration/GRU_C_STAR_V2_STANDARDS_MATRIX_AND_IMPLEMENTATION_PLAN.md"
|
||||
"$PROJECT_ROOT/docs/MASTER_INDEX.md"
|
||||
"$PROJECT_ROOT/AGENTS.md"
|
||||
"$PROJECT_ROOT/docs/04-configuration/README.md"
|
||||
"$PROJECT_ROOT/docs/11-references/PMM_DEX_ROUTING_STATUS.md"
|
||||
"$PROJECT_ROOT/docs/11-references/LIQUIDITY_POOLS_MASTER_MAP.md"
|
||||
"$PROJECT_ROOT/docs/11-references/CHAIN138_GRID_6534_WALLET_FUNDING_PLAN.md"
|
||||
"$PROJECT_ROOT/docs/11-references/GRU_V2_PUBLIC_PROTOCOL_DEPLOYMENT_STATUS.md"
|
||||
"$PROJECT_ROOT/docs/03-deployment/PHASE_C_CW_AND_EDGE_POOLS_RUNBOOK.md"
|
||||
"$PROJECT_ROOT/.cursor/rules/project-doc-and-deployment-refs.mdc"
|
||||
)
|
||||
|
||||
for f in "${REQUIRED_LINK_FILES[@]}"; do
|
||||
rel="${f#"$PROJECT_ROOT"/}"
|
||||
if [[ ! -f "$f" ]]; then
|
||||
err "Missing expected file: $rel"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
continue
|
||||
fi
|
||||
if ! grep -qF "$MARKER" "$f"; then
|
||||
err "$rel: must reference $MARKER"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
else
|
||||
ok "Link present: $rel"
|
||||
fi
|
||||
done
|
||||
|
||||
CC_README="$PROJECT_ROOT/cross-chain-pmm-lps/README.md"
|
||||
if [[ -f "$CC_README" ]]; then
|
||||
if ! grep -qF "$MARKER" "$CC_README"; then
|
||||
err "cross-chain-pmm-lps/README.md must reference $MARKER"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
else
|
||||
ok "Link present: cross-chain-pmm-lps/README.md"
|
||||
fi
|
||||
else
|
||||
ok "Submodule cross-chain-pmm-lps absent — skipped README check"
|
||||
fi
|
||||
|
||||
PEGB="$PROJECT_ROOT/cross-chain-pmm-lps/config/peg-bands.json"
|
||||
if [[ -f "$PEGB" ]]; then
|
||||
if command -v jq &>/dev/null; then
|
||||
if jq -e \
|
||||
'(.gruPolicyIntegration | type == "object")
|
||||
and (.gruPolicyIntegration.referencePrimacyDoc | type == "string")
|
||||
and (.gruPolicyIntegration.referencePrimacyDoc | test("GRU_REFERENCE_PRIMACY_AND_MESH_EXECUTION_MODEL"))
|
||||
and (.gruPolicyIntegration.meshExecutionRole | type == "string")
|
||||
and (.gruPolicyIntegration.meshExecutionRole | length > 0)' \
|
||||
"$PEGB" &>/dev/null; then
|
||||
ok "peg-bands.json: gruPolicyIntegration hook present"
|
||||
else
|
||||
err "peg-bands.json: missing or invalid .gruPolicyIntegration (referencePrimacyDoc + meshExecutionRole)"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
else
|
||||
err "jq not installed — cannot validate peg-bands.json gruPolicyIntegration"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
else
|
||||
ok "peg-bands.json absent (submodule not checked out) — skipped peg-bands hook check"
|
||||
fi
|
||||
|
||||
if [[ "$ERRORS" -gt 0 ]]; then
|
||||
err "GRU reference primacy integration: $ERRORS error(s)"
|
||||
exit 1
|
||||
fi
|
||||
ok "GRU reference primacy integration checks passed."
|
||||
exit 0
|
||||
@@ -93,7 +93,11 @@ echo " Router paused(): $router_paused"
|
||||
echo
|
||||
|
||||
if [[ "$delivery_enabled" == "true" && "$shedding" == "false" && ( "$router_paused" == "false" || "$router_paused" == "unknown" ) ]]; then
|
||||
echo "Lane is already deliverable."
|
||||
if [[ "$bridge_ready" == "yes" ]]; then
|
||||
echo "Lane is already deliverable."
|
||||
else
|
||||
echo "Lane is operational, but current bridge float is below the configured floor."
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
@@ -0,0 +1,219 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Read-only accounting report for retained Mainnet quote-push surplus:
|
||||
# - deployer ETH gas headroom vs configured floor
|
||||
# - receiver quote balance and sweepable amount
|
||||
# - recommended holdback for gas-cover accounting (in quote terms)
|
||||
# - recommended recycleable quote for pool growth
|
||||
#
|
||||
# Env:
|
||||
# ETHEREUM_MAINNET_RPC required
|
||||
# PRIVATE_KEY or QUOTE_PUSH_DEPLOYER_ADDRESS one required
|
||||
# AAVE_QUOTE_PUSH_RECEIVER_MAINNET required
|
||||
# QUOTE_PUSH_SURPLUS_TOKEN_MAINNET optional; defaults to USDC mainnet
|
||||
# QUOTE_PUSH_RECEIVER_RESERVE_RAW optional; receiver reserve kept after sweep (default 0)
|
||||
# QUOTE_PUSH_DEPLOYER_GAS_FLOOR_ETH optional; default 0.003
|
||||
# QUOTE_PUSH_OPERATION_BUFFER_ETH optional; default 0.0005
|
||||
# QUOTE_PUSH_NATIVE_TOKEN_PRICE optional; default 3200 quote per native token
|
||||
#
|
||||
# Usage:
|
||||
# source scripts/lib/load-project-env.sh
|
||||
# bash scripts/verify/report-mainnet-aave-quote-push-surplus-accounting.sh
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROXMOX_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
||||
SMOM="${PROXMOX_ROOT}/smom-dbis-138"
|
||||
DEFAULT_USDC_MAINNET="0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
|
||||
DEFAULT_CWUSDC_MAINNET="0x2de5F116bFcE3d0f922d9C8351e0c5Fc24b9284a"
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
source "${PROXMOX_ROOT}/scripts/lib/load-project-env.sh" 2>/dev/null || true
|
||||
# shellcheck disable=SC1091
|
||||
source "${SMOM}/scripts/load-env.sh" >/dev/null 2>&1 || true
|
||||
|
||||
require_cmd() {
|
||||
command -v "$1" >/dev/null 2>&1 || {
|
||||
echo "[fail] missing required command: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
require_env() {
|
||||
local name="$1"
|
||||
if [[ -z "${!name:-}" ]]; then
|
||||
echo "[fail] missing required env: $name" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
require_cmd cast
|
||||
require_cmd python3
|
||||
|
||||
require_env ETHEREUM_MAINNET_RPC
|
||||
|
||||
pick_latest_receiver() {
|
||||
local latest_json="${SMOM}/broadcast/DeployAaveQuotePushFlashReceiver.s.sol/1/run-latest.json"
|
||||
if [[ ! -f "$latest_json" ]] || ! command -v jq >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
jq -r '.transactions[]? | select(.transactionType == "CREATE" and .contractName == "AaveQuotePushFlashReceiver") | .contractAddress' \
|
||||
"$latest_json" | tail -n1
|
||||
}
|
||||
|
||||
pick_latest_manager() {
|
||||
local latest_json="${SMOM}/broadcast/DeployQuotePushTreasuryManager.s.sol/1/run-latest.json"
|
||||
if [[ ! -f "$latest_json" ]] || ! command -v jq >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
jq -r '.transactions[]? | select(.transactionType == "CREATE" and .contractName == "QuotePushTreasuryManager") | .contractAddress' \
|
||||
"$latest_json" | tail -n1
|
||||
}
|
||||
|
||||
if [[ -z "${AAVE_QUOTE_PUSH_RECEIVER_MAINNET:-}" ]]; then
|
||||
inferred_receiver="$(pick_latest_receiver || true)"
|
||||
if [[ -n "$inferred_receiver" && "$inferred_receiver" != "null" ]]; then
|
||||
export AAVE_QUOTE_PUSH_RECEIVER_MAINNET="$inferred_receiver"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z "${QUOTE_PUSH_TREASURY_MANAGER_MAINNET:-}" ]]; then
|
||||
inferred_manager="$(pick_latest_manager || true)"
|
||||
if [[ -n "$inferred_manager" && "$inferred_manager" != "null" ]]; then
|
||||
export QUOTE_PUSH_TREASURY_MANAGER_MAINNET="$inferred_manager"
|
||||
fi
|
||||
fi
|
||||
|
||||
require_env AAVE_QUOTE_PUSH_RECEIVER_MAINNET
|
||||
|
||||
if [[ -n "${PRIVATE_KEY:-}" ]]; then
|
||||
DEPLOYER="$(cast wallet address --private-key "$PRIVATE_KEY")"
|
||||
elif [[ -n "${QUOTE_PUSH_DEPLOYER_ADDRESS:-}" ]]; then
|
||||
DEPLOYER="${QUOTE_PUSH_DEPLOYER_ADDRESS}"
|
||||
else
|
||||
echo "[fail] set PRIVATE_KEY or QUOTE_PUSH_DEPLOYER_ADDRESS" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TOKEN="${QUOTE_PUSH_SURPLUS_TOKEN_MAINNET:-$DEFAULT_USDC_MAINNET}"
|
||||
CWUSDC="${CWUSDC_MAINNET:-$DEFAULT_CWUSDC_MAINNET}"
|
||||
RECEIVER="${AAVE_QUOTE_PUSH_RECEIVER_MAINNET}"
|
||||
RECEIVER_RESERVE_RAW="${QUOTE_PUSH_RECEIVER_RESERVE_RAW:-0}"
|
||||
GAS_FLOOR_ETH="${QUOTE_PUSH_DEPLOYER_GAS_FLOOR_ETH:-0.003}"
|
||||
OP_BUFFER_ETH="${QUOTE_PUSH_OPERATION_BUFFER_ETH:-0.0005}"
|
||||
NATIVE_TOKEN_PRICE="${QUOTE_PUSH_NATIVE_TOKEN_PRICE:-3200}"
|
||||
|
||||
deployer_eth="$(cast balance "$DEPLOYER" --ether --rpc-url "$ETHEREUM_MAINNET_RPC")"
|
||||
deployer_quote_raw="$(cast call "$TOKEN" 'balanceOf(address)(uint256)' "$DEPLOYER" --rpc-url "$ETHEREUM_MAINNET_RPC" | awk '{print $1}')"
|
||||
deployer_base_raw="$(cast call "$CWUSDC" 'balanceOf(address)(uint256)' "$DEPLOYER" --rpc-url "$ETHEREUM_MAINNET_RPC" | awk '{print $1}')"
|
||||
receiver_quote_raw="$(cast call "$TOKEN" 'balanceOf(address)(uint256)' "$RECEIVER" --rpc-url "$ETHEREUM_MAINNET_RPC" | awk '{print $1}')"
|
||||
|
||||
python3 - "$deployer_eth" "$deployer_quote_raw" "$deployer_base_raw" "$receiver_quote_raw" \
|
||||
"$RECEIVER_RESERVE_RAW" "$GAS_FLOOR_ETH" "$OP_BUFFER_ETH" "$NATIVE_TOKEN_PRICE" "$DEPLOYER" "$RECEIVER" "$TOKEN" <<'PY'
|
||||
import math
|
||||
import sys
|
||||
|
||||
deployer_eth = float(sys.argv[1])
|
||||
deployer_quote_raw = int(sys.argv[2])
|
||||
deployer_base_raw = int(sys.argv[3])
|
||||
receiver_quote_raw = int(sys.argv[4])
|
||||
receiver_reserve_raw = int(sys.argv[5])
|
||||
gas_floor_eth = float(sys.argv[6])
|
||||
op_buffer_eth = float(sys.argv[7])
|
||||
native_token_price = float(sys.argv[8])
|
||||
deployer = sys.argv[9]
|
||||
receiver = sys.argv[10]
|
||||
token = sys.argv[11]
|
||||
|
||||
recycle_floor_eth = gas_floor_eth + op_buffer_eth
|
||||
gas_shortfall_eth = max(0.0, recycle_floor_eth - deployer_eth)
|
||||
gas_shortfall_quote_raw = math.ceil(gas_shortfall_eth * native_token_price * 1_000_000)
|
||||
sweepable_raw = max(0, receiver_quote_raw - receiver_reserve_raw)
|
||||
holdback_for_gas_raw = min(sweepable_raw, gas_shortfall_quote_raw)
|
||||
recycleable_raw = max(0, sweepable_raw - holdback_for_gas_raw)
|
||||
matched_base_cap_raw = min(recycleable_raw, deployer_base_raw)
|
||||
|
||||
def human(raw: int) -> str:
|
||||
return f"{raw / 1_000_000:.6f}"
|
||||
|
||||
print("=== Mainnet quote-push surplus accounting ===")
|
||||
print(f"deployer={deployer}")
|
||||
print(f"receiver={receiver}")
|
||||
print(f"token={token}")
|
||||
print(f"deployer_eth={deployer_eth:.18f}")
|
||||
print(f"gas_floor_eth={gas_floor_eth:.18f}")
|
||||
print(f"operation_buffer_eth={op_buffer_eth:.18f}")
|
||||
print(f"recycle_floor_eth={recycle_floor_eth:.18f}")
|
||||
print(f"gas_shortfall_eth={gas_shortfall_eth:.18f}")
|
||||
print(f"native_token_price_quote={native_token_price:.6f}")
|
||||
print(f"gas_shortfall_quote_raw={gas_shortfall_quote_raw} human={human(gas_shortfall_quote_raw)}")
|
||||
print(f"receiver_quote_raw={receiver_quote_raw} human={human(receiver_quote_raw)}")
|
||||
print(f"receiver_reserve_raw={receiver_reserve_raw} human={human(receiver_reserve_raw)}")
|
||||
print(f"sweepable_raw={sweepable_raw} human={human(sweepable_raw)}")
|
||||
print(f"deployer_quote_raw={deployer_quote_raw} human={human(deployer_quote_raw)}")
|
||||
print(f"deployer_cWUSDC_raw={deployer_base_raw} human={human(deployer_base_raw)}")
|
||||
print(f"holdback_for_gas_raw={holdback_for_gas_raw} human={human(holdback_for_gas_raw)}")
|
||||
print(f"recycleable_quote_raw={recycleable_raw} human={human(recycleable_raw)}")
|
||||
print(f"matched_base_cap_raw={matched_base_cap_raw} human={human(matched_base_cap_raw)}")
|
||||
print("")
|
||||
print("Recommended next steps:")
|
||||
print("1. Preview receiver surplus sweep:")
|
||||
print(" bash scripts/deployment/sweep-mainnet-aave-quote-push-receiver-surplus.sh --dry-run")
|
||||
if gas_shortfall_eth > 0:
|
||||
print("2. Replenish deployer gas reserve before recycling surplus to the pool.")
|
||||
print(
|
||||
f" At current assumptions, hold back about {human(holdback_for_gas_raw)} quote units to cover the ETH shortfall."
|
||||
)
|
||||
print("3. After deployer ETH is back above the recycle floor, recycle the remainder into pool growth:")
|
||||
print(" bash scripts/deployment/recycle-mainnet-aave-quote-push-surplus.sh --dry-run")
|
||||
else:
|
||||
print("2. Deployer gas reserve is above the recycle floor. Swept quote can be recycled into pool growth.")
|
||||
print(" bash scripts/deployment/recycle-mainnet-aave-quote-push-surplus.sh --dry-run")
|
||||
if matched_base_cap_raw == 0:
|
||||
print("3. Wallet cWUSDC is the limiting asset for matched recycling; no pool-growth tranche is currently fundable.")
|
||||
else:
|
||||
print(
|
||||
f"3. Current matched recycle ceiling is {human(matched_base_cap_raw)} quote/base units using deployer-held cWUSDC."
|
||||
)
|
||||
PY
|
||||
|
||||
if [[ -n "${QUOTE_PUSH_TREASURY_MANAGER_MAINNET:-}" ]]; then
|
||||
manager_quote_raw="$(cast call "$QUOTE_PUSH_TREASURY_MANAGER_MAINNET" 'quoteBalance()(uint256)' --rpc-url "$ETHEREUM_MAINNET_RPC" 2>/dev/null | awk '{print $1}' || true)"
|
||||
manager_available_raw="$(cast call "$QUOTE_PUSH_TREASURY_MANAGER_MAINNET" 'availableQuote()(uint256)' --rpc-url "$ETHEREUM_MAINNET_RPC" 2>/dev/null | awk '{print $1}' || true)"
|
||||
manager_receiver_sweepable_raw="$(cast call "$QUOTE_PUSH_TREASURY_MANAGER_MAINNET" 'receiverSweepableQuote()(uint256)' --rpc-url "$ETHEREUM_MAINNET_RPC" 2>/dev/null | awk '{print $1}' || true)"
|
||||
manager_gas_recipient="$(cast call "$QUOTE_PUSH_TREASURY_MANAGER_MAINNET" 'gasRecipient()(address)' --rpc-url "$ETHEREUM_MAINNET_RPC" 2>/dev/null | awk '{print $1}' || true)"
|
||||
manager_recycle_recipient="$(cast call "$QUOTE_PUSH_TREASURY_MANAGER_MAINNET" 'recycleRecipient()(address)' --rpc-url "$ETHEREUM_MAINNET_RPC" 2>/dev/null | awk '{print $1}' || true)"
|
||||
manager_receiver_owner="$(cast call "$QUOTE_PUSH_TREASURY_MANAGER_MAINNET" 'receiverOwner()(address)' --rpc-url "$ETHEREUM_MAINNET_RPC" 2>/dev/null | awk '{print $1}' || true)"
|
||||
manager_receiver_owned="$(cast call "$QUOTE_PUSH_TREASURY_MANAGER_MAINNET" 'isReceiverOwnedByManager()(bool)' --rpc-url "$ETHEREUM_MAINNET_RPC" 2>/dev/null | awk '{print $1}' || true)"
|
||||
|
||||
if [[ -n "$manager_quote_raw" && -n "$manager_available_raw" ]]; then
|
||||
manager_quote_human="$(python3 - "$manager_quote_raw" <<'PY'
|
||||
import sys
|
||||
print(f"{int(sys.argv[1]) / 1_000_000:.6f}")
|
||||
PY
|
||||
)"
|
||||
manager_available_human="$(python3 - "$manager_available_raw" <<'PY'
|
||||
import sys
|
||||
print(f"{int(sys.argv[1]) / 1_000_000:.6f}")
|
||||
PY
|
||||
)"
|
||||
manager_receiver_sweepable_human="$(python3 - "${manager_receiver_sweepable_raw:-0}" <<'PY'
|
||||
import sys
|
||||
print(f"{int(sys.argv[1]) / 1_000_000:.6f}")
|
||||
PY
|
||||
)"
|
||||
|
||||
cat <<EOF
|
||||
|
||||
=== Treasury manager state ===
|
||||
manager=${QUOTE_PUSH_TREASURY_MANAGER_MAINNET}
|
||||
manager_quote_raw=${manager_quote_raw} human=${manager_quote_human}
|
||||
manager_available_raw=${manager_available_raw} human=${manager_available_human}
|
||||
manager_receiver_sweepable_raw=${manager_receiver_sweepable_raw:-0} human=${manager_receiver_sweepable_human}
|
||||
manager_receiver_owner=${manager_receiver_owner:-unknown}
|
||||
manager_receiver_owned_by_manager=${manager_receiver_owned:-unknown}
|
||||
manager_gas_recipient=${manager_gas_recipient:-unknown}
|
||||
manager_recycle_recipient=${manager_recycle_recipient:-unknown}
|
||||
EOF
|
||||
fi
|
||||
fi
|
||||
Reference in New Issue
Block a user