@molteee/arena-tools 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CLAUDE.md +7 -0
- package/dist/commands/auction-round.d.ts +2 -0
- package/dist/commands/auction-round.d.ts.map +1 -0
- package/dist/commands/auction-round.js +139 -0
- package/dist/commands/auction-round.js.map +1 -0
- package/dist/commands/create-tournament.d.ts +6 -0
- package/dist/commands/create-tournament.d.ts.map +1 -0
- package/dist/commands/create-tournament.js +47 -0
- package/dist/commands/create-tournament.js.map +1 -0
- package/dist/commands/market.d.ts +2 -0
- package/dist/commands/market.d.ts.map +1 -1
- package/dist/commands/market.js +46 -2
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/pending.d.ts +2 -0
- package/dist/commands/pending.d.ts.map +1 -0
- package/dist/commands/pending.js +52 -0
- package/dist/commands/pending.js.map +1 -0
- package/dist/commands/play.d.ts +5 -0
- package/dist/commands/play.d.ts.map +1 -0
- package/dist/commands/play.js +47 -0
- package/dist/commands/play.js.map +1 -0
- package/dist/commands/poker-step.d.ts +4 -0
- package/dist/commands/poker-step.d.ts.map +1 -0
- package/dist/commands/poker-step.js +243 -0
- package/dist/commands/poker-step.js.map +1 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +3 -2
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/respond.d.ts +5 -0
- package/dist/commands/respond.d.ts.map +1 -0
- package/dist/commands/respond.js +464 -0
- package/dist/commands/respond.js.map +1 -0
- package/dist/commands/rps-round.d.ts +2 -0
- package/dist/commands/rps-round.d.ts.map +1 -0
- package/dist/commands/rps-round.js +208 -0
- package/dist/commands/rps-round.js.map +1 -0
- package/dist/contracts.d.ts +72 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +30 -0
- package/dist/contracts.js.map +1 -1
- package/dist/index.js +79 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
// arena-tools respond — accept a match and play the entire game in one blocking call.
|
|
2
|
+
// Streams JSONL events for each step so LLM agents can follow progress.
|
|
3
|
+
//
|
|
4
|
+
// Architecture: State-machine loop. Every iteration reads on-chain state, decides
|
|
5
|
+
// the ONE action to take, executes it, then loops. Never assumes state transitions —
|
|
6
|
+
// always re-reads. All RPC calls retry on transient errors (429, timeout).
|
|
7
|
+
//
|
|
8
|
+
// Usage: npx arena-tools respond <match_id> [--rounds 3] [--timeout 600]
|
|
9
|
+
import { encodeFunctionData, formatEther } from "viem";
|
|
10
|
+
import { CONTRACTS, GAME_CONTRACTS } from "../config.js";
|
|
11
|
+
import { escrowAbi, rpsGameAbi, pokerGameAbi, auctionGameAbi, } from "../contracts.js";
|
|
12
|
+
import { getPublicClient, getAddress } from "../client.js";
|
|
13
|
+
import { sendTx } from "../utils/tx.js";
|
|
14
|
+
import { generateSalt, saveSalt, loadSalt, commitHash, commitBidHash } from "../utils/commit-reveal.js";
|
|
15
|
+
import { event, ok, fail } from "../utils/output.js";
|
|
16
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
17
|
+
const POLL_INTERVAL_MS = 8_000; // Time between state reads (higher to avoid 429s)
|
|
18
|
+
const GAME_CREATION_WAIT_MS = 20_000; // Wait for opponent to create game before we do
|
|
19
|
+
const MAX_RETRIES = 8; // Retry count for transient RPC errors
|
|
20
|
+
const RETRY_BASE_MS = 1_500; // Base backoff for retries (doubles each attempt + jitter)
|
|
21
|
+
// RPS move values (match Solidity enum: 0=None, 1=Rock, 2=Paper, 3=Scissors)
|
|
22
|
+
const RPS_MOVES = [1, 2, 3];
|
|
23
|
+
const RPS_MOVE_NAMES = { 1: "Rock", 2: "Paper", 3: "Scissors" };
|
|
24
|
+
// Poker action values
|
|
25
|
+
const POKER_CHECK = 1;
|
|
26
|
+
const POKER_CALL = 4;
|
|
27
|
+
// Phase enums (match Solidity)
|
|
28
|
+
const PHASE_COMMIT = 0;
|
|
29
|
+
const PHASE_REVEAL = 1;
|
|
30
|
+
// Poker-specific phases
|
|
31
|
+
const POKER_BETTING1 = 1;
|
|
32
|
+
const POKER_BETTING2 = 2;
|
|
33
|
+
const POKER_SHOWDOWN = 3;
|
|
34
|
+
// Match status
|
|
35
|
+
const MATCH_CREATED = 0;
|
|
36
|
+
const MATCH_ACTIVE = 1;
|
|
37
|
+
const ZERO_BYTES32 = "0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
38
|
+
// ─── Retry wrapper — the core resilience layer ──────────────────────────────
|
|
39
|
+
// Every RPC call goes through this. Retries on 429, timeout, and network errors.
|
|
40
|
+
function isTransient(err) {
|
|
41
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
42
|
+
return (msg.includes("429") ||
|
|
43
|
+
msg.includes("Too Many Requests") ||
|
|
44
|
+
msg.includes("ETIMEDOUT") ||
|
|
45
|
+
msg.includes("ECONNRESET") ||
|
|
46
|
+
msg.includes("fetch failed") ||
|
|
47
|
+
msg.includes("network") ||
|
|
48
|
+
msg.includes("socket hang up"));
|
|
49
|
+
}
|
|
50
|
+
async function retry(fn, label = "") {
|
|
51
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
52
|
+
try {
|
|
53
|
+
return await fn();
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (isTransient(err) && attempt < MAX_RETRIES - 1) {
|
|
57
|
+
// Exponential backoff + random jitter to desync competing agents
|
|
58
|
+
const backoff = RETRY_BASE_MS * Math.pow(2, attempt) + Math.floor(Math.random() * 2000);
|
|
59
|
+
event({ event: "retry", attempt: attempt + 1, backoffMs: backoff, label });
|
|
60
|
+
await sleep(backoff);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`Exhausted ${MAX_RETRIES} retries for: ${label}`);
|
|
67
|
+
}
|
|
68
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
69
|
+
function sleep(ms) {
|
|
70
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
71
|
+
}
|
|
72
|
+
function randomChoice(arr) {
|
|
73
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
74
|
+
}
|
|
75
|
+
function checkTimeout(startTime, timeoutMs) {
|
|
76
|
+
if (Date.now() - startTime > timeoutMs) {
|
|
77
|
+
fail("Overall timeout exceeded — aborting.", "TIMEOUT");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function gameTypeFromAddress(addr) {
|
|
81
|
+
const lower = addr.toLowerCase();
|
|
82
|
+
for (const [name, contractAddr] of Object.entries(GAME_CONTRACTS)) {
|
|
83
|
+
if (contractAddr.toLowerCase() === lower)
|
|
84
|
+
return name;
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
function gameContractAddr(gameType) {
|
|
89
|
+
return ({ rps: CONTRACTS.RPSGame, poker: CONTRACTS.PokerGame, auction: CONTRACTS.AuctionGame })[gameType];
|
|
90
|
+
}
|
|
91
|
+
// ─── Main respond command ───────────────────────────────────────────────────
|
|
92
|
+
export async function respondCommand(matchId, opts) {
|
|
93
|
+
const client = getPublicClient();
|
|
94
|
+
const myAddress = getAddress();
|
|
95
|
+
const id = BigInt(matchId);
|
|
96
|
+
const rounds = parseInt(opts.rounds || "3");
|
|
97
|
+
const timeoutMs = parseInt(opts.timeout || "600") * 1000;
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
// ── Phase A: Ensure match is Active ─────────────────────────────────────
|
|
100
|
+
const match = await retry(() => client.readContract({ address: CONTRACTS.Escrow, abi: escrowAbi, functionName: "getMatch", args: [id] }), "getMatch");
|
|
101
|
+
const status = Number(match.status);
|
|
102
|
+
if (status !== MATCH_CREATED && status !== MATCH_ACTIVE) {
|
|
103
|
+
fail(`Match ${matchId} status is ${status} (need 0=Created or 1=Active).`, "INVALID_STATUS");
|
|
104
|
+
}
|
|
105
|
+
const gameType = gameTypeFromAddress(match.gameContract);
|
|
106
|
+
if (!gameType) {
|
|
107
|
+
fail(`Unknown game contract ${match.gameContract}.`, "UNKNOWN_GAME");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const wagerWei = match.wager;
|
|
111
|
+
const isPlayer1 = match.player1.toLowerCase() === myAddress.toLowerCase();
|
|
112
|
+
// Accept if needed, or wait for acceptance if we're the challenger
|
|
113
|
+
if (status === MATCH_CREATED) {
|
|
114
|
+
if (match.player2.toLowerCase() === myAddress.toLowerCase()) {
|
|
115
|
+
// We're player2 — accept the match
|
|
116
|
+
const { hash: txHash } = await retry(() => sendTx({
|
|
117
|
+
to: CONTRACTS.Escrow,
|
|
118
|
+
data: encodeFunctionData({ abi: escrowAbi, functionName: "acceptMatch", args: [id] }),
|
|
119
|
+
value: wagerWei,
|
|
120
|
+
}), "acceptMatch");
|
|
121
|
+
event({ event: "accepted", matchId: Number(id), wager: formatEther(wagerWei), txHash });
|
|
122
|
+
}
|
|
123
|
+
else if (isPlayer1) {
|
|
124
|
+
// We're player1 (challenger) — wait for opponent to accept
|
|
125
|
+
event({ event: "waiting", message: "Waiting for opponent to accept match..." });
|
|
126
|
+
while (true) {
|
|
127
|
+
checkTimeout(startTime, timeoutMs);
|
|
128
|
+
await sleep(POLL_INTERVAL_MS);
|
|
129
|
+
const updated = await retry(() => client.readContract({ address: CONTRACTS.Escrow, abi: escrowAbi, functionName: "getMatch", args: [id] }), "poll-match-status");
|
|
130
|
+
if (Number(updated.status) === MATCH_ACTIVE) {
|
|
131
|
+
event({ event: "opponent_accepted", matchId: Number(id) });
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
fail(`Match ${matchId} is not for ${myAddress}.`, "WRONG_PLAYER");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
event({ event: "already_active", matchId: Number(id), wager: formatEther(wagerWei) });
|
|
142
|
+
}
|
|
143
|
+
// ── Phase B: Find or create game ────────────────────────────────────────
|
|
144
|
+
const contractAddr = gameContractAddr(gameType);
|
|
145
|
+
let gameId = await findGame(client, contractAddr, gameType, id);
|
|
146
|
+
if (gameId === null) {
|
|
147
|
+
event({ event: "waiting", message: "Waiting for opponent to create game..." });
|
|
148
|
+
const waitEnd = Date.now() + GAME_CREATION_WAIT_MS;
|
|
149
|
+
while (Date.now() < waitEnd && gameId === null) {
|
|
150
|
+
checkTimeout(startTime, timeoutMs);
|
|
151
|
+
await sleep(POLL_INTERVAL_MS);
|
|
152
|
+
gameId = await findGame(client, contractAddr, gameType, id);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (gameId === null) {
|
|
156
|
+
gameId = await createGame(client, gameType, id, rounds, contractAddr);
|
|
157
|
+
event({ event: "game_created", gameId: Number(gameId), gameType, rounds: gameType === "rps" ? rounds : 1 });
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
event({ event: "game_found", gameId: Number(gameId), gameType });
|
|
161
|
+
}
|
|
162
|
+
// ── Phase C: Play the game (state machine loop) ─────────────────────────
|
|
163
|
+
if (gameType === "rps") {
|
|
164
|
+
await rpsLoop(client, gameId, contractAddr, isPlayer1, startTime, timeoutMs);
|
|
165
|
+
}
|
|
166
|
+
else if (gameType === "poker") {
|
|
167
|
+
await pokerLoop(client, gameId, contractAddr, isPlayer1, wagerWei, startTime, timeoutMs);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
await auctionLoop(client, gameId, contractAddr, isPlayer1, wagerWei, startTime, timeoutMs);
|
|
171
|
+
}
|
|
172
|
+
// ── Phase D: Report result ──────────────────────────────────────────────
|
|
173
|
+
const finalMatch = await retry(() => client.readContract({ address: CONTRACTS.Escrow, abi: escrowAbi, functionName: "getMatch", args: [id] }), "getMatch-final");
|
|
174
|
+
let winner = "0x0000000000000000000000000000000000000000";
|
|
175
|
+
try {
|
|
176
|
+
winner = (await retry(() => client.readContract({ address: CONTRACTS.Escrow, abi: escrowAbi, functionName: "winners", args: [id] }), "getWinner"));
|
|
177
|
+
}
|
|
178
|
+
catch { /* not set yet */ }
|
|
179
|
+
const isWinner = winner.toLowerCase() === myAddress.toLowerCase();
|
|
180
|
+
event({ event: "match_complete", matchId: Number(id), winner, result: isWinner ? "win" : "loss" });
|
|
181
|
+
ok({
|
|
182
|
+
action: "respond",
|
|
183
|
+
matchId: Number(id),
|
|
184
|
+
gameType,
|
|
185
|
+
gameId: Number(gameId),
|
|
186
|
+
result: isWinner ? "win" : "loss",
|
|
187
|
+
winner,
|
|
188
|
+
wager: formatEther(wagerWei),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
192
|
+
// RPS STATE MACHINE
|
|
193
|
+
// Each iteration: read state → decide action → execute → sleep → repeat
|
|
194
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
196
|
+
async function rpsLoop(client, gameId, addr, isPlayer1, startTime, timeoutMs) {
|
|
197
|
+
while (true) {
|
|
198
|
+
checkTimeout(startTime, timeoutMs);
|
|
199
|
+
// 1. Read game state
|
|
200
|
+
const game = await retry(() => client.readContract({ address: addr, abi: rpsGameAbi, functionName: "getGame", args: [gameId] }), "rps-getGame");
|
|
201
|
+
// 2. Check if done
|
|
202
|
+
if (game.settled) {
|
|
203
|
+
event({ event: "game_settled", gameId: Number(gameId), p1Score: Number(game.p1Score), p2Score: Number(game.p2Score) });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const round = Number(game.currentRound);
|
|
207
|
+
const phase = Number(game.phase);
|
|
208
|
+
// 3. Read round data
|
|
209
|
+
const roundData = await retry(() => client.readContract({ address: addr, abi: rpsGameAbi, functionName: "getRound", args: [gameId, BigInt(round)] }), "rps-getRound");
|
|
210
|
+
const myCommit = isPlayer1 ? roundData.p1Commit : roundData.p2Commit;
|
|
211
|
+
const myRevealed = isPlayer1 ? roundData.p1Revealed : roundData.p2Revealed;
|
|
212
|
+
// 4. Decide action based on state
|
|
213
|
+
if (phase === PHASE_COMMIT && myCommit === ZERO_BYTES32) {
|
|
214
|
+
// ACTION: We need to commit a move
|
|
215
|
+
const moveNum = randomChoice(RPS_MOVES);
|
|
216
|
+
const salt = generateSalt();
|
|
217
|
+
const hash = commitHash(moveNum, salt);
|
|
218
|
+
const { hash: txHash } = await retry(() => sendTx({
|
|
219
|
+
to: addr,
|
|
220
|
+
data: encodeFunctionData({ abi: rpsGameAbi, functionName: "commit", args: [gameId, hash] }),
|
|
221
|
+
}), "rps-commit");
|
|
222
|
+
// Save salt (memory + disk)
|
|
223
|
+
storeSalt(`rps-${gameId}-${round}`, { salt, moveNum });
|
|
224
|
+
event({ event: "committed", round, move: RPS_MOVE_NAMES[moveNum], txHash });
|
|
225
|
+
}
|
|
226
|
+
else if (phase === PHASE_COMMIT) {
|
|
227
|
+
// We committed, waiting for opponent
|
|
228
|
+
event({ event: "status", round, phase: "commit", message: "Waiting for opponent to commit..." });
|
|
229
|
+
}
|
|
230
|
+
else if (phase === PHASE_REVEAL && !myRevealed) {
|
|
231
|
+
// ACTION: We need to reveal
|
|
232
|
+
const stored = loadStoredSalt(`rps-${gameId}-${round}`);
|
|
233
|
+
if (!stored) {
|
|
234
|
+
fail(`Lost salt for round ${round}. Cannot reveal. Game is unrecoverable.`, "SALT_LOST");
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const { hash: txHash } = await retry(() => sendTx({
|
|
238
|
+
to: addr,
|
|
239
|
+
data: encodeFunctionData({ abi: rpsGameAbi, functionName: "reveal", args: [gameId, stored.moveNum, stored.salt] }),
|
|
240
|
+
}), "rps-reveal");
|
|
241
|
+
event({ event: "revealed", round, move: RPS_MOVE_NAMES[stored.moveNum], txHash });
|
|
242
|
+
}
|
|
243
|
+
else if (phase === PHASE_REVEAL) {
|
|
244
|
+
// We revealed, waiting for opponent
|
|
245
|
+
event({ event: "status", round, phase: "reveal", message: "Waiting for opponent to reveal..." });
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// Unknown state — log it
|
|
249
|
+
event({ event: "status", round, phase, message: "Waiting for state change..." });
|
|
250
|
+
}
|
|
251
|
+
// 5. Sleep before next read
|
|
252
|
+
await sleep(POLL_INTERVAL_MS);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
256
|
+
// POKER STATE MACHINE
|
|
257
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
258
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
|
+
async function pokerLoop(client, gameId, addr, isPlayer1, wagerWei, startTime, timeoutMs) {
|
|
260
|
+
while (true) {
|
|
261
|
+
checkTimeout(startTime, timeoutMs);
|
|
262
|
+
const game = await retry(() => client.readContract({ address: addr, abi: pokerGameAbi, functionName: "getGame", args: [gameId] }), "poker-getGame");
|
|
263
|
+
if (game.settled) {
|
|
264
|
+
event({ event: "game_settled", gameId: Number(gameId), gameType: "poker" });
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const phase = Number(game.phase);
|
|
268
|
+
const myCommitted = isPlayer1 ? game.p1Committed : game.p2Committed;
|
|
269
|
+
const myRevealed = isPlayer1 ? game.p1Revealed : game.p2Revealed;
|
|
270
|
+
const isMyTurn = game.currentTurn.toLowerCase() === getAddress().toLowerCase();
|
|
271
|
+
if (phase === PHASE_COMMIT && !myCommitted) {
|
|
272
|
+
// ACTION: Commit a hand value
|
|
273
|
+
const handValue = Math.floor(Math.random() * 100) + 1;
|
|
274
|
+
const salt = generateSalt();
|
|
275
|
+
const hash = commitHash(handValue, salt);
|
|
276
|
+
storeSalt(`poker-${gameId}`, { salt, handValue });
|
|
277
|
+
const { hash: txHash } = await retry(() => sendTx({
|
|
278
|
+
to: addr,
|
|
279
|
+
data: encodeFunctionData({ abi: pokerGameAbi, functionName: "commitHand", args: [gameId, hash] }),
|
|
280
|
+
}), "poker-commit");
|
|
281
|
+
event({ event: "committed", gameType: "poker", handValue, txHash });
|
|
282
|
+
}
|
|
283
|
+
else if (phase === PHASE_COMMIT) {
|
|
284
|
+
event({ event: "status", phase: "commit", message: "Waiting for opponent to commit hand..." });
|
|
285
|
+
}
|
|
286
|
+
else if ((phase === POKER_BETTING1 || phase === POKER_BETTING2) && isMyTurn) {
|
|
287
|
+
// ACTION: Take betting action — check or call
|
|
288
|
+
const currentBet = BigInt(game.currentBet);
|
|
289
|
+
const action = currentBet > 0n ? POKER_CALL : POKER_CHECK;
|
|
290
|
+
const actionName = currentBet > 0n ? "call" : "check";
|
|
291
|
+
const value = action === POKER_CALL ? currentBet : 0n;
|
|
292
|
+
const { hash: txHash } = await retry(() => sendTx({
|
|
293
|
+
to: addr,
|
|
294
|
+
data: encodeFunctionData({ abi: pokerGameAbi, functionName: "takeAction", args: [gameId, action] }),
|
|
295
|
+
value,
|
|
296
|
+
}), `poker-${actionName}`);
|
|
297
|
+
event({ event: "action", gameType: "poker", action: actionName, bettingRound: phase, txHash });
|
|
298
|
+
}
|
|
299
|
+
else if (phase === POKER_BETTING1 || phase === POKER_BETTING2) {
|
|
300
|
+
event({ event: "status", phase: `betting${phase}`, message: "Waiting for opponent's turn..." });
|
|
301
|
+
}
|
|
302
|
+
else if (phase === POKER_SHOWDOWN && !myRevealed) {
|
|
303
|
+
// ACTION: Reveal hand
|
|
304
|
+
const stored = loadStoredSalt(`poker-${gameId}`);
|
|
305
|
+
if (!stored) {
|
|
306
|
+
fail("Lost salt for poker reveal. Game is unrecoverable.", "SALT_LOST");
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const { hash: txHash } = await retry(() => sendTx({
|
|
310
|
+
to: addr,
|
|
311
|
+
data: encodeFunctionData({ abi: pokerGameAbi, functionName: "revealHand", args: [gameId, stored.handValue, stored.salt] }),
|
|
312
|
+
}), "poker-reveal");
|
|
313
|
+
event({ event: "revealed", gameType: "poker", handValue: stored.handValue, txHash });
|
|
314
|
+
}
|
|
315
|
+
else if (phase === POKER_SHOWDOWN) {
|
|
316
|
+
event({ event: "status", phase: "showdown", message: "Waiting for opponent to reveal..." });
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
event({ event: "status", phase, message: "Waiting for state change..." });
|
|
320
|
+
}
|
|
321
|
+
await sleep(POLL_INTERVAL_MS);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
325
|
+
// AUCTION STATE MACHINE
|
|
326
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
327
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
328
|
+
async function auctionLoop(client, gameId, addr, isPlayer1, wagerWei, startTime, timeoutMs) {
|
|
329
|
+
while (true) {
|
|
330
|
+
checkTimeout(startTime, timeoutMs);
|
|
331
|
+
const game = await retry(() => client.readContract({ address: addr, abi: auctionGameAbi, functionName: "getGame", args: [gameId] }), "auction-getGame");
|
|
332
|
+
if (game.settled) {
|
|
333
|
+
event({ event: "game_settled", gameId: Number(gameId), gameType: "auction" });
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const phase = Number(game.phase);
|
|
337
|
+
const myCommitted = isPlayer1 ? game.p1Committed : game.p2Committed;
|
|
338
|
+
const myRevealed = isPlayer1 ? game.p1Revealed : game.p2Revealed;
|
|
339
|
+
if (phase === PHASE_COMMIT && !myCommitted) {
|
|
340
|
+
// ACTION: Commit a bid (~55-65% of wager)
|
|
341
|
+
const bidPercent = 55 + Math.floor(Math.random() * 11);
|
|
342
|
+
const bidWei = (wagerWei * BigInt(bidPercent)) / 100n;
|
|
343
|
+
const salt = generateSalt();
|
|
344
|
+
const hash = commitBidHash(bidWei, salt);
|
|
345
|
+
storeSalt(`auction-${gameId}`, { salt, bidWei: bidWei.toString() });
|
|
346
|
+
const { hash: txHash } = await retry(() => sendTx({
|
|
347
|
+
to: addr,
|
|
348
|
+
data: encodeFunctionData({ abi: auctionGameAbi, functionName: "commitBid", args: [gameId, hash] }),
|
|
349
|
+
}), "auction-commit");
|
|
350
|
+
event({ event: "committed", gameType: "auction", bidMON: formatEther(bidWei), bidPercent, txHash });
|
|
351
|
+
}
|
|
352
|
+
else if (phase === PHASE_COMMIT) {
|
|
353
|
+
event({ event: "status", phase: "commit", message: "Waiting for opponent to commit bid..." });
|
|
354
|
+
}
|
|
355
|
+
else if (phase === PHASE_REVEAL && !myRevealed) {
|
|
356
|
+
// ACTION: Reveal bid
|
|
357
|
+
const stored = loadStoredSalt(`auction-${gameId}`);
|
|
358
|
+
if (!stored) {
|
|
359
|
+
fail("Lost salt for auction reveal. Game is unrecoverable.", "SALT_LOST");
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
// bidWei stored as string, convert back to bigint
|
|
363
|
+
const bidWei = BigInt(stored.bidWei);
|
|
364
|
+
const { hash: txHash } = await retry(() => sendTx({
|
|
365
|
+
to: addr,
|
|
366
|
+
data: encodeFunctionData({ abi: auctionGameAbi, functionName: "revealBid", args: [gameId, bidWei, stored.salt] }),
|
|
367
|
+
}), "auction-reveal");
|
|
368
|
+
event({ event: "revealed", gameType: "auction", bidMON: formatEther(bidWei), txHash });
|
|
369
|
+
}
|
|
370
|
+
else if (phase === PHASE_REVEAL) {
|
|
371
|
+
event({ event: "status", phase: "reveal", message: "Waiting for opponent to reveal bid..." });
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
event({ event: "status", phase, message: "Waiting for state change..." });
|
|
375
|
+
}
|
|
376
|
+
await sleep(POLL_INTERVAL_MS);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
380
|
+
// GAME DISCOVERY
|
|
381
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
382
|
+
const nextGameIdAbi = [
|
|
383
|
+
{ name: "nextGameId", type: "function", stateMutability: "view", inputs: [], outputs: [{ name: "", type: "uint256" }] },
|
|
384
|
+
];
|
|
385
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
386
|
+
async function findGame(client, contractAddr, gameType, matchId) {
|
|
387
|
+
const abi = gameType === "rps" ? rpsGameAbi : gameType === "poker" ? pokerGameAbi : auctionGameAbi;
|
|
388
|
+
let nextId;
|
|
389
|
+
try {
|
|
390
|
+
nextId = (await retry(() => client.readContract({ address: contractAddr, abi: nextGameIdAbi, functionName: "nextGameId" }), "nextGameId"));
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
// Scan backwards (recent games first, max 50)
|
|
396
|
+
const start = Number(nextId) - 1;
|
|
397
|
+
const end = Math.max(0, start - 50);
|
|
398
|
+
for (let i = start; i >= end; i--) {
|
|
399
|
+
try {
|
|
400
|
+
const game = await client.readContract({
|
|
401
|
+
address: contractAddr, abi, functionName: "getGame", args: [BigInt(i)],
|
|
402
|
+
});
|
|
403
|
+
if (BigInt(game.escrowMatchId) === matchId)
|
|
404
|
+
return BigInt(i);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
413
|
+
async function createGame(client, gameType, matchId, rounds, contractAddr) {
|
|
414
|
+
// Read nextGameId before creating — that will be our game's ID
|
|
415
|
+
const beforeId = (await retry(() => client.readContract({ address: contractAddr, abi: nextGameIdAbi, functionName: "nextGameId" }), "nextGameId-pre"));
|
|
416
|
+
let data;
|
|
417
|
+
if (gameType === "rps") {
|
|
418
|
+
data = encodeFunctionData({ abi: rpsGameAbi, functionName: "createGame", args: [matchId, BigInt(rounds)] });
|
|
419
|
+
}
|
|
420
|
+
else if (gameType === "poker") {
|
|
421
|
+
data = encodeFunctionData({ abi: pokerGameAbi, functionName: "createGame", args: [matchId] });
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
data = encodeFunctionData({ abi: auctionGameAbi, functionName: "createGame", args: [matchId] });
|
|
425
|
+
}
|
|
426
|
+
await retry(() => sendTx({ to: contractAddr, data }), "createGame");
|
|
427
|
+
return beforeId;
|
|
428
|
+
}
|
|
429
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
430
|
+
// SALT STORAGE — in-memory primary, disk backup for process restarts
|
|
431
|
+
// Keys include wallet address to avoid collisions on shared machines.
|
|
432
|
+
// ═════════════════════════════════════════════════════════════════════════════
|
|
433
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
434
|
+
const memoryStore = {};
|
|
435
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
436
|
+
function storeSalt(key, value) {
|
|
437
|
+
memoryStore[key] = value;
|
|
438
|
+
// Persist to disk with wallet-scoped key
|
|
439
|
+
if (value.salt) {
|
|
440
|
+
const diskKey = `respond-${key}-${getAddress()}`;
|
|
441
|
+
saveSalt(diskKey, value.salt, JSON.stringify(value), "respond");
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
445
|
+
function loadStoredSalt(key) {
|
|
446
|
+
// Memory first
|
|
447
|
+
if (memoryStore[key])
|
|
448
|
+
return memoryStore[key];
|
|
449
|
+
// Disk fallback (process restart recovery)
|
|
450
|
+
const diskKey = `respond-${key}-${getAddress()}`;
|
|
451
|
+
const entry = loadSalt(diskKey);
|
|
452
|
+
if (entry) {
|
|
453
|
+
try {
|
|
454
|
+
const parsed = JSON.parse(entry.value);
|
|
455
|
+
memoryStore[key] = parsed;
|
|
456
|
+
return parsed;
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
return null;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=respond.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/commands/respond.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rps-round.d.ts","sourceRoot":"","sources":["../../src/commands/rps-round.ts"],"names":[],"mappings":"AAmEA,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBA4MjE"}
|