0xda51a8af…a790sent to0xb7278a61…e575·#24,714,038·0xaa5d8023…08b77e
# { "Depends": "py-genlayer:test" }
import json
from genlayer import *
class WordOracle(gl.Contract):
round_results: TreeMap[str, str]
leaderboard: TreeMap[str, u256]
def __init__(self) -> None:
self.round_results = TreeMap()
self.leaderboard = TreeMap()
@gl.public.view
def get_round_result(self, room_code: str, round_num: u32) -> str:
key = room_code + "_" + str(round_num)
result = self.round_results.get(key, None)
if result is None:
return "[]"
return result
@gl.public.view
def get_player_xp(self, player_name: str) -> u256:
xp = self.leaderboard.get(player_name, None)
if xp is None:
return u256(0)
return xp
@gl.public.write
def judge_round(
self,
room_code: str,
round_num: u32,
word: str,
prompt_txt: str,
answers_json: str,
) -> None:
key = room_code + "_" + str(round_num)
if self.round_results.get(key, None) is not None:
return
judge_prompt = (
"You are WordOracle, a fair AI judge on the GenLayer blockchain.\n"
"Word: " + word + "\n"
"Prompt: " + prompt_txt + "\n"
"Answers: " + answers_json + "\n\n"
"Score each answer 1-100. Criteria: creativity 40%, relevance 30%, originality 30%.\n"
"Write 1 fun sentence of feedback per player.\n"
"Return ONLY a JSON array sorted by score descending. No markdown.\n"
"Format: [{\"name\":\"Alice\",\"score\":88,\"reason\":\"Feedback.\"}]"
)
result_raw: str = gl.exec_prompt_non_comparative(judge_prompt)
cleaned = result_raw.strip()
start = cleaned.find("[")
end = cleaned.rfind("]")
if start != -1 and end != -1:
cleaned = cleaned[start : end + 1]
else:
cleaned = "[]"
self.round_results[key] = cleaned
xp_table = [100, 75, 50, 25, 15]
try:
scored = json.loads(cleaned)
for i, entry in enumerate(scored):
name = entry.get("name", "")
xp = xp_table[i] if i < len(xp_table) else 10
if name:
prev = self.leaderboard.get(name, None)
prev_val = prev if prev is not None else u256(0)
self.leaderboard[name] = prev_val + u256(xp)
except Exception:
pass