@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
package/bin/arena.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Entry point for the arena-tools CLI.
4
+ // Delegates to the compiled TypeScript in dist/.
5
+ import "../dist/index.js";
@@ -0,0 +1,52 @@
1
+ import { type PublicClient, type WalletClient, type Transport, type Chain, type Account } from "viem";
2
+ export declare const monadTestnet: {
3
+ blockExplorers: {
4
+ readonly default: {
5
+ readonly name: "Monad Explorer";
6
+ readonly url: "https://testnet.monadexplorer.com";
7
+ };
8
+ };
9
+ blockTime?: number | undefined | undefined;
10
+ contracts?: {
11
+ [x: string]: import("viem").ChainContract | {
12
+ [sourceId: number]: import("viem").ChainContract | undefined;
13
+ } | undefined;
14
+ ensRegistry?: import("viem").ChainContract | undefined;
15
+ ensUniversalResolver?: import("viem").ChainContract | undefined;
16
+ multicall3?: import("viem").ChainContract | undefined;
17
+ erc6492Verifier?: import("viem").ChainContract | undefined;
18
+ } | undefined;
19
+ ensTlds?: readonly string[] | undefined;
20
+ id: 10143;
21
+ name: "Monad Testnet";
22
+ nativeCurrency: {
23
+ readonly name: "MON";
24
+ readonly symbol: "MON";
25
+ readonly decimals: 18;
26
+ };
27
+ experimental_preconfirmationTime?: number | undefined | undefined;
28
+ rpcUrls: {
29
+ readonly default: {
30
+ readonly http: readonly [string];
31
+ };
32
+ };
33
+ sourceId?: number | undefined | undefined;
34
+ testnet?: boolean | undefined | undefined;
35
+ custom?: Record<string, unknown> | undefined;
36
+ extendSchema?: Record<string, unknown> | undefined;
37
+ fees?: import("viem").ChainFees<undefined> | undefined;
38
+ formatters?: undefined;
39
+ prepareTransactionRequest?: ((args: import("viem").PrepareTransactionRequestParameters, options: {
40
+ phase: "beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters";
41
+ }) => Promise<import("viem").PrepareTransactionRequestParameters>) | [fn: ((args: import("viem").PrepareTransactionRequestParameters, options: {
42
+ phase: "beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters";
43
+ }) => Promise<import("viem").PrepareTransactionRequestParameters>) | undefined, options: {
44
+ runAt: readonly ("beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters")[];
45
+ }] | undefined;
46
+ serializers?: import("viem").ChainSerializers<undefined, import("viem").TransactionSerializable> | undefined;
47
+ verifyHash?: ((client: import("viem").Client, parameters: import("viem").VerifyHashActionParameters) => Promise<import("viem").VerifyHashActionReturnType>) | undefined;
48
+ };
49
+ export declare function getPublicClient(): PublicClient<Transport, Chain>;
50
+ export declare function getWalletClient(): WalletClient<Transport, Chain, Account>;
51
+ export declare function getAddress(): `0x${string}`;
52
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,OAAO,EACb,MAAM,MAAM,CAAC;AAKd,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAavB,CAAC;AAIH,wBAAgB,eAAe,IAAI,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAQhE;AAID,wBAAgB,eAAe,IAAI,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAUzE;AAGD,wBAAgB,UAAU,IAAI,KAAK,MAAM,EAAE,CAE1C"}
package/dist/client.js ADDED
@@ -0,0 +1,48 @@
1
+ // Viem client setup — public client for reads, wallet client for writes.
2
+ import { createPublicClient, createWalletClient, http, defineChain, } from "viem";
3
+ import { privateKeyToAccount } from "viem/accounts";
4
+ import { RPC_URL, CHAIN_ID, CHAIN_NAME, getPrivateKey } from "./config.js";
5
+ // Define Monad testnet chain
6
+ export const monadTestnet = defineChain({
7
+ id: CHAIN_ID,
8
+ name: CHAIN_NAME,
9
+ nativeCurrency: { name: "MON", symbol: "MON", decimals: 18 },
10
+ rpcUrls: {
11
+ default: { http: [RPC_URL] },
12
+ },
13
+ blockExplorers: {
14
+ default: {
15
+ name: "Monad Explorer",
16
+ url: "https://testnet.monadexplorer.com",
17
+ },
18
+ },
19
+ });
20
+ // Public client — always available, no private key needed
21
+ let _publicClient = null;
22
+ export function getPublicClient() {
23
+ if (!_publicClient) {
24
+ _publicClient = createPublicClient({
25
+ chain: monadTestnet,
26
+ transport: http(RPC_URL),
27
+ });
28
+ }
29
+ return _publicClient;
30
+ }
31
+ // Wallet client — only created when a write command needs it
32
+ let _walletClient = null;
33
+ export function getWalletClient() {
34
+ if (!_walletClient) {
35
+ const account = privateKeyToAccount(getPrivateKey());
36
+ _walletClient = createWalletClient({
37
+ account,
38
+ chain: monadTestnet,
39
+ transport: http(RPC_URL),
40
+ });
41
+ }
42
+ return _walletClient;
43
+ }
44
+ // Get the wallet address (from PRIVATE_KEY)
45
+ export function getAddress() {
46
+ return getWalletClient().account.address;
47
+ }
48
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,IAAI,EACJ,WAAW,GAMZ,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3E,6BAA6B;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;IACtC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,UAAU;IAChB,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC5D,OAAO,EAAE;QACP,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;KAC7B;IACD,cAAc,EAAE;QACd,OAAO,EAAE;YACP,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,mCAAmC;SACzC;KACF;CACF,CAAC,CAAC;AAEH,0DAA0D;AAC1D,IAAI,aAAa,GAA0C,IAAI,CAAC;AAChE,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;SACzB,CAAmC,CAAC;IACvC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,6DAA6D;AAC7D,IAAI,aAAa,GAAmD,IAAI,CAAC;AACzE,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,mBAAmB,CAAC,aAAa,EAAE,CAAC,CAAC;QACrD,aAAa,GAAG,kBAAkB,CAAC;YACjC,OAAO;YACP,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;SACzB,CAA4C,CAAC;IAChD,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,UAAU;IACxB,OAAO,eAAe,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function acceptCommand(matchId: string): Promise<void>;
2
+ //# sourceMappingURL=accept.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../src/commands/accept.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,iBAqClD"}
@@ -0,0 +1,41 @@
1
+ // arena-tools accept — accept an escrow match
2
+ import { encodeFunctionData } from "viem";
3
+ import { CONTRACTS } from "../config.js";
4
+ import { escrowAbi } from "../contracts.js";
5
+ import { getPublicClient, getAddress } from "../client.js";
6
+ import { sendTx } from "../utils/tx.js";
7
+ import { ok, fail } from "../utils/output.js";
8
+ export async function acceptCommand(matchId) {
9
+ const client = getPublicClient();
10
+ const id = BigInt(matchId);
11
+ const address = getAddress();
12
+ // Get match details to know the wager
13
+ const match = await client.readContract({
14
+ address: CONTRACTS.Escrow,
15
+ abi: escrowAbi,
16
+ functionName: "getMatch",
17
+ args: [id],
18
+ });
19
+ if (match.status !== 0) {
20
+ fail(`Match ${matchId} is not in Created status (current: ${match.status})`, "INVALID_STATUS");
21
+ }
22
+ const data = encodeFunctionData({
23
+ abi: escrowAbi,
24
+ functionName: "acceptMatch",
25
+ args: [id],
26
+ });
27
+ const { hash } = await sendTx({
28
+ to: CONTRACTS.Escrow,
29
+ data,
30
+ value: match.wager,
31
+ });
32
+ ok({
33
+ action: "accept",
34
+ matchId: Number(id),
35
+ player1: match.player1,
36
+ player2: address,
37
+ wager: match.wager.toString(),
38
+ txHash: hash,
39
+ });
40
+ }
41
+ //# sourceMappingURL=accept.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../src/commands/accept.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,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,EAAE,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,sCAAsC;IACtC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QACtC,OAAO,EAAE,SAAS,CAAC,MAAuB;QAC1C,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,UAAU;QACxB,IAAI,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,IAAK,KAAK,CAAC,MAAiB,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS,OAAO,uCAAuC,KAAK,CAAC,MAAM,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;QAC5B,EAAE,EAAE,SAAS,CAAC,MAAuB;QACrC,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,KAAe;KAC7B,CAAC,CAAC;IAEH,EAAE,CAAC;QACD,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAG,KAAK,CAAC,KAAgB,CAAC,QAAQ,EAAE;QACzC,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Create a new Auction game for a match */
2
+ export declare function auctionCreateCommand(matchId: string): Promise<void>;
3
+ /** Commit a bid amount (in MON) */
4
+ export declare function auctionCommitCommand(gameId: string, bid: string): Promise<void>;
5
+ /** Reveal the committed bid */
6
+ export declare function auctionRevealCommand(gameId: string): Promise<void>;
7
+ //# sourceMappingURL=auction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auction.d.ts","sourceRoot":"","sources":["../../src/commands/auction.ts"],"names":[],"mappings":"AAYA,4CAA4C;AAC5C,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,iBAiBzD;AAED,mCAAmC;AACnC,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,iBA2BrE;AAED,+BAA+B;AAC/B,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,iBA8BxD"}
@@ -0,0 +1,79 @@
1
+ // arena-tools auction-* — step-by-step Auction game commands
2
+ // auction-create: Create a new Auction game
3
+ // auction-commit: Commit a bid amount
4
+ // auction-reveal: Reveal the committed bid
5
+ import { encodeFunctionData, parseEther } from "viem";
6
+ import { CONTRACTS } from "../config.js";
7
+ import { auctionGameAbi } from "../contracts.js";
8
+ import { 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 } from "../utils/output.js";
12
+ /** Create a new Auction game for a match */
13
+ export async function auctionCreateCommand(matchId) {
14
+ const data = encodeFunctionData({
15
+ abi: auctionGameAbi,
16
+ functionName: "createGame",
17
+ args: [BigInt(matchId)],
18
+ });
19
+ const { hash } = await sendTx({
20
+ to: CONTRACTS.AuctionGame,
21
+ data,
22
+ });
23
+ ok({
24
+ action: "auction-create",
25
+ matchId: parseInt(matchId),
26
+ txHash: hash,
27
+ });
28
+ }
29
+ /** Commit a bid amount (in MON) */
30
+ export async function auctionCommitCommand(gameId, bid) {
31
+ const bidWei = parseEther(bid);
32
+ const salt = generateSalt();
33
+ const hash = commitBidHash(bidWei, salt);
34
+ // Save salt and bid for reveal (include wallet address to avoid collision)
35
+ const myAddress = getAddress();
36
+ saveSalt(`auction-${gameId}-${myAddress}`, salt, bid, "auction");
37
+ const data = encodeFunctionData({
38
+ abi: auctionGameAbi,
39
+ functionName: "commitBid",
40
+ args: [BigInt(gameId), hash],
41
+ });
42
+ const { hash: txHash } = await sendTx({
43
+ to: CONTRACTS.AuctionGame,
44
+ data,
45
+ });
46
+ ok({
47
+ action: "auction-commit",
48
+ gameId: parseInt(gameId),
49
+ bid,
50
+ commitHash: hash,
51
+ txHash,
52
+ });
53
+ }
54
+ /** Reveal the committed bid */
55
+ export async function auctionRevealCommand(gameId) {
56
+ const myAddress = getAddress();
57
+ const saved = loadSalt(`auction-${gameId}-${myAddress}`);
58
+ if (!saved) {
59
+ fail(`No saved salt for auction game ${gameId}. Did you commit first?`, "NO_SALT");
60
+ return;
61
+ }
62
+ const bidWei = parseEther(saved.value);
63
+ const data = encodeFunctionData({
64
+ abi: auctionGameAbi,
65
+ functionName: "revealBid",
66
+ args: [BigInt(gameId), bidWei, saved.salt],
67
+ });
68
+ const { hash: txHash } = await sendTx({
69
+ to: CONTRACTS.AuctionGame,
70
+ data,
71
+ });
72
+ ok({
73
+ action: "auction-reveal",
74
+ gameId: parseInt(gameId),
75
+ bid: saved.value,
76
+ txHash,
77
+ });
78
+ }
79
+ //# sourceMappingURL=auction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auction.js","sourceRoot":"","sources":["../../src/commands/auction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function challengeCommand(opponent: string, wager: string, gameType: string): Promise<void>;
2
+ //# sourceMappingURL=challenge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../src/commands/challenge.ts"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,iBA0CjB"}
@@ -0,0 +1,44 @@
1
+ // arena-tools challenge — create an escrow match against an opponent
2
+ import { encodeFunctionData, parseEther, getAddress as checksumAddress } from "viem";
3
+ import { CONTRACTS, GAME_CONTRACTS, GAME_TYPES } from "../config.js";
4
+ import { escrowAbi } from "../contracts.js";
5
+ import { getPublicClient, getAddress } from "../client.js";
6
+ import { sendTx } from "../utils/tx.js";
7
+ import { ok, fail } from "../utils/output.js";
8
+ export async function challengeCommand(opponent, wager, gameType) {
9
+ const gt = gameType.toLowerCase();
10
+ if (!(gt in GAME_TYPES)) {
11
+ fail(`Invalid game type: ${gameType}. Must be rps, poker, or auction.`, "INVALID_GAME_TYPE");
12
+ }
13
+ const gameContract = GAME_CONTRACTS[gt];
14
+ const wagerWei = parseEther(wager);
15
+ const address = getAddress();
16
+ const data = encodeFunctionData({
17
+ abi: escrowAbi,
18
+ functionName: "createMatch",
19
+ args: [checksumAddress(opponent), gameContract],
20
+ });
21
+ const { hash } = await sendTx({
22
+ to: CONTRACTS.Escrow,
23
+ data,
24
+ value: wagerWei,
25
+ });
26
+ // Get the match ID from nextMatchId
27
+ const client = getPublicClient();
28
+ const nextId = (await client.readContract({
29
+ address: CONTRACTS.Escrow,
30
+ abi: escrowAbi,
31
+ functionName: "nextMatchId",
32
+ }));
33
+ const matchId = Number(nextId) - 1;
34
+ ok({
35
+ action: "challenge",
36
+ matchId,
37
+ challenger: address,
38
+ opponent,
39
+ gameType: gt,
40
+ wager,
41
+ txHash: hash,
42
+ });
43
+ }
44
+ //# sourceMappingURL=challenge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../src/commands/challenge.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,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,EAAE,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,KAAa,EACb,QAAgB;IAEhB,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,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,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;IAEnC,EAAE,CAAC;QACD,MAAM,EAAE,WAAW;QACnB,OAAO;QACP,UAAU,EAAE,OAAO;QACnB,QAAQ;QACR,QAAQ,EAAE,EAAE;QACZ,KAAK;QACL,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function claimTimeoutCommand(gameType: string, gameId: string): Promise<void>;
2
+ //# sourceMappingURL=claim-timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-timeout.d.ts","sourceRoot":"","sources":["../../src/commands/claim-timeout.ts"],"names":[],"mappings":"AAOA,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBA+BzE"}
@@ -0,0 +1,34 @@
1
+ // arena-tools claim-timeout — claim a timeout win for any game type
2
+ import { encodeFunctionData } from "viem";
3
+ import { CONTRACTS, GAME_TYPES } from "../config.js";
4
+ import { rpsGameAbi, pokerGameAbi, auctionGameAbi } from "../contracts.js";
5
+ import { sendTx } from "../utils/tx.js";
6
+ import { ok, fail } from "../utils/output.js";
7
+ export async function claimTimeoutCommand(gameType, gameId) {
8
+ const gt = gameType.toLowerCase();
9
+ if (!(gt in GAME_TYPES)) {
10
+ fail(`Invalid game type: ${gameType}. Must be rps, poker, or auction.`, "INVALID_GAME_TYPE");
11
+ }
12
+ const contractMap = {
13
+ rps: { address: CONTRACTS.RPSGame, abi: rpsGameAbi },
14
+ poker: { address: CONTRACTS.PokerGame, abi: pokerGameAbi },
15
+ auction: { address: CONTRACTS.AuctionGame, abi: auctionGameAbi },
16
+ };
17
+ const { address, abi } = contractMap[gt];
18
+ const data = encodeFunctionData({
19
+ abi,
20
+ functionName: "claimTimeout",
21
+ args: [BigInt(gameId)],
22
+ });
23
+ const { hash } = await sendTx({
24
+ to: address,
25
+ data,
26
+ });
27
+ ok({
28
+ action: "claim-timeout",
29
+ gameType: gt,
30
+ gameId: parseInt(gameId),
31
+ txHash: hash,
32
+ });
33
+ }
34
+ //# sourceMappingURL=claim-timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-timeout.js","sourceRoot":"","sources":["../../src/commands/claim-timeout.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAqB,UAAU,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,MAAc;IACxE,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,WAAW,GAAG;QAClB,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE;QACpD,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE;QAC1D,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE;KACjE,CAAC;IAEF,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAEzC,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG;QACH,YAAY,EAAE,cAAc;QAC5B,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KACvB,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;QAC5B,EAAE,EAAE,OAAwB;QAC5B,IAAI;KACL,CAAC,CAAC;IAEH,EAAE,CAAC;QACD,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;QACxB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function findOpponentsCommand(gameType: string): Promise<void>;
2
+ //# sourceMappingURL=find-opponents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-opponents.d.ts","sourceRoot":"","sources":["../../src/commands/find-opponents.ts"],"names":[],"mappings":"AAOA,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,iBAiD1D"}
@@ -0,0 +1,50 @@
1
+ // arena-tools find-opponents — list open agents for a game type
2
+ import { formatEther } from "viem";
3
+ import { getPublicClient } from "../client.js";
4
+ import { CONTRACTS, GAME_TYPES } from "../config.js";
5
+ import { agentRegistryAbi } from "../contracts.js";
6
+ import { ok, fail } from "../utils/output.js";
7
+ export async function findOpponentsCommand(gameType) {
8
+ const gt = gameType.toLowerCase();
9
+ if (!(gt in GAME_TYPES)) {
10
+ fail(`Invalid game type: ${gameType}. Must be rps, poker, or auction.`, "INVALID_GAME_TYPE");
11
+ }
12
+ const client = getPublicClient();
13
+ const gameTypeId = GAME_TYPES[gt];
14
+ // Get all open agents for this game type
15
+ const agents = (await client.readContract({
16
+ address: CONTRACTS.AgentRegistry,
17
+ abi: agentRegistryAbi,
18
+ functionName: "getOpenAgents",
19
+ args: [gameTypeId],
20
+ }));
21
+ // Fetch details for each agent in parallel
22
+ const details = await Promise.all(agents.map(async (addr) => {
23
+ const [info, elo] = await Promise.all([
24
+ client.readContract({
25
+ address: CONTRACTS.AgentRegistry,
26
+ abi: agentRegistryAbi,
27
+ functionName: "getAgent",
28
+ args: [addr],
29
+ }),
30
+ client.readContract({
31
+ address: CONTRACTS.AgentRegistry,
32
+ abi: agentRegistryAbi,
33
+ functionName: "elo",
34
+ args: [addr, gameTypeId],
35
+ }),
36
+ ]);
37
+ return {
38
+ address: addr,
39
+ elo: Number(elo),
40
+ minWager: formatEther(info.minWager),
41
+ maxWager: formatEther(info.maxWager),
42
+ };
43
+ }));
44
+ ok({
45
+ gameType: gt,
46
+ count: details.length,
47
+ agents: details,
48
+ });
49
+ }
50
+ //# sourceMappingURL=find-opponents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-opponents.js","sourceRoot":"","sources":["../../src/commands/find-opponents.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAqB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,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,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAElC,yCAAyC;IACzC,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC;QACxC,OAAO,EAAE,SAAS,CAAC,aAA8B;QACjD,GAAG,EAAE,gBAAgB;QACrB,YAAY,EAAE,eAAe;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC;KACnB,CAAC,CAA6B,CAAC;IAEhC,2CAA2C;IAC3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpC,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,SAAS,CAAC,aAA8B;gBACjD,GAAG,EAAE,gBAAgB;gBACrB,YAAY,EAAE,UAAU;gBACxB,IAAI,EAAE,CAAC,IAAI,CAAC;aACb,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,SAAS,CAAC,aAA8B;gBACjD,GAAG,EAAE,gBAAgB;gBACrB,YAAY,EAAE,KAAK;gBACnB,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;aACzB,CAAC;SACH,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;YAChB,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,QAAkB,CAAC;YAC9C,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,QAAkB,CAAC;SAC/C,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,EAAE,CAAC;QACD,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,MAAM,EAAE,OAAO;KAChB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getGameCommand(gameType: string, gameId: string): Promise<void>;
2
+ //# sourceMappingURL=get-game.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-game.d.ts","sourceRoot":"","sources":["../../src/commands/get-game.ts"],"names":[],"mappings":"AAUA,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAuFpE"}
@@ -0,0 +1,96 @@
1
+ // arena-tools get-game — get game state for RPS, Poker, or Auction
2
+ import { formatEther } from "viem";
3
+ import { getPublicClient } from "../client.js";
4
+ import { CONTRACTS } from "../config.js";
5
+ import { rpsGameAbi, pokerGameAbi, auctionGameAbi } from "../contracts.js";
6
+ import { ok, fail } from "../utils/output.js";
7
+ const PHASE_NAMES = ["Commit", "Reveal", "Complete"];
8
+ const RPS_MOVES = ["None", "Rock", "Paper", "Scissors"];
9
+ export async function getGameCommand(gameType, gameId) {
10
+ const gt = gameType.toLowerCase();
11
+ const client = getPublicClient();
12
+ const id = BigInt(gameId);
13
+ if (gt === "rps") {
14
+ const game = await client.readContract({
15
+ address: CONTRACTS.RPSGame,
16
+ abi: rpsGameAbi,
17
+ functionName: "getGame",
18
+ args: [id],
19
+ });
20
+ ok({
21
+ gameType: "rps",
22
+ gameId: Number(id),
23
+ matchId: Number(game.escrowMatchId),
24
+ player1: game.player1,
25
+ player2: game.player2,
26
+ totalRounds: Number(game.totalRounds),
27
+ currentRound: Number(game.currentRound),
28
+ p1Score: Number(game.p1Score),
29
+ p2Score: Number(game.p2Score),
30
+ phase: PHASE_NAMES[game.phase] || `Unknown(${game.phase})`,
31
+ phaseCode: Number(game.phase),
32
+ phaseDeadline: Number(game.phaseDeadline),
33
+ settled: game.settled,
34
+ });
35
+ }
36
+ else if (gt === "poker") {
37
+ const game = await client.readContract({
38
+ address: CONTRACTS.PokerGame,
39
+ abi: pokerGameAbi,
40
+ functionName: "getGame",
41
+ args: [id],
42
+ });
43
+ ok({
44
+ gameType: "poker",
45
+ gameId: Number(id),
46
+ matchId: Number(game.escrowMatchId),
47
+ player1: game.player1,
48
+ player2: game.player2,
49
+ pot: formatEther(game.pot),
50
+ currentBet: formatEther(game.currentBet),
51
+ currentTurn: game.currentTurn,
52
+ phase: PHASE_NAMES[game.phase] || `Unknown(${game.phase})`,
53
+ phaseCode: Number(game.phase),
54
+ phaseDeadline: Number(game.phaseDeadline),
55
+ settled: game.settled,
56
+ p1HandValue: Number(game.p1HandValue),
57
+ p2HandValue: Number(game.p2HandValue),
58
+ p1Committed: game.p1Committed,
59
+ p2Committed: game.p2Committed,
60
+ p1Revealed: game.p1Revealed,
61
+ p2Revealed: game.p2Revealed,
62
+ p1ExtraBets: formatEther(game.p1ExtraBets),
63
+ p2ExtraBets: formatEther(game.p2ExtraBets),
64
+ });
65
+ }
66
+ else if (gt === "auction") {
67
+ const game = await client.readContract({
68
+ address: CONTRACTS.AuctionGame,
69
+ abi: auctionGameAbi,
70
+ functionName: "getGame",
71
+ args: [id],
72
+ });
73
+ ok({
74
+ gameType: "auction",
75
+ gameId: Number(id),
76
+ matchId: Number(game.escrowMatchId),
77
+ player1: game.player1,
78
+ player2: game.player2,
79
+ prize: formatEther(game.prize),
80
+ p1Bid: formatEther(game.p1Bid),
81
+ p2Bid: formatEther(game.p2Bid),
82
+ p1Committed: game.p1Committed,
83
+ p2Committed: game.p2Committed,
84
+ p1Revealed: game.p1Revealed,
85
+ p2Revealed: game.p2Revealed,
86
+ phase: PHASE_NAMES[game.phase] || `Unknown(${game.phase})`,
87
+ phaseCode: Number(game.phase),
88
+ phaseDeadline: Number(game.phaseDeadline),
89
+ settled: game.settled,
90
+ });
91
+ }
92
+ else {
93
+ fail(`Invalid game type: ${gameType}. Must be rps, poker, or auction.`, "INVALID_GAME_TYPE");
94
+ }
95
+ }
96
+ //# sourceMappingURL=get-game.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-game.js","sourceRoot":"","sources":["../../src/commands/get-game.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getMatchCommand(matchId: string): Promise<void>;
2
+ //# sourceMappingURL=get-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-match.d.ts","sourceRoot":"","sources":["../../src/commands/get-match.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,iBA8BpD"}
@@ -0,0 +1,37 @@
1
+ // arena-tools get-match — single match details
2
+ import { formatEther } from "viem";
3
+ import { getPublicClient } from "../client.js";
4
+ import { CONTRACTS } from "../config.js";
5
+ import { escrowAbi } from "../contracts.js";
6
+ import { ok } from "../utils/output.js";
7
+ const STATUS_NAMES = ["Created", "Active", "Settled", "Cancelled"];
8
+ export async function getMatchCommand(matchId) {
9
+ const client = getPublicClient();
10
+ const id = BigInt(matchId);
11
+ const [match, winner] = await Promise.all([
12
+ client.readContract({
13
+ address: CONTRACTS.Escrow,
14
+ abi: escrowAbi,
15
+ functionName: "getMatch",
16
+ args: [id],
17
+ }),
18
+ client.readContract({
19
+ address: CONTRACTS.Escrow,
20
+ abi: escrowAbi,
21
+ functionName: "winners",
22
+ args: [id],
23
+ }),
24
+ ]);
25
+ ok({
26
+ matchId: Number(id),
27
+ player1: match.player1,
28
+ player2: match.player2,
29
+ wager: formatEther(match.wager),
30
+ gameContract: match.gameContract,
31
+ status: STATUS_NAMES[match.status] || `Unknown(${match.status})`,
32
+ statusCode: Number(match.status),
33
+ createdAt: Number(match.createdAt),
34
+ winner: winner,
35
+ });
36
+ }
37
+ //# sourceMappingURL=get-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-match.js","sourceRoot":"","sources":["../../src/commands/get-match.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,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,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAU,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3B,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxC,MAAM,CAAC,YAAY,CAAC;YAClB,OAAO,EAAE,SAAS,CAAC,MAAuB;YAC1C,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,UAAU;YACxB,IAAI,EAAE,CAAC,EAAE,CAAC;SACX,CAAC;QACF,MAAM,CAAC,YAAY,CAAC;YAClB,OAAO,EAAE,SAAS,CAAC,MAAuB;YAC1C,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,SAAS;YACvB,IAAI,EAAE,CAAC,EAAE,CAAC;SACX,CAAC;KACH,CAAC,CAAC;IAEH,EAAE,CAAC;QACD,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAe,CAAC;QACzC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAgB,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,GAAG;QAC1E,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAClC,MAAM,EAAE,MAAgB;KACzB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function historyCommand(address: string): Promise<void>;
2
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAOA,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,iBAkCnD"}