@molteee/arena-tools 0.2.5 → 0.2.7

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 (57) hide show
  1. package/dist/client.d.ts.map +1 -0
  2. package/dist/client.js +10 -4
  3. package/dist/client.js.map +1 -1
  4. package/dist/commands/accept.d.ts.map +1 -0
  5. package/dist/commands/auction-round.d.ts.map +1 -0
  6. package/dist/commands/auction.d.ts.map +1 -0
  7. package/dist/commands/challenge.d.ts.map +1 -0
  8. package/dist/commands/claim-timeout.d.ts.map +1 -0
  9. package/dist/commands/claim-timeout.js +1 -1
  10. package/dist/commands/claim-timeout.js.map +1 -1
  11. package/dist/commands/create-tournament.d.ts.map +1 -0
  12. package/dist/commands/find-game.d.ts.map +1 -0
  13. package/dist/commands/find-opponents.d.ts.map +1 -0
  14. package/dist/commands/get-game.d.ts.map +1 -0
  15. package/dist/commands/get-game.js +1 -1
  16. package/dist/commands/get-game.js.map +1 -1
  17. package/dist/commands/get-match.d.ts.map +1 -0
  18. package/dist/commands/history.d.ts.map +1 -0
  19. package/dist/commands/join-tournament.d.ts.map +1 -0
  20. package/dist/commands/market-status.d.ts.map +1 -0
  21. package/dist/commands/market.d.ts.map +1 -0
  22. package/dist/commands/pending.d.ts.map +1 -0
  23. package/dist/commands/play.d.ts.map +1 -0
  24. package/dist/commands/poker-step.d.ts.map +1 -0
  25. package/dist/commands/poker-step.js +1 -1
  26. package/dist/commands/poker-step.js.map +1 -1
  27. package/dist/commands/poker.d.ts.map +1 -0
  28. package/dist/commands/poker.js +6 -6
  29. package/dist/commands/poker.js.map +1 -1
  30. package/dist/commands/register.d.ts.map +1 -0
  31. package/dist/commands/respond.d.ts.map +1 -0
  32. package/dist/commands/rps-round.d.ts.map +1 -0
  33. package/dist/commands/rps.d.ts.map +1 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/tournaments.d.ts.map +1 -0
  36. package/dist/config.d.ts +1 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +8 -8
  39. package/dist/config.js.map +1 -1
  40. package/dist/contracts.d.ts.map +1 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/utils/commit-reveal.d.ts.map +1 -0
  43. package/dist/utils/output.d.ts +2 -1
  44. package/dist/utils/output.d.ts.map +1 -0
  45. package/dist/utils/output.js +3 -2
  46. package/dist/utils/output.js.map +1 -1
  47. package/dist/utils/tx.d.ts +3 -1
  48. package/dist/utils/tx.d.ts.map +1 -0
  49. package/dist/utils/tx.js +68 -24
  50. package/dist/utils/tx.js.map +1 -1
  51. package/package.json +1 -1
  52. package/dist/commands/play.d.ts +0 -1
  53. package/dist/commands/play.js +0 -46
  54. package/dist/commands/play.js.map +0 -1
  55. package/dist/commands/respond.d.ts +0 -1
  56. package/dist/commands/respond.js +0 -489
  57. package/dist/commands/respond.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@molteee/arena-tools",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "CLI tool for interacting with the Molteee Gaming Arena on Monad testnet",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- export declare function playCommand(opponent: string, wager: string, gameType: string, opts: any): Promise<void>;
@@ -1,46 +0,0 @@
1
- // arena-tools play — challenge an opponent AND play the full game in one blocking call.
2
- // This is the challenger-side equivalent of `respond` (which is for the acceptor).
3
- //
4
- // Usage: npx arena-tools play <opponent> <wager> <game_type> [--rounds 3] [--timeout 600]
5
- //
6
- // Flow: create challenge -> delegate to respondCommand (which waits for acceptance,
7
- // creates game, plays all rounds, and reports result).
8
- import { encodeFunctionData, parseEther, getAddress as checksumAddress } from "viem";
9
- import { CONTRACTS, GAME_CONTRACTS, GAME_TYPES } from "../config.js";
10
- import { escrowAbi } from "../contracts.js";
11
- import { sendTx } from "../utils/tx.js";
12
- import { event, fail } from "../utils/output.js";
13
- import { respondCommand } from "./respond.js";
14
- export async function playCommand(opponent, wager, gameType, opts) {
15
- const gt = gameType.toLowerCase();
16
- if (!(gt in GAME_TYPES)) {
17
- fail(`Invalid game type: ${gameType}. Must be rps, poker, or auction.`, "INVALID_GAME_TYPE");
18
- }
19
- const gameContract = GAME_CONTRACTS[gt];
20
- const wagerWei = parseEther(wager);
21
- // Step 1: Create the challenge
22
- event({ event: "challenging", opponent, wager, gameType: gt });
23
- const data = encodeFunctionData({
24
- abi: escrowAbi,
25
- functionName: "createMatch",
26
- args: [checksumAddress(opponent), gameContract],
27
- });
28
- const { hash, logs } = await sendTx({
29
- to: CONTRACTS.Escrow,
30
- data,
31
- value: wagerWei,
32
- });
33
- // Parse matchId from MatchCreated event in tx logs (topics[1]).
34
- // Race-safe — reads directly from our own tx receipt, not from global state.
35
- let matchId = -1;
36
- for (const log of logs) {
37
- if (log.address.toLowerCase() === CONTRACTS.Escrow.toLowerCase() && log.topics.length > 1) {
38
- matchId = Number(BigInt(log.topics[1]));
39
- break;
40
- }
41
- }
42
- event({ event: "challenge_created", matchId, opponent, wager, gameType: gt, txHash: hash });
43
- // Step 2: Delegate to respond — it handles waiting for acceptance, game creation, and play
44
- await respondCommand(String(matchId), opts);
45
- }
46
- //# sourceMappingURL=play.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"play.js","sourceRoot":"","sources":["../../src/commands/play.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,mFAAmF;AACnF,EAAE;AACF,0FAA0F;AAC1F,EAAE;AACF,oFAAoF;AACpF,uDAAuD;AACvD,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,MAAM,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAa,EAAE,QAAgB,EAAE,IAAS;IAC1F,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,sBAAsB,QAAQ,mCAAmC,EAAE,mBAAmB,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,YAAY,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEnC,+BAA+B;IAC/B,KAAK,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC5B,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;KAClD,CAAC,CAAC;IACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;QAChC,EAAE,EAAE,SAAS,CAAC,MAAM;QACpB,IAAI;QACJ,KAAK,EAAE,QAAQ;KAClB,CAAC,CAAC;IAEH,gEAAgE;IAChE,6EAA6E;IAC7E,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxF,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;YACzC,MAAM;QACV,CAAC;IACL,CAAC;IAED,KAAK,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5F,2FAA2F;IAC3F,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AAChD,CAAC"}
@@ -1 +0,0 @@
1
- export declare function respondCommand(matchId: string, opts: any): Promise<void>;
@@ -1,489 +0,0 @@
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, pokerGameV2Abi, 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 = 2_000; // Reduced from 8s — WS transport avoids rate limits
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) +
59
- Math.floor(Math.random() * 2000);
60
- event({ event: "retry", attempt: attempt + 1, backoffMs: backoff, label });
61
- await sleep(backoff);
62
- continue;
63
- }
64
- throw err;
65
- }
66
- }
67
- throw new Error(`Exhausted ${MAX_RETRIES} retries for: ${label}`);
68
- }
69
- // ─── Helpers ────────────────────────────────────────────────────────────────
70
- function sleep(ms) {
71
- return new Promise((r) => setTimeout(r, ms));
72
- }
73
- function randomChoice(arr) {
74
- return arr[Math.floor(Math.random() * arr.length)];
75
- }
76
- function checkTimeout(startTime, timeoutMs) {
77
- if (Date.now() - startTime > timeoutMs) {
78
- fail("Overall timeout exceeded — aborting.", "TIMEOUT");
79
- }
80
- }
81
- function gameTypeFromAddress(addr) {
82
- const lower = addr.toLowerCase();
83
- for (const [name, contractAddr] of Object.entries(GAME_CONTRACTS)) {
84
- if (contractAddr.toLowerCase() === lower)
85
- return name;
86
- }
87
- return null;
88
- }
89
- function gameContractAddr(gameType) {
90
- return { rps: CONTRACTS.RPSGame, poker: CONTRACTS.PokerGameV2, auction: CONTRACTS.AuctionGame }[gameType];
91
- }
92
- // ─── Main respond command ───────────────────────────────────────────────────
93
- export async function respondCommand(matchId, opts) {
94
- const client = getPublicClient();
95
- const myAddress = getAddress();
96
- const id = BigInt(matchId);
97
- const rounds = parseInt(opts.rounds || "3");
98
- const timeoutMs = parseInt(opts.timeout || "600") * 1000;
99
- const startTime = Date.now();
100
- // ── Phase A: Ensure match is Active ─────────────────────────────────────
101
- const match = (await retry(() => client.readContract({ address: CONTRACTS.Escrow, abi: escrowAbi, functionName: "getMatch", args: [id] }), "getMatch"));
102
- const status = Number(match.status);
103
- if (status !== MATCH_CREATED && status !== MATCH_ACTIVE) {
104
- fail(`Match ${matchId} status is ${status} (need 0=Created or 1=Active).`, "INVALID_STATUS");
105
- }
106
- const gameType = gameTypeFromAddress(match.gameContract);
107
- if (!gameType) {
108
- fail(`Unknown game contract ${match.gameContract}.`, "UNKNOWN_GAME");
109
- return;
110
- }
111
- const wagerWei = match.wager;
112
- const isPlayer1 = match.player1.toLowerCase() === myAddress.toLowerCase();
113
- // Accept if needed, or wait for acceptance if we're the challenger
114
- if (status === MATCH_CREATED) {
115
- if (match.player2.toLowerCase() === myAddress.toLowerCase()) {
116
- // We're player2 — accept the match
117
- const { hash: txHash } = await retry(() => sendTx({
118
- to: CONTRACTS.Escrow,
119
- data: encodeFunctionData({ abi: escrowAbi, functionName: "acceptMatch", args: [id] }),
120
- value: wagerWei,
121
- }), "acceptMatch");
122
- event({ event: "accepted", matchId: Number(id), wager: formatEther(wagerWei), txHash });
123
- }
124
- else if (isPlayer1) {
125
- // We're player1 (challenger) — wait for opponent to accept
126
- event({ event: "waiting", message: "Waiting for opponent to accept match..." });
127
- while (true) {
128
- checkTimeout(startTime, timeoutMs);
129
- await sleep(POLL_INTERVAL_MS);
130
- const updated = (await retry(() => client.readContract({ address: CONTRACTS.Escrow, abi: escrowAbi, functionName: "getMatch", args: [id] }), "poll-match-status"));
131
- if (Number(updated.status) === MATCH_ACTIVE) {
132
- event({ event: "opponent_accepted", matchId: Number(id) });
133
- break;
134
- }
135
- }
136
- }
137
- else {
138
- fail(`Match ${matchId} is not for ${myAddress}.`, "WRONG_PLAYER");
139
- }
140
- }
141
- else {
142
- event({ event: "already_active", matchId: Number(id), wager: formatEther(wagerWei) });
143
- }
144
- // ── Phase B: Find or create game ────────────────────────────────────────
145
- // Challenger (player1) creates immediately to avoid race conditions.
146
- // Responder (player2) waits for the game to appear, creates as fallback.
147
- const contractAddr = gameContractAddr(gameType);
148
- let gameId = await findGame(client, contractAddr, gameType, id);
149
- if (gameId === null && isPlayer1) {
150
- // Challenger creates the game immediately — no waiting
151
- gameId = await createGame(client, gameType, id, rounds, contractAddr);
152
- event({ event: "game_created", gameId: Number(gameId), gameType, rounds: gameType === "rps" ? rounds : 1 });
153
- }
154
- else if (gameId === null) {
155
- // Responder waits for challenger to create the game
156
- event({ event: "waiting", message: "Waiting for opponent to create game..." });
157
- const waitEnd = Date.now() + GAME_CREATION_WAIT_MS;
158
- while (Date.now() < waitEnd && gameId === null) {
159
- checkTimeout(startTime, timeoutMs);
160
- await sleep(POLL_INTERVAL_MS);
161
- gameId = await findGame(client, contractAddr, gameType, id);
162
- }
163
- if (gameId === null) {
164
- // Fallback: create ourselves if challenger didn't
165
- gameId = await createGame(client, gameType, id, rounds, contractAddr);
166
- event({ event: "game_created", gameId: Number(gameId), gameType, rounds: gameType === "rps" ? rounds : 1 });
167
- }
168
- else {
169
- event({ event: "game_found", gameId: Number(gameId), gameType });
170
- }
171
- }
172
- else {
173
- event({ event: "game_found", gameId: Number(gameId), gameType });
174
- }
175
- // ── Phase C: Play the game (state machine loop) ─────────────────────────
176
- if (gameType === "rps") {
177
- await rpsLoop(client, gameId, contractAddr, isPlayer1, startTime, timeoutMs);
178
- }
179
- else if (gameType === "poker") {
180
- await pokerLoop(client, gameId, contractAddr, isPlayer1, wagerWei, startTime, timeoutMs);
181
- }
182
- else {
183
- await auctionLoop(client, gameId, contractAddr, isPlayer1, wagerWei, startTime, timeoutMs);
184
- }
185
- // ── Phase D: Report result ──────────────────────────────────────────────
186
- const finalMatch = (await retry(() => client.readContract({ address: CONTRACTS.Escrow, abi: escrowAbi, functionName: "getMatch", args: [id] }), "getMatch-final"));
187
- let winner = "0x0000000000000000000000000000000000000000";
188
- try {
189
- winner = (await retry(() => client.readContract({ address: CONTRACTS.Escrow, abi: escrowAbi, functionName: "winners", args: [id] }), "getWinner"));
190
- }
191
- catch { /* not set yet */ }
192
- const isWinner = winner.toLowerCase() === myAddress.toLowerCase();
193
- event({ event: "match_complete", matchId: Number(id), winner, result: isWinner ? "win" : "loss" });
194
- ok({
195
- action: "respond",
196
- matchId: Number(id),
197
- gameType,
198
- gameId: Number(gameId),
199
- result: isWinner ? "win" : "loss",
200
- winner,
201
- wager: formatEther(wagerWei),
202
- });
203
- }
204
- // ═════════════════════════════════════════════════════════════════════════════
205
- // RPS STATE MACHINE
206
- // Each iteration: read state -> decide action -> execute -> sleep -> repeat
207
- // ═════════════════════════════════════════════════════════════════════════════
208
- async function rpsLoop(client, gameId, addr, isPlayer1, startTime, timeoutMs) {
209
- while (true) {
210
- checkTimeout(startTime, timeoutMs);
211
- // 1. Read game state
212
- const game = (await retry(() => client.readContract({ address: addr, abi: rpsGameAbi, functionName: "getGame", args: [gameId] }), "rps-getGame"));
213
- // 2. Check if done
214
- if (game.settled) {
215
- event({ event: "game_settled", gameId: Number(gameId), p1Score: Number(game.p1Score), p2Score: Number(game.p2Score) });
216
- return;
217
- }
218
- const round = Number(game.currentRound);
219
- const phase = Number(game.phase);
220
- // 3. Read round data
221
- const roundData = (await retry(() => client.readContract({ address: addr, abi: rpsGameAbi, functionName: "getRound", args: [gameId, BigInt(round)] }), "rps-getRound"));
222
- const myCommit = isPlayer1 ? roundData.p1Commit : roundData.p2Commit;
223
- const myRevealed = isPlayer1 ? roundData.p1Revealed : roundData.p2Revealed;
224
- // 4. Decide action based on state
225
- if (phase === PHASE_COMMIT && myCommit === ZERO_BYTES32) {
226
- // ACTION: We need to commit a move
227
- const moveNum = randomChoice(RPS_MOVES);
228
- const salt = generateSalt();
229
- const hash = commitHash(moveNum, salt);
230
- const { hash: txHash } = await retry(() => sendTx({
231
- to: addr,
232
- data: encodeFunctionData({ abi: rpsGameAbi, functionName: "commit", args: [gameId, hash] }),
233
- }), "rps-commit");
234
- // Save salt (memory + disk)
235
- storeSalt(`rps-${gameId}-${round}`, { salt, moveNum });
236
- event({ event: "committed", round, move: RPS_MOVE_NAMES[moveNum], txHash });
237
- }
238
- else if (phase === PHASE_COMMIT) {
239
- // We committed, waiting for opponent
240
- event({ event: "status", round, phase: "commit", message: "Waiting for opponent to commit..." });
241
- }
242
- else if (phase === PHASE_REVEAL && !myRevealed) {
243
- // ACTION: We need to reveal
244
- const stored = loadStoredSalt(`rps-${gameId}-${round}`);
245
- if (!stored) {
246
- fail(`Lost salt for round ${round}. Cannot reveal. Game is unrecoverable.`, "SALT_LOST");
247
- return;
248
- }
249
- const { hash: txHash } = await retry(() => sendTx({
250
- to: addr,
251
- data: encodeFunctionData({ abi: rpsGameAbi, functionName: "reveal", args: [gameId, stored.moveNum, stored.salt] }),
252
- }), "rps-reveal");
253
- event({ event: "revealed", round, move: RPS_MOVE_NAMES[stored.moveNum], txHash });
254
- }
255
- else if (phase === PHASE_REVEAL) {
256
- // We revealed, waiting for opponent
257
- event({ event: "status", round, phase: "reveal", message: "Waiting for opponent to reveal..." });
258
- }
259
- else {
260
- // Unknown state — log it
261
- event({ event: "status", round, phase, message: "Waiting for state change..." });
262
- }
263
- // 5. Sleep before next read
264
- await sleep(POLL_INTERVAL_MS);
265
- }
266
- }
267
- // ═════════════════════════════════════════════════════════════════════════════
268
- // POKER STATE MACHINE (V2 — Budget Poker: 3 rounds, 150-point hand budget)
269
- // Each iteration: read state → decide action → execute → sleep → repeat
270
- // Budget strategy: divide remaining budget by remaining rounds + random jitter
271
- // ═════════════════════════════════════════════════════════════════════════════
272
- async function pokerLoop(client, gameId, addr, isPlayer1, wagerWei, startTime, timeoutMs) {
273
- while (true) {
274
- checkTimeout(startTime, timeoutMs);
275
- const game = (await retry(() => client.readContract({ address: addr, abi: pokerGameV2Abi, functionName: "getGame", args: [gameId] }), "poker-getGame"));
276
- if (game.settled) {
277
- event({
278
- event: "game_settled", gameId: Number(gameId), gameType: "poker",
279
- p1Score: Number(game.p1Score), p2Score: Number(game.p2Score),
280
- p1Budget: Number(game.p1Budget), p2Budget: Number(game.p2Budget),
281
- });
282
- return;
283
- }
284
- const phase = Number(game.phase);
285
- const currentRound = Number(game.currentRound);
286
- const totalRounds = Number(game.totalRounds);
287
- const myBudget = isPlayer1 ? Number(game.p1Budget) : Number(game.p2Budget);
288
- const myCommitted = isPlayer1 ? game.p1Committed : game.p2Committed;
289
- const myRevealed = isPlayer1 ? game.p1Revealed : game.p2Revealed;
290
- const isMyTurn = game.currentTurn.toLowerCase() === getAddress().toLowerCase();
291
- if (phase === PHASE_COMMIT && !myCommitted) {
292
- // ACTION: Commit a budget-aware hand value
293
- // Strategy: divide remaining budget by remaining rounds, add random jitter
294
- const roundsLeft = totalRounds - currentRound;
295
- const roundsAfter = roundsLeft - 1;
296
- const avgPerRound = Math.floor(myBudget / roundsLeft);
297
- // Max hand this round: budget - 1 per future round
298
- const maxHand = Math.min(100, myBudget - roundsAfter);
299
- // Min hand: always at least 1
300
- const minHand = 1;
301
- // Random jitter around average (+/- 20%)
302
- const jitter = Math.floor(avgPerRound * 0.4 * (Math.random() - 0.5));
303
- let handValue = Math.max(minHand, Math.min(maxHand, avgPerRound + jitter));
304
- const salt = generateSalt();
305
- const hash = commitHash(handValue, salt);
306
- // Salt key includes round to support multi-round
307
- storeSalt(`poker-${gameId}-r${currentRound}`, { salt, handValue });
308
- const { hash: txHash } = await retry(() => sendTx({
309
- to: addr,
310
- data: encodeFunctionData({ abi: pokerGameV2Abi, functionName: "commitHand", args: [gameId, hash] }),
311
- }), "poker-commit");
312
- event({ event: "committed", gameType: "poker", round: currentRound, handValue, budget: myBudget, maxHand, txHash });
313
- }
314
- else if (phase === PHASE_COMMIT) {
315
- event({ event: "status", phase: "commit", round: currentRound, message: "Waiting for opponent to commit hand..." });
316
- }
317
- else if ((phase === POKER_BETTING1 || phase === POKER_BETTING2) && isMyTurn) {
318
- // ACTION: Take betting action — simple strategy: check or call
319
- const currentBet = BigInt(game.currentBet);
320
- const action = currentBet > 0n ? POKER_CALL : POKER_CHECK;
321
- const actionName = currentBet > 0n ? "call" : "check";
322
- const value = action === POKER_CALL ? currentBet : 0n;
323
- const { hash: txHash } = await retry(() => sendTx({
324
- to: addr,
325
- data: encodeFunctionData({ abi: pokerGameV2Abi, functionName: "takeAction", args: [gameId, action] }),
326
- value,
327
- }), `poker-${actionName}`);
328
- event({ event: "action", gameType: "poker", action: actionName, round: currentRound, bettingRound: phase, txHash });
329
- }
330
- else if (phase === POKER_BETTING1 || phase === POKER_BETTING2) {
331
- event({ event: "status", phase: `betting${phase}`, round: currentRound, message: "Waiting for opponent's turn..." });
332
- }
333
- else if (phase === POKER_SHOWDOWN && !myRevealed) {
334
- // ACTION: Reveal hand
335
- const stored = loadStoredSalt(`poker-${gameId}-r${currentRound}`);
336
- if (!stored) {
337
- fail(`Lost salt for poker round ${currentRound} reveal. Game is unrecoverable.`, "SALT_LOST");
338
- return;
339
- }
340
- const { hash: txHash } = await retry(() => sendTx({
341
- to: addr,
342
- data: encodeFunctionData({ abi: pokerGameV2Abi, functionName: "revealHand", args: [gameId, stored.handValue, stored.salt] }),
343
- }), "poker-reveal");
344
- event({ event: "revealed", gameType: "poker", round: currentRound, handValue: stored.handValue, budgetAfter: myBudget - stored.handValue, txHash });
345
- }
346
- else if (phase === POKER_SHOWDOWN) {
347
- event({ event: "status", phase: "showdown", round: currentRound, message: "Waiting for opponent to reveal..." });
348
- }
349
- else {
350
- event({ event: "status", phase, round: currentRound, message: "Waiting for state change..." });
351
- }
352
- await sleep(POLL_INTERVAL_MS);
353
- }
354
- }
355
- // ═════════════════════════════════════════════════════════════════════════════
356
- // AUCTION STATE MACHINE
357
- // ═════════════════════════════════════════════════════════════════════════════
358
- async function auctionLoop(client, gameId, addr, isPlayer1, wagerWei, startTime, timeoutMs) {
359
- while (true) {
360
- checkTimeout(startTime, timeoutMs);
361
- const game = (await retry(() => client.readContract({ address: addr, abi: auctionGameAbi, functionName: "getGame", args: [gameId] }), "auction-getGame"));
362
- if (game.settled) {
363
- event({ event: "game_settled", gameId: Number(gameId), gameType: "auction" });
364
- return;
365
- }
366
- const phase = Number(game.phase);
367
- const myCommitted = isPlayer1 ? game.p1Committed : game.p2Committed;
368
- const myRevealed = isPlayer1 ? game.p1Revealed : game.p2Revealed;
369
- if (phase === PHASE_COMMIT && !myCommitted) {
370
- // ACTION: Commit a bid (~55-65% of wager)
371
- const bidPercent = 55 + Math.floor(Math.random() * 11);
372
- const bidWei = (wagerWei * BigInt(bidPercent)) / 100n;
373
- const salt = generateSalt();
374
- const hash = commitBidHash(bidWei, salt);
375
- storeSalt(`auction-${gameId}`, { salt, bidWei: bidWei.toString() });
376
- const { hash: txHash } = await retry(() => sendTx({
377
- to: addr,
378
- data: encodeFunctionData({ abi: auctionGameAbi, functionName: "commitBid", args: [gameId, hash] }),
379
- }), "auction-commit");
380
- event({ event: "committed", gameType: "auction", bidMON: formatEther(bidWei), bidPercent, txHash });
381
- }
382
- else if (phase === PHASE_COMMIT) {
383
- event({ event: "status", phase: "commit", message: "Waiting for opponent to commit bid..." });
384
- }
385
- else if (phase === PHASE_REVEAL && !myRevealed) {
386
- // ACTION: Reveal bid
387
- const stored = loadStoredSalt(`auction-${gameId}`);
388
- if (!stored) {
389
- fail("Lost salt for auction reveal. Game is unrecoverable.", "SALT_LOST");
390
- return;
391
- }
392
- // bidWei stored as string, convert back to bigint
393
- const bidWei = BigInt(stored.bidWei);
394
- const { hash: txHash } = await retry(() => sendTx({
395
- to: addr,
396
- data: encodeFunctionData({ abi: auctionGameAbi, functionName: "revealBid", args: [gameId, bidWei, stored.salt] }),
397
- }), "auction-reveal");
398
- event({ event: "revealed", gameType: "auction", bidMON: formatEther(bidWei), txHash });
399
- }
400
- else if (phase === PHASE_REVEAL) {
401
- event({ event: "status", phase: "reveal", message: "Waiting for opponent to reveal bid..." });
402
- }
403
- else {
404
- event({ event: "status", phase, message: "Waiting for state change..." });
405
- }
406
- await sleep(POLL_INTERVAL_MS);
407
- }
408
- }
409
- // ═════════════════════════════════════════════════════════════════════════════
410
- // GAME DISCOVERY
411
- // ═════════════════════════════════════════════════════════════════════════════
412
- const nextGameIdAbi = [
413
- { name: "nextGameId", type: "function", stateMutability: "view", inputs: [], outputs: [{ name: "", type: "uint256" }] },
414
- ];
415
- async function findGame(client, contractAddr, gameType, matchId) {
416
- const abi = gameType === "rps" ? rpsGameAbi : gameType === "poker" ? pokerGameV2Abi : auctionGameAbi;
417
- let nextId;
418
- try {
419
- nextId = (await retry(() => client.readContract({ address: contractAddr, abi: nextGameIdAbi, functionName: "nextGameId" }), "nextGameId"));
420
- }
421
- catch {
422
- return null;
423
- }
424
- // Scan backwards (recent games first, max 50)
425
- const start = Number(nextId) - 1;
426
- const end = Math.max(0, start - 50);
427
- for (let i = start; i >= end; i--) {
428
- try {
429
- const game = (await client.readContract({
430
- address: contractAddr, abi, functionName: "getGame", args: [BigInt(i)],
431
- }));
432
- if (BigInt(game.escrowMatchId) === matchId)
433
- return BigInt(i);
434
- }
435
- catch {
436
- continue;
437
- }
438
- }
439
- return null;
440
- }
441
- async function createGame(client, gameType, matchId, rounds, contractAddr) {
442
- // Read nextGameId before creating — that will be our game's ID
443
- const beforeId = (await retry(() => client.readContract({ address: contractAddr, abi: nextGameIdAbi, functionName: "nextGameId" }), "nextGameId-pre"));
444
- let data;
445
- if (gameType === "rps") {
446
- data = encodeFunctionData({ abi: rpsGameAbi, functionName: "createGame", args: [matchId, BigInt(rounds)] });
447
- }
448
- else if (gameType === "poker") {
449
- data = encodeFunctionData({ abi: pokerGameV2Abi, functionName: "createGame", args: [matchId] });
450
- }
451
- else {
452
- data = encodeFunctionData({ abi: auctionGameAbi, functionName: "createGame", args: [matchId] });
453
- }
454
- await retry(() => sendTx({ to: contractAddr, data }), "createGame");
455
- return beforeId;
456
- }
457
- // ═════════════════════════════════════════════════════════════════════════════
458
- // SALT STORAGE — in-memory primary, disk backup for process restarts
459
- // Keys include wallet address to avoid collisions on shared machines.
460
- // ═════════════════════════════════════════════════════════════════════════════
461
- const memoryStore = {};
462
- function storeSalt(key, value) {
463
- memoryStore[key] = value;
464
- // Persist to disk with wallet-scoped key
465
- if (value.salt) {
466
- const diskKey = `respond-${key}-${getAddress()}`;
467
- saveSalt(diskKey, value.salt, JSON.stringify(value), "respond");
468
- }
469
- }
470
- function loadStoredSalt(key) {
471
- // Memory first
472
- if (memoryStore[key])
473
- return memoryStore[key];
474
- // Disk fallback (process restart recovery)
475
- const diskKey = `respond-${key}-${getAddress()}`;
476
- const entry = loadSalt(diskKey);
477
- if (entry) {
478
- try {
479
- const parsed = JSON.parse(entry.value);
480
- memoryStore[key] = parsed;
481
- return parsed;
482
- }
483
- catch {
484
- return null;
485
- }
486
- }
487
- return null;
488
- }
489
- //# sourceMappingURL=respond.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/commands/respond.ts"],"names":[],"mappings":"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"}