idea164-bexproof-verifiable.../bexproof/governance.py

29 lines
1.1 KiB
Python

"""Governance primitives for BeXProof policy changes."""
from __future__ import annotations
from typing import Dict, Set
class Governance:
def __init__(self, signers: Set[str] = None, required: int = 2):
self.signers = set(signers or {"alice", "bob", "carol"})
self.required = max(1, min(len(self.signers), required))
self.proposals: Dict[str, Dict] = {}
self.approvals: Dict[str, Set[str]] = {}
def propose(self, policy_id: str, policy_text: str) -> None:
self.proposals[policy_id] = {"policy": policy_text, "approved": False}
self.approvals[policy_id] = set()
def approve(self, policy_id: str, signer: str) -> bool:
if signer not in self.signers:
return False
if policy_id not in self.proposals:
return False
self.approvals[policy_id].add(signer)
if len(self.approvals[policy_id]) >= self.required:
self.proposals[policy_id]["approved"] = True
return True
def is_approved(self, policy_id: str) -> bool:
return bool(self.proposals.get(policy_id, {}).get("approved", False))