@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
package/dist/CLAUDE.md ADDED
@@ -0,0 +1,7 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ *No recent activity*
7
+ </claude-mem-context>
@@ -0,0 +1,2 @@
1
+ export declare function auctionRoundCommand(gameId: string, bid: string): Promise<void>;
2
+ //# sourceMappingURL=auction-round.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auction-round.d.ts","sourceRoot":"","sources":["../../src/commands/auction-round.ts"],"names":[],"mappings":"AAmDA,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,iBAqIpE"}
@@ -0,0 +1,139 @@
1
+ // arena-tools auction-round — play a full auction round with LLM-chosen bid.
2
+ // Commits bid, waits for opponent, reveals, waits, returns result.
3
+ //
4
+ // Usage: npx arena-tools auction-round <game_id> <bid_in_MON>
5
+ import { encodeFunctionData, parseEther, formatEther } from "viem";
6
+ import { CONTRACTS } from "../config.js";
7
+ import { auctionGameAbi } from "../contracts.js";
8
+ import { getPublicClient, getAddress } from "../client.js";
9
+ import { sendTx } from "../utils/tx.js";
10
+ import { generateSalt, saveSalt, loadSalt, commitBidHash } from "../utils/commit-reveal.js";
11
+ import { ok, fail, event } from "../utils/output.js";
12
+ // ─── Constants ──────────────────────────────────────────────────────────────
13
+ const POLL_INTERVAL_MS = 6_000;
14
+ const MAX_WAIT_MS = 300_000;
15
+ const MAX_RETRIES = 8;
16
+ const RETRY_BASE_MS = 1_500;
17
+ const PHASE_COMMIT = 0;
18
+ const PHASE_REVEAL = 1;
19
+ // ─── Retry wrapper ──────────────────────────────────────────────────────────
20
+ function isTransient(err) {
21
+ const msg = err instanceof Error ? err.message : String(err);
22
+ return msg.includes("429") || msg.includes("Too Many Requests") || msg.includes("ETIMEDOUT") ||
23
+ msg.includes("ECONNRESET") || msg.includes("fetch failed") || msg.includes("socket hang up");
24
+ }
25
+ async function retry(fn, label) {
26
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
27
+ try {
28
+ return await fn();
29
+ }
30
+ catch (err) {
31
+ if (isTransient(err) && attempt < MAX_RETRIES - 1) {
32
+ const backoff = RETRY_BASE_MS * Math.pow(2, attempt) + Math.floor(Math.random() * 2000);
33
+ await new Promise(r => setTimeout(r, backoff));
34
+ continue;
35
+ }
36
+ throw err;
37
+ }
38
+ }
39
+ throw new Error(`Exhausted ${MAX_RETRIES} retries for: ${label}`);
40
+ }
41
+ function sleep(ms) {
42
+ return new Promise(r => setTimeout(r, ms));
43
+ }
44
+ // ─── Main command ─────────────────────────────────────────────────────────
45
+ export async function auctionRoundCommand(gameId, bid) {
46
+ const client = getPublicClient();
47
+ const myAddress = getAddress();
48
+ const gid = BigInt(gameId);
49
+ const addr = CONTRACTS.AuctionGame;
50
+ const bidWei = parseEther(bid);
51
+ // Read game state
52
+ const game = await retry(() => client.readContract({ address: addr, abi: auctionGameAbi, functionName: "getGame", args: [gid] }), "getGame");
53
+ if (game.settled) {
54
+ ok({ gameId: Number(gid), gameComplete: true, message: "Game is already settled." });
55
+ return;
56
+ }
57
+ const isPlayer1 = game.player1.toLowerCase() === myAddress.toLowerCase();
58
+ const phase = Number(game.phase);
59
+ // ── Step 1: Commit ──────────────────────────────────────────────────────
60
+ const myCommitted = isPlayer1 ? game.p1Committed : game.p2Committed;
61
+ if (phase === PHASE_COMMIT && !myCommitted) {
62
+ const salt = generateSalt();
63
+ const hash = commitBidHash(bidWei, salt);
64
+ const saltKey = `auctionround-${gameId}-${myAddress}`;
65
+ saveSalt(saltKey, salt, JSON.stringify({ bidWei: bidWei.toString() }), "auction-round");
66
+ const { hash: txHash } = await retry(() => sendTx({ to: addr, data: encodeFunctionData({ abi: auctionGameAbi, functionName: "commitBid", args: [gid, hash] }) }), "commit");
67
+ event({ event: "committed", bid, txHash });
68
+ }
69
+ else if (phase === PHASE_COMMIT) {
70
+ event({ event: "already_committed" });
71
+ }
72
+ // ── Step 2: Wait for opponent to commit ──────────────────────────────
73
+ const commitStart = Date.now();
74
+ while (true) {
75
+ if (Date.now() - commitStart > MAX_WAIT_MS) {
76
+ fail("Timeout waiting for opponent to commit.", "OPPONENT_TIMEOUT");
77
+ return;
78
+ }
79
+ const g = await retry(() => client.readContract({ address: addr, abi: auctionGameAbi, functionName: "getGame", args: [gid] }), "poll-commit");
80
+ if (g.settled) {
81
+ ok({ gameId: Number(gid), gameComplete: true, message: "Game settled." });
82
+ return;
83
+ }
84
+ if (Number(g.phase) === PHASE_REVEAL)
85
+ break;
86
+ event({ event: "waiting", phase: "commit", message: "Waiting for opponent to commit..." });
87
+ await sleep(POLL_INTERVAL_MS);
88
+ }
89
+ // ── Step 3: Reveal ────────────────────────────────────────────────────
90
+ // Re-read to check if we already revealed
91
+ const game2 = await retry(() => client.readContract({ address: addr, abi: auctionGameAbi, functionName: "getGame", args: [gid] }), "getGame-reveal");
92
+ const myRevealed = isPlayer1 ? game2.p1Revealed : game2.p2Revealed;
93
+ if (!myRevealed) {
94
+ const saltKey = `auctionround-${gameId}-${myAddress}`;
95
+ const entry = loadSalt(saltKey);
96
+ if (!entry) {
97
+ fail("Salt not found for auction reveal.", "SALT_LOST");
98
+ return;
99
+ }
100
+ const storedBid = BigInt(JSON.parse(entry.value).bidWei);
101
+ const { hash: txHash } = await retry(() => sendTx({
102
+ to: addr,
103
+ data: encodeFunctionData({ abi: auctionGameAbi, functionName: "revealBid", args: [gid, storedBid, entry.salt] }),
104
+ }), "reveal");
105
+ event({ event: "revealed", bid: formatEther(storedBid), txHash });
106
+ }
107
+ else {
108
+ event({ event: "already_revealed" });
109
+ }
110
+ // ── Step 4: Wait for opponent to reveal and game to settle ───────────
111
+ const revealStart = Date.now();
112
+ while (true) {
113
+ if (Date.now() - revealStart > MAX_WAIT_MS) {
114
+ fail("Timeout waiting for opponent to reveal.", "OPPONENT_TIMEOUT");
115
+ return;
116
+ }
117
+ const g = await retry(() => client.readContract({ address: addr, abi: auctionGameAbi, functionName: "getGame", args: [gid] }), "poll-reveal");
118
+ if (g.settled) {
119
+ const myBid = isPlayer1 ? g.p1Bid : g.p2Bid;
120
+ const oppBid = isPlayer1 ? g.p2Bid : g.p1Bid;
121
+ const myBidMON = formatEther(myBid);
122
+ const oppBidMON = formatEther(oppBid);
123
+ const result = myBid > oppBid ? "win" : myBid < oppBid ? "loss" : "draw";
124
+ ok({
125
+ gameId: Number(gid),
126
+ yourBid: myBidMON,
127
+ opponentBid: oppBidMON,
128
+ prize: formatEther(g.prize),
129
+ gameComplete: true,
130
+ gameResult: result,
131
+ message: `Auction over! Your bid: ${myBidMON} MON, Opponent: ${oppBidMON} MON. You ${result}!`,
132
+ });
133
+ return;
134
+ }
135
+ event({ event: "waiting", phase: "reveal", message: "Waiting for opponent to reveal..." });
136
+ await sleep(POLL_INTERVAL_MS);
137
+ }
138
+ }
139
+ //# sourceMappingURL=auction-round.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auction-round.js","sourceRoot":"","sources":["../../src/commands/auction-round.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Create a tournament with the given format, entry fee, base wager, and max players */
2
+ export declare function createTournamentCommand(format: string, maxPlayers: string, opts: {
3
+ entryFee: string;
4
+ baseWager: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=create-tournament.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-tournament.d.ts","sourceRoot":"","sources":["../../src/commands/create-tournament.ts"],"names":[],"mappings":"AAaA,wFAAwF;AACxF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,iBA6C9C"}
@@ -0,0 +1,47 @@
1
+ // arena-tools create-tournament — create a new tournament on TournamentV2
2
+ import { encodeFunctionData, parseEther } from "viem";
3
+ import { CONTRACTS } from "../config.js";
4
+ import { tournamentV2Abi } from "../contracts.js";
5
+ import { sendTx } from "../utils/tx.js";
6
+ import { ok, fail } from "../utils/output.js";
7
+ // Map format names to uint8 values
8
+ const FORMAT_MAP = {
9
+ "round-robin": 0,
10
+ "double-elim": 1,
11
+ };
12
+ /** Create a tournament with the given format, entry fee, base wager, and max players */
13
+ export async function createTournamentCommand(format, maxPlayers, opts) {
14
+ // Validate format
15
+ const formatCode = FORMAT_MAP[format.toLowerCase()];
16
+ if (formatCode === undefined) {
17
+ fail(`Invalid format: ${format}. Must be round-robin or double-elim.`, "INVALID_FORMAT");
18
+ return;
19
+ }
20
+ // Validate max players (4 or 8)
21
+ const players = parseInt(maxPlayers, 10);
22
+ if (players !== 4 && players !== 8) {
23
+ fail(`Invalid max_players: ${maxPlayers}. Must be 4 or 8.`, "INVALID_PLAYERS");
24
+ return;
25
+ }
26
+ const entryFeeWei = parseEther(opts.entryFee);
27
+ const baseWagerWei = parseEther(opts.baseWager);
28
+ const data = encodeFunctionData({
29
+ abi: tournamentV2Abi,
30
+ functionName: "createTournament",
31
+ args: [formatCode, entryFeeWei, baseWagerWei, BigInt(players)],
32
+ });
33
+ const { hash } = await sendTx({
34
+ to: CONTRACTS.TournamentV2,
35
+ data,
36
+ });
37
+ ok({
38
+ action: "create-tournament",
39
+ format,
40
+ formatCode,
41
+ maxPlayers: players,
42
+ entryFee: opts.entryFee,
43
+ baseWager: opts.baseWager,
44
+ txHash: hash,
45
+ });
46
+ }
47
+ //# sourceMappingURL=create-tournament.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-tournament.js","sourceRoot":"","sources":["../../src/commands/create-tournament.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE9C,mCAAmC;AACnC,MAAM,UAAU,GAA2B;IACzC,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,CAAC;CACjB,CAAC;AAEF,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,UAAkB,EAClB,IAA6C;IAE7C,kBAAkB;IAClB,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CACF,mBAAmB,MAAM,uCAAuC,EAChE,gBAAgB,CACjB,CAAC;QACF,OAAO;IACT,CAAC;IAED,gCAAgC;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,CACF,wBAAwB,UAAU,mBAAmB,EACrD,iBAAiB,CAClB,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG,EAAE,eAAe;QACpB,YAAY,EAAE,kBAAkB;QAChC,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;KAC/D,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;QAC5B,EAAE,EAAE,SAAS,CAAC,YAA6B;QAC3C,IAAI;KACL,CAAC,CAAC;IAEH,EAAE,CAAC;QACD,MAAM,EAAE,mBAAmB;QAC3B,MAAM;QACN,UAAU;QACV,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +1,5 @@
1
+ /** List all prediction markets with prices and state */
2
+ export declare function listMarketsCommand(): Promise<void>;
1
3
  /** Create a prediction market for a match */
2
4
  export declare function createMarketCommand(matchId: string, seed: string): Promise<void>;
3
5
  /** Buy YES or NO tokens */
@@ -1 +1 @@
1
- {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../src/commands/market.ts"],"names":[],"mappings":"AAOA,6CAA6C;AAC7C,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAqBtE;AAED,2BAA2B;AAC3B,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,iBA6Bf;AAED,kCAAkC;AAClC,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,iBAiB1D;AAED,4BAA4B;AAC5B,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,iBAiBnD"}
1
+ {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../src/commands/market.ts"],"names":[],"mappings":"AAQA,wDAAwD;AACxD,wBAAsB,kBAAkB,kBA6CvC;AAED,6CAA6C;AAC7C,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAqBtE;AAED,2BAA2B;AAC3B,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,iBA6Bf;AAED,kCAAkC;AAClC,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,iBAiB1D;AAED,4BAA4B;AAC5B,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,iBAiBnD"}
@@ -1,9 +1,53 @@
1
- // arena-tools market commands — create-market, bet, resolve-market, redeem
2
- import { encodeFunctionData, parseEther } from "viem";
1
+ // arena-tools market commands — create-market, list-markets, bet, resolve-market, redeem
2
+ import { encodeFunctionData, parseEther, formatEther } from "viem";
3
3
  import { CONTRACTS } from "../config.js";
4
4
  import { predictionMarketAbi } from "../contracts.js";
5
+ import { getPublicClient } from "../client.js";
5
6
  import { sendTx } from "../utils/tx.js";
6
7
  import { ok, fail } from "../utils/output.js";
8
+ /** List all prediction markets with prices and state */
9
+ export async function listMarketsCommand() {
10
+ const client = getPublicClient();
11
+ // Get the next market ID to know how many exist
12
+ const nextId = (await client.readContract({
13
+ address: CONTRACTS.PredictionMarket,
14
+ abi: predictionMarketAbi,
15
+ functionName: "nextMarketId",
16
+ }));
17
+ // Fetch each market's data and prices
18
+ const markets = [];
19
+ for (let i = 1n; i < nextId; i++) {
20
+ const [market, prices] = await Promise.all([
21
+ client.readContract({
22
+ address: CONTRACTS.PredictionMarket,
23
+ abi: predictionMarketAbi,
24
+ functionName: "getMarket",
25
+ args: [i],
26
+ }),
27
+ client.readContract({
28
+ address: CONTRACTS.PredictionMarket,
29
+ abi: predictionMarketAbi,
30
+ functionName: "getPrice",
31
+ args: [i],
32
+ }),
33
+ ]);
34
+ const [yesPrice, noPrice] = prices;
35
+ markets.push({
36
+ id: Number(i),
37
+ matchId: Number(market.matchId),
38
+ player1: market.player1,
39
+ player2: market.player2,
40
+ resolved: market.resolved,
41
+ winner: market.winner,
42
+ reserveYES: formatEther(market.reserveYES),
43
+ reserveNO: formatEther(market.reserveNO),
44
+ seedLiquidity: formatEther(market.seedLiquidity),
45
+ yesPriceRaw: yesPrice.toString(),
46
+ noPriceRaw: noPrice.toString(),
47
+ });
48
+ }
49
+ ok({ count: markets.length, markets });
50
+ }
7
51
  /** Create a prediction market for a match */
8
52
  export async function createMarketCommand(matchId, seed) {
9
53
  const seedWei = parseEther(seed);
@@ -1 +1 @@
1
- {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/commands/market.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/commands/market.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function pendingCommand(address: string): Promise<void>;
2
+ //# sourceMappingURL=pending.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending.d.ts","sourceRoot":"","sources":["../../src/commands/pending.ts"],"names":[],"mappings":"AAiBA,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,iBAoDnD"}
@@ -0,0 +1,52 @@
1
+ // arena-tools pending — list incoming challenges (Created matches where address is player2)
2
+ // Scans all match IDs via getMatch(), filters to Created status with matching player2.
3
+ // Works with any RPC (no eth_getLogs block range limits).
4
+ import { formatEther, getAddress as checksumAddress } from "viem";
5
+ import { getPublicClient } from "../client.js";
6
+ import { CONTRACTS, GAME_CONTRACTS } from "../config.js";
7
+ import { escrowAbi } from "../contracts.js";
8
+ import { ok } from "../utils/output.js";
9
+ // Reverse map: game contract address → game type name
10
+ const GAME_TYPE_MAP = Object.fromEntries(Object.entries(GAME_CONTRACTS).map(([name, addr]) => [
11
+ addr.toLowerCase(),
12
+ name,
13
+ ]));
14
+ export async function pendingCommand(address) {
15
+ const client = getPublicClient();
16
+ const addr = checksumAddress(address);
17
+ // Get total match count
18
+ const nextMatchId = await client.readContract({
19
+ address: CONTRACTS.Escrow,
20
+ abi: escrowAbi,
21
+ functionName: "nextMatchId",
22
+ });
23
+ const total = Number(nextMatchId);
24
+ if (total === 0) {
25
+ ok({ address: addr, challenges: [] });
26
+ }
27
+ // Scan all matches, find Created (status=0) where player2 = addr
28
+ const challenges = [];
29
+ for (let i = 0; i < total; i++) {
30
+ const match = await client.readContract({
31
+ address: CONTRACTS.Escrow,
32
+ abi: escrowAbi,
33
+ functionName: "getMatch",
34
+ args: [BigInt(i)],
35
+ });
36
+ // status 0 = Created, and player2 must match queried address
37
+ if (match.status === 0 &&
38
+ match.player2.toLowerCase() === addr.toLowerCase()) {
39
+ const gc = match.gameContract.toLowerCase();
40
+ challenges.push({
41
+ matchId: i,
42
+ challenger: match.player1,
43
+ wager: formatEther(match.wager),
44
+ gameContract: match.gameContract,
45
+ gameType: GAME_TYPE_MAP[gc] || "unknown",
46
+ createdAt: Number(match.createdAt),
47
+ });
48
+ }
49
+ }
50
+ ok({ address: addr, challenges });
51
+ }
52
+ //# sourceMappingURL=pending.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending.js","sourceRoot":"","sources":["../../src/commands/pending.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,uFAAuF;AACvF,0DAA0D;AAC1D,OAAO,EAAE,WAAW,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,MAAM,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,sDAAsD;AACtD,MAAM,aAAa,GAA2B,MAAM,CAAC,WAAW,CAC9D,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IACnD,IAAI,CAAC,WAAW,EAAE;IAClB,IAAI;CACL,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAwB,CAAC,CAAC;IAEvD,wBAAwB;IACxB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC5C,OAAO,EAAE,SAAS,CAAC,MAAuB;QAC1C,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,aAAa;KAC5B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,iEAAiE;IACjE,MAAM,UAAU,GAOX,EAAE,CAAC;IAER,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;YACtC,OAAO,EAAE,SAAS,CAAC,MAAuB;YAC1C,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,UAAU;YACxB,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAClB,CAAC,CAAC;QAEH,6DAA6D;QAC7D,IACE,KAAK,CAAC,MAAM,KAAK,CAAC;YACjB,KAAK,CAAC,OAAkB,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,EAC9D,CAAC;YACD,MAAM,EAAE,GAAI,KAAK,CAAC,YAAuB,CAAC,WAAW,EAAE,CAAC;YACxD,UAAU,CAAC,IAAI,CAAC;gBACd,OAAO,EAAE,CAAC;gBACV,UAAU,EAAE,KAAK,CAAC,OAAiB;gBACnC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAe,CAAC;gBACzC,YAAY,EAAE,KAAK,CAAC,YAAsB;gBAC1C,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC,IAAI,SAAS;gBACxC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function playCommand(opponent: string, wager: string, gameType: string, opts: {
2
+ rounds?: string;
3
+ timeout?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=play.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../src/commands/play.ts"],"names":[],"mappings":"AAgBA,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,iBAuC5C"}
@@ -0,0 +1,47 @@
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 { getPublicClient, getAddress } from "../client.js";
12
+ import { sendTx } from "../utils/tx.js";
13
+ import { event, fail } from "../utils/output.js";
14
+ import { respondCommand } from "./respond.js";
15
+ export async function playCommand(opponent, wager, gameType, opts) {
16
+ const gt = gameType.toLowerCase();
17
+ if (!(gt in GAME_TYPES)) {
18
+ fail(`Invalid game type: ${gameType}. Must be rps, poker, or auction.`, "INVALID_GAME_TYPE");
19
+ }
20
+ const gameContract = GAME_CONTRACTS[gt];
21
+ const wagerWei = parseEther(wager);
22
+ const myAddress = getAddress();
23
+ // Step 1: Create the challenge
24
+ event({ event: "challenging", opponent, wager, gameType: gt });
25
+ const data = encodeFunctionData({
26
+ abi: escrowAbi,
27
+ functionName: "createMatch",
28
+ args: [checksumAddress(opponent), gameContract],
29
+ });
30
+ const { hash } = await sendTx({
31
+ to: CONTRACTS.Escrow,
32
+ data,
33
+ value: wagerWei,
34
+ });
35
+ // Get the match ID from nextMatchId
36
+ const client = getPublicClient();
37
+ const nextId = (await client.readContract({
38
+ address: CONTRACTS.Escrow,
39
+ abi: escrowAbi,
40
+ functionName: "nextMatchId",
41
+ }));
42
+ const matchId = Number(nextId) - 1;
43
+ event({ event: "challenge_created", matchId, opponent, wager, gameType: gt, txHash: hash });
44
+ // Step 2: Delegate to respond — it handles waiting for acceptance, game creation, and play
45
+ await respondCommand(String(matchId), opts);
46
+ }
47
+ //# sourceMappingURL=play.js.map
@@ -0,0 +1 @@
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,mFAAmF;AACnF,uDAAuD;AAEvD,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,MAAM,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,cAAc,EAAqB,UAAU,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,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,CAC/B,QAAgB,EAChB,KAAa,EACb,QAAgB,EAChB,IAA2C;IAE3C,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAkB,CAAC;IAClD,IAAI,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,sBAAsB,QAAQ,mCAAmC,EAAE,mBAAmB,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAE/B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAE/D,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE,CAAC,eAAe,CAAC,QAAyB,CAAC,EAAE,YAA6B,CAAC;KAClF,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;QAC5B,EAAE,EAAE,SAAS,CAAC,MAAuB;QACrC,IAAI;QACJ,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEH,oCAAoC;IACpC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC;QACxC,OAAO,EAAE,SAAS,CAAC,MAAuB;QAC1C,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,aAAa;KAC5B,CAAC,CAAW,CAAC;IAEd,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,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;AAC9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function pokerStepCommand(gameId: string, decision: string, opts: {
2
+ amount?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=poker-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poker-step.d.ts","sourceRoot":"","sources":["../../src/commands/poker-step.ts"],"names":[],"mappings":"AAqEA,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAwOjG"}