from __future__ import annotations import hashlib import json from dataclasses import dataclass from datetime import datetime from typing import List @dataclass class GovernanceEntry: contract_id: str action: str signer: str timestamp: str version: int payload_hash: str | None = None class GovernanceLedger: def __init__(self) -> None: self._entries: List[GovernanceEntry] = [] self._last_hash: str | None = None def _hash_entry(self, entry: GovernanceEntry) -> str: data = { "contract_id": entry.contract_id, "action": entry.action, "signer": entry.signer, "timestamp": entry.timestamp, "version": entry.version, "payload_hash": entry.payload_hash, "prev_hash": self._last_hash, } return hashlib.sha256(json.dumps(data, sort_keys=True).encode("utf-8")).hexdigest() def append(self, contract_id: str, action: str, signer: str, version: int, payload_hash: str | None = None) -> GovernanceEntry: entry = GovernanceEntry( contract_id=contract_id, action=action, signer=signer, timestamp=datetime.utcnow().isoformat() + "Z", version=version, payload_hash=payload_hash, ) self._entries.append(entry) self._last_hash = self._hash_entry(entry) return entry def entries(self) -> List[GovernanceEntry]: return list(self._entries) def latest_hash(self) -> str | None: return self._last_hash __all__ = ["GovernanceLedger", "GovernanceEntry"]