@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.
- package/bin/arena.js +5 -0
- package/dist/client.d.ts +52 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +48 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/accept.d.ts +2 -0
- package/dist/commands/accept.d.ts.map +1 -0
- package/dist/commands/accept.js +41 -0
- package/dist/commands/accept.js.map +1 -0
- package/dist/commands/auction.d.ts +7 -0
- package/dist/commands/auction.d.ts.map +1 -0
- package/dist/commands/auction.js +79 -0
- package/dist/commands/auction.js.map +1 -0
- package/dist/commands/challenge.d.ts +2 -0
- package/dist/commands/challenge.d.ts.map +1 -0
- package/dist/commands/challenge.js +44 -0
- package/dist/commands/challenge.js.map +1 -0
- package/dist/commands/claim-timeout.d.ts +2 -0
- package/dist/commands/claim-timeout.d.ts.map +1 -0
- package/dist/commands/claim-timeout.js +34 -0
- package/dist/commands/claim-timeout.js.map +1 -0
- package/dist/commands/find-opponents.d.ts +2 -0
- package/dist/commands/find-opponents.d.ts.map +1 -0
- package/dist/commands/find-opponents.js +50 -0
- package/dist/commands/find-opponents.js.map +1 -0
- package/dist/commands/get-game.d.ts +2 -0
- package/dist/commands/get-game.d.ts.map +1 -0
- package/dist/commands/get-game.js +96 -0
- package/dist/commands/get-game.js.map +1 -0
- package/dist/commands/get-match.d.ts +2 -0
- package/dist/commands/get-match.d.ts.map +1 -0
- package/dist/commands/get-match.js +37 -0
- package/dist/commands/get-match.js.map +1 -0
- package/dist/commands/history.d.ts +2 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +33 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/join-tournament.d.ts +2 -0
- package/dist/commands/join-tournament.d.ts.map +1 -0
- package/dist/commands/join-tournament.js +37 -0
- package/dist/commands/join-tournament.js.map +1 -0
- package/dist/commands/market-status.d.ts +2 -0
- package/dist/commands/market-status.d.ts.map +1 -0
- package/dist/commands/market-status.js +39 -0
- package/dist/commands/market-status.js.map +1 -0
- package/dist/commands/market.d.ts +9 -0
- package/dist/commands/market.d.ts.map +1 -0
- package/dist/commands/market.js +87 -0
- package/dist/commands/market.js.map +1 -0
- package/dist/commands/poker.d.ts +9 -0
- package/dist/commands/poker.d.ts.map +1 -0
- package/dist/commands/poker.js +120 -0
- package/dist/commands/poker.js.map +1 -0
- package/dist/commands/register.d.ts +5 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +39 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/rps.d.ts +7 -0
- package/dist/commands/rps.d.ts.map +1 -0
- package/dist/commands/rps.js +135 -0
- package/dist/commands/rps.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +58 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tournaments.d.ts +3 -0
- package/dist/commands/tournaments.d.ts.map +1 -0
- package/dist/commands/tournaments.js +77 -0
- package/dist/commands/tournaments.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +50 -0
- package/dist/config.js.map +1 -0
- package/dist/contracts.d.ts +764 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +518 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +245 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/commit-reveal.d.ts +22 -0
- package/dist/utils/commit-reveal.d.ts.map +1 -0
- package/dist/utils/commit-reveal.js +56 -0
- package/dist/utils/commit-reveal.js.map +1 -0
- package/dist/utils/output.d.ts +9 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +30 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/tx.d.ts +14 -0
- package/dist/utils/tx.d.ts.map +1 -0
- package/dist/utils/tx.js +35 -0
- package/dist/utils/tx.js.map +1 -0
- package/package.json +34 -0
package/bin/arena.js
ADDED
package/dist/client.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAOA,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,iBAkCnD"}
|