memoscan
← all memos

Memo 0x787ed949…6b32de on Ethereum

# { "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)