0x25da99e9…4072sent to0xb7278a61…e575·#24,796,319·0xcabe0691…9e8e90
# { "Depends": "py-genlayer:test" }
from genlayer import *
from genlayer import gl
import json
class GovernAI(gl.Contract):
dao_name: str
proposals: DynArray[str]
proposal_count: u256
def __init__(self, dao_name: str) -> None:
self.dao_name = dao_name
self.proposal_count = u256(0)
self.proposals = DynArray[str]([])
@gl.public.view
def get_dao_name(self) -> str:
return self.dao_name
@gl.public.view
def get_proposal_count(self) -> int:
return int(self.proposal_count)
@gl.public.view
def get_all_proposals(self) -> list:
return [json.loads(p) for p in self.proposals]
@gl.public.write
def submit_proposal(self, title: str, description: str, category: str) -> None:
dao_name = self.dao_name
def leader_fn():
prompt = f"""
You are a governance evaluator for the DAO "{dao_name}".
Evaluate this proposal and return ONLY a JSON object, no other text.
Proposal Title: {title}
Category: {category}
Description: {description}
Return exactly this structure:
{{"status": "approved", "safety_score": 85, "fairness_score": 90, "verdict": "Explanation here."}}
- status must be one of: approved, rejected, amended
- safety_score and fairness_score are integers 0-100
- verdict is 1-3 sentences explaining the decision
"""
result = gl.nondet.exec_prompt(prompt, response_format='json')
if isinstance(result, dict):
return result
text = str(result).strip()
return json.loads(text[text.find("{"):text.rfind("}")+1])
def validator_fn(leader_result) -> bool:
if not isinstance(leader_result, gl.vm.Return):
return False
data = leader_result.calldata
if not isinstance(data, dict):
return False
if data.get("status") not in ("approved", "rejected", "amended"):
return False
my_result = leader_fn()
return my_result.get("status") == data.get("status")
evaluation = gl.vm.run_nondet_unsafe(leader_fn, validator_fn)
entry = json.dumps({
"id": int(self.proposal_count),
"title": title,
"category": category,
"status": evaluation.get("status", "rejected"),
"verdict": evaluation.get("verdict", "No verdict."),
"safety_score": evaluation.get("safety_score", 0),
"fairness_score": evaluation.get("fairness_score", 0),
})
self.proposals.append(entry)
self.proposal_count = u256(int(self.proposal_count) + 1)