@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.
Files changed (43) hide show
  1. package/dist/CLAUDE.md +7 -0
  2. package/dist/commands/auction-round.d.ts +2 -0
  3. package/dist/commands/auction-round.d.ts.map +1 -0
  4. package/dist/commands/auction-round.js +139 -0
  5. package/dist/commands/auction-round.js.map +1 -0
  6. package/dist/commands/create-tournament.d.ts +6 -0
  7. package/dist/commands/create-tournament.d.ts.map +1 -0
  8. package/dist/commands/create-tournament.js +47 -0
  9. package/dist/commands/create-tournament.js.map +1 -0
  10. package/dist/commands/market.d.ts +2 -0
  11. package/dist/commands/market.d.ts.map +1 -1
  12. package/dist/commands/market.js +46 -2
  13. package/dist/commands/market.js.map +1 -1
  14. package/dist/commands/pending.d.ts +2 -0
  15. package/dist/commands/pending.d.ts.map +1 -0
  16. package/dist/commands/pending.js +52 -0
  17. package/dist/commands/pending.js.map +1 -0
  18. package/dist/commands/play.d.ts +5 -0
  19. package/dist/commands/play.d.ts.map +1 -0
  20. package/dist/commands/play.js +47 -0
  21. package/dist/commands/play.js.map +1 -0
  22. package/dist/commands/poker-step.d.ts +4 -0
  23. package/dist/commands/poker-step.d.ts.map +1 -0
  24. package/dist/commands/poker-step.js +243 -0
  25. package/dist/commands/poker-step.js.map +1 -0
  26. package/dist/commands/register.d.ts.map +1 -1
  27. package/dist/commands/register.js +3 -2
  28. package/dist/commands/register.js.map +1 -1
  29. package/dist/commands/respond.d.ts +5 -0
  30. package/dist/commands/respond.d.ts.map +1 -0
  31. package/dist/commands/respond.js +464 -0
  32. package/dist/commands/respond.js.map +1 -0
  33. package/dist/commands/rps-round.d.ts +2 -0
  34. package/dist/commands/rps-round.d.ts.map +1 -0
  35. package/dist/commands/rps-round.js +208 -0
  36. package/dist/commands/rps-round.js.map +1 -0
  37. package/dist/contracts.d.ts +72 -0
  38. package/dist/contracts.d.ts.map +1 -1
  39. package/dist/contracts.js +30 -0
  40. package/dist/contracts.js.map +1 -1
  41. package/dist/index.js +79 -2
  42. package/dist/index.js.map +1 -1
  43. 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,2 @@
1
+ export declare function rpsRoundCommand(gameId: string, move: string): Promise<void>;
2
+ //# sourceMappingURL=rps-round.d.ts.map
@@ -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"}