@coinbase/agentkit 0.10.1 → 0.10.3

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 (127) hide show
  1. package/README.md +179 -40
  2. package/dist/action-providers/across/schemas.d.ts +1 -1
  3. package/dist/action-providers/baseAccount/baseAccountActionProvider.d.ts +46 -0
  4. package/dist/action-providers/baseAccount/baseAccountActionProvider.js +404 -0
  5. package/dist/action-providers/baseAccount/baseAccountActionProvider.test.d.ts +1 -0
  6. package/dist/action-providers/baseAccount/baseAccountActionProvider.test.js +325 -0
  7. package/dist/action-providers/baseAccount/index.d.ts +2 -0
  8. package/dist/action-providers/baseAccount/index.js +18 -0
  9. package/dist/action-providers/baseAccount/schemas.d.ts +43 -0
  10. package/dist/action-providers/baseAccount/schemas.js +62 -0
  11. package/dist/action-providers/baseAccount/types.d.ts +17 -0
  12. package/dist/action-providers/baseAccount/types.js +2 -0
  13. package/dist/action-providers/baseAccount/utils.d.ts +14 -0
  14. package/dist/action-providers/baseAccount/utils.js +57 -0
  15. package/dist/action-providers/cdp/cdpApiActionProvider.js +7 -30
  16. package/dist/action-providers/cdp/cdpApiActionProvider.test.js +2 -8
  17. package/dist/action-providers/cdp/cdpEvmWalletActionProvider.js +2 -1
  18. package/dist/action-providers/cdp/cdpEvmWalletActionProvider.test.js +3 -1
  19. package/dist/action-providers/cdp/cdpSmartWalletActionProvider.js +2 -1
  20. package/dist/action-providers/cdp/cdpSmartWalletActionProvider.test.js +3 -1
  21. package/dist/action-providers/cdp/faucetUtils.d.ts +38 -0
  22. package/dist/action-providers/cdp/faucetUtils.js +81 -0
  23. package/dist/action-providers/cdp/swapUtils.d.ts +0 -9
  24. package/dist/action-providers/cdp/swapUtils.js +0 -36
  25. package/dist/action-providers/clanker/schemas.d.ts +6 -6
  26. package/dist/action-providers/enso/constants.d.ts +4 -0
  27. package/dist/action-providers/enso/constants.js +10 -0
  28. package/dist/action-providers/enso/ensoActionProvider.d.ts +34 -0
  29. package/dist/action-providers/enso/ensoActionProvider.js +125 -0
  30. package/dist/action-providers/enso/ensoActionProvider.test.d.ts +1 -0
  31. package/dist/action-providers/enso/ensoActionProvider.test.js +141 -0
  32. package/dist/action-providers/enso/index.d.ts +1 -0
  33. package/dist/action-providers/enso/index.js +17 -0
  34. package/dist/action-providers/enso/schemas.d.ts +23 -0
  35. package/dist/action-providers/enso/schemas.js +22 -0
  36. package/dist/action-providers/erc20/constants.d.ts +2 -0
  37. package/dist/action-providers/erc20/constants.js +2 -0
  38. package/dist/action-providers/erc20/erc20ActionProvider.d.ts +17 -1
  39. package/dist/action-providers/erc20/erc20ActionProvider.js +103 -1
  40. package/dist/action-providers/erc20/erc20ActionProvider.test.js +201 -0
  41. package/dist/action-providers/erc20/schemas.d.ts +29 -0
  42. package/dist/action-providers/erc20/schemas.js +34 -1
  43. package/dist/action-providers/flaunch/client_utils.d.ts +25 -0
  44. package/dist/action-providers/flaunch/client_utils.js +62 -0
  45. package/dist/action-providers/flaunch/constants.d.ts +41 -20
  46. package/dist/action-providers/flaunch/constants.js +111 -36
  47. package/dist/action-providers/flaunch/flaunchActionProvider.d.ts +4 -43
  48. package/dist/action-providers/flaunch/flaunchActionProvider.js +132 -200
  49. package/dist/action-providers/flaunch/flaunchActionProvider.test.js +108 -13
  50. package/dist/action-providers/flaunch/metadata_utils.d.ts +12 -0
  51. package/dist/action-providers/flaunch/metadata_utils.js +216 -0
  52. package/dist/action-providers/flaunch/schemas.d.ts +39 -3
  53. package/dist/action-providers/flaunch/schemas.js +62 -10
  54. package/dist/action-providers/flaunch/{utils.d.ts → swap_utils.d.ts} +17 -19
  55. package/dist/action-providers/flaunch/{utils.js → swap_utils.js} +137 -172
  56. package/dist/action-providers/index.d.ts +4 -1
  57. package/dist/action-providers/index.js +4 -1
  58. package/dist/action-providers/pyth/pythActionProvider.d.ts +2 -2
  59. package/dist/action-providers/pyth/pythActionProvider.js +83 -31
  60. package/dist/action-providers/pyth/pythActionProvider.test.js +178 -26
  61. package/dist/action-providers/pyth/schemas.d.ts +6 -0
  62. package/dist/action-providers/pyth/schemas.js +9 -1
  63. package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.js +5 -4
  64. package/dist/action-providers/superfluid/utils/parseLogs.d.ts +2 -1
  65. package/dist/action-providers/superfluid/utils/parseLogs.js +6 -3
  66. package/dist/action-providers/wallet/walletActionProvider.js +4 -1
  67. package/dist/action-providers/weth/constants.d.ts +0 -1
  68. package/dist/action-providers/weth/constants.js +1 -2
  69. package/dist/action-providers/weth/schemas.js +6 -2
  70. package/dist/action-providers/weth/wethActionProvider.d.ts +7 -0
  71. package/dist/action-providers/weth/wethActionProvider.js +57 -32
  72. package/dist/action-providers/weth/wethActionProvider.test.js +60 -11
  73. package/dist/action-providers/x402/schemas.d.ts +7 -0
  74. package/dist/action-providers/x402/schemas.js +11 -1
  75. package/dist/action-providers/x402/utils.d.ts +55 -0
  76. package/dist/action-providers/x402/utils.js +197 -0
  77. package/dist/action-providers/x402/x402ActionProvider.d.ts +14 -14
  78. package/dist/action-providers/x402/x402ActionProvider.js +179 -45
  79. package/dist/action-providers/x402/x402ActionProvider.test.js +162 -12
  80. package/dist/action-providers/yelay/constants.d.ts +64 -0
  81. package/dist/action-providers/yelay/constants.js +137 -0
  82. package/dist/action-providers/yelay/index.d.ts +2 -0
  83. package/dist/action-providers/yelay/index.js +18 -0
  84. package/dist/action-providers/yelay/schemas.d.ts +47 -0
  85. package/dist/action-providers/yelay/schemas.js +59 -0
  86. package/dist/action-providers/yelay/types.d.ts +24 -0
  87. package/dist/action-providers/yelay/types.js +2 -0
  88. package/dist/action-providers/yelay/yelayActionProvider.d.ts +70 -0
  89. package/dist/action-providers/yelay/yelayActionProvider.js +329 -0
  90. package/dist/action-providers/yelay/yelayActionProvider.test.d.ts +1 -0
  91. package/dist/action-providers/yelay/yelayActionProvider.test.js +302 -0
  92. package/dist/utils.d.ts +10 -0
  93. package/dist/utils.js +43 -13
  94. package/dist/wallet-providers/cdpEvmWalletProvider.d.ts +7 -0
  95. package/dist/wallet-providers/cdpEvmWalletProvider.js +14 -21
  96. package/dist/wallet-providers/cdpEvmWalletProvider.test.js +7 -0
  97. package/dist/wallet-providers/cdpSmartWalletProvider.d.ts +7 -0
  98. package/dist/wallet-providers/cdpSmartWalletProvider.js +23 -8
  99. package/dist/wallet-providers/cdpSmartWalletProvider.test.js +6 -10
  100. package/dist/wallet-providers/cdpSolanaWalletProvider.d.ts +14 -0
  101. package/dist/wallet-providers/cdpSolanaWalletProvider.js +39 -3
  102. package/dist/wallet-providers/cdpSolanaWalletProvider.test.js +16 -0
  103. package/dist/wallet-providers/evmWalletProvider.d.ts +9 -2
  104. package/dist/wallet-providers/evmWalletProvider.js +4 -0
  105. package/dist/wallet-providers/legacyCdpSmartWalletProvider.d.ts +9 -0
  106. package/dist/wallet-providers/legacyCdpSmartWalletProvider.js +11 -0
  107. package/dist/wallet-providers/legacyCdpWalletProvider.d.ts +7 -0
  108. package/dist/wallet-providers/legacyCdpWalletProvider.js +16 -0
  109. package/dist/wallet-providers/legacyCdpWalletProvider.test.js +6 -0
  110. package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.d.ts +7 -0
  111. package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.js +27 -0
  112. package/dist/wallet-providers/privyEvmWalletProvider.test.js +11 -0
  113. package/dist/wallet-providers/privySvmWalletProvider.d.ts +14 -0
  114. package/dist/wallet-providers/privySvmWalletProvider.js +17 -0
  115. package/dist/wallet-providers/privySvmWalletProvider.test.js +10 -0
  116. package/dist/wallet-providers/solanaKeypairWalletProvider.d.ts +14 -0
  117. package/dist/wallet-providers/solanaKeypairWalletProvider.js +17 -0
  118. package/dist/wallet-providers/svmWalletProvider.d.ts +34 -0
  119. package/dist/wallet-providers/svmWalletProvider.js +43 -0
  120. package/dist/wallet-providers/svmWalletProvider.test.js +10 -0
  121. package/dist/wallet-providers/viemWalletProvider.d.ts +8 -1
  122. package/dist/wallet-providers/viemWalletProvider.js +21 -1
  123. package/dist/wallet-providers/viemWalletProvider.test.js +21 -1
  124. package/dist/wallet-providers/zeroDevWalletProvider.d.ts +7 -0
  125. package/dist/wallet-providers/zeroDevWalletProvider.js +12 -0
  126. package/dist/wallet-providers/zeroDevWalletProvider.test.js +10 -0
  127. package/package.json +8 -4
@@ -0,0 +1,404 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.baseAccountActionProvider = exports.BaseAccountActionProvider = void 0;
13
+ const zod_1 = require("zod");
14
+ const viem_1 = require("viem");
15
+ const actionProvider_1 = require("../actionProvider");
16
+ const actionDecorator_1 = require("../actionDecorator");
17
+ const wallet_providers_1 = require("../../wallet-providers");
18
+ const utils_1 = require("../erc20/utils");
19
+ const schemas_1 = require("./schemas");
20
+ const utils_2 = require("./utils");
21
+ const utils_3 = require("../../utils");
22
+ /**
23
+ * Fetch spend permissions for a user account from a spender address
24
+ *
25
+ * @param userAccount - The user account address
26
+ * @param spenderAccount - The spender account address
27
+ * @param tokenAddress - Optional token address to filter by. If not provided, returns all permissions
28
+ * @returns Promise resolving to array of fetched permissions
29
+ */
30
+ async function fetchUserSpendPermissions(userAccount, spenderAccount, tokenAddress) {
31
+ try {
32
+ const { fetchPermissions } = await import("@base-org/account/spend-permission");
33
+ const permissions = await fetchPermissions({
34
+ account: userAccount,
35
+ chainId: 8453,
36
+ spender: spenderAccount,
37
+ });
38
+ if (tokenAddress) {
39
+ return permissions.filter(p => p.permission?.token?.toLowerCase() === tokenAddress.toLowerCase());
40
+ }
41
+ return permissions;
42
+ }
43
+ catch (error) {
44
+ console.error("❌ Failed to fetch spend permissions:", error);
45
+ return [];
46
+ }
47
+ }
48
+ /**
49
+ * BaseAccountActionProvider provides actions to interact with Base Account spend permissions.
50
+ */
51
+ class BaseAccountActionProvider extends actionProvider_1.ActionProvider {
52
+ /**
53
+ * Constructor for the BaseAccountActionProvider.
54
+ */
55
+ constructor() {
56
+ super("base_account", []);
57
+ /**
58
+ * Checks if the Base Account action provider supports the given network.
59
+ *
60
+ * @param network - The network to check.
61
+ * @returns True if the Base Account action provider supports the network, false otherwise.
62
+ */
63
+ this.supportsNetwork = (network) => {
64
+ // Base Account spend permissions are only supported on Base mainnet
65
+ return network.networkId === "base-mainnet";
66
+ };
67
+ }
68
+ /**
69
+ * Lists spend permissions that have been granted to the current wallet by a Base Account.
70
+ *
71
+ * @param walletProvider - The wallet provider to use for listing permissions.
72
+ * @param args - The input arguments for listing spend permissions.
73
+ * @returns A JSON string with the list of spend permissions.
74
+ */
75
+ async listBaseAccountSpendPermissions(walletProvider, args) {
76
+ try {
77
+ // Validate and normalize addresses
78
+ const baseAccount = (0, viem_1.getAddress)(args.baseAccount);
79
+ const spenderAddress = (0, viem_1.getAddress)(walletProvider.getAddress());
80
+ // Fetch permissions with retry logic
81
+ const permissions = await (0, utils_3.retryWithExponentialBackoff)(() => fetchUserSpendPermissions(baseAccount, spenderAddress), 3, // Max 3 retries
82
+ 1000);
83
+ if (permissions.length === 0) {
84
+ return JSON.stringify({
85
+ success: false,
86
+ error: "No spend permissions found for Base Account. The user needs to grant spend permissions first through the UI.",
87
+ baseAccount: baseAccount,
88
+ spender: spenderAddress,
89
+ permissionsCount: 0,
90
+ });
91
+ }
92
+ // Format the permissions with token details
93
+ const formattedPermissions = await Promise.all(permissions.map(async (permission, index) => {
94
+ const tokenAddress = permission.permission?.token || "";
95
+ const allowanceRaw = permission.permission?.allowance || 0;
96
+ // Get token details for proper formatting
97
+ let tokenName = "Unknown Token";
98
+ let allowanceFormatted;
99
+ if (tokenAddress) {
100
+ const tokenDetails = await (0, utils_1.getTokenDetails)(walletProvider, tokenAddress);
101
+ if (tokenDetails) {
102
+ tokenName = tokenDetails.name;
103
+ allowanceFormatted = (0, viem_1.formatUnits)(allowanceRaw, tokenDetails.decimals);
104
+ }
105
+ }
106
+ return {
107
+ permissionIndex: index + 1,
108
+ token: tokenAddress,
109
+ tokenName: tokenName,
110
+ allowance: allowanceFormatted || allowanceRaw.toString(),
111
+ createdAt: permission.createdAt ? (0, utils_2.formatTimestamp)(permission.createdAt) : "Unknown",
112
+ period: permission.permission?.period
113
+ ? (0, utils_2.formatPeriod)(permission.permission.period)
114
+ : "Unknown",
115
+ start: permission.permission?.start
116
+ ? (0, utils_2.formatTimestamp)(permission.permission.start)
117
+ : "Unknown",
118
+ end: permission.permission?.end
119
+ ? (0, utils_2.formatTimestamp)(permission.permission.end)
120
+ : "Unknown",
121
+ };
122
+ }));
123
+ return JSON.stringify({
124
+ success: true,
125
+ permissionsCount: permissions.length,
126
+ baseAccount: baseAccount,
127
+ spender: spenderAddress,
128
+ permissions: formattedPermissions,
129
+ });
130
+ }
131
+ catch (error) {
132
+ console.error("Error listing spend permissions:", error);
133
+ return JSON.stringify({
134
+ success: false,
135
+ error: `Error listing spend permissions: ${error instanceof Error ? error.message : "Unknown error"}`,
136
+ baseAccount: args.baseAccount,
137
+ spender: walletProvider.getAddress(),
138
+ });
139
+ }
140
+ }
141
+ /**
142
+ * Uses a spend permission to transfer tokens from a Base Account to the current wallet.
143
+ *
144
+ * @param walletProvider - The wallet provider to use for the spend operation.
145
+ * @param args - The input arguments for using the spend permission.
146
+ * @returns A JSON string with the spend operation results.
147
+ */
148
+ async spendFromBaseAccountPermission(walletProvider, args) {
149
+ try {
150
+ // Validate and normalize addresses
151
+ const baseAccount = (0, viem_1.getAddress)(args.baseAccount);
152
+ const spenderAddress = (0, viem_1.getAddress)(walletProvider.getAddress());
153
+ const tokenAddress = args.tokenAddress ? (0, viem_1.getAddress)(args.tokenAddress) : undefined;
154
+ // Fetch permissions to find a valid one with retry logic
155
+ const permissions = await (0, utils_3.retryWithExponentialBackoff)(() => fetchUserSpendPermissions(baseAccount, spenderAddress, tokenAddress), 3, // Max 3 retries
156
+ 1000);
157
+ if (permissions.length === 0) {
158
+ const errorMsg = tokenAddress
159
+ ? `No spend permissions found for Base Account with token ${tokenAddress}.`
160
+ : "No spend permissions found for Base Account.";
161
+ return JSON.stringify({
162
+ success: false,
163
+ error: `${errorMsg} The user needs to grant spend permissions first through the UI.`,
164
+ baseAccount: baseAccount,
165
+ spender: spenderAddress,
166
+ tokenAddress: tokenAddress,
167
+ });
168
+ }
169
+ // Determine which permission to use
170
+ const permissionIndex = args.permissionIndex || 1;
171
+ if (permissionIndex > permissions.length) {
172
+ return JSON.stringify({
173
+ success: false,
174
+ error: `Permission index ${permissionIndex} is out of range. Only ${permissions.length} permission(s) available.`,
175
+ baseAccount: baseAccount,
176
+ spender: spenderAddress,
177
+ availablePermissions: permissions.length,
178
+ });
179
+ }
180
+ // Use the specified permission (convert to 0-based index)
181
+ const _permission = permissions[permissionIndex - 1];
182
+ const permissionTokenAddress = _permission.permission?.token;
183
+ if (!permissionTokenAddress) {
184
+ return JSON.stringify({
185
+ success: false,
186
+ error: "Permission does not have a valid token address",
187
+ baseAccount: baseAccount,
188
+ spender: spenderAddress,
189
+ });
190
+ }
191
+ // Get token details for proper conversion
192
+ const tokenDetails = await (0, utils_1.getTokenDetails)(walletProvider, permissionTokenAddress);
193
+ if (!tokenDetails) {
194
+ return JSON.stringify({
195
+ success: false,
196
+ error: `Failed to get token details for address: ${permissionTokenAddress}`,
197
+ baseAccount: baseAccount,
198
+ spender: spenderAddress,
199
+ tokenAddress: permissionTokenAddress,
200
+ });
201
+ }
202
+ // Check permission status and prepare spend call data
203
+ const { getPermissionStatus, prepareSpendCallData } = await import("@base-org/account/spend-permission");
204
+ const status = await (0, utils_3.retryWithExponentialBackoff)(
205
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
206
+ () => getPermissionStatus(_permission), 3, // Max 3 retries
207
+ 1000, // 1s base delay
208
+ 2000);
209
+ // Determine amount to spend - use provided amount or full remaining allowance
210
+ const amountInAtomicUnits = args.amount
211
+ ? (0, viem_1.parseUnits)(args.amount.toString(), tokenDetails.decimals)
212
+ : status.remainingSpend;
213
+ if (status.remainingSpend < amountInAtomicUnits) {
214
+ const requestedAmountFormatted = args.amount?.toString() || (0, viem_1.formatUnits)(amountInAtomicUnits, tokenDetails.decimals);
215
+ return JSON.stringify({
216
+ success: false,
217
+ error: `Insufficient remaining allowance. Requested: ${requestedAmountFormatted} ${tokenDetails.name}, Available: ${(0, viem_1.formatUnits)(status.remainingSpend, tokenDetails.decimals)} ${tokenDetails.name}`,
218
+ baseAccount: baseAccount,
219
+ spender: spenderAddress,
220
+ tokenAddress: permissionTokenAddress,
221
+ tokenName: tokenDetails.name,
222
+ requestedAmount: requestedAmountFormatted,
223
+ availableAmount: (0, viem_1.formatUnits)(status.remainingSpend, tokenDetails.decimals),
224
+ });
225
+ }
226
+ // Prepare the spend transaction - returns an array of calls
227
+ const spendCalls = await (0, utils_3.retryWithExponentialBackoff)(
228
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
229
+ () => prepareSpendCallData(_permission, amountInAtomicUnits), 3, // Max 3 retries
230
+ 1000, // 1s base delay
231
+ 2000);
232
+ // Take the first call from the array (there should be one for spend operations)
233
+ if (!spendCalls || spendCalls.length === 0) {
234
+ throw new Error("No transaction calls returned from prepareSpendCallData");
235
+ }
236
+ const callData = spendCalls[0];
237
+ // Execute the spend transaction
238
+ const txHash = await walletProvider.sendTransaction({
239
+ to: callData.to,
240
+ data: callData.data,
241
+ value: BigInt(callData.value || "0x0"),
242
+ });
243
+ const amountSpentFormatted = (0, viem_1.formatUnits)(amountInAtomicUnits, tokenDetails.decimals);
244
+ return JSON.stringify({
245
+ success: true,
246
+ transactionHash: txHash,
247
+ amountSpent: amountSpentFormatted,
248
+ tokenAddress: permissionTokenAddress,
249
+ tokenName: tokenDetails.name,
250
+ baseAccount: baseAccount,
251
+ spender: spenderAddress,
252
+ permissionIndex: permissionIndex,
253
+ remainingAllowance: (0, viem_1.formatUnits)(status.remainingSpend - amountInAtomicUnits, tokenDetails.decimals),
254
+ });
255
+ }
256
+ catch (error) {
257
+ console.error("Error using spend permission:", error);
258
+ return JSON.stringify({
259
+ success: false,
260
+ error: `Error using spend permission: ${error instanceof Error ? error.message : "Unknown error"}`,
261
+ baseAccount: args.baseAccount,
262
+ spender: walletProvider.getAddress(),
263
+ amountRequested: args.amount?.toString() || "full allowance",
264
+ tokenAddress: args.tokenAddress,
265
+ permissionIndex: args.permissionIndex,
266
+ });
267
+ }
268
+ }
269
+ /**
270
+ * Revokes a spend permission that was previously granted by a Base Account to the current wallet.
271
+ *
272
+ * @param walletProvider - The wallet provider to use for the revoke operation.
273
+ * @param args - The input arguments for revoking the spend permission.
274
+ * @returns A JSON string with the revoke operation results.
275
+ */
276
+ async revokeBaseAccountSpendPermission(walletProvider, args) {
277
+ try {
278
+ // Validate and normalize addresses
279
+ const baseAccount = (0, viem_1.getAddress)(args.baseAccount);
280
+ const spenderAddress = (0, viem_1.getAddress)(walletProvider.getAddress());
281
+ // Fetch permissions to find the one to revoke with retry logic
282
+ const permissions = await (0, utils_3.retryWithExponentialBackoff)(() => fetchUserSpendPermissions(baseAccount, spenderAddress), 3, // Max 3 retries
283
+ 1000);
284
+ if (permissions.length === 0) {
285
+ return JSON.stringify({
286
+ success: false,
287
+ error: "No spend permissions found for Base Account. There are no permissions to revoke.",
288
+ baseAccount: baseAccount,
289
+ spender: spenderAddress,
290
+ });
291
+ }
292
+ // Determine which permission to revoke
293
+ const permissionIndex = args.permissionIndex || 1;
294
+ if (permissionIndex > permissions.length) {
295
+ return JSON.stringify({
296
+ success: false,
297
+ error: `Permission index ${permissionIndex} is out of range. Only ${permissions.length} permission(s) available.`,
298
+ baseAccount: baseAccount,
299
+ spender: spenderAddress,
300
+ availablePermissions: permissions.length,
301
+ });
302
+ }
303
+ // Use the specified permission (convert to 0-based index)
304
+ const _permission = permissions[permissionIndex - 1];
305
+ // Prepare the revoke transaction
306
+ const { prepareRevokeCallData } = await import("@base-org/account/spend-permission");
307
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
308
+ const revokeCall = await prepareRevokeCallData(_permission);
309
+ // Execute the revoke transaction
310
+ const txHash = await walletProvider.sendTransaction({
311
+ to: revokeCall.to,
312
+ data: revokeCall.data,
313
+ value: BigInt(revokeCall.value || "0x0"),
314
+ });
315
+ return JSON.stringify({
316
+ success: true,
317
+ transactionHash: txHash,
318
+ revokedPermissionIndex: permissionIndex,
319
+ baseAccount: baseAccount,
320
+ spender: spenderAddress,
321
+ message: "Spend permission successfully revoked",
322
+ });
323
+ }
324
+ catch (error) {
325
+ console.error("Error revoking spend permission:", error);
326
+ return JSON.stringify({
327
+ success: false,
328
+ error: `Error revoking spend permission: ${error instanceof Error ? error.message : "Unknown error"}`,
329
+ baseAccount: args.baseAccount,
330
+ spender: walletProvider.getAddress(),
331
+ permissionIndex: args.permissionIndex,
332
+ });
333
+ }
334
+ }
335
+ }
336
+ exports.BaseAccountActionProvider = BaseAccountActionProvider;
337
+ __decorate([
338
+ (0, actionDecorator_1.CreateAction)({
339
+ name: "list_base_account_spend_permissions",
340
+ description: `
341
+ This tool lists spend permissions that have been granted to the current wallet by a Base Account.
342
+
343
+ It takes the following inputs:
344
+ - baseAccount: The Base Account address to check if it has granted spend permissions
345
+
346
+ Important notes:
347
+ - This tool is specifically designed for Base Account spend permissions
348
+ - The returned period is the time duration for resetting the used allowance on a recurring basis within the start and end timestamps
349
+ - The returned allowance is the maximum allowed value to spend within each period
350
+ `,
351
+ schema: schemas_1.ListBaseAccountSpendPermissionsSchema,
352
+ }),
353
+ __metadata("design:type", Function),
354
+ __metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
355
+ __metadata("design:returntype", Promise)
356
+ ], BaseAccountActionProvider.prototype, "listBaseAccountSpendPermissions", null);
357
+ __decorate([
358
+ (0, actionDecorator_1.CreateAction)({
359
+ name: "spend_from_base_account_permission",
360
+ description: `
361
+ This tool uses a spend permission to transfer tokens from a Base Account to the current wallet.
362
+
363
+ It takes the following inputs:
364
+ - baseAccount: The Base Account address that has granted the spend permission
365
+ - amount: (Optional) The amount to spend in whole units of the token (e.g. 4.6 for 4.6 tokens). If not provided, will withdraw the full remaining allowance
366
+ - tokenAddress: (Optional) The token contract address. If not provided, will use the first available permission token
367
+ - permissionIndex: (Optional) The index of the permission to use (1-based). If not provided, the first permission will be used
368
+
369
+ Important notes:
370
+ - The Base Account must have previously granted a spend permission to the current agent
371
+ - This tool automatically finds and uses the specified token spend permission, or the first valid permission if no token is specified
372
+ - The funds are transferred from the Base Account to the current wallet after successful execution
373
+ - This is specifically designed for Base Account spend permissions on Base mainnet
374
+ `,
375
+ schema: schemas_1.UseBaseAccountSpendPermissionSchema,
376
+ }),
377
+ __metadata("design:type", Function),
378
+ __metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
379
+ __metadata("design:returntype", Promise)
380
+ ], BaseAccountActionProvider.prototype, "spendFromBaseAccountPermission", null);
381
+ __decorate([
382
+ (0, actionDecorator_1.CreateAction)({
383
+ name: "revoke_base_account_spend_permission",
384
+ description: `
385
+ This tool revokes a spend permission that was previously granted by a Base Account to the current wallet.
386
+
387
+ It takes the following inputs:
388
+ - baseAccount: The Base Account address that has granted the spend permission
389
+ - permissionIndex: (Optional) The index of the permission to revoke (1-based). If not provided, the first permission will be revoked
390
+
391
+ Important notes:
392
+ - This permanently revokes the spend permission - it cannot be undone
393
+ - The Base Account must have previously granted a spend permission to the current agent
394
+ - This tool automatically finds and revokes the specified token spend permission
395
+ - This is specifically designed for Base Account spend permissions on Base mainnet
396
+ `,
397
+ schema: schemas_1.RevokeBaseAccountSpendPermissionSchema,
398
+ }),
399
+ __metadata("design:type", Function),
400
+ __metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
401
+ __metadata("design:returntype", Promise)
402
+ ], BaseAccountActionProvider.prototype, "revokeBaseAccountSpendPermission", null);
403
+ const baseAccountActionProvider = () => new BaseAccountActionProvider();
404
+ exports.baseAccountActionProvider = baseAccountActionProvider;