@coinbase/agentkit 0.3.0 → 0.5.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 (83) hide show
  1. package/README.md +90 -7
  2. package/dist/action-providers/across/acrossActionProvider.d.ts +50 -0
  3. package/dist/action-providers/across/acrossActionProvider.js +333 -0
  4. package/dist/action-providers/across/acrossActionProvider.test.d.ts +1 -0
  5. package/dist/action-providers/across/acrossActionProvider.test.js +391 -0
  6. package/dist/action-providers/across/constants.d.ts +1 -0
  7. package/dist/action-providers/across/constants.js +2 -0
  8. package/dist/action-providers/across/index.d.ts +1 -0
  9. package/dist/action-providers/across/index.js +17 -0
  10. package/dist/action-providers/across/schemas.d.ts +36 -0
  11. package/dist/action-providers/across/schemas.js +46 -0
  12. package/dist/action-providers/across/utils.d.ts +7 -0
  13. package/dist/action-providers/across/utils.js +25 -0
  14. package/dist/action-providers/defillama/constants.d.ts +8 -0
  15. package/dist/action-providers/defillama/constants.js +11 -0
  16. package/dist/action-providers/defillama/defillamaActionProvider.d.ts +54 -0
  17. package/dist/action-providers/defillama/defillamaActionProvider.js +180 -0
  18. package/dist/action-providers/defillama/defillamaActionProvider.test.d.ts +1 -0
  19. package/dist/action-providers/defillama/defillamaActionProvider.test.js +114 -0
  20. package/dist/action-providers/defillama/index.d.ts +1 -0
  21. package/dist/action-providers/defillama/index.js +17 -0
  22. package/dist/action-providers/defillama/schemas.d.ts +34 -0
  23. package/dist/action-providers/defillama/schemas.js +34 -0
  24. package/dist/action-providers/defillama/types.d.ts +73 -0
  25. package/dist/action-providers/defillama/types.js +2 -0
  26. package/dist/action-providers/defillama/utils.d.ts +10 -0
  27. package/dist/action-providers/defillama/utils.js +87 -0
  28. package/dist/action-providers/defillama/utils.test.d.ts +1 -0
  29. package/dist/action-providers/defillama/utils.test.js +124 -0
  30. package/dist/action-providers/erc20/constants.d.ts +2 -0
  31. package/dist/action-providers/erc20/constants.js +12 -1
  32. package/dist/action-providers/erc20/erc20ActionProvider.js +18 -0
  33. package/dist/action-providers/erc20/erc20ActionProvider.test.js +4 -0
  34. package/dist/action-providers/index.d.ts +3 -0
  35. package/dist/action-providers/index.js +3 -0
  36. package/dist/action-providers/messari/constants.d.ts +17 -0
  37. package/dist/action-providers/messari/constants.js +20 -0
  38. package/dist/action-providers/messari/index.d.ts +5 -0
  39. package/dist/action-providers/messari/index.js +21 -0
  40. package/dist/action-providers/messari/messariActionProvider.d.ts +42 -0
  41. package/dist/action-providers/messari/messariActionProvider.js +128 -0
  42. package/dist/action-providers/messari/messariActionProvider.test.d.ts +1 -0
  43. package/dist/action-providers/messari/messariActionProvider.test.js +152 -0
  44. package/dist/action-providers/messari/schemas.d.ts +11 -0
  45. package/dist/action-providers/messari/schemas.js +16 -0
  46. package/dist/action-providers/messari/types.d.ts +40 -0
  47. package/dist/action-providers/messari/types.js +2 -0
  48. package/dist/action-providers/messari/utils.d.ts +22 -0
  49. package/dist/action-providers/messari/utils.js +65 -0
  50. package/dist/action-providers/morpho/morphoActionProvider.js +11 -4
  51. package/dist/action-providers/morpho/morphoActionProvider.test.js +2 -0
  52. package/dist/wallet-providers/cdpWalletProvider.d.ts +11 -2
  53. package/dist/wallet-providers/cdpWalletProvider.js +24 -0
  54. package/dist/wallet-providers/cdpWalletProvider.test.d.ts +1 -0
  55. package/dist/wallet-providers/cdpWalletProvider.test.js +701 -0
  56. package/dist/wallet-providers/evmWalletProvider.test.d.ts +1 -0
  57. package/dist/wallet-providers/evmWalletProvider.test.js +56 -0
  58. package/dist/wallet-providers/index.d.ts +1 -0
  59. package/dist/wallet-providers/index.js +1 -0
  60. package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.d.ts +167 -0
  61. package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.js +438 -0
  62. package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.test.d.ts +1 -0
  63. package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.test.js +280 -0
  64. package/dist/wallet-providers/privyEvmWalletProvider.test.d.ts +1 -0
  65. package/dist/wallet-providers/privyEvmWalletProvider.test.js +331 -0
  66. package/dist/wallet-providers/privyShared.d.ts +9 -0
  67. package/dist/wallet-providers/privyShared.js +16 -5
  68. package/dist/wallet-providers/privySvmWalletProvider.test.d.ts +1 -0
  69. package/dist/wallet-providers/privySvmWalletProvider.test.js +310 -0
  70. package/dist/wallet-providers/privyWalletProvider.d.ts +21 -8
  71. package/dist/wallet-providers/privyWalletProvider.js +39 -7
  72. package/dist/wallet-providers/privyWalletProvider.test.d.ts +1 -0
  73. package/dist/wallet-providers/privyWalletProvider.test.js +124 -0
  74. package/dist/wallet-providers/smartWalletProvider.test.d.ts +1 -0
  75. package/dist/wallet-providers/smartWalletProvider.test.js +388 -0
  76. package/dist/wallet-providers/solanaKeypairWalletProvider.test.js +210 -16
  77. package/dist/wallet-providers/svmWalletProvider.test.d.ts +1 -0
  78. package/dist/wallet-providers/svmWalletProvider.test.js +55 -0
  79. package/dist/wallet-providers/viemWalletProvider.test.d.ts +1 -0
  80. package/dist/wallet-providers/viemWalletProvider.test.js +338 -0
  81. package/dist/wallet-providers/walletProvider.test.d.ts +1 -0
  82. package/dist/wallet-providers/walletProvider.test.js +103 -0
  83. package/package.json +24 -20
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const svmWalletProvider_1 = require("./svmWalletProvider");
4
+ global.fetch = jest.fn(() => Promise.resolve({
5
+ ok: true,
6
+ json: () => Promise.resolve({}),
7
+ }));
8
+ jest.mock("../analytics", () => ({
9
+ sendAnalyticsEvent: jest.fn().mockImplementation(() => Promise.resolve()),
10
+ }));
11
+ describe("SvmWalletProvider", () => {
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ if (!svmWalletProvider_1.SvmWalletProvider.prototype.getConnection) {
15
+ svmWalletProvider_1.SvmWalletProvider.prototype.getConnection = jest.fn();
16
+ }
17
+ if (!svmWalletProvider_1.SvmWalletProvider.prototype.getPublicKey) {
18
+ svmWalletProvider_1.SvmWalletProvider.prototype.getPublicKey = jest.fn();
19
+ }
20
+ if (!svmWalletProvider_1.SvmWalletProvider.prototype.signTransaction) {
21
+ svmWalletProvider_1.SvmWalletProvider.prototype.signTransaction = jest.fn();
22
+ }
23
+ if (!svmWalletProvider_1.SvmWalletProvider.prototype.sendTransaction) {
24
+ svmWalletProvider_1.SvmWalletProvider.prototype.sendTransaction = jest.fn();
25
+ }
26
+ if (!svmWalletProvider_1.SvmWalletProvider.prototype.signAndSendTransaction) {
27
+ svmWalletProvider_1.SvmWalletProvider.prototype.signAndSendTransaction = jest.fn();
28
+ }
29
+ if (!svmWalletProvider_1.SvmWalletProvider.prototype.getSignatureStatus) {
30
+ svmWalletProvider_1.SvmWalletProvider.prototype.getSignatureStatus = jest.fn();
31
+ }
32
+ if (!svmWalletProvider_1.SvmWalletProvider.prototype.waitForSignatureResult) {
33
+ svmWalletProvider_1.SvmWalletProvider.prototype.waitForSignatureResult = jest.fn();
34
+ }
35
+ });
36
+ it("should extend WalletProvider", () => {
37
+ const proto = Object.getPrototypeOf(svmWalletProvider_1.SvmWalletProvider);
38
+ const protoName = proto.name;
39
+ expect(protoName).toBe("WalletProvider");
40
+ });
41
+ it("should have consistent method signatures", () => {
42
+ const signTransactionDescriptor = Object.getOwnPropertyDescriptor(svmWalletProvider_1.SvmWalletProvider.prototype, "signTransaction");
43
+ expect(signTransactionDescriptor).toBeDefined();
44
+ expect(typeof signTransactionDescriptor.value).toBe("function");
45
+ const sendTransactionDescriptor = Object.getOwnPropertyDescriptor(svmWalletProvider_1.SvmWalletProvider.prototype, "sendTransaction");
46
+ expect(sendTransactionDescriptor).toBeDefined();
47
+ expect(typeof sendTransactionDescriptor.value).toBe("function");
48
+ const getPublicKeyDescriptor = Object.getOwnPropertyDescriptor(svmWalletProvider_1.SvmWalletProvider.prototype, "getPublicKey");
49
+ expect(getPublicKeyDescriptor).toBeDefined();
50
+ expect(typeof getPublicKeyDescriptor.value).toBe("function");
51
+ const getConnectionDescriptor = Object.getOwnPropertyDescriptor(svmWalletProvider_1.SvmWalletProvider.prototype, "getConnection");
52
+ expect(getConnectionDescriptor).toBeDefined();
53
+ expect(typeof getConnectionDescriptor.value).toBe("function");
54
+ });
55
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const viemWalletProvider_1 = require("./viemWalletProvider");
37
+ const viem = __importStar(require("viem"));
38
+ global.fetch = jest.fn(() => Promise.resolve({
39
+ ok: true,
40
+ json: () => Promise.resolve({}),
41
+ }));
42
+ jest.mock("../analytics", () => ({
43
+ sendAnalyticsEvent: jest.fn().mockImplementation(() => Promise.resolve()),
44
+ }));
45
+ // =========================================================
46
+ // consts
47
+ // =========================================================
48
+ const MOCK_CHAIN_ID = 84532;
49
+ const MOCK_ADDRESS = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e";
50
+ const MOCK_ADDRESS_TO = "0x1234567890123456789012345678901234567890";
51
+ const MOCK_TRANSACTION_HASH = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
52
+ const MOCK_SIGNATURE = "0x123456789abcdef";
53
+ const MOCK_BALANCE = 10000000000000000000n;
54
+ const MOCK_BLOCK_NUMBER = 12345n;
55
+ const MOCK_MESSAGE = "Hello, World!";
56
+ const MOCK_MAX_FEE_PER_GAS = BigInt(1000000000);
57
+ const MOCK_MAX_PRIORITY_FEE_PER_GAS = BigInt(100000000);
58
+ const MOCK_CHAIN = {
59
+ id: MOCK_CHAIN_ID,
60
+ name: "Base Sepolia",
61
+ nativeCurrency: { name: "ETH", symbol: "ETH", decimals: 18 },
62
+ rpcUrls: {
63
+ default: {
64
+ http: ["https://sepolia.base.org"],
65
+ },
66
+ },
67
+ };
68
+ const MOCK_DATA = {
69
+ domain: {
70
+ name: "Example",
71
+ version: "1",
72
+ chainId: 1,
73
+ verifyingContract: "0x0000000000000000000000000000000000000000",
74
+ },
75
+ types: {
76
+ Person: [
77
+ { name: "name", type: "string" },
78
+ { name: "wallet", type: "address" },
79
+ ],
80
+ },
81
+ primaryType: "Person",
82
+ message: {
83
+ name: "John Doe",
84
+ wallet: "0x0000000000000000000000000000000000000000",
85
+ },
86
+ };
87
+ // =========================================================
88
+ // mocks
89
+ // =========================================================
90
+ jest.mock("../network/network", () => ({
91
+ CHAIN_ID_TO_NETWORK_ID: {
92
+ 1: "mainnet",
93
+ 5: "goerli",
94
+ 11155111: "sepolia",
95
+ },
96
+ }));
97
+ jest.mock("viem", () => {
98
+ return {
99
+ createPublicClient: jest.fn(),
100
+ createWalletClient: jest.fn(),
101
+ http: jest.fn(() => jest.fn()),
102
+ parseEther: jest.fn(() => BigInt(1000000000000000000)),
103
+ hexToString: jest.fn(),
104
+ fromHex: jest.fn(),
105
+ formatEther: jest.fn(),
106
+ privateKeyToAccount: jest.fn(),
107
+ };
108
+ });
109
+ jest.mock("viem/accounts", () => {
110
+ return {
111
+ privateKeyToAccount: jest.fn(),
112
+ };
113
+ });
114
+ describe("ViemWalletProvider", () => {
115
+ let provider;
116
+ let mockPublicClient;
117
+ let mockWalletClient;
118
+ beforeEach(() => {
119
+ jest.clearAllMocks();
120
+ const mockAccount = {
121
+ address: MOCK_ADDRESS,
122
+ };
123
+ mockPublicClient = {
124
+ chain: MOCK_CHAIN,
125
+ getBalance: jest.fn(),
126
+ getChainId: jest.fn(),
127
+ waitForTransactionReceipt: jest.fn(),
128
+ readContract: jest.fn(),
129
+ estimateFeesPerGas: jest.fn(),
130
+ estimateGas: jest.fn(),
131
+ };
132
+ mockPublicClient.getBalance.mockResolvedValue(MOCK_BALANCE);
133
+ mockPublicClient.getChainId.mockResolvedValue(MOCK_CHAIN_ID);
134
+ mockPublicClient.waitForTransactionReceipt.mockResolvedValue({
135
+ transactionHash: MOCK_TRANSACTION_HASH,
136
+ blockNumber: MOCK_BLOCK_NUMBER,
137
+ status: "success",
138
+ });
139
+ mockPublicClient.readContract.mockResolvedValue("mock_result");
140
+ mockPublicClient.estimateFeesPerGas.mockResolvedValue({
141
+ maxFeePerGas: MOCK_MAX_FEE_PER_GAS,
142
+ maxPriorityFeePerGas: MOCK_MAX_PRIORITY_FEE_PER_GAS,
143
+ });
144
+ mockPublicClient.estimateGas.mockResolvedValue(BigInt(21000));
145
+ mockWalletClient = {
146
+ chain: MOCK_CHAIN,
147
+ transport: {
148
+ name: "HTTP JSON-RPC",
149
+ request: jest.fn(),
150
+ value: { url: "https://ethereum.example.com" },
151
+ },
152
+ account: mockAccount,
153
+ signMessage: jest.fn(),
154
+ signTypedData: jest.fn(),
155
+ signTransaction: jest.fn(),
156
+ sendTransaction: jest.fn(),
157
+ };
158
+ mockWalletClient.signMessage.mockResolvedValue(MOCK_SIGNATURE);
159
+ mockWalletClient.signTypedData.mockResolvedValue(MOCK_SIGNATURE);
160
+ mockWalletClient.signTransaction.mockResolvedValue(MOCK_SIGNATURE);
161
+ mockWalletClient.sendTransaction.mockResolvedValue(MOCK_TRANSACTION_HASH);
162
+ viem.createPublicClient.mockReturnValue(mockPublicClient);
163
+ viem.createWalletClient.mockReturnValue(mockWalletClient);
164
+ viem.http.mockReturnValue(jest.fn());
165
+ provider = new viemWalletProvider_1.ViemWalletProvider(mockWalletClient);
166
+ });
167
+ describe("configuration and initialization", () => {
168
+ it("should create a provider with default gas multipliers", () => {
169
+ const provider = new viemWalletProvider_1.ViemWalletProvider(mockWalletClient);
170
+ expect(provider).toBeInstanceOf(viemWalletProvider_1.ViemWalletProvider);
171
+ expect(viem.createPublicClient).toHaveBeenCalledWith({
172
+ chain: MOCK_CHAIN,
173
+ transport: expect.any(Function),
174
+ });
175
+ });
176
+ it("should create a provider with custom gas multipliers", () => {
177
+ const gasConfig = {
178
+ gasLimitMultiplier: 1.5,
179
+ feePerGasMultiplier: 1.2,
180
+ };
181
+ const provider = new viemWalletProvider_1.ViemWalletProvider(mockWalletClient, gasConfig);
182
+ expect(provider).toBeInstanceOf(viemWalletProvider_1.ViemWalletProvider);
183
+ });
184
+ });
185
+ describe("basic wallet methods", () => {
186
+ it("should get wallet address", () => {
187
+ const address = provider.getAddress();
188
+ expect(address).toBe(MOCK_ADDRESS);
189
+ });
190
+ it("should get network", () => {
191
+ const network = provider.getNetwork();
192
+ expect(network.chainId).toBe(String(MOCK_CHAIN_ID));
193
+ expect(network.protocolFamily).toBe("evm");
194
+ });
195
+ it("should get wallet name", () => {
196
+ const name = provider.getName();
197
+ expect(name).toBe("viem_wallet_provider");
198
+ });
199
+ it("should get balance", async () => {
200
+ const balance = await provider.getBalance();
201
+ expect(balance).toBe(MOCK_BALANCE);
202
+ expect(mockPublicClient.getBalance).toHaveBeenCalledWith({
203
+ address: MOCK_ADDRESS,
204
+ });
205
+ });
206
+ it("should handle connection errors during balance check", async () => {
207
+ mockPublicClient.getBalance.mockRejectedValueOnce(new Error("Network connection error"));
208
+ await expect(provider.getBalance()).rejects.toThrow("Network connection error");
209
+ });
210
+ });
211
+ describe("signing operations", () => {
212
+ it("should sign a message", async () => {
213
+ const signature = await provider.signMessage(MOCK_MESSAGE);
214
+ expect(mockWalletClient.signMessage).toHaveBeenCalledWith({
215
+ account: mockWalletClient.account,
216
+ message: MOCK_MESSAGE,
217
+ });
218
+ expect(signature).toBe(MOCK_SIGNATURE);
219
+ });
220
+ it("should sign typed data", async () => {
221
+ const signature = await provider.signTypedData(MOCK_DATA);
222
+ expect(mockWalletClient.signTypedData).toHaveBeenCalledWith({
223
+ account: mockWalletClient.account,
224
+ ...MOCK_DATA,
225
+ });
226
+ expect(signature).toBe(MOCK_SIGNATURE);
227
+ });
228
+ it("should sign a transaction", async () => {
229
+ const transaction = {
230
+ to: MOCK_ADDRESS_TO,
231
+ value: BigInt(1000000000000000000),
232
+ };
233
+ await provider.signTransaction(transaction);
234
+ expect(mockWalletClient.signTransaction).toHaveBeenCalledWith({
235
+ account: mockWalletClient.account,
236
+ chain: mockWalletClient.chain,
237
+ to: transaction.to,
238
+ value: transaction.value,
239
+ data: transaction.data,
240
+ });
241
+ });
242
+ it("should handle signing errors", async () => {
243
+ mockWalletClient.signMessage.mockRejectedValueOnce(new Error("Signing failed"));
244
+ await expect(provider.signMessage("test message")).rejects.toThrow("Signing failed");
245
+ });
246
+ it("should handle typed data signing errors", async () => {
247
+ mockWalletClient.signTypedData.mockRejectedValueOnce(new Error("Signing failed"));
248
+ await expect(provider.signTypedData(MOCK_DATA)).rejects.toThrow("Signing failed");
249
+ });
250
+ });
251
+ describe("transaction operations", () => {
252
+ it("should send a transaction", async () => {
253
+ const transaction = {
254
+ to: MOCK_ADDRESS_TO,
255
+ value: BigInt(1000000000000000000),
256
+ };
257
+ const hash = await provider.sendTransaction(transaction);
258
+ expect(mockWalletClient.sendTransaction).toHaveBeenCalled();
259
+ expect(hash).toBe(MOCK_TRANSACTION_HASH);
260
+ });
261
+ it("should wait for a transaction receipt", async () => {
262
+ const receipt = await provider.waitForTransactionReceipt(MOCK_TRANSACTION_HASH);
263
+ expect(mockPublicClient.waitForTransactionReceipt).toHaveBeenCalledWith({
264
+ hash: MOCK_TRANSACTION_HASH,
265
+ });
266
+ expect(receipt).toEqual({
267
+ transactionHash: MOCK_TRANSACTION_HASH,
268
+ blockNumber: MOCK_BLOCK_NUMBER,
269
+ status: "success",
270
+ });
271
+ });
272
+ it("should handle transaction send errors", async () => {
273
+ mockWalletClient.sendTransaction.mockRejectedValueOnce(new Error("Transaction failed"));
274
+ const transaction = {
275
+ to: MOCK_ADDRESS_TO,
276
+ value: BigInt(1000000000000000000),
277
+ };
278
+ await expect(provider.sendTransaction(transaction)).rejects.toThrow("Transaction failed");
279
+ });
280
+ it("should handle transaction receipt wait errors", async () => {
281
+ mockPublicClient.waitForTransactionReceipt.mockRejectedValueOnce(new Error("Receipt retrieval failed"));
282
+ await expect(provider.waitForTransactionReceipt(MOCK_TRANSACTION_HASH)).rejects.toThrow("Receipt retrieval failed");
283
+ });
284
+ });
285
+ describe("native token operations", () => {
286
+ it("should transfer native tokens", async () => {
287
+ viem.parseEther.mockReturnValueOnce(BigInt(1000000000000000000));
288
+ const hash = await provider.nativeTransfer(MOCK_ADDRESS_TO, "1.0");
289
+ expect(viem.parseEther).toHaveBeenCalledWith("1.0");
290
+ expect(mockWalletClient.sendTransaction).toHaveBeenCalled();
291
+ expect(hash).toBe(MOCK_TRANSACTION_HASH);
292
+ });
293
+ it("should handle native transfer errors", async () => {
294
+ mockWalletClient.sendTransaction.mockRejectedValueOnce(new Error("Transaction failed"));
295
+ await expect(provider.nativeTransfer(MOCK_ADDRESS_TO, "1.0")).rejects.toThrow("Transaction failed");
296
+ });
297
+ it("should handle invalid address in native transfer", async () => {
298
+ const invalidAddress = "not_a_valid_address";
299
+ mockWalletClient.sendTransaction.mockImplementationOnce(() => {
300
+ throw new Error("Invalid address");
301
+ });
302
+ await expect(provider.nativeTransfer(invalidAddress, "1.0")).rejects.toThrow();
303
+ });
304
+ });
305
+ describe("contract interactions", () => {
306
+ it("should read contract data", async () => {
307
+ const contractParams = {
308
+ address: MOCK_ADDRESS_TO,
309
+ abi: [],
310
+ functionName: "balanceOf",
311
+ args: [MOCK_ADDRESS],
312
+ };
313
+ const result = await provider.readContract(contractParams);
314
+ expect(mockPublicClient.readContract).toHaveBeenCalledWith(contractParams);
315
+ expect(result).toBe("mock_result");
316
+ });
317
+ it("should handle contract read errors", async () => {
318
+ mockPublicClient.readContract.mockRejectedValueOnce(new Error("Contract read failed"));
319
+ const contractParams = {
320
+ address: MOCK_ADDRESS_TO,
321
+ abi: [],
322
+ functionName: "balanceOf",
323
+ args: [MOCK_ADDRESS],
324
+ };
325
+ await expect(provider.readContract(contractParams)).rejects.toThrow("Contract read failed");
326
+ });
327
+ it("should handle invalid ABI in contract read", async () => {
328
+ mockPublicClient.readContract.mockRejectedValueOnce(new TypeError("Invalid ABI format"));
329
+ const contractParams = {
330
+ address: MOCK_ADDRESS_TO,
331
+ abi: "invalid abi",
332
+ functionName: "balanceOf",
333
+ args: [MOCK_ADDRESS],
334
+ };
335
+ await expect(provider.readContract(contractParams)).rejects.toThrow("Invalid ABI format");
336
+ });
337
+ });
338
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const walletProvider_1 = require("./walletProvider");
4
+ const analytics_1 = require("../analytics");
5
+ // Mock fetch globally to prevent any actual network requests
6
+ global.fetch = jest.fn(() => Promise.resolve({
7
+ ok: true,
8
+ json: () => Promise.resolve({}),
9
+ }));
10
+ jest.mock("../analytics", () => ({
11
+ sendAnalyticsEvent: jest.fn().mockImplementation(() => Promise.resolve()),
12
+ }));
13
+ const MOCK_ADDRESS = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e";
14
+ const MOCK_NETWORK_ID = "mainnet";
15
+ const MOCK_CHAIN_ID = "1";
16
+ const MOCK_PROTOCOL_FAMILY = "evm";
17
+ const MOCK_WALLET_NAME = "test_wallet_provider";
18
+ const MOCK_NETWORK = {
19
+ protocolFamily: MOCK_PROTOCOL_FAMILY,
20
+ networkId: MOCK_NETWORK_ID,
21
+ chainId: MOCK_CHAIN_ID,
22
+ };
23
+ describe("WalletProvider", () => {
24
+ /**
25
+ *
26
+ */
27
+ class MockWalletProvider extends walletProvider_1.WalletProvider {
28
+ /**
29
+ * Returns the wallet address.
30
+ *
31
+ * @returns The wallet address as a string.
32
+ */
33
+ getAddress() {
34
+ return MOCK_ADDRESS;
35
+ }
36
+ /**
37
+ * Returns the network information.
38
+ *
39
+ * @returns The network details.
40
+ */
41
+ getNetwork() {
42
+ return MOCK_NETWORK;
43
+ }
44
+ /**
45
+ * Returns the wallet provider name.
46
+ *
47
+ * @returns The wallet provider name as a string.
48
+ */
49
+ getName() {
50
+ return MOCK_WALLET_NAME;
51
+ }
52
+ /**
53
+ * Returns the wallet balance.
54
+ *
55
+ * @returns A promise resolving to the wallet balance as a bigint.
56
+ */
57
+ getBalance() {
58
+ return Promise.resolve(BigInt(1000000000000000000));
59
+ }
60
+ /**
61
+ * Transfers native tokens.
62
+ *
63
+ * @param _to - The recipient address.
64
+ * @param _value - The amount to transfer.
65
+ * @returns A promise resolving to the transaction hash as a string.
66
+ */
67
+ nativeTransfer(_to, _value) {
68
+ return Promise.resolve("0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef");
69
+ }
70
+ }
71
+ beforeEach(() => {
72
+ jest.clearAllMocks();
73
+ });
74
+ it("should define abstract methods (TypeScript only - not a runtime check)", () => { });
75
+ it("should track initialization via analytics", () => {
76
+ new MockWalletProvider();
77
+ return new Promise(resolve => setTimeout(() => {
78
+ expect(analytics_1.sendAnalyticsEvent).toHaveBeenCalledWith({
79
+ name: "agent_initialization",
80
+ action: "initialize_wallet_provider",
81
+ component: "wallet_provider",
82
+ wallet_provider: MOCK_WALLET_NAME,
83
+ wallet_address: MOCK_ADDRESS,
84
+ network_id: MOCK_NETWORK_ID,
85
+ chain_id: MOCK_CHAIN_ID,
86
+ protocol_family: MOCK_PROTOCOL_FAMILY,
87
+ });
88
+ resolve(null);
89
+ }, 0));
90
+ });
91
+ it("should handle tracking failures gracefully", () => {
92
+ analytics_1.sendAnalyticsEvent.mockImplementationOnce(() => {
93
+ throw new Error("Test error");
94
+ });
95
+ const consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation(() => { });
96
+ new MockWalletProvider();
97
+ return new Promise(resolve => setTimeout(() => {
98
+ expect(consoleWarnSpy).toHaveBeenCalledWith("Failed to track wallet provider initialization:", expect.any(Error));
99
+ consoleWarnSpy.mockRestore();
100
+ resolve(null);
101
+ }, 0));
102
+ });
103
+ });
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@coinbase/agentkit",
3
3
  "description": "Coinbase AgentKit core primitives",
4
4
  "repository": "https://github.com/coinbase/agentkit",
5
- "version": "0.3.0",
5
+ "version": "0.5.0",
6
6
  "author": "Coinbase Inc.",
7
7
  "license": "Apache-2.0",
8
8
  "main": "dist/index.js",
@@ -10,24 +10,6 @@
10
10
  "files": [
11
11
  "dist"
12
12
  ],
13
- "scripts": {
14
- "build": "tsc",
15
- "lint": "eslint -c .eslintrc.json \"src/**/*.ts\"",
16
- "lint:fix": "eslint -c .eslintrc.json \"src/**/*.ts\" --fix",
17
- "format": "prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"",
18
- "format:check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"",
19
- "check": "tsc --noEmit",
20
- "test": "npx jest --no-cache --testMatch='**/*.test.ts'",
21
- "test:dry-run": "npm install && npm ci && npm publish --dry-run",
22
- "test:e2e": "npx jest --no-cache --testMatch=**/e2e.ts --coverageThreshold '{}'",
23
- "test:types": "tsd --files src/tests/types.test-d.ts",
24
- "clean": "rm -rf dist/*",
25
- "prepack": "tsc",
26
- "docs": "typedoc --entryPoints ./src --entryPointStrategy expand --exclude ./src/tests/**/*.ts",
27
- "docs:serve": "http-server ./docs",
28
- "dev": "tsc --watch",
29
- "generate:action-provider": "tsx ./scripts/generate-action-provider/main.ts"
30
- },
31
13
  "keywords": [
32
14
  "coinbase",
33
15
  "sdk",
@@ -40,12 +22,17 @@
40
22
  "typescript"
41
23
  ],
42
24
  "dependencies": {
25
+ "@across-protocol/app-sdk": "^0.2.0",
43
26
  "@alloralabs/allora-sdk": "^0.1.0",
44
27
  "@coinbase/coinbase-sdk": "^0.20.0",
45
28
  "@jup-ag/api": "^6.0.39",
46
29
  "@privy-io/server-auth": "^1.18.4",
47
30
  "@solana/spl-token": "^0.4.12",
48
31
  "@solana/web3.js": "^1.98.0",
32
+ "bs58": "^4.0.1",
33
+ "canonicalize": "^2.1.0",
34
+ "decimal.js": "^10.5.0",
35
+ "ethers": "^6.13.5",
49
36
  "md5": "^2.3.0",
50
37
  "opensea-js": "^7.1.18",
51
38
  "reflect-metadata": "^0.2.2",
@@ -59,6 +46,7 @@
59
46
  "@types/ora": "^3.2.0",
60
47
  "@types/prompts": "^2.4.9",
61
48
  "@types/secp256k1": "^4.0.6",
49
+ "abitype": "^1.0.8",
62
50
  "http-server": "^14.1.1",
63
51
  "jest": "^29.7.0",
64
52
  "mock-fs": "^5.2.0",
@@ -76,5 +64,21 @@
76
64
  "types": "./dist/index.d.ts",
77
65
  "default": "./dist/index.js"
78
66
  }
67
+ },
68
+ "scripts": {
69
+ "build": "tsc",
70
+ "lint": "eslint -c .eslintrc.json \"src/**/*.ts\"",
71
+ "lint:fix": "eslint -c .eslintrc.json \"src/**/*.ts\" --fix",
72
+ "format": "prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"",
73
+ "format:check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"",
74
+ "check": "tsc --noEmit",
75
+ "test": "jest --no-cache --testMatch='**/*.test.ts'",
76
+ "test:e2e": "jest --no-cache --testMatch=**/e2e.ts --coverageThreshold '{}'",
77
+ "test:types": "tsd --files src/tests/types.test-d.ts",
78
+ "clean": "rm -rf dist/*",
79
+ "docs": "typedoc --entryPoints ./src --entryPointStrategy expand --exclude ./src/tests/**/*.ts",
80
+ "docs:serve": "http-server ./docs",
81
+ "dev": "tsc --watch",
82
+ "generate:action-provider": "tsx ./scripts/generate-action-provider/main.ts"
79
83
  }
80
- }
84
+ }