@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.
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +10 -4
- package/dist/client.js.map +1 -1
- package/dist/commands/accept.d.ts.map +1 -0
- package/dist/commands/auction-round.d.ts.map +1 -0
- package/dist/commands/auction.d.ts.map +1 -0
- package/dist/commands/challenge.d.ts.map +1 -0
- package/dist/commands/claim-timeout.d.ts.map +1 -0
- package/dist/commands/claim-timeout.js +1 -1
- package/dist/commands/claim-timeout.js.map +1 -1
- package/dist/commands/create-tournament.d.ts.map +1 -0
- package/dist/commands/find-game.d.ts.map +1 -0
- package/dist/commands/find-opponents.d.ts.map +1 -0
- package/dist/commands/get-game.d.ts.map +1 -0
- package/dist/commands/get-game.js +1 -1
- package/dist/commands/get-game.js.map +1 -1
- package/dist/commands/get-match.d.ts.map +1 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/join-tournament.d.ts.map +1 -0
- package/dist/commands/market-status.d.ts.map +1 -0
- package/dist/commands/market.d.ts.map +1 -0
- package/dist/commands/pending.d.ts.map +1 -0
- package/dist/commands/play.d.ts.map +1 -0
- package/dist/commands/poker-step.d.ts.map +1 -0
- package/dist/commands/poker-step.js +1 -1
- package/dist/commands/poker-step.js.map +1 -1
- package/dist/commands/poker.d.ts.map +1 -0
- package/dist/commands/poker.js +6 -6
- package/dist/commands/poker.js.map +1 -1
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/respond.d.ts.map +1 -0
- package/dist/commands/rps-round.d.ts.map +1 -0
- package/dist/commands/rps.d.ts.map +1 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/tournaments.d.ts.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +8 -8
- package/dist/config.js.map +1 -1
- package/dist/contracts.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/utils/commit-reveal.d.ts.map +1 -0
- package/dist/utils/output.d.ts +2 -1
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +3 -2
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/tx.d.ts +3 -1
- package/dist/utils/tx.d.ts.map +1 -0
- package/dist/utils/tx.js +68 -24
- package/dist/utils/tx.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/play.d.ts +0 -1
- package/dist/commands/play.js +0 -46
- package/dist/commands/play.js.map +0 -1
- package/dist/commands/respond.d.ts +0 -1
- package/dist/commands/respond.js +0 -489
- package/dist/commands/respond.js.map +0 -1
package/package.json
CHANGED
package/dist/commands/play.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function playCommand(opponent: string, wager: string, gameType: string, opts: any): Promise<void>;
|
package/dist/commands/play.js
DELETED
|
@@ -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>;
|
package/dist/commands/respond.js
DELETED
|
@@ -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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"}
|