@molteee/arena-tools 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CLAUDE.md +7 -0
- package/dist/commands/auction-round.d.ts +2 -0
- package/dist/commands/auction-round.d.ts.map +1 -0
- package/dist/commands/auction-round.js +139 -0
- package/dist/commands/auction-round.js.map +1 -0
- package/dist/commands/create-tournament.d.ts +6 -0
- package/dist/commands/create-tournament.d.ts.map +1 -0
- package/dist/commands/create-tournament.js +47 -0
- package/dist/commands/create-tournament.js.map +1 -0
- package/dist/commands/market.d.ts +2 -0
- package/dist/commands/market.d.ts.map +1 -1
- package/dist/commands/market.js +46 -2
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/pending.d.ts +2 -0
- package/dist/commands/pending.d.ts.map +1 -0
- package/dist/commands/pending.js +52 -0
- package/dist/commands/pending.js.map +1 -0
- package/dist/commands/play.d.ts +5 -0
- package/dist/commands/play.d.ts.map +1 -0
- package/dist/commands/play.js +47 -0
- package/dist/commands/play.js.map +1 -0
- package/dist/commands/poker-step.d.ts +4 -0
- package/dist/commands/poker-step.d.ts.map +1 -0
- package/dist/commands/poker-step.js +243 -0
- package/dist/commands/poker-step.js.map +1 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +3 -2
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/respond.d.ts +5 -0
- package/dist/commands/respond.d.ts.map +1 -0
- package/dist/commands/respond.js +464 -0
- package/dist/commands/respond.js.map +1 -0
- package/dist/commands/rps-round.d.ts +2 -0
- package/dist/commands/rps-round.d.ts.map +1 -0
- package/dist/commands/rps-round.js +208 -0
- package/dist/commands/rps-round.js.map +1 -0
- package/dist/contracts.d.ts +72 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +30 -0
- package/dist/contracts.js.map +1 -1
- package/dist/index.js +79 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/CLAUDE.md
ADDED
|
@@ -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":"
|
|
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"}
|
package/dist/commands/market.js
CHANGED
|
@@ -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":"AAAA,
|
|
1
|
+
{"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/commands/market.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|