@telaro/sacp 1.0.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 (75) hide show
  1. package/INTEGRATION.md +238 -0
  2. package/README.md +253 -0
  3. package/dist/codec.d.ts +35 -0
  4. package/dist/codec.d.ts.map +1 -0
  5. package/dist/codec.js +63 -0
  6. package/dist/codec.js.map +1 -0
  7. package/dist/constants.d.ts +50 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +50 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/dispatcher.d.ts +87 -0
  12. package/dist/dispatcher.d.ts.map +1 -0
  13. package/dist/dispatcher.js +175 -0
  14. package/dist/dispatcher.js.map +1 -0
  15. package/dist/events.d.ts +93 -0
  16. package/dist/events.d.ts.map +1 -0
  17. package/dist/events.js +142 -0
  18. package/dist/events.js.map +1 -0
  19. package/dist/index.d.ts +38 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +39 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/job.d.ts +99 -0
  24. package/dist/job.d.ts.map +1 -0
  25. package/dist/job.js +297 -0
  26. package/dist/job.js.map +1 -0
  27. package/dist/lst.d.ts +52 -0
  28. package/dist/lst.d.ts.map +1 -0
  29. package/dist/lst.js +58 -0
  30. package/dist/lst.js.map +1 -0
  31. package/dist/negotiation.d.ts +66 -0
  32. package/dist/negotiation.d.ts.map +1 -0
  33. package/dist/negotiation.js +184 -0
  34. package/dist/negotiation.js.map +1 -0
  35. package/dist/offering.d.ts +65 -0
  36. package/dist/offering.d.ts.map +1 -0
  37. package/dist/offering.js +190 -0
  38. package/dist/offering.js.map +1 -0
  39. package/dist/pdas.d.ts +44 -0
  40. package/dist/pdas.d.ts.map +1 -0
  41. package/dist/pdas.js +95 -0
  42. package/dist/pdas.js.map +1 -0
  43. package/dist/runtime.d.ts +244 -0
  44. package/dist/runtime.d.ts.map +1 -0
  45. package/dist/runtime.js +481 -0
  46. package/dist/runtime.js.map +1 -0
  47. package/dist/signer.d.ts +107 -0
  48. package/dist/signer.d.ts.map +1 -0
  49. package/dist/signer.js +94 -0
  50. package/dist/signer.js.map +1 -0
  51. package/dist/take_rate.d.ts +44 -0
  52. package/dist/take_rate.d.ts.map +1 -0
  53. package/dist/take_rate.js +141 -0
  54. package/dist/take_rate.js.map +1 -0
  55. package/dist/timeout.d.ts +35 -0
  56. package/dist/timeout.d.ts.map +1 -0
  57. package/dist/timeout.js +113 -0
  58. package/dist/timeout.js.map +1 -0
  59. package/dist/types.d.ts +39 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +13 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/validation.d.ts +133 -0
  64. package/dist/validation.d.ts.map +1 -0
  65. package/dist/validation.js +315 -0
  66. package/dist/validation.js.map +1 -0
  67. package/dist/watcher.d.ts +67 -0
  68. package/dist/watcher.d.ts.map +1 -0
  69. package/dist/watcher.js +176 -0
  70. package/dist/watcher.js.map +1 -0
  71. package/dist/wormhole.d.ts +88 -0
  72. package/dist/wormhole.d.ts.map +1 -0
  73. package/dist/wormhole.js +152 -0
  74. package/dist/wormhole.js.map +1 -0
  75. package/package.json +138 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,315 @@
1
+ import { PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, Transaction, TransactionInstruction, sendAndConfirmTransaction, } from "@solana/web3.js";
2
+ import { encodeInstruction, encodeString, encodeU64, encodeU8, } from "./codec.js";
3
+ import { SACP_PROGRAM_ID, SACP_VALIDATION_PROGRAM_ID } from "./constants.js";
4
+ import { findBondAuthorityPda, findBondVaultPda, findChallengePda, findEscrowPda, findEscrowVaultPda, findJobPda, findSacpConfigPda, findResolverConfigPda, findTreasuryAuthorityPda, findTreasuryVaultPda, findValidatorPda, } from "./pdas.js";
5
+ import { getTreasuryTokenAccount } from "./take_rate.js";
6
+ import { VERDICT_WINNER_NUMERIC } from "./types.js";
7
+ /**
8
+ * Part B — Validation Registry SDK (v0.2).
9
+ *
10
+ * Real SPL bond escrow: register pins a bond mint, stake / withdraw
11
+ * move tokens, resolve_challenge with slash splits the bond 70/30.
12
+ *
13
+ * Account orders mirror `programs/sacp_validation/src/lib.rs`. Same
14
+ * pattern as the job-side SDK — Borsh + discriminator, no IDL
15
+ * dependency. The version-lock guarantee carries: a v0.1 SDK won't
16
+ * deserialize against the v0.2 deployment (account count changed).
17
+ */
18
+ const SACP_VALIDATION = SACP_VALIDATION_PROGRAM_ID;
19
+ const SPL_TOKEN_PROGRAM_ID = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
20
+ const SPL_ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
21
+ const URI_MAX_BYTES = 256;
22
+ function assertUri(uri, name) {
23
+ const len = Buffer.byteLength(uri, "utf8");
24
+ if (len > URI_MAX_BYTES) {
25
+ throw new Error(`${name} exceeds 256-byte limit (got ${len} bytes)`);
26
+ }
27
+ }
28
+ // ─────────────────────────── init_treasury_vault ─────────────────────
29
+ /**
30
+ * Permissionless treasury vault bootstrap (one per bond mint).
31
+ * Anyone can pay rent; the vault is owned by a program PDA so funds
32
+ * can only be moved by a future governance instruction.
33
+ */
34
+ export function buildInitTreasuryVaultIx(payer, bondMint) {
35
+ const [treasuryAuthorityPda] = findTreasuryAuthorityPda();
36
+ const [treasuryVaultPda] = findTreasuryVaultPda(bondMint);
37
+ const data = encodeInstruction("init_treasury_vault");
38
+ const ix = new TransactionInstruction({
39
+ programId: SACP_VALIDATION,
40
+ keys: [
41
+ { pubkey: payer, isSigner: true, isWritable: true },
42
+ { pubkey: bondMint, isSigner: false, isWritable: false },
43
+ { pubkey: treasuryAuthorityPda, isSigner: false, isWritable: false },
44
+ { pubkey: treasuryVaultPda, isSigner: false, isWritable: true },
45
+ { pubkey: SPL_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
46
+ { pubkey: SPL_ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
47
+ { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false },
48
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
49
+ ],
50
+ data,
51
+ });
52
+ return { ix, treasuryVaultPda };
53
+ }
54
+ export function buildRegisterValidatorIx(params) {
55
+ assertUri(params.metadataUri, "metadataUri");
56
+ const [validatorPda] = findValidatorPda(params.authority);
57
+ const [bondAuthorityPda] = findBondAuthorityPda(params.authority);
58
+ const [bondVaultPda] = findBondVaultPda(params.authority);
59
+ const data = encodeInstruction("register_validator", encodeString(params.metadataUri));
60
+ const ix = new TransactionInstruction({
61
+ programId: SACP_VALIDATION,
62
+ keys: [
63
+ { pubkey: params.authority, isSigner: true, isWritable: true },
64
+ { pubkey: params.bondMint, isSigner: false, isWritable: false },
65
+ { pubkey: validatorPda, isSigner: false, isWritable: true },
66
+ { pubkey: bondAuthorityPda, isSigner: false, isWritable: false },
67
+ { pubkey: bondVaultPda, isSigner: false, isWritable: true },
68
+ { pubkey: SPL_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
69
+ { pubkey: SPL_ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
70
+ { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false },
71
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
72
+ ],
73
+ data,
74
+ });
75
+ return { ix, validatorPda, bondAuthorityPda, bondVaultPda };
76
+ }
77
+ export function buildStakeBondIx(params) {
78
+ if (params.amount <= 0n)
79
+ throw new Error("amount must be > 0");
80
+ const [validatorPda] = findValidatorPda(params.authority);
81
+ const [bondVaultPda] = findBondVaultPda(params.authority);
82
+ const data = encodeInstruction("stake_bond", encodeU64(params.amount));
83
+ return new TransactionInstruction({
84
+ programId: SACP_VALIDATION,
85
+ keys: [
86
+ { pubkey: params.authority, isSigner: true, isWritable: true },
87
+ { pubkey: validatorPda, isSigner: false, isWritable: true },
88
+ { pubkey: params.operatorTokenAccount, isSigner: false, isWritable: true },
89
+ { pubkey: bondVaultPda, isSigner: false, isWritable: true },
90
+ { pubkey: SPL_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
91
+ ],
92
+ data,
93
+ });
94
+ }
95
+ // ───────────────────────────── accept_verdict ────────────────────────
96
+ export function buildAcceptVerdictIx(authority, jobId, winner) {
97
+ const [validatorPda] = findValidatorPda(authority);
98
+ const data = encodeInstruction("accept_verdict", encodeU64(jobId), encodeU8(VERDICT_WINNER_NUMERIC[winner]));
99
+ return new TransactionInstruction({
100
+ programId: SACP_VALIDATION,
101
+ keys: [
102
+ { pubkey: authority, isSigner: true, isWritable: false },
103
+ { pubkey: validatorPda, isSigner: false, isWritable: false },
104
+ ],
105
+ data,
106
+ });
107
+ }
108
+ export function buildIssueVerdictIx(params) {
109
+ const [validatorPda] = findValidatorPda(params.authority);
110
+ const [jobPda] = findJobPda(params.jobId);
111
+ const [escrowPda] = findEscrowPda(params.jobId);
112
+ const [escrowVaultPda] = findEscrowVaultPda(params.jobId);
113
+ const [configPda] = findSacpConfigPda();
114
+ const treasuryAta = getTreasuryTokenAccount(params.bondMint);
115
+ const data = encodeInstruction("issue_verdict", encodeU64(params.jobId), encodeU8(VERDICT_WINNER_NUMERIC[params.winner]));
116
+ return new TransactionInstruction({
117
+ programId: SACP_VALIDATION,
118
+ keys: [
119
+ { pubkey: params.authority, isSigner: true, isWritable: true },
120
+ { pubkey: validatorPda, isSigner: false, isWritable: true },
121
+ { pubkey: jobPda, isSigner: false, isWritable: true },
122
+ { pubkey: params.client, isSigner: false, isWritable: false },
123
+ { pubkey: params.provider, isSigner: false, isWritable: false },
124
+ { pubkey: escrowPda, isSigner: false, isWritable: false },
125
+ { pubkey: escrowVaultPda, isSigner: false, isWritable: true },
126
+ { pubkey: params.clientTokenAccount, isSigner: false, isWritable: true },
127
+ { pubkey: params.providerTokenAccount, isSigner: false, isWritable: true },
128
+ { pubkey: configPda, isSigner: false, isWritable: false },
129
+ { pubkey: treasuryAta, isSigner: false, isWritable: true },
130
+ { pubkey: params.validatorTokenAccount, isSigner: false, isWritable: true },
131
+ { pubkey: SPL_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
132
+ { pubkey: SACP_PROGRAM_ID, isSigner: false, isWritable: false },
133
+ ],
134
+ data,
135
+ });
136
+ }
137
+ export function buildChallengeVerdictIx(params) {
138
+ assertUri(params.evidenceUri, "evidenceUri");
139
+ const [validatorPda] = findValidatorPda(params.validatorAuthority);
140
+ const [challengePda] = findChallengePda(params.jobId);
141
+ const data = encodeInstruction("challenge_verdict", encodeU64(params.jobId), encodeString(params.evidenceUri));
142
+ const ix = new TransactionInstruction({
143
+ programId: SACP_VALIDATION,
144
+ keys: [
145
+ { pubkey: params.challenger, isSigner: true, isWritable: true },
146
+ { pubkey: validatorPda, isSigner: false, isWritable: true },
147
+ { pubkey: challengePda, isSigner: false, isWritable: true },
148
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
149
+ ],
150
+ data,
151
+ });
152
+ return { ix, challengePda };
153
+ }
154
+ export function buildResolveChallengeIx(params) {
155
+ const [validatorPda] = findValidatorPda(params.validatorAuthority);
156
+ const [challengePda] = findChallengePda(params.jobId);
157
+ const [bondAuthorityPda] = findBondAuthorityPda(params.validatorAuthority);
158
+ const [bondVaultPda] = findBondVaultPda(params.validatorAuthority);
159
+ const [treasuryVaultPda] = findTreasuryVaultPda(params.bondMint);
160
+ const [resolverConfigPda] = findResolverConfigPda();
161
+ const data = encodeInstruction("resolve_challenge", encodeU8(params.slash ? 1 : 0));
162
+ return new TransactionInstruction({
163
+ programId: SACP_VALIDATION,
164
+ keys: [
165
+ { pubkey: params.authority, isSigner: true, isWritable: false },
166
+ { pubkey: resolverConfigPda, isSigner: false, isWritable: false },
167
+ { pubkey: validatorPda, isSigner: false, isWritable: true },
168
+ { pubkey: challengePda, isSigner: false, isWritable: true },
169
+ { pubkey: bondAuthorityPda, isSigner: false, isWritable: false },
170
+ { pubkey: bondVaultPda, isSigner: false, isWritable: true },
171
+ { pubkey: params.challengerTokenAccount, isSigner: false, isWritable: true },
172
+ { pubkey: treasuryVaultPda, isSigner: false, isWritable: true },
173
+ { pubkey: SPL_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
174
+ ],
175
+ data,
176
+ });
177
+ }
178
+ // ─────────────────────────── ResolverConfig admin ────────────────────
179
+ export function buildInitResolverConfigIx(params) {
180
+ const [resolverConfigPda] = findResolverConfigPda();
181
+ const data = encodeInstruction("init_resolver_config", Buffer.from(params.authority.toBytes()));
182
+ return new TransactionInstruction({
183
+ programId: SACP_VALIDATION,
184
+ keys: [
185
+ { pubkey: params.payer, isSigner: true, isWritable: true },
186
+ { pubkey: resolverConfigPda, isSigner: false, isWritable: true },
187
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
188
+ ],
189
+ data,
190
+ });
191
+ }
192
+ export function buildSetResolverAuthorityIx(params) {
193
+ const [resolverConfigPda] = findResolverConfigPda();
194
+ const data = encodeInstruction("set_resolver_authority", Buffer.from(params.newAuthority.toBytes()));
195
+ return new TransactionInstruction({
196
+ programId: SACP_VALIDATION,
197
+ keys: [
198
+ { pubkey: params.authority, isSigner: true, isWritable: false },
199
+ { pubkey: resolverConfigPda, isSigner: false, isWritable: true },
200
+ ],
201
+ data,
202
+ });
203
+ }
204
+ export async function fetchResolverConfig(connection) {
205
+ const [resolverConfigPda] = findResolverConfigPda();
206
+ const info = await connection.getAccountInfo(resolverConfigPda, "confirmed");
207
+ if (!info)
208
+ return null;
209
+ // discriminator(8) | authority(32) | bump(1)
210
+ return { authority: new PublicKey(info.data.subarray(8, 40)) };
211
+ }
212
+ export function buildWithdrawBondIx(params) {
213
+ if (params.amount <= 0n)
214
+ throw new Error("amount must be > 0");
215
+ const [validatorPda] = findValidatorPda(params.authority);
216
+ const [bondAuthorityPda] = findBondAuthorityPda(params.authority);
217
+ const [bondVaultPda] = findBondVaultPda(params.authority);
218
+ const data = encodeInstruction("withdraw_bond", encodeU64(params.amount));
219
+ return new TransactionInstruction({
220
+ programId: SACP_VALIDATION,
221
+ keys: [
222
+ { pubkey: params.authority, isSigner: true, isWritable: false },
223
+ { pubkey: validatorPda, isSigner: false, isWritable: true },
224
+ { pubkey: bondAuthorityPda, isSigner: false, isWritable: false },
225
+ { pubkey: bondVaultPda, isSigner: false, isWritable: true },
226
+ { pubkey: params.operatorTokenAccount, isSigner: false, isWritable: true },
227
+ { pubkey: SPL_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
228
+ ],
229
+ data,
230
+ });
231
+ }
232
+ // ─────────────────────────────── convenience ─────────────────────────
233
+ export async function registerValidator(connection, operator, params) {
234
+ const { ix, validatorPda, bondVaultPda } = buildRegisterValidatorIx({
235
+ authority: operator.publicKey,
236
+ bondMint: params.bondMint,
237
+ metadataUri: params.metadataUri,
238
+ });
239
+ const tx = new Transaction().add(ix);
240
+ const txSignature = await sendAndConfirmTransaction(connection, tx, [operator], {
241
+ commitment: "confirmed",
242
+ });
243
+ return { validatorPda, bondVaultPda, txSignature };
244
+ }
245
+ export async function fetchValidator(connection, authority) {
246
+ const [validatorPda] = findValidatorPda(authority);
247
+ const info = await connection.getAccountInfo(validatorPda, "confirmed");
248
+ if (!info)
249
+ return null;
250
+ const data = info.data;
251
+ let offset = 8;
252
+ const auth = new PublicKey(data.subarray(offset, offset + 32));
253
+ offset += 32;
254
+ const uriLen = data.readUInt32LE(offset);
255
+ offset += 4;
256
+ const metadataUri = data.subarray(offset, offset + uriLen).toString("utf8");
257
+ offset += uriLen;
258
+ const bondMint = new PublicKey(data.subarray(offset, offset + 32));
259
+ offset += 32;
260
+ const bondAmount = data.readBigUInt64LE(offset);
261
+ offset += 8;
262
+ const slashCount = data.readUInt32LE(offset);
263
+ offset += 4;
264
+ const activeChallenges = data.readUInt32LE(offset);
265
+ offset += 4;
266
+ const registeredAt = data.readBigInt64LE(offset);
267
+ offset += 8;
268
+ // bond_bump (1) + bump (1) — skip
269
+ offset += 2;
270
+ // v0.9 fields. Old accounts won't have these — guard on length.
271
+ const tail = data.length - offset;
272
+ const successfulSettles = tail >= 4 ? data.readUInt32LE(offset) : 0;
273
+ if (tail >= 4)
274
+ offset += 4;
275
+ const failedChallenges = tail - 4 >= 4 ? data.readUInt32LE(offset) : 0;
276
+ if (tail - 4 >= 4)
277
+ offset += 4;
278
+ const wonChallenges = tail - 8 >= 4 ? data.readUInt32LE(offset) : 0;
279
+ return {
280
+ authority: auth,
281
+ metadataUri,
282
+ bondMint,
283
+ bondAmount,
284
+ slashCount,
285
+ activeChallenges,
286
+ registeredAt,
287
+ successfulSettles,
288
+ failedChallenges,
289
+ wonChallenges,
290
+ };
291
+ }
292
+ export async function fetchChallenge(connection, jobId) {
293
+ const [challengePda] = findChallengePda(jobId);
294
+ const info = await connection.getAccountInfo(challengePda, "confirmed");
295
+ if (!info)
296
+ return null;
297
+ const data = info.data;
298
+ let offset = 8;
299
+ const id = data.readBigUInt64LE(offset);
300
+ offset += 8;
301
+ const challenger = new PublicKey(data.subarray(offset, offset + 32));
302
+ offset += 32;
303
+ const validator = new PublicKey(data.subarray(offset, offset + 32));
304
+ offset += 32;
305
+ const uriLen = data.readUInt32LE(offset);
306
+ offset += 4;
307
+ const evidenceUri = data.subarray(offset, offset + uriLen).toString("utf8");
308
+ offset += uriLen;
309
+ const filedAt = data.readBigInt64LE(offset);
310
+ offset += 8;
311
+ const resolved = data.readUInt8(offset) === 1;
312
+ return { jobId: id, challenger, validator, evidenceUri, filedAt, resolved };
313
+ }
314
+ export { findBondAuthorityPda, findBondVaultPda, findChallengePda, findValidatorPda, };
315
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { type FetchedJob } from "./job.js";
2
+ import { findJobPda } from "./pdas.js";
3
+ import { SacpClient, JobSession, type JobActors } from "./runtime.js";
4
+ import type { SacpSigner } from "./signer.js";
5
+ export interface WatcherCallbackContext {
6
+ job: FetchedJob;
7
+ /** Constructed JobSession with the watcher's signer plugged in. The
8
+ * counterparty signers (Client / Provider / Evaluator that aren't
9
+ * the watcher) are pubkey-only stubs; if your callback needs to
10
+ * sign on their behalf you must supply them via `resolveActors`. */
11
+ session: JobSession;
12
+ }
13
+ export interface ProviderRuntimeOptions {
14
+ client: SacpClient;
15
+ /** Provider signer — this watcher claims jobs that name this pubkey
16
+ * as the `provider`. */
17
+ signer: SacpSigner;
18
+ /** How often to poll. Defaults to 5 seconds. */
19
+ pollIntervalMs?: number;
20
+ /** Called for each Job that is in `Funded` state and not already
21
+ * handled. Throwing skips this Job; the next poll will retry. */
22
+ onJobAssigned: (ctx: WatcherCallbackContext) => Promise<void>;
23
+ /** Optional: turn pubkey-only counterparty roles into real signers,
24
+ * e.g. for tests or for an operator that holds multiple roles. */
25
+ resolveActors?: (job: FetchedJob) => Promise<Partial<JobActors>>;
26
+ /** Optional logger. Defaults to console.error for errors only. */
27
+ logger?: {
28
+ info: (m: string) => void;
29
+ error: (m: string, e?: unknown) => void;
30
+ };
31
+ }
32
+ export interface EvaluatorRuntimeOptions {
33
+ client: SacpClient;
34
+ /** Evaluator signer — this watcher claims jobs that name this
35
+ * pubkey as the `evaluator`. */
36
+ signer: SacpSigner;
37
+ pollIntervalMs?: number;
38
+ /** Called for each Job that is in `Disputed` state and not already
39
+ * handled. */
40
+ onDisputeAssigned: (ctx: WatcherCallbackContext) => Promise<void>;
41
+ resolveActors?: (job: FetchedJob) => Promise<Partial<JobActors>>;
42
+ logger?: {
43
+ info: (m: string) => void;
44
+ error: (m: string, e?: unknown) => void;
45
+ };
46
+ }
47
+ export declare class ProviderRuntime {
48
+ private readonly opts;
49
+ private timer;
50
+ private seen;
51
+ constructor(opts: ProviderRuntimeOptions);
52
+ start(): Promise<void>;
53
+ stop(): void;
54
+ private tick;
55
+ }
56
+ export declare class EvaluatorRuntime {
57
+ private readonly opts;
58
+ private timer;
59
+ private seen;
60
+ constructor(opts: EvaluatorRuntimeOptions);
61
+ start(): Promise<void>;
62
+ stop(): void;
63
+ private tick;
64
+ }
65
+ /** Internal: expose findJobPda for downstream watchers that need it. */
66
+ export { findJobPda };
67
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA4B9C,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,UAAU,CAAC;IAChB;;;wEAGoE;IACpE,OAAO,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB;4BACwB;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;qEACiE;IACjE,aAAa,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D;sEACkE;IAClE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,kEAAkE;IAClE,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAC;CACjF;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,UAAU,CAAC;IACnB;oCACgC;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;kBACc;IACd,iBAAiB,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAC;CACjF;AAoED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAGI;IACzB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,IAAI,CAAqB;gBAErB,IAAI,EAAE,sBAAsB;IAOlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,IAAI,IAAI;YAOE,IAAI;CA2BnB;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAGK;IAC1B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,IAAI,CAAqB;gBAErB,IAAI,EAAE,uBAAuB;IAOnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,IAAI,IAAI;YAOE,IAAI;CAiCnB;AAED,wEAAwE;AACxE,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,176 @@
1
+ import { SACP_PROGRAM_ID } from "./constants.js";
2
+ import { parseJobFromBuffer } from "./job.js";
3
+ import { findJobPda } from "./pdas.js";
4
+ import { JobSession } from "./runtime.js";
5
+ /**
6
+ * v0.9 — runtime watchers.
7
+ *
8
+ * `ProviderRuntime` and `EvaluatorRuntime` are long-lived agents that
9
+ * watch the program for Jobs whose `provider` or `evaluator` field
10
+ * matches the signer, then hand the Job to a user callback as a fully
11
+ * constructed `JobSession`.
12
+ *
13
+ * Both runtimes use polling (`getProgramAccounts` + memcmp on the
14
+ * provider/evaluator offset), not `accountSubscribe`. Polling is more
15
+ * predictable under flaky RPC, matches idolly-acp's pattern, and
16
+ * survives RPC restarts without a reconnection loop. WebSocket
17
+ * subscription can be added later as an optimization.
18
+ *
19
+ * Offsets in the `Job` account, in bytes:
20
+ * discriminator(8) | job_id(8) | client(32) | provider(32) | evaluator(32) | ...
21
+ *
22
+ * So provider sits at offset 48, evaluator at offset 80. `state` is
23
+ * after the variable-length work_uri, so we can't memcmp it; we
24
+ * filter by pubkey + parse the buffer + reject states we don't want.
25
+ */
26
+ const PROVIDER_OFFSET = 48;
27
+ const EVALUATOR_OFFSET = 80;
28
+ /* ─── shared internals ─────────────────────────────────────────────── */
29
+ async function fetchJobsByActor(conn, actor, role) {
30
+ const offset = role === "provider" ? PROVIDER_OFFSET : EVALUATOR_OFFSET;
31
+ const accounts = await conn.getProgramAccounts(SACP_PROGRAM_ID, {
32
+ commitment: "confirmed",
33
+ filters: [{ memcmp: { offset, bytes: actor.toBase58() } }],
34
+ });
35
+ const out = [];
36
+ for (const { account } of accounts) {
37
+ try {
38
+ out.push(parseJobFromBuffer(account.data));
39
+ }
40
+ catch {
41
+ // Not a Job account (different discriminator or truncated by an
42
+ // unrelated program account that happened to memcmp the same).
43
+ }
44
+ }
45
+ return out;
46
+ }
47
+ function makeSession(client, job, signer, role, resolved) {
48
+ const stub = (pk) => ({
49
+ publicKey: pk,
50
+ // Pubkey-only stub. Throws loudly if anything tries to sign for
51
+ // this role from inside the runtime — that means the user's
52
+ // resolveActors didn't return a real signer they need.
53
+ sendAndConfirm: async () => {
54
+ throw new Error(`runtime: tried to sign on behalf of ${pk.toBase58()} but no signer was supplied via resolveActors`);
55
+ },
56
+ });
57
+ const actors = {
58
+ client: resolved?.client ??
59
+ (role === "provider" || role === "evaluator"
60
+ ? stub(job.roles.client)
61
+ : signer),
62
+ provider: resolved?.provider ??
63
+ (role === "provider" ? signer : stub(job.roles.provider)),
64
+ evaluator: resolved?.evaluator ??
65
+ (role === "evaluator" ? signer : stub(job.roles.evaluator)),
66
+ };
67
+ return JobSession.attach(client, {
68
+ jobId: job.jobId,
69
+ actors,
70
+ bondMint: job.bondMint,
71
+ });
72
+ }
73
+ /* ─── ProviderRuntime ──────────────────────────────────────────────── */
74
+ export class ProviderRuntime {
75
+ opts;
76
+ timer = null;
77
+ seen = new Set();
78
+ constructor(opts) {
79
+ this.opts = {
80
+ pollIntervalMs: opts.pollIntervalMs ?? 5_000,
81
+ ...opts,
82
+ };
83
+ }
84
+ async start() {
85
+ if (this.timer)
86
+ return;
87
+ await this.tick(); // immediate run on start
88
+ this.timer = setInterval(() => void this.tick(), this.opts.pollIntervalMs);
89
+ }
90
+ stop() {
91
+ if (this.timer) {
92
+ clearInterval(this.timer);
93
+ this.timer = null;
94
+ }
95
+ }
96
+ async tick() {
97
+ const { client, signer, onJobAssigned, resolveActors, logger } = this.opts;
98
+ try {
99
+ const jobs = await fetchJobsByActor(client.connection, signer.publicKey, "provider");
100
+ for (const job of jobs) {
101
+ if (job.state !== "Funded")
102
+ continue;
103
+ const key = `${job.jobId}`;
104
+ if (this.seen.has(key))
105
+ continue;
106
+ this.seen.add(key);
107
+ try {
108
+ const resolved = resolveActors ? await resolveActors(job) : undefined;
109
+ const session = makeSession(client, job, signer, "provider", resolved);
110
+ await onJobAssigned({ job, session });
111
+ }
112
+ catch (e) {
113
+ // Allow retry on the next tick.
114
+ this.seen.delete(key);
115
+ logger?.error(`onJobAssigned threw for job ${job.jobId}`, e);
116
+ }
117
+ }
118
+ }
119
+ catch (e) {
120
+ logger?.error("ProviderRuntime tick failed", e);
121
+ }
122
+ }
123
+ }
124
+ /* ─── EvaluatorRuntime ─────────────────────────────────────────────── */
125
+ export class EvaluatorRuntime {
126
+ opts;
127
+ timer = null;
128
+ seen = new Set();
129
+ constructor(opts) {
130
+ this.opts = {
131
+ pollIntervalMs: opts.pollIntervalMs ?? 5_000,
132
+ ...opts,
133
+ };
134
+ }
135
+ async start() {
136
+ if (this.timer)
137
+ return;
138
+ await this.tick();
139
+ this.timer = setInterval(() => void this.tick(), this.opts.pollIntervalMs);
140
+ }
141
+ stop() {
142
+ if (this.timer) {
143
+ clearInterval(this.timer);
144
+ this.timer = null;
145
+ }
146
+ }
147
+ async tick() {
148
+ const { client, signer, onDisputeAssigned, resolveActors, logger } = this.opts;
149
+ try {
150
+ const jobs = await fetchJobsByActor(client.connection, signer.publicKey, "evaluator");
151
+ for (const job of jobs) {
152
+ if (job.state !== "Disputed")
153
+ continue;
154
+ const key = `${job.jobId}`;
155
+ if (this.seen.has(key))
156
+ continue;
157
+ this.seen.add(key);
158
+ try {
159
+ const resolved = resolveActors ? await resolveActors(job) : undefined;
160
+ const session = makeSession(client, job, signer, "evaluator", resolved);
161
+ await onDisputeAssigned({ job, session });
162
+ }
163
+ catch (e) {
164
+ this.seen.delete(key);
165
+ logger?.error(`onDisputeAssigned threw for job ${job.jobId}`, e);
166
+ }
167
+ }
168
+ }
169
+ catch (e) {
170
+ logger?.error("EvaluatorRuntime tick failed", e);
171
+ }
172
+ }
173
+ }
174
+ /** Internal: expose findJobPda for downstream watchers that need it. */
175
+ export { findJobPda };
176
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}