97 lines
2.7 KiB
Python
97 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Generate a deterministic devnet genesis file for the blockchain node."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import time
|
|
from pathlib import Path
|
|
|
|
DEFAULT_GENESIS = {
|
|
"chain_id": "ait-devnet",
|
|
"timestamp": None, # populated at runtime
|
|
"params": {
|
|
"mint_per_unit": 1000,
|
|
"coordinator_ratio": 0.05,
|
|
"base_fee": 10,
|
|
"fee_per_byte": 1,
|
|
},
|
|
"accounts": [
|
|
{
|
|
"address": "ait1faucet000000000000000000000000000000000",
|
|
"balance": 1_000_000_000,
|
|
"nonce": 0,
|
|
}
|
|
],
|
|
"authorities": [
|
|
{
|
|
"address": "ait1devproposer000000000000000000000000000000",
|
|
"weight": 1,
|
|
}
|
|
],
|
|
}
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
parser = argparse.ArgumentParser(description="Generate devnet genesis data")
|
|
parser.add_argument(
|
|
"--output",
|
|
type=Path,
|
|
default=Path("data/devnet/genesis.json"),
|
|
help="Path to write the generated genesis file (default: data/devnet/genesis.json)",
|
|
)
|
|
parser.add_argument(
|
|
"--force",
|
|
action="store_true",
|
|
help="Overwrite the genesis file if it already exists.",
|
|
)
|
|
parser.add_argument(
|
|
"--faucet-address",
|
|
default="ait1faucet000000000000000000000000000000000",
|
|
help="Address seeded with devnet funds.",
|
|
)
|
|
parser.add_argument(
|
|
"--faucet-balance",
|
|
type=int,
|
|
default=1_000_000_000,
|
|
help="Faucet balance in smallest units.",
|
|
)
|
|
parser.add_argument(
|
|
"--authorities",
|
|
nargs="*",
|
|
default=["ait1devproposer000000000000000000000000000000"],
|
|
help="Authority addresses included in the genesis file.",
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def build_genesis(args: argparse.Namespace) -> dict:
|
|
genesis = json.loads(json.dumps(DEFAULT_GENESIS)) # deep copy via JSON
|
|
genesis["timestamp"] = int(time.time())
|
|
genesis["accounts"][0]["address"] = args.faucet_address
|
|
genesis["accounts"][0]["balance"] = args.faucet_balance
|
|
genesis["authorities"] = [
|
|
{"address": address, "weight": 1}
|
|
for address in args.authorities
|
|
]
|
|
return genesis
|
|
|
|
|
|
def write_genesis(path: Path, data: dict, force: bool) -> None:
|
|
if path.exists() and not force:
|
|
raise SystemExit(f"Genesis file already exists at {path}. Use --force to overwrite.")
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
path.write_text(json.dumps(data, indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
print(f"[genesis] wrote genesis file to {path}")
|
|
|
|
|
|
def main() -> None:
|
|
args = parse_args()
|
|
genesis = build_genesis(args)
|
|
write_genesis(args.output, genesis, args.force)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|