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
This commit is contained in:
83
scripts/sync-weth10-genesis-bytecode.py
Executable file
83
scripts/sync-weth10-genesis-bytecode.py
Executable file
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Re-embed WETH10 runtime bytecode in genesis JSON files from the current
|
||||
contracts/tokens/WETH10.sol build (Foundry solc 0.8.20 + foundry.toml).
|
||||
|
||||
Run from repo: python3 smom-dbis-138/scripts/sync-weth10-genesis-bytecode.py
|
||||
|
||||
Live Chain 138 nodes must NOT replace genesis.json in place (different genesis
|
||||
= fork). Use this for new networks, templates, and Blockscout verification
|
||||
alignment with the submodule source.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
WETH10 = "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f"
|
||||
SMOM = Path(__file__).resolve().parent.parent
|
||||
ROOT = SMOM.parent
|
||||
|
||||
GENESIS_FILES = [
|
||||
SMOM / "config" / "genesis.json",
|
||||
ROOT / "smom-dbis-138-proxmox" / "config" / "genesis.json",
|
||||
SMOM / "terraform" / "phases" / "phase1" / "config" / "genesis-138.json",
|
||||
]
|
||||
TEMPLATE = SMOM / "config" / "genesis-template-for-operator.json"
|
||||
|
||||
|
||||
def forge_deployed_bytecode() -> str:
|
||||
out = subprocess.check_output(
|
||||
[
|
||||
"forge",
|
||||
"inspect",
|
||||
"contracts/tokens/WETH10.sol:WETH10",
|
||||
"deployedBytecode",
|
||||
],
|
||||
cwd=str(SMOM),
|
||||
text=True,
|
||||
).strip()
|
||||
if not out.startswith("0x"):
|
||||
raise SystemExit(f"unexpected forge output: {out[:80]}...")
|
||||
return out
|
||||
|
||||
|
||||
def patch_alloc(alloc: dict, code: str) -> None:
|
||||
key = next((k for k in alloc if k.lower() == WETH10.lower()), None)
|
||||
if not key:
|
||||
raise SystemExit(f"alloc missing WETH10 ({WETH10})")
|
||||
entry = alloc[key]
|
||||
entry["code"] = code
|
||||
if "storage" not in entry:
|
||||
entry["storage"] = {}
|
||||
|
||||
|
||||
def main() -> int:
|
||||
code = forge_deployed_bytecode()
|
||||
for path in GENESIS_FILES:
|
||||
if not path.is_file():
|
||||
print(f"skip (missing): {path}", file=sys.stderr)
|
||||
continue
|
||||
data = json.loads(path.read_text())
|
||||
patch_alloc(data["alloc"], code)
|
||||
path.write_text(json.dumps(data, indent=2) + "\n")
|
||||
print(f"updated {path}")
|
||||
|
||||
if TEMPLATE.is_file():
|
||||
data = json.loads(TEMPLATE.read_text())
|
||||
g = data.get("genesis") or data
|
||||
alloc = g.get("alloc")
|
||||
if not alloc:
|
||||
raise SystemExit("template: no genesis.alloc")
|
||||
patch_alloc(alloc, code)
|
||||
TEMPLATE.write_text(json.dumps(data, indent=2) + "\n")
|
||||
print(f"updated {TEMPLATE}")
|
||||
|
||||
print(f"WETH10 code length: {len(code)} chars (solc tail matches 0.8.x)")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user