@ic402/client 0.1.5 → 2.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.
package/dist/evm.d.ts ADDED
@@ -0,0 +1,108 @@
1
+ import { type Hash, type TransactionReceipt, type PublicClient } from 'viem';
2
+ import type { SignedTransaction, SignedAuthorization } from './types.js';
3
+ export type Ic402ErrorKind = 'transient' | 'no_match' | 'sign_failed' | 'settlement_failed' | 'broadcast_failed' | 'insufficient_funds' | 'nonce_error' | 'not_confirmed' | 'http_error' | 'config_error' | 'unknown';
4
+ export declare class Ic402Error extends Error {
5
+ readonly kind: Ic402ErrorKind;
6
+ readonly retryable: boolean;
7
+ readonly detail?: unknown;
8
+ constructor(kind: Ic402ErrorKind, message: string, detail?: unknown);
9
+ }
10
+ export declare function classifyNetworkError(e: unknown): Ic402Error;
11
+ export interface PaymentOption {
12
+ recipient: string;
13
+ amount: bigint;
14
+ tokenName: string;
15
+ tokenVersion: string;
16
+ network: string;
17
+ asset: string;
18
+ ic402Nonce?: string;
19
+ }
20
+ /**
21
+ * Parse a 402 response and find the cheapest payment option matching the given chain.
22
+ * Matches by CAIP-2 network string (eip155:{chainId}) or common alias (e.g., "base").
23
+ */
24
+ export declare function findPaymentOption(body: string, chainId: number): PaymentOption | null;
25
+ export type FetchX402Result = {
26
+ status: 'ok';
27
+ code: number;
28
+ body: string;
29
+ paidAmount: bigint;
30
+ } | {
31
+ status: 'free';
32
+ code: number;
33
+ body: string;
34
+ } | {
35
+ status: 'error';
36
+ error: Ic402Error;
37
+ };
38
+ /**
39
+ * Probe a URL for x402 payment requirements.
40
+ * Returns the payment option if 402, or the response if free/error.
41
+ */
42
+ export type ProbeResult = {
43
+ status: 'payment_required';
44
+ paymentOption: PaymentOption;
45
+ } | {
46
+ status: 'free';
47
+ code: number;
48
+ body: string;
49
+ } | {
50
+ status: 'error';
51
+ error: Ic402Error;
52
+ };
53
+ /**
54
+ * Probe a URL for x402 payment requirements.
55
+ * Returns the payment option if 402, or the response if free/error.
56
+ */
57
+ export declare function probeX402(url: string, chainId: number, init?: RequestInit): Promise<ProbeResult>;
58
+ /**
59
+ * Complete x402 fetch: probe → sign via canister → retry with payment header.
60
+ *
61
+ * @param url - The x402-gated URL
62
+ * @param chainId - EVM chain to pay on
63
+ * @param signPayment - Function that calls the canister's signX402Payment endpoint
64
+ * @param init - Optional fetch init (method, headers, body)
65
+ */
66
+ export declare function fetchX402(url: string, chainId: number, signPayment: (recipient: string, amount: bigint, tokenName: string, tokenVersion: string) => Promise<SignedAuthorization>, init?: RequestInit): Promise<FetchX402Result>;
67
+ /**
68
+ * Create a viem public client for the given chain.
69
+ * Uses the chain's default public RPC, or a custom URL.
70
+ */
71
+ export declare function createEvmClient(chainId: number, rpcUrl?: string): PublicClient;
72
+ /**
73
+ * Get the current nonce for an address.
74
+ */
75
+ export declare function getEvmNonce(client: PublicClient, address: string): Promise<bigint>;
76
+ /**
77
+ * Get current fee data (maxFeePerGas, maxPriorityFeePerGas).
78
+ */
79
+ export declare function getFeeData(client: PublicClient): Promise<{
80
+ maxFeePerGas: bigint;
81
+ maxPriorityFeePerGas: bigint;
82
+ }>;
83
+ /**
84
+ * Broadcast a signed raw transaction and return the tx hash.
85
+ */
86
+ export declare function broadcastTransaction(client: PublicClient, rawTx: string): Promise<Hash>;
87
+ /**
88
+ * Poll for a transaction receipt until confirmed or max attempts reached.
89
+ */
90
+ export declare function pollReceipt(client: PublicClient, txHash: Hash, maxAttempts?: number, intervalMs?: number): Promise<TransactionReceipt | null>;
91
+ /**
92
+ * Parse AgentRegistered event from transaction logs.
93
+ * event AgentRegistered(uint256 indexed tokenId, address indexed owner, ...)
94
+ */
95
+ export declare function parseAgentRegisteredEvent(receipt: TransactionReceipt): bigint | null;
96
+ /**
97
+ * Full agent registration flow: get chain state → sign via canister → broadcast → poll.
98
+ *
99
+ * @param signRegistration - Function that calls the canister's signAgentRegistration endpoint
100
+ * @param chainId - Target EVM chain
101
+ * @param rpcUrl - Optional custom RPC URL
102
+ */
103
+ export declare function registerAgent(signRegistration: (nonce: bigint, maxFeePerGas: bigint, maxPriorityFeePerGas: bigint) => Promise<SignedTransaction>, canisterEvmAddress: string, chainId: number, rpcUrl?: string): Promise<{
104
+ tokenId: bigint | null;
105
+ txHash: Hash;
106
+ receipt: TransactionReceipt | null;
107
+ }>;
108
+ //# sourceMappingURL=evm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../src/evm.ts"],"names":[],"mappings":"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"}
package/dist/evm.js ADDED
@@ -0,0 +1,437 @@
1
+ /// EVM client-side utilities for ic402 remote signing.
2
+ ///
3
+ /// Handles the client half of the remote signing pattern:
4
+ /// probing x402 URLs, broadcasting signed transactions,
5
+ /// polling receipts, and fetching chain state.
6
+ import { createPublicClient, http, defineChain, keccak256, toHex, } from 'viem';
7
+ export class Ic402Error extends Error {
8
+ kind;
9
+ retryable;
10
+ detail;
11
+ constructor(kind, message, detail) {
12
+ super(message);
13
+ this.name = 'Ic402Error';
14
+ this.kind = kind;
15
+ this.retryable = kind === 'transient' || kind === 'nonce_error';
16
+ this.detail = detail;
17
+ }
18
+ }
19
+ export function classifyNetworkError(e) {
20
+ const msg = e instanceof Error ? e.message : String(e);
21
+ if (/timeout|ETIMEDOUT|ECONNREFUSED|ENOTFOUND|fetch failed/i.test(msg)) {
22
+ return new Ic402Error('transient', msg, e);
23
+ }
24
+ if (/rate.?limit|429|too many/i.test(msg)) {
25
+ return new Ic402Error('transient', msg, e);
26
+ }
27
+ return new Ic402Error('unknown', msg, e);
28
+ }
29
+ function classifyRpcError(e) {
30
+ const msg = e instanceof Error ? e.message : String(e);
31
+ if (/nonce too low/i.test(msg))
32
+ return new Ic402Error('nonce_error', msg, e);
33
+ if (/nonce too high/i.test(msg))
34
+ return new Ic402Error('nonce_error', msg, e);
35
+ if (/insufficient funds|gas/i.test(msg))
36
+ return new Ic402Error('insufficient_funds', msg, e);
37
+ if (/timeout|rate.?limit|429/i.test(msg))
38
+ return new Ic402Error('transient', msg, e);
39
+ return new Ic402Error('broadcast_failed', msg, e);
40
+ }
41
+ // ── Chain alias mapping (matches Motoko EvmSigner) ──
42
+ const CHAIN_ALIASES = {
43
+ 8453: 'base',
44
+ 84532: 'base-sepolia',
45
+ 1: 'ethereum',
46
+ 11155111: 'ethereum-sepolia',
47
+ 43114: 'avalanche',
48
+ 43113: 'avalanche-fuji',
49
+ 10: 'optimism',
50
+ 11155420: 'optimism-sepolia',
51
+ 42161: 'arbitrum',
52
+ 421614: 'arbitrum-sepolia',
53
+ };
54
+ // Default public RPCs per chain (free, no API key required)
55
+ const DEFAULT_RPC = {
56
+ 8453: 'https://mainnet.base.org',
57
+ 84532: 'https://sepolia.base.org',
58
+ 1: 'https://eth.llamarpc.com',
59
+ 11155111: 'https://rpc.sepolia.org',
60
+ 43114: 'https://api.avax.network/ext/bc/C/rpc',
61
+ 43113: 'https://api.avax-test.network/ext/bc/C/rpc',
62
+ 10: 'https://mainnet.optimism.io',
63
+ 11155420: 'https://sepolia.optimism.io',
64
+ 42161: 'https://arb1.arbitrum.io/rpc',
65
+ 421614: 'https://sepolia-rollup.arbitrum.io/rpc',
66
+ };
67
+ /** Build a minimal viem Chain from a chain ID and optional RPC URL. */
68
+ function chainForId(chainId, rpcUrl) {
69
+ const url = rpcUrl ?? DEFAULT_RPC[chainId];
70
+ if (!url)
71
+ throw new Ic402Error('config_error', `No default RPC for chain ${chainId}. Provide rpcUrl.`);
72
+ return defineChain({
73
+ id: chainId,
74
+ name: CHAIN_ALIASES[chainId] ?? `eip155:${chainId}`,
75
+ nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },
76
+ rpcUrls: {
77
+ default: { http: [url] },
78
+ },
79
+ });
80
+ }
81
+ /**
82
+ * Parse a 402 response and find the cheapest payment option matching the given chain.
83
+ * Matches by CAIP-2 network string (eip155:{chainId}) or common alias (e.g., "base").
84
+ */
85
+ export function findPaymentOption(body, chainId) {
86
+ const caip2 = `eip155:${chainId}`;
87
+ const alias = CHAIN_ALIASES[chainId] ?? '';
88
+ // Try to parse as JSON first (structured format)
89
+ try {
90
+ const parsed = JSON.parse(body);
91
+ const accepts = parsed.accepts ?? parsed.x402?.accepts ?? [parsed];
92
+ let best = null;
93
+ let bestAmount = BigInt('0xFFFFFFFFFFFFFFFF');
94
+ for (const entry of accepts) {
95
+ const e = entry;
96
+ const network = String(e.network ?? '');
97
+ if (network !== caip2 && network !== alias)
98
+ continue;
99
+ const rawAmount = e.maxAmountRequired ?? e.amount;
100
+ const amount = BigInt(String(rawAmount ?? '0'));
101
+ if (amount <= 0n || amount >= bestAmount)
102
+ continue;
103
+ const payTo = String(e.payTo ?? '');
104
+ if (!payTo)
105
+ continue;
106
+ const extra = (e.extra ?? {});
107
+ best = {
108
+ recipient: payTo,
109
+ amount,
110
+ tokenName: extra.name || 'USD Coin',
111
+ tokenVersion: extra.version || '2',
112
+ network: caip2,
113
+ asset: String(e.asset ?? ''),
114
+ ic402Nonce: e.ic402Nonce ? String(e.ic402Nonce) : undefined,
115
+ };
116
+ bestAmount = amount;
117
+ }
118
+ return best;
119
+ }
120
+ catch {
121
+ // Fall back to string splitting (handles non-standard JSON or partial responses)
122
+ return findPaymentOptionFromText(body, chainId, caip2, alias);
123
+ }
124
+ }
125
+ function findPaymentOptionFromText(body, chainId, caip2, alias) {
126
+ const needles = [`"network":"${caip2}"`, ...(alias ? [`"network":"${alias}"`] : [])];
127
+ let best = null;
128
+ let bestAmount = BigInt('0xFFFFFFFFFFFFFFFF');
129
+ for (const needle of needles) {
130
+ const parts = body.split(needle);
131
+ for (let i = 1; i < parts.length; i++) {
132
+ const entry = parts[i];
133
+ const payTo = extractJsonField(entry, 'payTo');
134
+ let amount = extractJsonNat(entry, 'maxAmountRequired');
135
+ if (amount === 0n)
136
+ amount = extractJsonNat(entry, 'amount');
137
+ if (!payTo || amount <= 0n || amount >= bestAmount)
138
+ continue;
139
+ const name = extractJsonField(entry, 'name') || 'USD Coin';
140
+ const version = extractJsonField(entry, 'version') || '2';
141
+ best = {
142
+ recipient: payTo,
143
+ amount,
144
+ tokenName: name,
145
+ tokenVersion: version,
146
+ network: `eip155:${chainId}`,
147
+ asset: extractJsonField(entry, 'asset') || '',
148
+ ic402Nonce: extractJsonField(entry, 'ic402Nonce') || undefined,
149
+ };
150
+ bestAmount = amount;
151
+ }
152
+ }
153
+ return best;
154
+ }
155
+ function extractJsonField(text, field) {
156
+ const needle = `"${field}":"`;
157
+ const idx = text.indexOf(needle);
158
+ if (idx === -1)
159
+ return '';
160
+ const start = idx + needle.length;
161
+ const end = text.indexOf('"', start);
162
+ if (end === -1)
163
+ return '';
164
+ return text.slice(start, end);
165
+ }
166
+ function extractJsonNat(text, field) {
167
+ const needle = `"${field}":"`;
168
+ const idx = text.indexOf(needle);
169
+ if (idx === -1) {
170
+ // Try without quotes around value
171
+ const needle2 = `"${field}":`;
172
+ const idx2 = text.indexOf(needle2);
173
+ if (idx2 === -1)
174
+ return 0n;
175
+ const start = idx2 + needle2.length;
176
+ const match = text.slice(start, start + 30).match(/^"?(\d+)"?/);
177
+ return match ? BigInt(match[1]) : 0n;
178
+ }
179
+ const start = idx + needle.length;
180
+ const end = text.indexOf('"', start);
181
+ if (end === -1)
182
+ return 0n;
183
+ try {
184
+ return BigInt(text.slice(start, end));
185
+ }
186
+ catch {
187
+ return 0n;
188
+ }
189
+ }
190
+ /**
191
+ * Probe a URL for x402 payment requirements.
192
+ * Returns the payment option if 402, or the response if free/error.
193
+ */
194
+ export async function probeX402(url, chainId, init) {
195
+ let response;
196
+ try {
197
+ response = await fetch(url, { ...init, redirect: 'follow' });
198
+ }
199
+ catch (e) {
200
+ return { status: 'error', error: classifyNetworkError(e) };
201
+ }
202
+ if (response.status !== 402) {
203
+ const body = await response.text();
204
+ if (response.ok)
205
+ return { status: 'free', code: response.status, body };
206
+ return {
207
+ status: 'error',
208
+ error: new Ic402Error('http_error', `HTTP ${response.status}: ${body.slice(0, 200)}`, {
209
+ code: response.status,
210
+ body,
211
+ }),
212
+ };
213
+ }
214
+ // Parse 402 — check payment-required header first, then body
215
+ let paymentJson = '';
216
+ const paymentHeader = response.headers.get('payment-required');
217
+ if (paymentHeader) {
218
+ try {
219
+ paymentJson = atob(paymentHeader);
220
+ }
221
+ catch {
222
+ paymentJson = paymentHeader;
223
+ }
224
+ }
225
+ if (!paymentJson) {
226
+ paymentJson = await response.text();
227
+ }
228
+ const option = findPaymentOption(paymentJson, chainId);
229
+ if (!option) {
230
+ return {
231
+ status: 'error',
232
+ error: new Ic402Error('no_match', `No payment option for eip155:${chainId} in 402 response`),
233
+ };
234
+ }
235
+ return { status: 'payment_required', paymentOption: option };
236
+ }
237
+ /**
238
+ * Complete x402 fetch: probe → sign via canister → retry with payment header.
239
+ *
240
+ * @param url - The x402-gated URL
241
+ * @param chainId - EVM chain to pay on
242
+ * @param signPayment - Function that calls the canister's signX402Payment endpoint
243
+ * @param init - Optional fetch init (method, headers, body)
244
+ */
245
+ export async function fetchX402(url, chainId, signPayment, init) {
246
+ // 1. Probe
247
+ const probeResult = await probeX402(url, chainId, init);
248
+ if (probeResult.status === 'free')
249
+ return probeResult;
250
+ if (probeResult.status === 'error')
251
+ return probeResult;
252
+ const { paymentOption } = probeResult;
253
+ // 2. Sign via canister
254
+ let signed;
255
+ try {
256
+ signed = await signPayment(paymentOption.recipient, paymentOption.amount, paymentOption.tokenName, paymentOption.tokenVersion);
257
+ }
258
+ catch (e) {
259
+ const msg = e instanceof Error ? e.message : String(e);
260
+ const kind = /policy|frozen|not.*owner|not.*operator/i.test(msg)
261
+ ? 'sign_failed'
262
+ : 'unknown';
263
+ return { status: 'error', error: new Ic402Error(kind, msg, e) };
264
+ }
265
+ // 3. Retry with payment header.
266
+ // H-10: echo the ic402 server nonce from the 402 challenge into the payment
267
+ // payload so the canister can lock the bound amount (server-nonce → amount
268
+ // binding). Without it, an EVM-over-HTTP settlement returns #expired.
269
+ let headerToSend = signed.header;
270
+ if (paymentOption.ic402Nonce) {
271
+ try {
272
+ const obj = JSON.parse(atob(signed.header));
273
+ obj.ic402Nonce = paymentOption.ic402Nonce;
274
+ headerToSend = btoa(JSON.stringify(obj));
275
+ }
276
+ catch {
277
+ headerToSend = signed.header; // fall back to the canister-signed header as-is
278
+ }
279
+ }
280
+ let response;
281
+ try {
282
+ const headers = new Headers(init?.headers);
283
+ headers.set('X-Payment', headerToSend);
284
+ headers.set('Payment-Signature', headerToSend);
285
+ response = await fetch(url, { ...init, headers });
286
+ }
287
+ catch (e) {
288
+ return { status: 'error', error: classifyNetworkError(e) };
289
+ }
290
+ const body = await response.text();
291
+ if (response.ok) {
292
+ return { status: 'ok', code: response.status, body, paidAmount: signed.paidAmount };
293
+ }
294
+ if (response.status === 402) {
295
+ return { status: 'error', error: new Ic402Error('settlement_failed', body.slice(0, 200)) };
296
+ }
297
+ return {
298
+ status: 'error',
299
+ error: new Ic402Error('http_error', `HTTP ${response.status}: ${body.slice(0, 200)}`, {
300
+ code: response.status,
301
+ }),
302
+ };
303
+ }
304
+ // ── EVM RPC utilities ──
305
+ /**
306
+ * Create a viem public client for the given chain.
307
+ * Uses the chain's default public RPC, or a custom URL.
308
+ */
309
+ export function createEvmClient(chainId, rpcUrl) {
310
+ const chain = chainForId(chainId, rpcUrl);
311
+ return createPublicClient({ chain, transport: http(rpcUrl) });
312
+ }
313
+ /**
314
+ * Get the current nonce for an address.
315
+ */
316
+ export async function getEvmNonce(client, address) {
317
+ return BigInt(await client.getTransactionCount({ address: address }));
318
+ }
319
+ /**
320
+ * Get current fee data (maxFeePerGas, maxPriorityFeePerGas).
321
+ */
322
+ export async function getFeeData(client) {
323
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
324
+ const block = await client.getBlock({ blockTag: 'latest' });
325
+ const baseFee = block.baseFeePerGas ?? 1000000000n;
326
+ const minPriority = 1000000n;
327
+ const priorityFee = baseFee > 1500000000n ? 1500000000n : baseFee > minPriority ? baseFee : minPriority;
328
+ return {
329
+ maxFeePerGas: 2n * baseFee + priorityFee,
330
+ maxPriorityFeePerGas: priorityFee,
331
+ };
332
+ }
333
+ /**
334
+ * Broadcast a signed raw transaction and return the tx hash.
335
+ */
336
+ export async function broadcastTransaction(client, rawTx) {
337
+ try {
338
+ const hash = await client.request({
339
+ method: 'eth_sendRawTransaction',
340
+ params: [rawTx],
341
+ });
342
+ return hash;
343
+ }
344
+ catch (e) {
345
+ throw classifyRpcError(e);
346
+ }
347
+ }
348
+ /**
349
+ * Poll for a transaction receipt until confirmed or max attempts reached.
350
+ */
351
+ export async function pollReceipt(client, txHash, maxAttempts = 10, intervalMs = 3000) {
352
+ for (let i = 0; i < maxAttempts; i++) {
353
+ try {
354
+ const receipt = await client.getTransactionReceipt({ hash: txHash });
355
+ if (receipt)
356
+ return receipt;
357
+ }
358
+ catch {
359
+ // Not yet mined
360
+ }
361
+ if (i < maxAttempts - 1) {
362
+ await new Promise((r) => setTimeout(r, intervalMs));
363
+ }
364
+ }
365
+ return null;
366
+ }
367
+ /**
368
+ * Parse AgentRegistered event from transaction logs.
369
+ * event AgentRegistered(uint256 indexed tokenId, address indexed owner, ...)
370
+ */
371
+ export function parseAgentRegisteredEvent(receipt) {
372
+ // M-8: Hash the event signature and compare against topics[0]
373
+ const eventSigHash = keccak256(toHex('AgentRegistered(uint256,address,string,string,bool)'));
374
+ for (const log of receipt.logs) {
375
+ if (log.topics.length >= 2 && log.topics[0] === eventSigHash) {
376
+ // topics[1] is the indexed tokenId
377
+ const tokenId = log.topics[1];
378
+ if (tokenId) {
379
+ try {
380
+ return BigInt(tokenId);
381
+ }
382
+ catch {
383
+ continue;
384
+ }
385
+ }
386
+ }
387
+ }
388
+ return null;
389
+ }
390
+ // ── High-level workflows ──
391
+ /**
392
+ * Full agent registration flow: get chain state → sign via canister → broadcast → poll.
393
+ *
394
+ * @param signRegistration - Function that calls the canister's signAgentRegistration endpoint
395
+ * @param chainId - Target EVM chain
396
+ * @param rpcUrl - Optional custom RPC URL
397
+ */
398
+ export async function registerAgent(signRegistration, canisterEvmAddress, chainId, rpcUrl) {
399
+ let client;
400
+ try {
401
+ client = createEvmClient(chainId, rpcUrl);
402
+ }
403
+ catch (e) {
404
+ throw new Ic402Error('config_error', `Failed to create EVM client: ${e instanceof Error ? e.message : String(e)}`);
405
+ }
406
+ // 1. Get chain state
407
+ let nonce;
408
+ let fees;
409
+ try {
410
+ [nonce, fees] = await Promise.all([
411
+ getEvmNonce(client, canisterEvmAddress),
412
+ getFeeData(client),
413
+ ]);
414
+ }
415
+ catch (e) {
416
+ throw classifyNetworkError(e);
417
+ }
418
+ // 2. Sign via canister
419
+ let signed;
420
+ try {
421
+ signed = await signRegistration(nonce, fees.maxFeePerGas, fees.maxPriorityFeePerGas);
422
+ }
423
+ catch (e) {
424
+ throw new Ic402Error('sign_failed', e instanceof Error ? e.message : String(e), e);
425
+ }
426
+ // 3. Broadcast (classifyRpcError handles nonce/gas/funds errors)
427
+ const txHash = await broadcastTransaction(client, signed.rawTx);
428
+ // 4. Poll for receipt
429
+ const receipt = await pollReceipt(client, txHash);
430
+ if (!receipt) {
431
+ throw new Ic402Error('not_confirmed', `Tx ${txHash} submitted but not confirmed within poll window`);
432
+ }
433
+ // 5. Parse event
434
+ const tokenId = parseAgentRegisteredEvent(receipt);
435
+ return { tokenId, txHash, receipt };
436
+ }
437
+ //# sourceMappingURL=evm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm.js","sourceRoot":"","sources":["../src/evm.ts"],"names":[],"mappings":"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"}
package/dist/idl.d.ts CHANGED
@@ -18,6 +18,10 @@ declare const ServiceEntry: IDL.RecordClass;
18
18
  declare const AgentCard: IDL.RecordClass;
19
19
  declare const ContentEntry: IDL.RecordClass;
20
20
  declare const ContentStoreResult: IDL.VariantClass;
21
+ declare const SignedTransaction: IDL.RecordClass;
22
+ declare const SignedAuthorization: IDL.RecordClass;
23
+ declare const SignedTxResult: IDL.VariantClass;
24
+ declare const SignedAuthResult: IDL.VariantClass;
21
25
  export declare const exampleIdlFactory: () => IDL.ServiceClass<string, {
22
26
  search: IDL.FuncClass<[IDL.TextClass, IDL.OptClass<Record<string, any>>], [IDL.VariantClass]>;
23
27
  requestSession: IDL.FuncClass<[], [IDL.RecordClass]>;
@@ -37,12 +41,29 @@ export declare const exampleIdlFactory: () => IDL.ServiceClass<string, {
37
41
  getAgentId: IDL.FuncClass<[], [IDL.OptClass<number | bigint>]>;
38
42
  getEvmPublicKey: IDL.FuncClass<[], [IDL.VecClass<number | bigint>]>;
39
43
  getEvmAddress: IDL.FuncClass<[], [IDL.TextClass]>;
40
- registerAgent: IDL.FuncClass<[], [IDL.VariantClass]>;
41
- fetchX402: IDL.FuncClass<[IDL.TextClass], [IDL.VariantClass]>;
42
- fetchX402Post: IDL.FuncClass<[IDL.TextClass, IDL.TextClass, IDL.TextClass], [IDL.VariantClass]>;
43
44
  verifyGrant: IDL.FuncClass<[IDL.RecordClass], [IDL.VariantClass]>;
44
45
  setPolicy: IDL.FuncClass<[IDL.RecordClass], []>;
45
46
  forceCloseSession: IDL.FuncClass<[IDL.TextClass], [IDL.VariantClass]>;
47
+ signX402Payment: IDL.FuncClass<[IDL.NatClass, IDL.TextClass, IDL.TextClass, IDL.NatClass, IDL.TextClass, IDL.TextClass], [IDL.VariantClass]>;
48
+ signErc20Transfer: IDL.FuncClass<[IDL.NatClass, IDL.TextClass, IDL.TextClass, IDL.NatClass, IDL.NatClass, IDL.NatClass, IDL.NatClass], [IDL.VariantClass]>;
49
+ signEthTransfer: IDL.FuncClass<[IDL.NatClass, IDL.TextClass, IDL.NatClass, IDL.NatClass, IDL.NatClass, IDL.NatClass, IDL.NatClass], [IDL.VariantClass]>;
50
+ signAgentRegistration: IDL.FuncClass<[IDL.NatClass, IDL.NatClass, IDL.NatClass], [IDL.VariantClass]>;
51
+ signTypedData: IDL.FuncClass<[IDL.VecClass<number | bigint>, IDL.VecClass<number | bigint>], [IDL.VariantClass]>;
52
+ keccak256: IDL.FuncClass<[IDL.VecClass<number | bigint>], [IDL.VecClass<number | bigint>]>;
53
+ registerService: IDL.FuncClass<[IDL.TextClass, IDL.TextClass, IDL.VariantClass, IDL.VariantClass, IDL.TextClass, IDL.OptClass<string>, IDL.OptClass<(number | bigint)[]>, IDL.VariantClass, IDL.NatClass], [IDL.VariantClass]>;
54
+ enableService: IDL.FuncClass<[IDL.TextClass], [IDL.VariantClass]>;
55
+ disableService: IDL.FuncClass<[IDL.TextClass], [IDL.VariantClass]>;
56
+ listServices: IDL.FuncClass<[], [IDL.VecClass<Record<string, any>>]>;
57
+ submitServiceRequest: IDL.FuncClass<[IDL.TextClass, IDL.VecClass<number | bigint>, IDL.OptClass<Record<string, any>>], [IDL.VariantClass]>;
58
+ claimJob: IDL.FuncClass<[IDL.TextClass], [IDL.VariantClass]>;
59
+ submitJobResult: IDL.FuncClass<[IDL.TextClass, IDL.VecClass<number | bigint>, IDL.OptClass<(number | bigint)[]>, IDL.OptClass<number | bigint>], [IDL.VariantClass]>;
60
+ confirmJob: IDL.FuncClass<[IDL.TextClass], [IDL.VariantClass]>;
61
+ disputeJob: IDL.FuncClass<[IDL.TextClass, IDL.TextClass], [IDL.VariantClass]>;
62
+ getJobStatus: IDL.FuncClass<[IDL.TextClass], [IDL.OptClass<{
63
+ [x: string]: any;
64
+ }>]>;
65
+ getJob: IDL.FuncClass<[IDL.TextClass], [IDL.OptClass<Record<string, any>>]>;
66
+ getJobResult: IDL.FuncClass<[IDL.TextClass], [IDL.OptClass<(number | bigint)[]>]>;
46
67
  }>;
47
- export { PaymentRequirement, PaymentSignature, PaymentReceipt, PaymentResult, SessionIntent, SessionState, SessionConfig, Voucher, SpendingPolicy, ContentRef, AccessGrant, AccessGrantResult, DeliveryMethod, ContentDelivery, GetContentResult, ContentEntry, ContentStoreResult, ServiceEntry, AgentCard, };
68
+ export { PaymentRequirement, PaymentSignature, PaymentReceipt, PaymentResult, SessionIntent, SessionState, SessionConfig, Voucher, SpendingPolicy, ContentRef, AccessGrant, AccessGrantResult, DeliveryMethod, ContentDelivery, GetContentResult, ContentEntry, ContentStoreResult, ServiceEntry, AgentCard, SignedTransaction, SignedAuthorization, SignedTxResult, SignedAuthResult, };
48
69
  //# sourceMappingURL=idl.d.ts.map
package/dist/idl.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"idl.d.ts","sourceRoot":"","sources":["../src/idl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAE3C,QAAA,MAAM,kBAAkB,iBAUtB,CAAC;AAcH,QAAA,MAAM,gBAAgB,iBAQpB,CAAC;AAEH,QAAA,MAAM,cAAc,iBAWlB,CAAC;AAEH,QAAA,MAAM,aAAa,kBAWjB,CAAC;AAEH,QAAA,MAAM,aAAa,iBASjB,CAAC;AASH,QAAA,MAAM,YAAY,iBAUhB,CAAC;AAEH,QAAA,MAAM,aAAa,iBAIjB,CAAC;AAEH,QAAA,MAAM,OAAO,iBAKX,CAAC;AAEH,QAAA,MAAM,cAAc,iBAUlB,CAAC;AAIH,QAAA,MAAM,UAAU,iBAKd,CAAC;AAEH,QAAA,MAAM,WAAW,iBAQf,CAAC;AAEH,QAAA,MAAM,iBAAiB,kBAKrB,CAAC;AAEH,QAAA,MAAM,cAAc,kBAKlB,CAAC;AAEH,QAAA,MAAM,eAAe,iBAGnB,CAAC;AAEH,QAAA,MAAM,gBAAgB,kBAIpB,CAAC;AAoBH,QAAA,MAAM,YAAY,iBAMhB,CAAC;AAEH,QAAA,MAAM,SAAS,iBAKb,CAAC;AAIH,QAAA,MAAM,YAAY,iBAMhB,CAAC;AAEH,QAAA,MAAM,kBAAkB,kBAMtB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;EAwE1B,CAAC;AAEL,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,OAAO,EACP,cAAc,EACd,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,SAAS,GACV,CAAC"}
1
+ {"version":3,"file":"idl.d.ts","sourceRoot":"","sources":["../src/idl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAE3C,QAAA,MAAM,kBAAkB,iBAUtB,CAAC;AAcH,QAAA,MAAM,gBAAgB,iBAQpB,CAAC;AAEH,QAAA,MAAM,cAAc,iBAWlB,CAAC;AAEH,QAAA,MAAM,aAAa,kBAYjB,CAAC;AAEH,QAAA,MAAM,aAAa,iBASjB,CAAC;AASH,QAAA,MAAM,YAAY,iBAUhB,CAAC;AAEH,QAAA,MAAM,aAAa,iBAIjB,CAAC;AAEH,QAAA,MAAM,OAAO,iBAKX,CAAC;AAEH,QAAA,MAAM,cAAc,iBAUlB,CAAC;AAIH,QAAA,MAAM,UAAU,iBAKd,CAAC;AAEH,QAAA,MAAM,WAAW,iBAQf,CAAC;AAEH,QAAA,MAAM,iBAAiB,kBAKrB,CAAC;AAEH,QAAA,MAAM,cAAc,kBAKlB,CAAC;AAEH,QAAA,MAAM,eAAe,iBAGnB,CAAC;AAEH,QAAA,MAAM,gBAAgB,kBAIpB,CAAC;AAoBH,QAAA,MAAM,YAAY,iBAMhB,CAAC;AAEH,QAAA,MAAM,SAAS,iBAKb,CAAC;AAIH,QAAA,MAAM,YAAY,iBAMhB,CAAC;AAEH,QAAA,MAAM,kBAAkB,kBAMtB,CAAC;AAIH,QAAA,MAAM,iBAAiB,iBAGrB,CAAC;AAYH,QAAA,MAAM,mBAAmB,iBAIvB,CAAC;AAEH,QAAA,MAAM,cAAc,kBAAwD,CAAC;AAC7E,QAAA,MAAM,gBAAgB,kBAA0D,CAAC;AAqEjF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2F1B,CAAC;AAEL,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,OAAO,EACP,cAAc,EACd,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,GACjB,CAAC"}