@molteee/arena-tools 0.1.0

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 (94) hide show
  1. package/bin/arena.js +5 -0
  2. package/dist/client.d.ts +52 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +48 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/commands/accept.d.ts +2 -0
  7. package/dist/commands/accept.d.ts.map +1 -0
  8. package/dist/commands/accept.js +41 -0
  9. package/dist/commands/accept.js.map +1 -0
  10. package/dist/commands/auction.d.ts +7 -0
  11. package/dist/commands/auction.d.ts.map +1 -0
  12. package/dist/commands/auction.js +79 -0
  13. package/dist/commands/auction.js.map +1 -0
  14. package/dist/commands/challenge.d.ts +2 -0
  15. package/dist/commands/challenge.d.ts.map +1 -0
  16. package/dist/commands/challenge.js +44 -0
  17. package/dist/commands/challenge.js.map +1 -0
  18. package/dist/commands/claim-timeout.d.ts +2 -0
  19. package/dist/commands/claim-timeout.d.ts.map +1 -0
  20. package/dist/commands/claim-timeout.js +34 -0
  21. package/dist/commands/claim-timeout.js.map +1 -0
  22. package/dist/commands/find-opponents.d.ts +2 -0
  23. package/dist/commands/find-opponents.d.ts.map +1 -0
  24. package/dist/commands/find-opponents.js +50 -0
  25. package/dist/commands/find-opponents.js.map +1 -0
  26. package/dist/commands/get-game.d.ts +2 -0
  27. package/dist/commands/get-game.d.ts.map +1 -0
  28. package/dist/commands/get-game.js +96 -0
  29. package/dist/commands/get-game.js.map +1 -0
  30. package/dist/commands/get-match.d.ts +2 -0
  31. package/dist/commands/get-match.d.ts.map +1 -0
  32. package/dist/commands/get-match.js +37 -0
  33. package/dist/commands/get-match.js.map +1 -0
  34. package/dist/commands/history.d.ts +2 -0
  35. package/dist/commands/history.d.ts.map +1 -0
  36. package/dist/commands/history.js +33 -0
  37. package/dist/commands/history.js.map +1 -0
  38. package/dist/commands/join-tournament.d.ts +2 -0
  39. package/dist/commands/join-tournament.d.ts.map +1 -0
  40. package/dist/commands/join-tournament.js +37 -0
  41. package/dist/commands/join-tournament.js.map +1 -0
  42. package/dist/commands/market-status.d.ts +2 -0
  43. package/dist/commands/market-status.d.ts.map +1 -0
  44. package/dist/commands/market-status.js +39 -0
  45. package/dist/commands/market-status.js.map +1 -0
  46. package/dist/commands/market.d.ts +9 -0
  47. package/dist/commands/market.d.ts.map +1 -0
  48. package/dist/commands/market.js +87 -0
  49. package/dist/commands/market.js.map +1 -0
  50. package/dist/commands/poker.d.ts +9 -0
  51. package/dist/commands/poker.d.ts.map +1 -0
  52. package/dist/commands/poker.js +120 -0
  53. package/dist/commands/poker.js.map +1 -0
  54. package/dist/commands/register.d.ts +5 -0
  55. package/dist/commands/register.d.ts.map +1 -0
  56. package/dist/commands/register.js +39 -0
  57. package/dist/commands/register.js.map +1 -0
  58. package/dist/commands/rps.d.ts +7 -0
  59. package/dist/commands/rps.d.ts.map +1 -0
  60. package/dist/commands/rps.js +135 -0
  61. package/dist/commands/rps.js.map +1 -0
  62. package/dist/commands/status.d.ts +2 -0
  63. package/dist/commands/status.d.ts.map +1 -0
  64. package/dist/commands/status.js +58 -0
  65. package/dist/commands/status.js.map +1 -0
  66. package/dist/commands/tournaments.d.ts +3 -0
  67. package/dist/commands/tournaments.d.ts.map +1 -0
  68. package/dist/commands/tournaments.js +77 -0
  69. package/dist/commands/tournaments.js.map +1 -0
  70. package/dist/config.d.ts +23 -0
  71. package/dist/config.d.ts.map +1 -0
  72. package/dist/config.js +50 -0
  73. package/dist/config.js.map +1 -0
  74. package/dist/contracts.d.ts +764 -0
  75. package/dist/contracts.d.ts.map +1 -0
  76. package/dist/contracts.js +518 -0
  77. package/dist/contracts.js.map +1 -0
  78. package/dist/index.d.ts +3 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +245 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/utils/commit-reveal.d.ts +22 -0
  83. package/dist/utils/commit-reveal.d.ts.map +1 -0
  84. package/dist/utils/commit-reveal.js +56 -0
  85. package/dist/utils/commit-reveal.js.map +1 -0
  86. package/dist/utils/output.d.ts +9 -0
  87. package/dist/utils/output.d.ts.map +1 -0
  88. package/dist/utils/output.js +30 -0
  89. package/dist/utils/output.js.map +1 -0
  90. package/dist/utils/tx.d.ts +14 -0
  91. package/dist/utils/tx.d.ts.map +1 -0
  92. package/dist/utils/tx.js +35 -0
  93. package/dist/utils/tx.js.map +1 -0
  94. package/package.json +34 -0
@@ -0,0 +1,33 @@
1
+ // arena-tools history — match history for an address
2
+ import { formatEther, getAddress as checksumAddress } from "viem";
3
+ import { getPublicClient } from "../client.js";
4
+ import { CONTRACTS } from "../config.js";
5
+ import { agentRegistryAbi } from "../contracts.js";
6
+ import { ok } from "../utils/output.js";
7
+ export async function historyCommand(address) {
8
+ const client = getPublicClient();
9
+ // Normalize to checksummed address
10
+ const addr = checksumAddress(address);
11
+ const matches = (await client.readContract({
12
+ address: CONTRACTS.AgentRegistry,
13
+ abi: agentRegistryAbi,
14
+ functionName: "getMatchHistory",
15
+ args: [addr],
16
+ }));
17
+ const gameTypeNames = ["rps", "poker", "auction"];
18
+ ok({
19
+ address: addr,
20
+ totalMatches: matches.length,
21
+ wins: matches.filter((m) => m.won).length,
22
+ losses: matches.filter((m) => !m.won).length,
23
+ matches: matches.map((m) => ({
24
+ opponent: m.opponent,
25
+ gameType: gameTypeNames[m.gameType] || `unknown(${m.gameType})`,
26
+ won: m.won,
27
+ wager: formatEther(m.wager),
28
+ timestamp: Number(m.timestamp),
29
+ date: new Date(Number(m.timestamp) * 1000).toISOString(),
30
+ })),
31
+ });
32
+ }
33
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,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,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,mCAAmC;IACnC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAwB,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC;QACzC,OAAO,EAAE,SAAS,CAAC,aAA8B;QACjD,GAAG,EAAE,gBAAgB;QACrB,YAAY,EAAE,iBAAiB;QAC/B,IAAI,EAAE,CAAC,IAAI,CAAC;KACb,CAAC,CAMC,CAAC;IAEJ,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC;IAE3D,EAAE,CAAC;QACD,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM;QACzC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM;QAC5C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,QAAQ,GAAG;YAC/D,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9B,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;SACzD,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function joinTournamentCommand(tournamentId: string): Promise<void>;
2
+ //# sourceMappingURL=join-tournament.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-tournament.d.ts","sourceRoot":"","sources":["../../src/commands/join-tournament.ts"],"names":[],"mappings":"AAQA,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,iBAgC/D"}
@@ -0,0 +1,37 @@
1
+ // arena-tools join-tournament — register for a tournament
2
+ import { encodeFunctionData } from "viem";
3
+ import { CONTRACTS } from "../config.js";
4
+ import { tournamentV2Abi } from "../contracts.js";
5
+ import { getPublicClient, getAddress } from "../client.js";
6
+ import { sendTx } from "../utils/tx.js";
7
+ import { ok } from "../utils/output.js";
8
+ export async function joinTournamentCommand(tournamentId) {
9
+ const client = getPublicClient();
10
+ const id = BigInt(tournamentId);
11
+ const address = getAddress();
12
+ // Get tournament to know entry fee
13
+ const tournament = await client.readContract({
14
+ address: CONTRACTS.TournamentV2,
15
+ abi: tournamentV2Abi,
16
+ functionName: "getTournament",
17
+ args: [id],
18
+ });
19
+ const data = encodeFunctionData({
20
+ abi: tournamentV2Abi,
21
+ functionName: "register",
22
+ args: [id],
23
+ });
24
+ const { hash } = await sendTx({
25
+ to: CONTRACTS.TournamentV2,
26
+ data,
27
+ value: tournament.entryFee,
28
+ });
29
+ ok({
30
+ action: "join-tournament",
31
+ tournamentId: Number(id),
32
+ address,
33
+ entryFee: tournament.entryFee.toString(),
34
+ txHash: hash,
35
+ });
36
+ }
37
+ //# sourceMappingURL=join-tournament.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-tournament.js","sourceRoot":"","sources":["../../src/commands/join-tournament.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,YAAoB;IAC9D,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,mCAAmC;IACnC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC3C,OAAO,EAAE,SAAS,CAAC,YAA6B;QAChD,GAAG,EAAE,eAAe;QACpB,YAAY,EAAE,eAAe;QAC7B,IAAI,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG,EAAE,eAAe;QACpB,YAAY,EAAE,UAAU;QACxB,IAAI,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;QAC5B,EAAE,EAAE,SAAS,CAAC,YAA6B;QAC3C,IAAI;QACJ,KAAK,EAAE,UAAU,CAAC,QAAkB;KACrC,CAAC,CAAC;IAEH,EAAE,CAAC;QACD,MAAM,EAAE,iBAAiB;QACzB,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO;QACP,QAAQ,EAAG,UAAU,CAAC,QAAmB,CAAC,QAAQ,EAAE;QACpD,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function marketStatusCommand(marketId: string): Promise<void>;
2
+ //# sourceMappingURL=market-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market-status.d.ts","sourceRoot":"","sources":["../../src/commands/market-status.ts"],"names":[],"mappings":"AAOA,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,iBAiCzD"}
@@ -0,0 +1,39 @@
1
+ // arena-tools market-status — prediction market prices and state
2
+ import { formatEther } from "viem";
3
+ import { getPublicClient } from "../client.js";
4
+ import { CONTRACTS } from "../config.js";
5
+ import { predictionMarketAbi } from "../contracts.js";
6
+ import { ok } from "../utils/output.js";
7
+ export async function marketStatusCommand(marketId) {
8
+ const client = getPublicClient();
9
+ const id = BigInt(marketId);
10
+ const [market, prices] = await Promise.all([
11
+ client.readContract({
12
+ address: CONTRACTS.PredictionMarket,
13
+ abi: predictionMarketAbi,
14
+ functionName: "getMarket",
15
+ args: [id],
16
+ }),
17
+ client.readContract({
18
+ address: CONTRACTS.PredictionMarket,
19
+ abi: predictionMarketAbi,
20
+ functionName: "getPrice",
21
+ args: [id],
22
+ }),
23
+ ]);
24
+ ok({
25
+ marketId: Number(id),
26
+ matchId: Number(market.matchId),
27
+ player1: market.player1,
28
+ player2: market.player2,
29
+ resolved: market.resolved,
30
+ winner: market.winner,
31
+ reserveYES: formatEther(market.reserveYES),
32
+ reserveNO: formatEther(market.reserveNO),
33
+ seedLiquidity: formatEther(market.seedLiquidity),
34
+ // Prices are in 1e18 basis (1.0 = 100%)
35
+ yesPriceRaw: prices[0].toString(),
36
+ noPriceRaw: prices[1].toString(),
37
+ });
38
+ }
39
+ //# sourceMappingURL=market-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market-status.js","sourceRoot":"","sources":["../../src/commands/market-status.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,MAAM,CAAC,YAAY,CAAC;YAClB,OAAO,EAAE,SAAS,CAAC,gBAAiC;YACpD,GAAG,EAAE,mBAAmB;YACxB,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,EAAE,CAAC;SACX,CAAC;QACF,MAAM,CAAC,YAAY,CAAC;YAClB,OAAO,EAAE,SAAS,CAAC,gBAAiC;YACpD,GAAG,EAAE,mBAAmB;YACxB,YAAY,EAAE,UAAU;YACxB,IAAI,EAAE,CAAC,EAAE,CAAC;SACX,CAAC;KACH,CAAC,CAAC;IAEH,EAAE,CAAC;QACD,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,UAAoB,CAAC;QACpD,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,SAAmB,CAAC;QAClD,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,aAAuB,CAAC;QAC1D,wCAAwC;QACxC,WAAW,EAAG,MAAoC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAChE,UAAU,EAAG,MAAoC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KAChE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** Create a prediction market for a match */
2
+ export declare function createMarketCommand(matchId: string, seed: string): Promise<void>;
3
+ /** Buy YES or NO tokens */
4
+ export declare function betCommand(marketId: string, side: string, amount: string): Promise<void>;
5
+ /** Resolve a prediction market */
6
+ export declare function resolveMarketCommand(marketId: string): Promise<void>;
7
+ /** Redeem winning tokens */
8
+ export declare function redeemCommand(marketId: string): Promise<void>;
9
+ //# sourceMappingURL=market.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,87 @@
1
+ // arena-tools market commands — create-market, bet, resolve-market, redeem
2
+ import { encodeFunctionData, parseEther } from "viem";
3
+ import { CONTRACTS } from "../config.js";
4
+ import { predictionMarketAbi } from "../contracts.js";
5
+ import { sendTx } from "../utils/tx.js";
6
+ import { ok, fail } from "../utils/output.js";
7
+ /** Create a prediction market for a match */
8
+ export async function createMarketCommand(matchId, seed) {
9
+ const seedWei = parseEther(seed);
10
+ const data = encodeFunctionData({
11
+ abi: predictionMarketAbi,
12
+ functionName: "createMarket",
13
+ args: [BigInt(matchId)],
14
+ });
15
+ const { hash } = await sendTx({
16
+ to: CONTRACTS.PredictionMarket,
17
+ data,
18
+ value: seedWei,
19
+ });
20
+ ok({
21
+ action: "create-market",
22
+ matchId: parseInt(matchId),
23
+ seed,
24
+ txHash: hash,
25
+ });
26
+ }
27
+ /** Buy YES or NO tokens */
28
+ export async function betCommand(marketId, side, amount) {
29
+ const sideLower = side.toLowerCase();
30
+ if (sideLower !== "yes" && sideLower !== "no") {
31
+ fail(`Invalid side: ${side}. Must be yes or no.`, "INVALID_SIDE");
32
+ }
33
+ const amountWei = parseEther(amount);
34
+ const functionName = sideLower === "yes" ? "buyYES" : "buyNO";
35
+ const data = encodeFunctionData({
36
+ abi: predictionMarketAbi,
37
+ functionName,
38
+ args: [BigInt(marketId)],
39
+ });
40
+ const { hash } = await sendTx({
41
+ to: CONTRACTS.PredictionMarket,
42
+ data,
43
+ value: amountWei,
44
+ });
45
+ ok({
46
+ action: "bet",
47
+ marketId: parseInt(marketId),
48
+ side: sideLower,
49
+ amount,
50
+ txHash: hash,
51
+ });
52
+ }
53
+ /** Resolve a prediction market */
54
+ export async function resolveMarketCommand(marketId) {
55
+ const data = encodeFunctionData({
56
+ abi: predictionMarketAbi,
57
+ functionName: "resolve",
58
+ args: [BigInt(marketId)],
59
+ });
60
+ const { hash } = await sendTx({
61
+ to: CONTRACTS.PredictionMarket,
62
+ data,
63
+ });
64
+ ok({
65
+ action: "resolve-market",
66
+ marketId: parseInt(marketId),
67
+ txHash: hash,
68
+ });
69
+ }
70
+ /** Redeem winning tokens */
71
+ export async function redeemCommand(marketId) {
72
+ const data = encodeFunctionData({
73
+ abi: predictionMarketAbi,
74
+ functionName: "redeem",
75
+ args: [BigInt(marketId)],
76
+ });
77
+ const { hash } = await sendTx({
78
+ to: CONTRACTS.PredictionMarket,
79
+ data,
80
+ });
81
+ ok({
82
+ action: "redeem",
83
+ marketId: parseInt(marketId),
84
+ txHash: hash,
85
+ });
86
+ }
87
+ //# sourceMappingURL=market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/commands/market.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Create a new Poker game for a match */
2
+ export declare function pokerCreateCommand(matchId: string): Promise<void>;
3
+ /** Commit a hand value (1-100) */
4
+ export declare function pokerCommitCommand(gameId: string, handValue: string): Promise<void>;
5
+ /** Take a betting action (check, bet, raise, call, fold) */
6
+ export declare function pokerActionCommand(gameId: string, action: string, amount?: string): Promise<void>;
7
+ /** Reveal the committed hand value */
8
+ export declare function pokerRevealCommand(gameId: string): Promise<void>;
9
+ //# sourceMappingURL=poker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poker.d.ts","sourceRoot":"","sources":["../../src/commands/poker.ts"],"names":[],"mappings":"AAsBA,0CAA0C;AAC1C,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,iBAiBvD;AAED,kCAAkC;AAClC,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBA+BzE;AAED,4DAA4D;AAC5D,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,iBAoChB;AAED,sCAAsC;AACtC,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,iBA8BtD"}
@@ -0,0 +1,120 @@
1
+ // arena-tools poker-* — step-by-step Poker game commands
2
+ // poker-create: Create a new Poker game
3
+ // poker-commit: Commit a hand value (1-100)
4
+ // poker-action: Take a betting action (check, bet, raise, call, fold)
5
+ // poker-reveal: Reveal the committed hand
6
+ import { encodeFunctionData, parseEther } from "viem";
7
+ import { CONTRACTS } from "../config.js";
8
+ import { pokerGameAbi } from "../contracts.js";
9
+ import { getAddress } from "../client.js";
10
+ import { sendTx } from "../utils/tx.js";
11
+ import { generateSalt, saveSalt, loadSalt, commitHash } from "../utils/commit-reveal.js";
12
+ import { ok, fail } from "../utils/output.js";
13
+ const ACTION_MAP = {
14
+ none: 0,
15
+ check: 1,
16
+ bet: 2,
17
+ raise: 3,
18
+ call: 4,
19
+ fold: 5,
20
+ };
21
+ /** Create a new Poker game for a match */
22
+ export async function pokerCreateCommand(matchId) {
23
+ const data = encodeFunctionData({
24
+ abi: pokerGameAbi,
25
+ functionName: "createGame",
26
+ args: [BigInt(matchId)],
27
+ });
28
+ const { hash } = await sendTx({
29
+ to: CONTRACTS.PokerGame,
30
+ data,
31
+ });
32
+ ok({
33
+ action: "poker-create",
34
+ matchId: parseInt(matchId),
35
+ txHash: hash,
36
+ });
37
+ }
38
+ /** Commit a hand value (1-100) */
39
+ export async function pokerCommitCommand(gameId, handValue) {
40
+ const value = parseInt(handValue);
41
+ if (value < 1 || value > 100) {
42
+ fail("Hand value must be between 1 and 100.", "INVALID_HAND_VALUE");
43
+ }
44
+ const salt = generateSalt();
45
+ const hash = commitHash(value, salt);
46
+ // Include wallet address in key to avoid collision between players
47
+ const myAddress = getAddress();
48
+ saveSalt(`poker-${gameId}-${myAddress}`, salt, handValue, "poker");
49
+ const data = encodeFunctionData({
50
+ abi: pokerGameAbi,
51
+ functionName: "commitHand",
52
+ args: [BigInt(gameId), hash],
53
+ });
54
+ const { hash: txHash } = await sendTx({
55
+ to: CONTRACTS.PokerGame,
56
+ data,
57
+ });
58
+ ok({
59
+ action: "poker-commit",
60
+ gameId: parseInt(gameId),
61
+ handValue: value,
62
+ commitHash: hash,
63
+ txHash,
64
+ });
65
+ }
66
+ /** Take a betting action (check, bet, raise, call, fold) */
67
+ export async function pokerActionCommand(gameId, action, amount) {
68
+ const actionLower = action.toLowerCase();
69
+ const actionNum = ACTION_MAP[actionLower];
70
+ if (actionNum === undefined) {
71
+ fail(`Invalid action: ${action}. Must be check, bet, raise, call, or fold.`, "INVALID_ACTION");
72
+ }
73
+ const data = encodeFunctionData({
74
+ abi: pokerGameAbi,
75
+ functionName: "takeAction",
76
+ args: [BigInt(gameId), actionNum],
77
+ });
78
+ // Bet and raise require sending MON as msg.value
79
+ const value = (actionLower === "bet" || actionLower === "raise") && amount
80
+ ? parseEther(amount)
81
+ : 0n;
82
+ const { hash: txHash } = await sendTx({
83
+ to: CONTRACTS.PokerGame,
84
+ data,
85
+ value,
86
+ });
87
+ ok({
88
+ action: "poker-action",
89
+ gameId: parseInt(gameId),
90
+ actionType: actionLower,
91
+ amount: amount || "0",
92
+ txHash,
93
+ });
94
+ }
95
+ /** Reveal the committed hand value */
96
+ export async function pokerRevealCommand(gameId) {
97
+ const myAddress = getAddress();
98
+ const saved = loadSalt(`poker-${gameId}-${myAddress}`);
99
+ if (!saved) {
100
+ fail(`No saved salt for poker game ${gameId}. Did you commit first?`, "NO_SALT");
101
+ return;
102
+ }
103
+ const handValue = parseInt(saved.value);
104
+ const data = encodeFunctionData({
105
+ abi: pokerGameAbi,
106
+ functionName: "revealHand",
107
+ args: [BigInt(gameId), handValue, saved.salt],
108
+ });
109
+ const { hash: txHash } = await sendTx({
110
+ to: CONTRACTS.PokerGame,
111
+ data,
112
+ });
113
+ ok({
114
+ action: "poker-reveal",
115
+ gameId: parseInt(gameId),
116
+ handValue,
117
+ txHash,
118
+ });
119
+ }
120
+ //# sourceMappingURL=poker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poker.js","sourceRoot":"","sources":["../../src/commands/poker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function registerCommand(gameTypes: string, opts: {
2
+ minWager?: string;
3
+ maxWager?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAQA,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,iBAmC/C"}
@@ -0,0 +1,39 @@
1
+ // arena-tools register — register on AgentRegistry for game types
2
+ import { encodeFunctionData, parseEther } from "viem";
3
+ import { CONTRACTS, GAME_TYPES } from "../config.js";
4
+ import { agentRegistryAbi } from "../contracts.js";
5
+ import { getAddress } from "../client.js";
6
+ import { sendTx } from "../utils/tx.js";
7
+ import { ok, fail } from "../utils/output.js";
8
+ export async function registerCommand(gameTypes, opts) {
9
+ // Parse game types: "rps,poker,auction" → [0, 1, 2]
10
+ const types = gameTypes.split(",").map((t) => {
11
+ const gt = t.trim().toLowerCase();
12
+ if (!(gt in GAME_TYPES)) {
13
+ fail(`Invalid game type: ${t}. Must be rps, poker, or auction.`, "INVALID_GAME_TYPE");
14
+ }
15
+ return GAME_TYPES[gt];
16
+ });
17
+ const minWager = parseEther(opts.minWager || "0.001");
18
+ const maxWager = parseEther(opts.maxWager || "1.0");
19
+ const address = getAddress();
20
+ const data = encodeFunctionData({
21
+ abi: agentRegistryAbi,
22
+ functionName: "register",
23
+ args: [types, minWager, maxWager],
24
+ });
25
+ const { hash, gasUsed } = await sendTx({
26
+ to: CONTRACTS.AgentRegistry,
27
+ data,
28
+ });
29
+ ok({
30
+ action: "register",
31
+ address,
32
+ gameTypes: gameTypes.split(",").map((t) => t.trim().toLowerCase()),
33
+ minWager: opts.minWager || "0.001",
34
+ maxWager: opts.maxWager || "1.0",
35
+ txHash: hash,
36
+ gasUsed: gasUsed.toString(),
37
+ });
38
+ }
39
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAqB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,IAA8C;IAE9C,oDAAoD;IACpD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAkB,CAAC;QAClD,IAAI,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,sBAAsB,CAAC,mCAAmC,EAAE,mBAAmB,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG,EAAE,gBAAgB;QACrB,YAAY,EAAE,UAAU;QACxB,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;KAClC,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;QACrC,EAAE,EAAE,SAAS,CAAC,aAA8B;QAC5C,IAAI;KACL,CAAC,CAAC;IAEH,EAAE,CAAC;QACD,MAAM,EAAE,UAAU;QAClB,OAAO;QACP,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO;QAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;QAChC,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;KAC5B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Create a new RPS game for a match */
2
+ export declare function rpsCreateCommand(matchId: string, rounds?: string): Promise<void>;
3
+ /** Commit a move (salt is generated and stored automatically) */
4
+ export declare function rpsCommitCommand(gameId: string, move: string): Promise<void>;
5
+ /** Reveal the committed move (loads the saved salt automatically) */
6
+ export declare function rpsRevealCommand(gameId: string): Promise<void>;
7
+ //# sourceMappingURL=rps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rps.d.ts","sourceRoot":"","sources":["../../src/commands/rps.ts"],"names":[],"mappings":"AAkBA,wCAAwC;AACxC,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAY,iBA8D3E;AAED,iEAAiE;AACjE,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAkClE;AAED,qEAAqE;AACrE,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,iBA8BpD"}
@@ -0,0 +1,135 @@
1
+ // arena-tools rps-* — step-by-step RPS game commands
2
+ // rps-create: Create a new RPS game for a match
3
+ // rps-commit: Commit a move (rock/paper/scissors)
4
+ // rps-reveal: Reveal the committed move
5
+ import { encodeFunctionData } from "viem";
6
+ import { CONTRACTS } from "../config.js";
7
+ import { rpsGameAbi } from "../contracts.js";
8
+ import { getPublicClient, getAddress } from "../client.js";
9
+ import { sendTx } from "../utils/tx.js";
10
+ import { generateSalt, saveSalt, loadSalt, commitHash } from "../utils/commit-reveal.js";
11
+ import { ok, fail } from "../utils/output.js";
12
+ const MOVE_MAP = {
13
+ rock: 1,
14
+ paper: 2,
15
+ scissors: 3,
16
+ };
17
+ /** Create a new RPS game for a match */
18
+ export async function rpsCreateCommand(matchId, rounds = "1") {
19
+ const roundsNum = parseInt(rounds);
20
+ if (roundsNum <= 0 || roundsNum % 2 === 0) {
21
+ fail("Rounds must be a positive odd number (1, 3, 5, ...)", "INVALID_ROUNDS");
22
+ }
23
+ const data = encodeFunctionData({
24
+ abi: rpsGameAbi,
25
+ functionName: "createGame",
26
+ args: [BigInt(matchId), BigInt(roundsNum)],
27
+ });
28
+ const { hash } = await sendTx({
29
+ to: CONTRACTS.RPSGame,
30
+ data,
31
+ });
32
+ // Find the game ID by scanning backwards from the most recent game.
33
+ // The newly created game should be the latest one with this matchId.
34
+ const client = getPublicClient();
35
+ let gameId = -1;
36
+ // Find the upper bound by binary-ish search (probe until we get a revert)
37
+ let upper = 0;
38
+ for (let probe = 100;; probe += 100) {
39
+ try {
40
+ await client.readContract({
41
+ address: CONTRACTS.RPSGame,
42
+ abi: rpsGameAbi,
43
+ functionName: "getGame",
44
+ args: [BigInt(probe)],
45
+ });
46
+ upper = probe;
47
+ }
48
+ catch {
49
+ upper = probe;
50
+ break;
51
+ }
52
+ }
53
+ // Scan backwards from upper to find the latest game for this match
54
+ for (let i = upper; i >= 0; i--) {
55
+ try {
56
+ const game = await client.readContract({
57
+ address: CONTRACTS.RPSGame,
58
+ abi: rpsGameAbi,
59
+ functionName: "getGame",
60
+ args: [BigInt(i)],
61
+ });
62
+ if (Number(game.escrowMatchId) === parseInt(matchId)) {
63
+ gameId = i;
64
+ break;
65
+ }
66
+ }
67
+ catch {
68
+ continue;
69
+ }
70
+ }
71
+ ok({
72
+ action: "rps-create",
73
+ matchId: parseInt(matchId),
74
+ gameId,
75
+ rounds: roundsNum,
76
+ txHash: hash,
77
+ });
78
+ }
79
+ /** Commit a move (salt is generated and stored automatically) */
80
+ export async function rpsCommitCommand(gameId, move) {
81
+ const moveLower = move.toLowerCase();
82
+ const moveNum = MOVE_MAP[moveLower];
83
+ if (!moveNum) {
84
+ fail(`Invalid move: ${move}. Must be rock, paper, or scissors.`, "INVALID_MOVE");
85
+ }
86
+ // Generate salt and compute commit hash
87
+ const salt = generateSalt();
88
+ const hash = commitHash(moveNum, salt);
89
+ // Save salt for later reveal (include wallet address to avoid collision)
90
+ const myAddress = getAddress();
91
+ saveSalt(`rps-${gameId}-${myAddress}`, salt, moveLower, "rps");
92
+ const data = encodeFunctionData({
93
+ abi: rpsGameAbi,
94
+ functionName: "commit",
95
+ args: [BigInt(gameId), hash],
96
+ });
97
+ const { hash: txHash } = await sendTx({
98
+ to: CONTRACTS.RPSGame,
99
+ data,
100
+ });
101
+ ok({
102
+ action: "rps-commit",
103
+ gameId: parseInt(gameId),
104
+ move: moveLower,
105
+ commitHash: hash,
106
+ txHash,
107
+ note: "Salt saved locally. Run rps-reveal when opponent has committed.",
108
+ });
109
+ }
110
+ /** Reveal the committed move (loads the saved salt automatically) */
111
+ export async function rpsRevealCommand(gameId) {
112
+ const myAddress = getAddress();
113
+ const saved = loadSalt(`rps-${gameId}-${myAddress}`);
114
+ if (!saved) {
115
+ fail(`No saved salt for game ${gameId}. Did you commit with rps-commit first?`, "NO_SALT");
116
+ return; // TypeScript needs this even though fail() is never
117
+ }
118
+ const moveNum = MOVE_MAP[saved.value];
119
+ const data = encodeFunctionData({
120
+ abi: rpsGameAbi,
121
+ functionName: "reveal",
122
+ args: [BigInt(gameId), moveNum, saved.salt],
123
+ });
124
+ const { hash: txHash } = await sendTx({
125
+ to: CONTRACTS.RPSGame,
126
+ data,
127
+ });
128
+ ok({
129
+ action: "rps-reveal",
130
+ gameId: parseInt(gameId),
131
+ move: saved.value,
132
+ txHash,
133
+ });
134
+ }
135
+ //# sourceMappingURL=rps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rps.js","sourceRoot":"","sources":["../../src/commands/rps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(address: string): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,iBAuDlD"}