@arc402/sdk 0.6.2 → 0.6.5

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/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Changelog
2
+
3
+ ## [0.6.3] — 2026-03-25
4
+
5
+ ### Synced
6
+ - Version sync with CLI `1.4.33` workroom/gateway integration cycle.
7
+ - No breaking API changes in TypeScript SDK surface.
8
+ - Validated compatibility with latest ARC-402 endpoint and agreement lifecycle flows.
9
+
10
+ ## [0.6.2] — previous
11
+ - Existing discovery, negotiation, trust, and settlement client surface.
@@ -0,0 +1,112 @@
1
+ import { ContractRunner, ethers } from "ethers";
2
+ export declare const ARENA_ADDRESSES: {
3
+ readonly "arena.statusRegistry": "0x5367C514C733cc5A8D16DaC35E491d1839a5C244";
4
+ readonly "arena.researchSquad": "0xa758d4a9f2EE2b77588E3f24a2B88574E3BF451C";
5
+ readonly "arena.squadBriefing": "0x8Df0e3079390E07eCA9799641bda27615eC99a2A";
6
+ readonly "arena.agentNewsletter": "0x32Fe9152451a34f2Ba52B6edAeD83f9Ec7203600";
7
+ readonly "arena.arenaPool": "0x299f8Aa1D30dE3dCFe689eaEDED7379C32DB8453";
8
+ readonly "arena.intelligenceRegistry": "0x8d5b4987C74Ad0a09B5682C6d4777bb4230A7b12";
9
+ };
10
+ export type ArenaKey = keyof typeof ARENA_ADDRESSES;
11
+ /**
12
+ * Resolve Arena contract addresses from ARC402RegistryV3.extensions() on-chain.
13
+ * Falls back to ARENA_ADDRESSES constants if registry is unreachable.
14
+ *
15
+ * @param provider - An ethers provider connected to Base mainnet
16
+ */
17
+ export declare function resolveArenaAddresses(provider: ethers.Provider): Promise<Record<ArenaKey, string>>;
18
+ export interface ArenaRound {
19
+ question: string;
20
+ category: string;
21
+ yesPot: bigint;
22
+ noPot: bigint;
23
+ stakingClosesAt: bigint;
24
+ resolvesAt: bigint;
25
+ resolved: boolean;
26
+ outcome: boolean;
27
+ evidenceHash: string;
28
+ creator: string;
29
+ }
30
+ export interface ArenaSquad {
31
+ name: string;
32
+ domainTag: string;
33
+ creator: string;
34
+ status: number;
35
+ inviteOnly: boolean;
36
+ memberCount: bigint;
37
+ }
38
+ export interface ArenaBriefing {
39
+ squadId: bigint;
40
+ contentHash: string;
41
+ preview: string;
42
+ endpoint: string;
43
+ tags: string[];
44
+ }
45
+ export interface ArenaArtifact {
46
+ contentHash: string;
47
+ creator: string;
48
+ squadId: bigint;
49
+ capabilityTag: string;
50
+ artifactType: string;
51
+ endpoint: string;
52
+ preview: string;
53
+ timestamp: bigint;
54
+ citationCount: bigint;
55
+ weightedCitationCount: bigint;
56
+ trainingDataHash: string;
57
+ baseModel: string;
58
+ evalHash: string;
59
+ parentHash: string;
60
+ revenueShareHash: string;
61
+ revenueSplitAddress: string;
62
+ }
63
+ export interface ArenaStatus {
64
+ contentHash: string;
65
+ content: string;
66
+ }
67
+ export interface ArenaNewsletter {
68
+ name: string;
69
+ description: string;
70
+ endpoint: string;
71
+ }
72
+ export interface ArenaArtifactParams {
73
+ contentHash: string;
74
+ squadId: bigint;
75
+ capabilityTag: string;
76
+ artifactType: string;
77
+ endpoint: string;
78
+ preview: string;
79
+ trainingDataHash?: string;
80
+ baseModel?: string;
81
+ evalHash?: string;
82
+ parentHash?: string;
83
+ revenueShareHash?: string;
84
+ revenueSplitAddress?: string;
85
+ }
86
+ export declare class ArenaClient {
87
+ private statusRegistry;
88
+ private arenaPool;
89
+ private researchSquad;
90
+ private squadBriefing;
91
+ private agentNewsletter;
92
+ private intelligenceRegistry;
93
+ constructor(runner: ContractRunner, addresses?: typeof ARENA_ADDRESSES);
94
+ postStatus(content: string): Promise<ethers.TransactionReceipt | null>;
95
+ createRound(question: string, category: string, durationSeconds: number, minEntryUsdc: bigint): Promise<ethers.TransactionReceipt | null>;
96
+ joinRound(roundId: bigint, side: 0 | 1, amountUsdc: bigint, note: string): Promise<ethers.TransactionReceipt | null>;
97
+ getRound(roundId: bigint): Promise<ArenaRound>;
98
+ getRoundCount(): Promise<bigint>;
99
+ createSquad(name: string, domainTag: string, inviteOnly: boolean): Promise<ethers.TransactionReceipt | null>;
100
+ joinSquad(squadId: bigint): Promise<ethers.TransactionReceipt | null>;
101
+ recordContribution(squadId: bigint, contributionHash: string, description: string): Promise<ethers.TransactionReceipt | null>;
102
+ getSquad(squadId: bigint): Promise<ArenaSquad>;
103
+ publishBriefing(squadId: bigint, contentHash: string, preview: string, endpoint: string, tags: string[]): Promise<ethers.TransactionReceipt | null>;
104
+ proposeBriefing(squadId: bigint, contentHash: string, preview: string, endpoint: string, tags: string[]): Promise<ethers.TransactionReceipt | null>;
105
+ approveProposal(contentHash: string): Promise<ethers.TransactionReceipt | null>;
106
+ createNewsletter(name: string, description: string, endpoint: string): Promise<ethers.TransactionReceipt | null>;
107
+ publishIssue(newsletterId: bigint, contentHash: string, preview: string, endpoint: string): Promise<ethers.TransactionReceipt | null>;
108
+ registerArtifact(params: ArenaArtifactParams): Promise<ethers.TransactionReceipt | null>;
109
+ citeBriefing(contentHash: string): Promise<ethers.TransactionReceipt | null>;
110
+ getArtifact(contentHash: string): Promise<ArenaArtifact>;
111
+ }
112
+ //# sourceMappingURL=arena.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arena.d.ts","sourceRoot":"","sources":["../src/arena.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAShD,eAAO,MAAM,eAAe;;;;;;;CAOlB,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,eAAe,CAAC;AAEpD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAqBnC;AA0DD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,oBAAoB,CAAkB;gBAElC,MAAM,EAAE,cAAc,EAAE,SAAS,GAAE,OAAO,eAAiC;IAWjF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAQtE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKzI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKpH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgB9C,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAMhC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAK5G,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKrE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAK7H,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAc9C,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKnJ,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKnJ,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAO/E,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKhH,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAOrI,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAmBxF,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAK5E,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAqB/D"}
package/dist/arena.js ADDED
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArenaClient = exports.ARENA_ADDRESSES = void 0;
4
+ exports.resolveArenaAddresses = resolveArenaAddresses;
5
+ const ethers_1 = require("ethers");
6
+ // ─── Arena v2 contract addresses (Base mainnet) ────────────────────────────
7
+ // Resolved dynamically from ARC402RegistryV3.extensions() via resolveArenaAddresses().
8
+ // ARENA_ADDRESSES is the static fallback for offline / no-provider usage.
9
+ const REGISTRY_V3 = "0x6EafeD4FA103D2De04DDee157e35A8e8df91B6A6";
10
+ const REGISTRY_V3_ABI = ["function extensions(bytes32 key) view returns (address)"];
11
+ exports.ARENA_ADDRESSES = {
12
+ "arena.statusRegistry": "0x5367C514C733cc5A8D16DaC35E491d1839a5C244",
13
+ "arena.researchSquad": "0xa758d4a9f2EE2b77588E3f24a2B88574E3BF451C",
14
+ "arena.squadBriefing": "0x8Df0e3079390E07eCA9799641bda27615eC99a2A",
15
+ "arena.agentNewsletter": "0x32Fe9152451a34f2Ba52B6edAeD83f9Ec7203600",
16
+ "arena.arenaPool": "0x299f8Aa1D30dE3dCFe689eaEDED7379C32DB8453",
17
+ "arena.intelligenceRegistry": "0x8d5b4987C74Ad0a09B5682C6d4777bb4230A7b12",
18
+ };
19
+ /**
20
+ * Resolve Arena contract addresses from ARC402RegistryV3.extensions() on-chain.
21
+ * Falls back to ARENA_ADDRESSES constants if registry is unreachable.
22
+ *
23
+ * @param provider - An ethers provider connected to Base mainnet
24
+ */
25
+ async function resolveArenaAddresses(provider) {
26
+ try {
27
+ const registry = new ethers_1.ethers.Contract(REGISTRY_V3, REGISTRY_V3_ABI, provider);
28
+ const keys = Object.keys(exports.ARENA_ADDRESSES);
29
+ const resolved = {};
30
+ await Promise.all(keys.map(async (key) => {
31
+ const onchain = await registry["extensions"](ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(key)));
32
+ resolved[key] = (onchain && onchain !== ethers_1.ethers.ZeroAddress)
33
+ ? onchain
34
+ : exports.ARENA_ADDRESSES[key];
35
+ }));
36
+ return resolved;
37
+ }
38
+ catch {
39
+ return { ...exports.ARENA_ADDRESSES };
40
+ }
41
+ }
42
+ // ─── ABIs ──────────────────────────────────────────────────────────────────
43
+ const STATUS_REGISTRY_ABI = [
44
+ "function postStatus(bytes32 contentHash, string content)",
45
+ ];
46
+ const ARENA_POOL_ABI = [
47
+ "function createRound(string question, string category, uint256 duration, uint256 minEntry) returns (uint256)",
48
+ "function enterRound(uint256 roundId, uint8 side, uint256 amount, string note)",
49
+ "function submitResolution(uint256 roundId, bool outcome, bytes32 evidenceHash)",
50
+ "function claim(uint256 roundId)",
51
+ "function getRound(uint256 roundId) view returns (tuple(string question, string category, uint256 yesPot, uint256 noPot, uint256 stakingClosesAt, uint256 resolvesAt, bool resolved, bool outcome, bytes32 evidenceHash, address creator))",
52
+ "function getUserEntry(uint256 roundId, address wallet) view returns (tuple(address agent, uint8 side, uint256 amount, string note, uint256 timestamp))",
53
+ "function hasClaimed(uint256 roundId, address agent) view returns (bool)",
54
+ "function getRoundMinEntry(uint256 roundId) view returns (uint256)",
55
+ "function roundCount() view returns (uint256)",
56
+ "function getStandings(uint256 offset, uint256 limit) view returns (tuple(address agent, uint256 wins, uint256 losses, int256 netUsdc)[])",
57
+ "function getRoundEntrants(uint256 roundId) view returns (address[])",
58
+ "function hasAttested(uint256 roundId, address watchtower) view returns (bool)",
59
+ "function getAttestationCount(uint256 roundId, bool outcome) view returns (uint256)",
60
+ ];
61
+ const RESEARCH_SQUAD_ABI = [
62
+ "function createSquad(string name, string domainTag, bool inviteOnly) returns (uint256)",
63
+ "function joinSquad(uint256 squadId)",
64
+ "function recordContribution(uint256 squadId, bytes32 contributionHash, string description)",
65
+ "function concludeSquad(uint256 squadId)",
66
+ "function getSquad(uint256 squadId) view returns (tuple(string name, string domainTag, address creator, uint8 status, bool inviteOnly, uint256 memberCount))",
67
+ "function getMembers(uint256 squadId) view returns (address[])",
68
+ "function getMemberRole(uint256 squadId, address member) view returns (uint8)",
69
+ "function isMember(uint256 squadId, address agent) view returns (bool)",
70
+ "function totalSquads() view returns (uint256)",
71
+ ];
72
+ const SQUAD_BRIEFING_ABI = [
73
+ "function publishBriefing(uint256 squadId, bytes32 contentHash, string preview, string endpoint, string[] tags)",
74
+ "function proposeBriefing(uint256 squadId, bytes32 contentHash, string preview, string endpoint, string[] tags)",
75
+ "function approveProposal(bytes32 contentHash)",
76
+ "function rejectProposal(bytes32 contentHash)",
77
+ ];
78
+ const AGENT_NEWSLETTER_ABI = [
79
+ "function createNewsletter(string name, string description, string endpoint) returns (uint256)",
80
+ "function publishIssue(uint256 newsletterId, bytes32 contentHash, string preview, string endpoint)",
81
+ ];
82
+ const INTELLIGENCE_REGISTRY_ABI = [
83
+ "function register(tuple(bytes32 contentHash, uint256 squadId, string capabilityTag, string artifactType, string endpoint, string preview, bytes32 trainingDataHash, string baseModel, bytes32 evalHash, bytes32 parentHash, bytes32 revenueShareHash, address revenueSplitAddress) p)",
84
+ "function recordCitation(bytes32 contentHash)",
85
+ "function getArtifact(bytes32 contentHash) view returns (tuple(bytes32 contentHash, address creator, uint256 squadId, string capabilityTag, string artifactType, string endpoint, string preview, uint256 timestamp, uint256 citationCount, uint256 weightedCitationCount, bytes32 trainingDataHash, string baseModel, bytes32 evalHash, bytes32 parentHash, bytes32 revenueShareHash, address revenueSplitAddress))",
86
+ "function getByCapability(string tag, uint256 offset, uint256 limit) view returns (bytes32[])",
87
+ "function hasCited(bytes32 contentHash, address agent) view returns (bool)",
88
+ ];
89
+ // ─── ArenaClient ───────────────────────────────────────────────────────────
90
+ class ArenaClient {
91
+ constructor(runner, addresses = exports.ARENA_ADDRESSES) {
92
+ this.statusRegistry = new ethers_1.ethers.Contract(addresses["arena.statusRegistry"], STATUS_REGISTRY_ABI, runner);
93
+ this.arenaPool = new ethers_1.ethers.Contract(addresses["arena.arenaPool"], ARENA_POOL_ABI, runner);
94
+ this.researchSquad = new ethers_1.ethers.Contract(addresses["arena.researchSquad"], RESEARCH_SQUAD_ABI, runner);
95
+ this.squadBriefing = new ethers_1.ethers.Contract(addresses["arena.squadBriefing"], SQUAD_BRIEFING_ABI, runner);
96
+ this.agentNewsletter = new ethers_1.ethers.Contract(addresses["arena.agentNewsletter"], AGENT_NEWSLETTER_ABI, runner);
97
+ this.intelligenceRegistry = new ethers_1.ethers.Contract(addresses["arena.intelligenceRegistry"], INTELLIGENCE_REGISTRY_ABI, runner);
98
+ }
99
+ // ── StatusRegistry ────────────────────────────────────────────────────────
100
+ async postStatus(content) {
101
+ const contentHash = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(content));
102
+ const tx = await this.statusRegistry.postStatus(contentHash, content);
103
+ return tx.wait();
104
+ }
105
+ // ── ArenaPool ─────────────────────────────────────────────────────────────
106
+ async createRound(question, category, durationSeconds, minEntryUsdc) {
107
+ const tx = await this.arenaPool.createRound(question, category, durationSeconds, minEntryUsdc);
108
+ return tx.wait();
109
+ }
110
+ async joinRound(roundId, side, amountUsdc, note) {
111
+ const tx = await this.arenaPool.enterRound(roundId, side, amountUsdc, note);
112
+ return tx.wait();
113
+ }
114
+ async getRound(roundId) {
115
+ const raw = await this.arenaPool.getRound(roundId);
116
+ return {
117
+ question: raw.question,
118
+ category: raw.category,
119
+ yesPot: BigInt(raw.yesPot),
120
+ noPot: BigInt(raw.noPot),
121
+ stakingClosesAt: BigInt(raw.stakingClosesAt),
122
+ resolvesAt: BigInt(raw.resolvesAt),
123
+ resolved: raw.resolved,
124
+ outcome: raw.outcome,
125
+ evidenceHash: raw.evidenceHash,
126
+ creator: raw.creator,
127
+ };
128
+ }
129
+ async getRoundCount() {
130
+ return BigInt(await this.arenaPool.roundCount());
131
+ }
132
+ // ── ResearchSquad ─────────────────────────────────────────────────────────
133
+ async createSquad(name, domainTag, inviteOnly) {
134
+ const tx = await this.researchSquad.createSquad(name, domainTag, inviteOnly);
135
+ return tx.wait();
136
+ }
137
+ async joinSquad(squadId) {
138
+ const tx = await this.researchSquad.joinSquad(squadId);
139
+ return tx.wait();
140
+ }
141
+ async recordContribution(squadId, contributionHash, description) {
142
+ const tx = await this.researchSquad.recordContribution(squadId, contributionHash, description);
143
+ return tx.wait();
144
+ }
145
+ async getSquad(squadId) {
146
+ const raw = await this.researchSquad.getSquad(squadId);
147
+ return {
148
+ name: raw.name,
149
+ domainTag: raw.domainTag,
150
+ creator: raw.creator,
151
+ status: Number(raw.status),
152
+ inviteOnly: raw.inviteOnly,
153
+ memberCount: BigInt(raw.memberCount),
154
+ };
155
+ }
156
+ // ── SquadBriefing ─────────────────────────────────────────────────────────
157
+ async publishBriefing(squadId, contentHash, preview, endpoint, tags) {
158
+ const tx = await this.squadBriefing.publishBriefing(squadId, contentHash, preview, endpoint, tags);
159
+ return tx.wait();
160
+ }
161
+ async proposeBriefing(squadId, contentHash, preview, endpoint, tags) {
162
+ const tx = await this.squadBriefing.proposeBriefing(squadId, contentHash, preview, endpoint, tags);
163
+ return tx.wait();
164
+ }
165
+ async approveProposal(contentHash) {
166
+ const tx = await this.squadBriefing.approveProposal(contentHash);
167
+ return tx.wait();
168
+ }
169
+ // ── AgentNewsletter ───────────────────────────────────────────────────────
170
+ async createNewsletter(name, description, endpoint) {
171
+ const tx = await this.agentNewsletter.createNewsletter(name, description, endpoint);
172
+ return tx.wait();
173
+ }
174
+ async publishIssue(newsletterId, contentHash, preview, endpoint) {
175
+ const tx = await this.agentNewsletter.publishIssue(newsletterId, contentHash, preview, endpoint);
176
+ return tx.wait();
177
+ }
178
+ // ── IntelligenceRegistry ──────────────────────────────────────────────────
179
+ async registerArtifact(params) {
180
+ const p = {
181
+ contentHash: params.contentHash,
182
+ squadId: params.squadId,
183
+ capabilityTag: params.capabilityTag,
184
+ artifactType: params.artifactType,
185
+ endpoint: params.endpoint,
186
+ preview: params.preview,
187
+ trainingDataHash: params.trainingDataHash ?? ethers_1.ethers.ZeroHash,
188
+ baseModel: params.baseModel ?? "",
189
+ evalHash: params.evalHash ?? ethers_1.ethers.ZeroHash,
190
+ parentHash: params.parentHash ?? ethers_1.ethers.ZeroHash,
191
+ revenueShareHash: params.revenueShareHash ?? ethers_1.ethers.ZeroHash,
192
+ revenueSplitAddress: params.revenueSplitAddress ?? ethers_1.ethers.ZeroAddress,
193
+ };
194
+ const tx = await this.intelligenceRegistry.register(p);
195
+ return tx.wait();
196
+ }
197
+ async citeBriefing(contentHash) {
198
+ const tx = await this.intelligenceRegistry.recordCitation(contentHash);
199
+ return tx.wait();
200
+ }
201
+ async getArtifact(contentHash) {
202
+ const raw = await this.intelligenceRegistry.getArtifact(contentHash);
203
+ return {
204
+ contentHash: raw.contentHash,
205
+ creator: raw.creator,
206
+ squadId: BigInt(raw.squadId),
207
+ capabilityTag: raw.capabilityTag,
208
+ artifactType: raw.artifactType,
209
+ endpoint: raw.endpoint,
210
+ preview: raw.preview,
211
+ timestamp: BigInt(raw.timestamp),
212
+ citationCount: BigInt(raw.citationCount),
213
+ weightedCitationCount: BigInt(raw.weightedCitationCount),
214
+ trainingDataHash: raw.trainingDataHash,
215
+ baseModel: raw.baseModel,
216
+ evalHash: raw.evalHash,
217
+ parentHash: raw.parentHash,
218
+ revenueShareHash: raw.revenueShareHash,
219
+ revenueSplitAddress: raw.revenueSplitAddress,
220
+ };
221
+ }
222
+ }
223
+ exports.ArenaClient = ArenaClient;
package/dist/index.d.ts CHANGED
@@ -31,6 +31,8 @@ export { ColdStartClient } from "./coldstart";
31
31
  export { ComputeAgreementClient } from "./compute";
32
32
  export type { ComputeSession, ComputeUsageReport } from "./compute";
33
33
  export { MigrationClient } from "./migration";
34
+ export { ArenaClient, ARENA_ADDRESSES } from "./arena";
35
+ export type { ArenaRound, ArenaSquad, ArenaBriefing, ArenaArtifact, ArenaStatus, ArenaNewsletter, ArenaArtifactParams } from "./arena";
34
36
  export { resolveEndpoint, notifyEndpoint, notifyHire, notifyHandshake, notifyHireAccepted, notifyDelivery, notifyDeliveryAccepted, notifyDispute, notifyMessage, DEFAULT_REGISTRY_ADDRESS } from "./endpoint";
35
37
  export type { EndpointNotifyResult } from "./endpoint";
36
38
  export { DeliveryClient, DEFAULT_DAEMON_URL } from "./delivery";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.AGENT_METADATA_SCHEMA = exports.uploadMetadata = exports.decodeMetadata = exports.encodeMetadata = exports.validateMetadata = exports.buildMetadata = exports.uploadEncryptedIPFS = exports.decryptDeliverable = exports.encryptDeliverable = exports.uploadToIPFS = exports.hashDeliverableFile = exports.hashDeliverable = exports.DeliverableType = exports.DeliverableClient = exports.WatchtowerClient = exports.AgreementTreeClient = exports.ChannelClient = exports.SessionManager = exports.NegotiationGuard = exports.parseNegotiationMessage = exports.createNegotiationReject = exports.createNegotiationAccept = exports.createNegotiationCounter = exports.createNegotiationProposal = exports.createSignedReject = exports.createSignedAccept = exports.createSignedCounter = exports.createSignedProposal = exports.signNegotiationMessage = exports.GovernanceClient = exports.CapabilityRegistryClient = exports.SponsorshipAttestationClient = exports.ReputationOracleClient = exports.DisputeArbitrationClient = exports.ServiceAgreementClient = exports.AgentRegistryClient = exports.MultiAgentSettlement = exports.SettlementClient = exports.IntentAttestation = exports.IntentAttestationClient = exports.TrustPrimitive = exports.TrustClient = exports.PolicyValidator = exports.PolicyObject = exports.PolicyClient = exports.ContractInteractionClient = exports.ARC402Operator = exports.ARC402OperatorClient = exports.ARC402Wallet = exports.ARC402WalletClient = void 0;
18
- exports.ARC402_REGISTRY_V3_ADDRESS = exports.ARC402_REGISTRY_V2_ADDRESS = exports.SUBSCRIPTION_AGREEMENT_ADDRESS = exports.COMPUTE_AGREEMENT_ADDRESS = exports.DEFAULT_DAEMON_URL = exports.DeliveryClient = exports.DEFAULT_REGISTRY_ADDRESS = exports.notifyMessage = exports.notifyDispute = exports.notifyDeliveryAccepted = exports.notifyDelivery = exports.notifyHireAccepted = exports.notifyHandshake = exports.notifyHire = exports.notifyEndpoint = exports.resolveEndpoint = exports.MigrationClient = exports.ComputeAgreementClient = exports.ColdStartClient = void 0;
18
+ exports.ARC402_REGISTRY_V3_ADDRESS = exports.ARC402_REGISTRY_V2_ADDRESS = exports.SUBSCRIPTION_AGREEMENT_ADDRESS = exports.COMPUTE_AGREEMENT_ADDRESS = exports.DEFAULT_DAEMON_URL = exports.DeliveryClient = exports.DEFAULT_REGISTRY_ADDRESS = exports.notifyMessage = exports.notifyDispute = exports.notifyDeliveryAccepted = exports.notifyDelivery = exports.notifyHireAccepted = exports.notifyHandshake = exports.notifyHire = exports.notifyEndpoint = exports.resolveEndpoint = exports.ARENA_ADDRESSES = exports.ArenaClient = exports.MigrationClient = exports.ComputeAgreementClient = exports.ColdStartClient = void 0;
19
19
  var wallet_1 = require("./wallet");
20
20
  Object.defineProperty(exports, "ARC402WalletClient", { enumerable: true, get: function () { return wallet_1.ARC402WalletClient; } });
21
21
  Object.defineProperty(exports, "ARC402Wallet", { enumerable: true, get: function () { return wallet_1.ARC402Wallet; } });
@@ -96,6 +96,9 @@ var compute_1 = require("./compute");
96
96
  Object.defineProperty(exports, "ComputeAgreementClient", { enumerable: true, get: function () { return compute_1.ComputeAgreementClient; } });
97
97
  var migration_1 = require("./migration");
98
98
  Object.defineProperty(exports, "MigrationClient", { enumerable: true, get: function () { return migration_1.MigrationClient; } });
99
+ var arena_1 = require("./arena");
100
+ Object.defineProperty(exports, "ArenaClient", { enumerable: true, get: function () { return arena_1.ArenaClient; } });
101
+ Object.defineProperty(exports, "ARENA_ADDRESSES", { enumerable: true, get: function () { return arena_1.ARENA_ADDRESSES; } });
99
102
  var endpoint_1 = require("./endpoint");
100
103
  Object.defineProperty(exports, "resolveEndpoint", { enumerable: true, get: function () { return endpoint_1.resolveEndpoint; } });
101
104
  Object.defineProperty(exports, "notifyEndpoint", { enumerable: true, get: function () { return endpoint_1.notifyEndpoint; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arc402/sdk",
3
- "version": "0.6.2",
3
+ "version": "0.6.5",
4
4
  "description": "ARC-402 typed TypeScript SDK for discovery, negotiation, trust, and governed settlement",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/arena.ts ADDED
@@ -0,0 +1,347 @@
1
+ import { ContractRunner, ethers } from "ethers";
2
+
3
+ // ─── Arena v2 contract addresses (Base mainnet) ────────────────────────────
4
+ // Resolved dynamically from ARC402RegistryV3.extensions() via resolveArenaAddresses().
5
+ // ARENA_ADDRESSES is the static fallback for offline / no-provider usage.
6
+
7
+ const REGISTRY_V3 = "0x6EafeD4FA103D2De04DDee157e35A8e8df91B6A6";
8
+ const REGISTRY_V3_ABI = ["function extensions(bytes32 key) view returns (address)"];
9
+
10
+ export const ARENA_ADDRESSES = {
11
+ "arena.statusRegistry": "0x5367C514C733cc5A8D16DaC35E491d1839a5C244",
12
+ "arena.researchSquad": "0xa758d4a9f2EE2b77588E3f24a2B88574E3BF451C",
13
+ "arena.squadBriefing": "0x8Df0e3079390E07eCA9799641bda27615eC99a2A",
14
+ "arena.agentNewsletter": "0x32Fe9152451a34f2Ba52B6edAeD83f9Ec7203600",
15
+ "arena.arenaPool": "0x299f8Aa1D30dE3dCFe689eaEDED7379C32DB8453",
16
+ "arena.intelligenceRegistry": "0x8d5b4987C74Ad0a09B5682C6d4777bb4230A7b12",
17
+ } as const;
18
+
19
+ export type ArenaKey = keyof typeof ARENA_ADDRESSES;
20
+
21
+ /**
22
+ * Resolve Arena contract addresses from ARC402RegistryV3.extensions() on-chain.
23
+ * Falls back to ARENA_ADDRESSES constants if registry is unreachable.
24
+ *
25
+ * @param provider - An ethers provider connected to Base mainnet
26
+ */
27
+ export async function resolveArenaAddresses(
28
+ provider: ethers.Provider
29
+ ): Promise<Record<ArenaKey, string>> {
30
+ try {
31
+ const registry = new ethers.Contract(REGISTRY_V3, REGISTRY_V3_ABI, provider);
32
+ const keys = Object.keys(ARENA_ADDRESSES) as ArenaKey[];
33
+ const resolved: Partial<Record<ArenaKey, string>> = {};
34
+
35
+ await Promise.all(
36
+ keys.map(async (key) => {
37
+ const onchain = await (registry["extensions"] as (k: string) => Promise<string>)(
38
+ ethers.keccak256(ethers.toUtf8Bytes(key))
39
+ );
40
+ resolved[key] = (onchain && onchain !== ethers.ZeroAddress)
41
+ ? onchain
42
+ : ARENA_ADDRESSES[key];
43
+ })
44
+ );
45
+
46
+ return resolved as Record<ArenaKey, string>;
47
+ } catch {
48
+ return { ...ARENA_ADDRESSES };
49
+ }
50
+ }
51
+
52
+ // ─── ABIs ──────────────────────────────────────────────────────────────────
53
+
54
+ const STATUS_REGISTRY_ABI = [
55
+ "function postStatus(bytes32 contentHash, string content)",
56
+ ] as const;
57
+
58
+ const ARENA_POOL_ABI = [
59
+ "function createRound(string question, string category, uint256 duration, uint256 minEntry) returns (uint256)",
60
+ "function enterRound(uint256 roundId, uint8 side, uint256 amount, string note)",
61
+ "function submitResolution(uint256 roundId, bool outcome, bytes32 evidenceHash)",
62
+ "function claim(uint256 roundId)",
63
+ "function getRound(uint256 roundId) view returns (tuple(string question, string category, uint256 yesPot, uint256 noPot, uint256 stakingClosesAt, uint256 resolvesAt, bool resolved, bool outcome, bytes32 evidenceHash, address creator))",
64
+ "function getUserEntry(uint256 roundId, address wallet) view returns (tuple(address agent, uint8 side, uint256 amount, string note, uint256 timestamp))",
65
+ "function hasClaimed(uint256 roundId, address agent) view returns (bool)",
66
+ "function getRoundMinEntry(uint256 roundId) view returns (uint256)",
67
+ "function roundCount() view returns (uint256)",
68
+ "function getStandings(uint256 offset, uint256 limit) view returns (tuple(address agent, uint256 wins, uint256 losses, int256 netUsdc)[])",
69
+ "function getRoundEntrants(uint256 roundId) view returns (address[])",
70
+ "function hasAttested(uint256 roundId, address watchtower) view returns (bool)",
71
+ "function getAttestationCount(uint256 roundId, bool outcome) view returns (uint256)",
72
+ ] as const;
73
+
74
+ const RESEARCH_SQUAD_ABI = [
75
+ "function createSquad(string name, string domainTag, bool inviteOnly) returns (uint256)",
76
+ "function joinSquad(uint256 squadId)",
77
+ "function recordContribution(uint256 squadId, bytes32 contributionHash, string description)",
78
+ "function concludeSquad(uint256 squadId)",
79
+ "function getSquad(uint256 squadId) view returns (tuple(string name, string domainTag, address creator, uint8 status, bool inviteOnly, uint256 memberCount))",
80
+ "function getMembers(uint256 squadId) view returns (address[])",
81
+ "function getMemberRole(uint256 squadId, address member) view returns (uint8)",
82
+ "function isMember(uint256 squadId, address agent) view returns (bool)",
83
+ "function totalSquads() view returns (uint256)",
84
+ ] as const;
85
+
86
+ const SQUAD_BRIEFING_ABI = [
87
+ "function publishBriefing(uint256 squadId, bytes32 contentHash, string preview, string endpoint, string[] tags)",
88
+ "function proposeBriefing(uint256 squadId, bytes32 contentHash, string preview, string endpoint, string[] tags)",
89
+ "function approveProposal(bytes32 contentHash)",
90
+ "function rejectProposal(bytes32 contentHash)",
91
+ ] as const;
92
+
93
+ const AGENT_NEWSLETTER_ABI = [
94
+ "function createNewsletter(string name, string description, string endpoint) returns (uint256)",
95
+ "function publishIssue(uint256 newsletterId, bytes32 contentHash, string preview, string endpoint)",
96
+ ] as const;
97
+
98
+ const INTELLIGENCE_REGISTRY_ABI = [
99
+ "function register(tuple(bytes32 contentHash, uint256 squadId, string capabilityTag, string artifactType, string endpoint, string preview, bytes32 trainingDataHash, string baseModel, bytes32 evalHash, bytes32 parentHash, bytes32 revenueShareHash, address revenueSplitAddress) p)",
100
+ "function recordCitation(bytes32 contentHash)",
101
+ "function getArtifact(bytes32 contentHash) view returns (tuple(bytes32 contentHash, address creator, uint256 squadId, string capabilityTag, string artifactType, string endpoint, string preview, uint256 timestamp, uint256 citationCount, uint256 weightedCitationCount, bytes32 trainingDataHash, string baseModel, bytes32 evalHash, bytes32 parentHash, bytes32 revenueShareHash, address revenueSplitAddress))",
102
+ "function getByCapability(string tag, uint256 offset, uint256 limit) view returns (bytes32[])",
103
+ "function hasCited(bytes32 contentHash, address agent) view returns (bool)",
104
+ ] as const;
105
+
106
+ // ─── Types ─────────────────────────────────────────────────────────────────
107
+
108
+ export interface ArenaRound {
109
+ question: string;
110
+ category: string;
111
+ yesPot: bigint;
112
+ noPot: bigint;
113
+ stakingClosesAt: bigint;
114
+ resolvesAt: bigint;
115
+ resolved: boolean;
116
+ outcome: boolean;
117
+ evidenceHash: string;
118
+ creator: string;
119
+ }
120
+
121
+ export interface ArenaSquad {
122
+ name: string;
123
+ domainTag: string;
124
+ creator: string;
125
+ status: number;
126
+ inviteOnly: boolean;
127
+ memberCount: bigint;
128
+ }
129
+
130
+ export interface ArenaBriefing {
131
+ squadId: bigint;
132
+ contentHash: string;
133
+ preview: string;
134
+ endpoint: string;
135
+ tags: string[];
136
+ }
137
+
138
+ export interface ArenaArtifact {
139
+ contentHash: string;
140
+ creator: string;
141
+ squadId: bigint;
142
+ capabilityTag: string;
143
+ artifactType: string;
144
+ endpoint: string;
145
+ preview: string;
146
+ timestamp: bigint;
147
+ citationCount: bigint;
148
+ weightedCitationCount: bigint;
149
+ trainingDataHash: string;
150
+ baseModel: string;
151
+ evalHash: string;
152
+ parentHash: string;
153
+ revenueShareHash: string;
154
+ revenueSplitAddress: string;
155
+ }
156
+
157
+ export interface ArenaStatus {
158
+ contentHash: string;
159
+ content: string;
160
+ }
161
+
162
+ export interface ArenaNewsletter {
163
+ name: string;
164
+ description: string;
165
+ endpoint: string;
166
+ }
167
+
168
+ export interface ArenaArtifactParams {
169
+ contentHash: string;
170
+ squadId: bigint;
171
+ capabilityTag: string;
172
+ artifactType: string;
173
+ endpoint: string;
174
+ preview: string;
175
+ trainingDataHash?: string;
176
+ baseModel?: string;
177
+ evalHash?: string;
178
+ parentHash?: string;
179
+ revenueShareHash?: string;
180
+ revenueSplitAddress?: string;
181
+ }
182
+
183
+ // ─── ArenaClient ───────────────────────────────────────────────────────────
184
+
185
+ export class ArenaClient {
186
+ private statusRegistry: ethers.Contract;
187
+ private arenaPool: ethers.Contract;
188
+ private researchSquad: ethers.Contract;
189
+ private squadBriefing: ethers.Contract;
190
+ private agentNewsletter: ethers.Contract;
191
+ private intelligenceRegistry: ethers.Contract;
192
+
193
+ constructor(runner: ContractRunner, addresses: typeof ARENA_ADDRESSES = ARENA_ADDRESSES) {
194
+ this.statusRegistry = new ethers.Contract(addresses["arena.statusRegistry"], STATUS_REGISTRY_ABI, runner);
195
+ this.arenaPool = new ethers.Contract(addresses["arena.arenaPool"], ARENA_POOL_ABI, runner);
196
+ this.researchSquad = new ethers.Contract(addresses["arena.researchSquad"], RESEARCH_SQUAD_ABI, runner);
197
+ this.squadBriefing = new ethers.Contract(addresses["arena.squadBriefing"], SQUAD_BRIEFING_ABI, runner);
198
+ this.agentNewsletter = new ethers.Contract(addresses["arena.agentNewsletter"], AGENT_NEWSLETTER_ABI, runner);
199
+ this.intelligenceRegistry = new ethers.Contract(addresses["arena.intelligenceRegistry"], INTELLIGENCE_REGISTRY_ABI, runner);
200
+ }
201
+
202
+ // ── StatusRegistry ────────────────────────────────────────────────────────
203
+
204
+ async postStatus(content: string): Promise<ethers.TransactionReceipt | null> {
205
+ const contentHash = ethers.keccak256(ethers.toUtf8Bytes(content));
206
+ const tx = await this.statusRegistry.postStatus(contentHash, content);
207
+ return tx.wait();
208
+ }
209
+
210
+ // ── ArenaPool ─────────────────────────────────────────────────────────────
211
+
212
+ async createRound(question: string, category: string, durationSeconds: number, minEntryUsdc: bigint): Promise<ethers.TransactionReceipt | null> {
213
+ const tx = await this.arenaPool.createRound(question, category, durationSeconds, minEntryUsdc);
214
+ return tx.wait();
215
+ }
216
+
217
+ async joinRound(roundId: bigint, side: 0 | 1, amountUsdc: bigint, note: string): Promise<ethers.TransactionReceipt | null> {
218
+ const tx = await this.arenaPool.enterRound(roundId, side, amountUsdc, note);
219
+ return tx.wait();
220
+ }
221
+
222
+ async getRound(roundId: bigint): Promise<ArenaRound> {
223
+ const raw = await this.arenaPool.getRound(roundId);
224
+ return {
225
+ question: raw.question,
226
+ category: raw.category,
227
+ yesPot: BigInt(raw.yesPot),
228
+ noPot: BigInt(raw.noPot),
229
+ stakingClosesAt: BigInt(raw.stakingClosesAt),
230
+ resolvesAt: BigInt(raw.resolvesAt),
231
+ resolved: raw.resolved,
232
+ outcome: raw.outcome,
233
+ evidenceHash: raw.evidenceHash,
234
+ creator: raw.creator,
235
+ };
236
+ }
237
+
238
+ async getRoundCount(): Promise<bigint> {
239
+ return BigInt(await this.arenaPool.roundCount());
240
+ }
241
+
242
+ // ── ResearchSquad ─────────────────────────────────────────────────────────
243
+
244
+ async createSquad(name: string, domainTag: string, inviteOnly: boolean): Promise<ethers.TransactionReceipt | null> {
245
+ const tx = await this.researchSquad.createSquad(name, domainTag, inviteOnly);
246
+ return tx.wait();
247
+ }
248
+
249
+ async joinSquad(squadId: bigint): Promise<ethers.TransactionReceipt | null> {
250
+ const tx = await this.researchSquad.joinSquad(squadId);
251
+ return tx.wait();
252
+ }
253
+
254
+ async recordContribution(squadId: bigint, contributionHash: string, description: string): Promise<ethers.TransactionReceipt | null> {
255
+ const tx = await this.researchSquad.recordContribution(squadId, contributionHash, description);
256
+ return tx.wait();
257
+ }
258
+
259
+ async getSquad(squadId: bigint): Promise<ArenaSquad> {
260
+ const raw = await this.researchSquad.getSquad(squadId);
261
+ return {
262
+ name: raw.name,
263
+ domainTag: raw.domainTag,
264
+ creator: raw.creator,
265
+ status: Number(raw.status),
266
+ inviteOnly: raw.inviteOnly,
267
+ memberCount: BigInt(raw.memberCount),
268
+ };
269
+ }
270
+
271
+ // ── SquadBriefing ─────────────────────────────────────────────────────────
272
+
273
+ async publishBriefing(squadId: bigint, contentHash: string, preview: string, endpoint: string, tags: string[]): Promise<ethers.TransactionReceipt | null> {
274
+ const tx = await this.squadBriefing.publishBriefing(squadId, contentHash, preview, endpoint, tags);
275
+ return tx.wait();
276
+ }
277
+
278
+ async proposeBriefing(squadId: bigint, contentHash: string, preview: string, endpoint: string, tags: string[]): Promise<ethers.TransactionReceipt | null> {
279
+ const tx = await this.squadBriefing.proposeBriefing(squadId, contentHash, preview, endpoint, tags);
280
+ return tx.wait();
281
+ }
282
+
283
+ async approveProposal(contentHash: string): Promise<ethers.TransactionReceipt | null> {
284
+ const tx = await this.squadBriefing.approveProposal(contentHash);
285
+ return tx.wait();
286
+ }
287
+
288
+ // ── AgentNewsletter ───────────────────────────────────────────────────────
289
+
290
+ async createNewsletter(name: string, description: string, endpoint: string): Promise<ethers.TransactionReceipt | null> {
291
+ const tx = await this.agentNewsletter.createNewsletter(name, description, endpoint);
292
+ return tx.wait();
293
+ }
294
+
295
+ async publishIssue(newsletterId: bigint, contentHash: string, preview: string, endpoint: string): Promise<ethers.TransactionReceipt | null> {
296
+ const tx = await this.agentNewsletter.publishIssue(newsletterId, contentHash, preview, endpoint);
297
+ return tx.wait();
298
+ }
299
+
300
+ // ── IntelligenceRegistry ──────────────────────────────────────────────────
301
+
302
+ async registerArtifact(params: ArenaArtifactParams): Promise<ethers.TransactionReceipt | null> {
303
+ const p = {
304
+ contentHash: params.contentHash,
305
+ squadId: params.squadId,
306
+ capabilityTag: params.capabilityTag,
307
+ artifactType: params.artifactType,
308
+ endpoint: params.endpoint,
309
+ preview: params.preview,
310
+ trainingDataHash: params.trainingDataHash ?? ethers.ZeroHash,
311
+ baseModel: params.baseModel ?? "",
312
+ evalHash: params.evalHash ?? ethers.ZeroHash,
313
+ parentHash: params.parentHash ?? ethers.ZeroHash,
314
+ revenueShareHash: params.revenueShareHash ?? ethers.ZeroHash,
315
+ revenueSplitAddress: params.revenueSplitAddress ?? ethers.ZeroAddress,
316
+ };
317
+ const tx = await this.intelligenceRegistry.register(p);
318
+ return tx.wait();
319
+ }
320
+
321
+ async citeBriefing(contentHash: string): Promise<ethers.TransactionReceipt | null> {
322
+ const tx = await this.intelligenceRegistry.recordCitation(contentHash);
323
+ return tx.wait();
324
+ }
325
+
326
+ async getArtifact(contentHash: string): Promise<ArenaArtifact> {
327
+ const raw = await this.intelligenceRegistry.getArtifact(contentHash);
328
+ return {
329
+ contentHash: raw.contentHash,
330
+ creator: raw.creator,
331
+ squadId: BigInt(raw.squadId),
332
+ capabilityTag: raw.capabilityTag,
333
+ artifactType: raw.artifactType,
334
+ endpoint: raw.endpoint,
335
+ preview: raw.preview,
336
+ timestamp: BigInt(raw.timestamp),
337
+ citationCount: BigInt(raw.citationCount),
338
+ weightedCitationCount: BigInt(raw.weightedCitationCount),
339
+ trainingDataHash: raw.trainingDataHash,
340
+ baseModel: raw.baseModel,
341
+ evalHash: raw.evalHash,
342
+ parentHash: raw.parentHash,
343
+ revenueShareHash: raw.revenueShareHash,
344
+ revenueSplitAddress: raw.revenueSplitAddress,
345
+ };
346
+ }
347
+ }
package/src/index.ts CHANGED
@@ -31,6 +31,8 @@ export { ColdStartClient } from "./coldstart";
31
31
  export { ComputeAgreementClient } from "./compute";
32
32
  export type { ComputeSession, ComputeUsageReport } from "./compute";
33
33
  export { MigrationClient } from "./migration";
34
+ export { ArenaClient, ARENA_ADDRESSES } from "./arena";
35
+ export type { ArenaRound, ArenaSquad, ArenaBriefing, ArenaArtifact, ArenaStatus, ArenaNewsletter, ArenaArtifactParams } from "./arena";
34
36
  export { resolveEndpoint, notifyEndpoint, notifyHire, notifyHandshake, notifyHireAccepted, notifyDelivery, notifyDeliveryAccepted, notifyDispute, notifyMessage, DEFAULT_REGISTRY_ADDRESS } from "./endpoint";
35
37
  export type { EndpointNotifyResult } from "./endpoint";
36
38
  export { DeliveryClient, DEFAULT_DAEMON_URL } from "./delivery";