agent0-sdk 1.2.0 → 1.3.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.
@@ -1,191 +0,0 @@
1
- /**
2
- * Web3 integration layer for smart contract interactions using ethers.js
3
- */
4
- import { ethers, type Contract, type Wallet, type Signer, type JsonRpcProvider, type InterfaceAbi } from 'ethers';
5
- export interface TransactionOptions {
6
- gasLimit?: bigint;
7
- gasPrice?: bigint;
8
- maxFeePerGas?: bigint;
9
- maxPriorityFeePerGas?: bigint;
10
- }
11
- /**
12
- * Web3 client for interacting with ERC-8004 smart contracts
13
- */
14
- export declare class Web3Client {
15
- readonly provider: JsonRpcProvider;
16
- readonly signer?: Wallet | Signer;
17
- chainId: bigint;
18
- /**
19
- * Initialize Web3 client
20
- * @param rpcUrl - RPC endpoint URL
21
- * @param signerOrKey - Optional private key string OR ethers Wallet/Signer for signing transactions
22
- */
23
- constructor(rpcUrl: string, signerOrKey?: string | Wallet | Signer);
24
- /**
25
- * Initialize the client (fetch chain ID)
26
- */
27
- initialize(): Promise<void>;
28
- /**
29
- * Get contract instance
30
- */
31
- getContract(address: string, abi: InterfaceAbi): Contract;
32
- /**
33
- * Call a contract method (view/pure function)
34
- */
35
- callContract(contract: Contract, methodName: string, ...args: any[]): Promise<any>;
36
- /**
37
- * Execute a contract transaction
38
- * For overloaded functions like register(), use registerAgent() wrapper instead
39
- */
40
- transactContract(contract: Contract, methodName: string, options?: TransactionOptions, ...args: any[]): Promise<string>;
41
- /**
42
- * Router wrapper for register() function overloads
43
- * Intelligently selects the correct overload based on arguments:
44
- * - register() - no arguments
45
- * - register(string agentURI) - just agentURI
46
- * - register(string agentURI, tuple[] metadata) - agentURI + metadata
47
- */
48
- private registerAgent;
49
- /**
50
- * Wait for transaction to be mined
51
- */
52
- waitForTransaction(txHash: string, timeout?: number): Promise<ethers.ContractTransactionReceipt>;
53
- /**
54
- * Get contract events
55
- */
56
- getEvents(contract: Contract, eventName: string, fromBlock?: number, toBlock?: number): Promise<ethers.Log[]>;
57
- /**
58
- * Sign a message with the account's private key
59
- */
60
- signMessage(message: string | Uint8Array): Promise<string>;
61
- /**
62
- * Sign typed data (EIP-712) with the account's private key
63
- */
64
- signTypedData(domain: {
65
- name?: string;
66
- version?: string;
67
- chainId?: number | bigint;
68
- verifyingContract?: string;
69
- salt?: string;
70
- }, types: Record<string, any>, value: Record<string, any>): Promise<string>;
71
- /**
72
- * Build canonical EIP-712 typed data for IdentityRegistry.setAgentWallet (ERC-8004 Jan 2026).
73
- *
74
- * Contract expects:
75
- * - domain: name="ERC8004IdentityRegistry", version="1"
76
- * - primary type: AgentWalletSet(uint256 agentId,address newWallet,address owner,uint256 deadline)
77
- */
78
- buildAgentWalletSetTypedData(params: {
79
- agentId: bigint;
80
- newWallet: string;
81
- owner: string;
82
- deadline: bigint;
83
- chainId: number | bigint;
84
- verifyingContract: string;
85
- domainName?: string;
86
- domainVersion?: string;
87
- }): {
88
- domain: {
89
- name: string;
90
- version: string;
91
- chainId: number | bigint;
92
- verifyingContract: string;
93
- };
94
- types: {
95
- AgentWalletSet: Array<{
96
- name: string;
97
- type: string;
98
- }>;
99
- };
100
- message: {
101
- agentId: bigint;
102
- newWallet: string;
103
- owner: string;
104
- deadline: bigint;
105
- };
106
- };
107
- /**
108
- * Legacy typed-data variant (without owner field).
109
- * Some deployments may use AgentWalletSet(uint256 agentId,address newWallet,uint256 deadline).
110
- */
111
- buildAgentWalletSetTypedDataNoOwner(params: {
112
- agentId: bigint;
113
- newWallet: string;
114
- deadline: bigint;
115
- chainId: number | bigint;
116
- verifyingContract: string;
117
- domainName?: string;
118
- domainVersion?: string;
119
- }): {
120
- domain: {
121
- name: string;
122
- version: string;
123
- chainId: number | bigint;
124
- verifyingContract: string;
125
- };
126
- types: {
127
- AgentWalletSet: Array<{
128
- name: string;
129
- type: string;
130
- }>;
131
- };
132
- message: {
133
- agentId: bigint;
134
- newWallet: string;
135
- deadline: bigint;
136
- };
137
- };
138
- /**
139
- * Sign EIP-712 typed data with either:
140
- * - a private key string (EOA), or
141
- * - an ethers Signer (EOA / smart account with a signer abstraction).
142
- */
143
- signTypedDataWith(signerOrKey: string | Wallet | Signer, domain: Record<string, any>, types: Record<string, any>, message: Record<string, any>): Promise<string>;
144
- /**
145
- * Normalize ECDSA signatures to use v = 27/28 (some contracts/libraries expect this).
146
- * ethers may produce signatures with v in {0,1}.
147
- */
148
- normalizeEcdsaSignature(signature: string): string;
149
- /**
150
- * Recover the signer address for EIP-712 typed data (EOA path).
151
- */
152
- recoverTypedDataSigner(domain: Record<string, any>, types: Record<string, any>, message: Record<string, any>, signature: string): string;
153
- /**
154
- * Resolve an address for a provided signer or private key string.
155
- */
156
- addressOf(signerOrKey: string | Wallet | Signer): Promise<string>;
157
- /**
158
- * Recover address from message and signature
159
- */
160
- recoverAddress(message: string | Uint8Array, signature: string): string;
161
- /**
162
- * Compute Keccak-256 hash
163
- */
164
- keccak256(data: string | Uint8Array): string;
165
- /**
166
- * Convert address to checksum format
167
- */
168
- toChecksumAddress(address: string): string;
169
- /**
170
- * Check if string is a valid Ethereum address
171
- */
172
- isAddress(address: string): boolean;
173
- /**
174
- * Get ETH balance of an address
175
- */
176
- getBalance(address: string): Promise<bigint>;
177
- /**
178
- * Get transaction count (nonce) of an address
179
- */
180
- getTransactionCount(address: string): Promise<number>;
181
- /**
182
- * Get the account address (if signer is available)
183
- */
184
- get address(): string | undefined;
185
- /**
186
- * Get the account address asynchronously (if signer is available)
187
- * Use this method when you need the address from a generic Signer
188
- */
189
- getAddress(): Promise<string | undefined>;
190
- }
191
- //# sourceMappingURL=web3-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"web3-client.d.ts","sourceRoot":"","sources":["../../src/core/web3-client.ts"],"names":[],"mappings":"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"}
@@ -1,350 +0,0 @@
1
- /**
2
- * Web3 integration layer for smart contract interactions using ethers.js
3
- */
4
- import { ethers, } from 'ethers';
5
- /**
6
- * Web3 client for interacting with ERC-8004 smart contracts
7
- */
8
- export class Web3Client {
9
- /**
10
- * Initialize Web3 client
11
- * @param rpcUrl - RPC endpoint URL
12
- * @param signerOrKey - Optional private key string OR ethers Wallet/Signer for signing transactions
13
- */
14
- constructor(rpcUrl, signerOrKey) {
15
- this.provider = new ethers.JsonRpcProvider(rpcUrl);
16
- if (signerOrKey) {
17
- if (typeof signerOrKey === 'string') {
18
- // Private key string - create a new Wallet
19
- // Validate that it's not an empty string
20
- if (signerOrKey.trim() === '') {
21
- throw new Error('Private key cannot be empty');
22
- }
23
- this.signer = new ethers.Wallet(signerOrKey, this.provider);
24
- }
25
- else {
26
- // Already a Wallet or Signer - connect to provider if needed
27
- const currentProvider = signerOrKey.provider;
28
- if (currentProvider && currentProvider === this.provider) {
29
- // Already connected to the same provider
30
- this.signer = signerOrKey;
31
- }
32
- else if (typeof signerOrKey.connect === 'function') {
33
- // Connect to provider
34
- try {
35
- this.signer = signerOrKey.connect(this.provider);
36
- }
37
- catch (error) {
38
- throw new Error(`Failed to connect signer to provider: ${error instanceof Error ? error.message : String(error)}`);
39
- }
40
- }
41
- else {
42
- // Signer without connect method - use as-is
43
- this.signer = signerOrKey;
44
- }
45
- }
46
- }
47
- // Get chain ID asynchronously (will be set in async initialization)
48
- // For now, we'll fetch it when needed
49
- this.chainId = 0n;
50
- }
51
- /**
52
- * Initialize the client (fetch chain ID)
53
- */
54
- async initialize() {
55
- const network = await this.provider.getNetwork();
56
- this.chainId = network.chainId;
57
- }
58
- /**
59
- * Get contract instance
60
- */
61
- getContract(address, abi) {
62
- const signerOrProvider = this.signer || this.provider;
63
- return new ethers.Contract(address, abi, signerOrProvider);
64
- }
65
- /**
66
- * Call a contract method (view/pure function)
67
- */
68
- async callContract(contract, methodName, ...args) {
69
- const method = contract[methodName];
70
- if (!method || typeof method !== 'function') {
71
- throw new Error(`Method ${methodName} not found on contract`);
72
- }
73
- return await method(...args);
74
- }
75
- /**
76
- * Execute a contract transaction
77
- * For overloaded functions like register(), use registerAgent() wrapper instead
78
- */
79
- async transactContract(contract, methodName, options = {}, ...args) {
80
- if (!this.signer) {
81
- throw new Error('Cannot execute transaction: SDK is in read-only mode. Provide a private key to enable write operations.');
82
- }
83
- // Special handling for register() function with multiple overloads
84
- if (methodName === 'register') {
85
- return this.registerAgent(contract, options, ...args);
86
- }
87
- const method = contract[methodName];
88
- if (!method || typeof method !== 'function') {
89
- throw new Error(`Method ${methodName} not found on contract`);
90
- }
91
- // Build transaction options - filter out undefined values
92
- const txOptions = Object.fromEntries(Object.entries(options).filter(([_, value]) => value !== undefined));
93
- // Send transaction
94
- const tx = await method(...args);
95
- const txResponse = await tx;
96
- return txResponse.hash;
97
- }
98
- /**
99
- * Router wrapper for register() function overloads
100
- * Intelligently selects the correct overload based on arguments:
101
- * - register() - no arguments
102
- * - register(string agentURI) - just agentURI
103
- * - register(string agentURI, tuple[] metadata) - agentURI + metadata
104
- */
105
- async registerAgent(contract, options, ...args) {
106
- if (!this.signer) {
107
- throw new Error('No signer available for transaction');
108
- }
109
- const contractInterface = contract.interface;
110
- // Determine which overload to use based on arguments
111
- let functionName;
112
- let callArgs;
113
- if (args.length === 0) {
114
- // register() - no arguments
115
- functionName = 'register()';
116
- callArgs = [];
117
- }
118
- else if (args.length === 1 && typeof args[0] === 'string') {
119
- // register(string agentURI) - just agentURI
120
- functionName = 'register(string)';
121
- callArgs = [args[0]];
122
- }
123
- else if (args.length === 2 && typeof args[0] === 'string' && Array.isArray(args[1])) {
124
- // register(string agentURI, tuple[] metadata) - agentURI + metadata
125
- functionName = 'register(string,(string,bytes)[])';
126
- callArgs = [args[0], args[1]];
127
- }
128
- else {
129
- throw new Error(`Invalid arguments for register(). Expected: () | (string) | (string, tuple[]), got ${args.length} arguments`);
130
- }
131
- // Get the specific function fragment using the signature
132
- const functionFragment = contractInterface.getFunction(functionName);
133
- if (!functionFragment) {
134
- throw new Error(`Function ${functionName} not found in contract ABI`);
135
- }
136
- // Encode function data to avoid ambiguity - this bypasses function resolution
137
- const data = contractInterface.encodeFunctionData(functionFragment, callArgs);
138
- // Send transaction directly with encoded data (no function call resolution needed)
139
- const txResponse = await this.signer.sendTransaction({
140
- to: contract.target,
141
- data: data,
142
- });
143
- return txResponse.hash;
144
- }
145
- /**
146
- * Wait for transaction to be mined
147
- */
148
- async waitForTransaction(txHash, timeout = 180000) {
149
- return (await this.provider.waitForTransaction(txHash, undefined, timeout));
150
- }
151
- /**
152
- * Get contract events
153
- */
154
- async getEvents(contract, eventName, fromBlock = 0, toBlock) {
155
- const filter = contract.filters[eventName]();
156
- return await contract.queryFilter(filter, fromBlock, toBlock);
157
- }
158
- /**
159
- * Sign a message with the account's private key
160
- */
161
- async signMessage(message) {
162
- if (!this.signer) {
163
- throw new Error('No signer available');
164
- }
165
- return await this.signer.signMessage(message);
166
- }
167
- /**
168
- * Sign typed data (EIP-712) with the account's private key
169
- */
170
- async signTypedData(domain, types, value) {
171
- if (!this.signer) {
172
- throw new Error('No signer available');
173
- }
174
- // ethers.js v6 signTypedData signature
175
- const sig = await this.signer.signTypedData(domain, types, value);
176
- return this.normalizeEcdsaSignature(sig);
177
- }
178
- /**
179
- * Build canonical EIP-712 typed data for IdentityRegistry.setAgentWallet (ERC-8004 Jan 2026).
180
- *
181
- * Contract expects:
182
- * - domain: name="ERC8004IdentityRegistry", version="1"
183
- * - primary type: AgentWalletSet(uint256 agentId,address newWallet,address owner,uint256 deadline)
184
- */
185
- buildAgentWalletSetTypedData(params) {
186
- const domain = {
187
- name: params.domainName || 'ERC8004IdentityRegistry',
188
- version: params.domainVersion || '1',
189
- chainId: params.chainId,
190
- verifyingContract: params.verifyingContract,
191
- };
192
- const types = {
193
- AgentWalletSet: [
194
- { name: 'agentId', type: 'uint256' },
195
- { name: 'newWallet', type: 'address' },
196
- { name: 'owner', type: 'address' },
197
- { name: 'deadline', type: 'uint256' },
198
- ],
199
- };
200
- const message = {
201
- agentId: params.agentId,
202
- newWallet: params.newWallet,
203
- owner: params.owner,
204
- deadline: params.deadline,
205
- };
206
- return { domain, types, message };
207
- }
208
- /**
209
- * Legacy typed-data variant (without owner field).
210
- * Some deployments may use AgentWalletSet(uint256 agentId,address newWallet,uint256 deadline).
211
- */
212
- buildAgentWalletSetTypedDataNoOwner(params) {
213
- const domain = {
214
- name: params.domainName || 'ERC8004IdentityRegistry',
215
- version: params.domainVersion || '1',
216
- chainId: params.chainId,
217
- verifyingContract: params.verifyingContract,
218
- };
219
- const types = {
220
- AgentWalletSet: [
221
- { name: 'agentId', type: 'uint256' },
222
- { name: 'newWallet', type: 'address' },
223
- { name: 'deadline', type: 'uint256' },
224
- ],
225
- };
226
- const message = {
227
- agentId: params.agentId,
228
- newWallet: params.newWallet,
229
- deadline: params.deadline,
230
- };
231
- return { domain, types, message };
232
- }
233
- /**
234
- * Sign EIP-712 typed data with either:
235
- * - a private key string (EOA), or
236
- * - an ethers Signer (EOA / smart account with a signer abstraction).
237
- */
238
- async signTypedDataWith(signerOrKey, domain, types, message) {
239
- if (typeof signerOrKey === 'string') {
240
- const key = signerOrKey.startsWith('0x') ? signerOrKey : `0x${signerOrKey}`;
241
- const wallet = new ethers.Wallet(key);
242
- const sig = await wallet.signTypedData(domain, types, message);
243
- return this.normalizeEcdsaSignature(sig);
244
- }
245
- const sig = await signerOrKey.signTypedData(domain, types, message);
246
- return this.normalizeEcdsaSignature(sig);
247
- }
248
- /**
249
- * Normalize ECDSA signatures to use v = 27/28 (some contracts/libraries expect this).
250
- * ethers may produce signatures with v in {0,1}.
251
- */
252
- normalizeEcdsaSignature(signature) {
253
- const sig = signature.startsWith('0x') ? signature : `0x${signature}`;
254
- const bytes = ethers.getBytes(sig);
255
- if (bytes.length !== 65) {
256
- return sig;
257
- }
258
- const v = bytes[64];
259
- if (v === 0 || v === 1) {
260
- bytes[64] = v + 27;
261
- return ethers.hexlify(bytes);
262
- }
263
- return sig;
264
- }
265
- /**
266
- * Recover the signer address for EIP-712 typed data (EOA path).
267
- */
268
- recoverTypedDataSigner(domain, types, message, signature) {
269
- return ethers.verifyTypedData(domain, types, message, signature);
270
- }
271
- /**
272
- * Resolve an address for a provided signer or private key string.
273
- */
274
- async addressOf(signerOrKey) {
275
- if (typeof signerOrKey === 'string') {
276
- const key = signerOrKey.startsWith('0x') ? signerOrKey : `0x${signerOrKey}`;
277
- return new ethers.Wallet(key).address;
278
- }
279
- return await signerOrKey.getAddress();
280
- }
281
- /**
282
- * Recover address from message and signature
283
- */
284
- recoverAddress(message, signature) {
285
- return ethers.verifyMessage(message, signature);
286
- }
287
- /**
288
- * Compute Keccak-256 hash
289
- */
290
- keccak256(data) {
291
- if (typeof data === 'string') {
292
- return ethers.keccak256(ethers.toUtf8Bytes(data));
293
- }
294
- // For Uint8Array, convert to hex string first
295
- return ethers.keccak256(ethers.hexlify(data));
296
- }
297
- /**
298
- * Convert address to checksum format
299
- */
300
- toChecksumAddress(address) {
301
- return ethers.getAddress(address);
302
- }
303
- /**
304
- * Check if string is a valid Ethereum address
305
- */
306
- isAddress(address) {
307
- try {
308
- return ethers.isAddress(address);
309
- }
310
- catch {
311
- return false;
312
- }
313
- }
314
- /**
315
- * Get ETH balance of an address
316
- */
317
- async getBalance(address) {
318
- return await this.provider.getBalance(address);
319
- }
320
- /**
321
- * Get transaction count (nonce) of an address
322
- */
323
- async getTransactionCount(address) {
324
- return await this.provider.getTransactionCount(address, 'pending');
325
- }
326
- /**
327
- * Get the account address (if signer is available)
328
- */
329
- get address() {
330
- if (!this.signer)
331
- return undefined;
332
- // Wallet has address property, Signer might need getAddress()
333
- if ('address' in this.signer) {
334
- return this.signer.address;
335
- }
336
- // For generic Signer, we can't get address synchronously
337
- // This is a limitation of the Signer interface
338
- return undefined;
339
- }
340
- /**
341
- * Get the account address asynchronously (if signer is available)
342
- * Use this method when you need the address from a generic Signer
343
- */
344
- async getAddress() {
345
- if (!this.signer)
346
- return undefined;
347
- return await this.signer.getAddress();
348
- }
349
- }
350
- //# sourceMappingURL=web3-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"web3-client.js","sourceRoot":"","sources":["../../src/core/web3-client.ts"],"names":[],"mappings":"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"}