@coinbase/agentkit 0.0.0-nightly-20250328174338

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 (292) hide show
  1. package/README.md +827 -0
  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/actionDecorator.d.ts +69 -0
  15. package/dist/action-providers/actionDecorator.js +96 -0
  16. package/dist/action-providers/actionProvider.d.ts +48 -0
  17. package/dist/action-providers/actionProvider.js +62 -0
  18. package/dist/action-providers/alchemy/alchemyTokenPricesActionProvider.d.ts +55 -0
  19. package/dist/action-providers/alchemy/alchemyTokenPricesActionProvider.js +173 -0
  20. package/dist/action-providers/alchemy/alchemyTokenPricesActionProvider.test.d.ts +1 -0
  21. package/dist/action-providers/alchemy/alchemyTokenPricesActionProvider.test.js +131 -0
  22. package/dist/action-providers/alchemy/index.d.ts +2 -0
  23. package/dist/action-providers/alchemy/index.js +18 -0
  24. package/dist/action-providers/alchemy/schemas.d.ts +41 -0
  25. package/dist/action-providers/alchemy/schemas.js +34 -0
  26. package/dist/action-providers/allora/alloraActionProvider.d.ts +44 -0
  27. package/dist/action-providers/allora/alloraActionProvider.js +195 -0
  28. package/dist/action-providers/allora/alloraActionProvider.test.d.ts +1 -0
  29. package/dist/action-providers/allora/alloraActionProvider.test.js +109 -0
  30. package/dist/action-providers/allora/index.d.ts +2 -0
  31. package/dist/action-providers/allora/index.js +18 -0
  32. package/dist/action-providers/allora/schemas.d.ts +28 -0
  33. package/dist/action-providers/allora/schemas.js +30 -0
  34. package/dist/action-providers/basename/basenameActionProvider.d.ts +30 -0
  35. package/dist/action-providers/basename/basenameActionProvider.js +109 -0
  36. package/dist/action-providers/basename/basenameActionProvider.test.d.ts +1 -0
  37. package/dist/action-providers/basename/basenameActionProvider.test.js +146 -0
  38. package/dist/action-providers/basename/constants.d.ts +52 -0
  39. package/dist/action-providers/basename/constants.js +81 -0
  40. package/dist/action-providers/basename/index.d.ts +2 -0
  41. package/dist/action-providers/basename/index.js +18 -0
  42. package/dist/action-providers/basename/schemas.d.ts +14 -0
  43. package/dist/action-providers/basename/schemas.js +14 -0
  44. package/dist/action-providers/cdp/cdpApiActionProvider.d.ts +43 -0
  45. package/dist/action-providers/cdp/cdpApiActionProvider.js +128 -0
  46. package/dist/action-providers/cdp/cdpApiActionProvider.test.d.ts +1 -0
  47. package/dist/action-providers/cdp/cdpApiActionProvider.test.js +146 -0
  48. package/dist/action-providers/cdp/cdpWalletActionProvider.d.ts +58 -0
  49. package/dist/action-providers/cdp/cdpWalletActionProvider.js +224 -0
  50. package/dist/action-providers/cdp/cdpWalletActionProvider.test.d.ts +1 -0
  51. package/dist/action-providers/cdp/cdpWalletActionProvider.test.js +267 -0
  52. package/dist/action-providers/cdp/constants.d.ts +31 -0
  53. package/dist/action-providers/cdp/constants.js +34 -0
  54. package/dist/action-providers/cdp/index.d.ts +3 -0
  55. package/dist/action-providers/cdp/index.js +19 -0
  56. package/dist/action-providers/cdp/schemas.d.ts +91 -0
  57. package/dist/action-providers/cdp/schemas.js +77 -0
  58. package/dist/action-providers/compound/compoundActionProvider.d.ts +67 -0
  59. package/dist/action-providers/compound/compoundActionProvider.js +365 -0
  60. package/dist/action-providers/compound/compoundActionProvider.test.d.ts +1 -0
  61. package/dist/action-providers/compound/compoundActionProvider.test.js +353 -0
  62. package/dist/action-providers/compound/constants.d.ts +180 -0
  63. package/dist/action-providers/compound/constants.js +129 -0
  64. package/dist/action-providers/compound/index.d.ts +1 -0
  65. package/dist/action-providers/compound/index.js +17 -0
  66. package/dist/action-providers/compound/schemas.d.ts +57 -0
  67. package/dist/action-providers/compound/schemas.js +58 -0
  68. package/dist/action-providers/compound/utils.d.ts +95 -0
  69. package/dist/action-providers/compound/utils.js +353 -0
  70. package/dist/action-providers/customActionProvider.d.ts +30 -0
  71. package/dist/action-providers/customActionProvider.js +66 -0
  72. package/dist/action-providers/defillama/constants.d.ts +8 -0
  73. package/dist/action-providers/defillama/constants.js +11 -0
  74. package/dist/action-providers/defillama/defillamaActionProvider.d.ts +54 -0
  75. package/dist/action-providers/defillama/defillamaActionProvider.js +180 -0
  76. package/dist/action-providers/defillama/defillamaActionProvider.test.d.ts +1 -0
  77. package/dist/action-providers/defillama/defillamaActionProvider.test.js +114 -0
  78. package/dist/action-providers/defillama/index.d.ts +1 -0
  79. package/dist/action-providers/defillama/index.js +17 -0
  80. package/dist/action-providers/defillama/schemas.d.ts +34 -0
  81. package/dist/action-providers/defillama/schemas.js +34 -0
  82. package/dist/action-providers/defillama/types.d.ts +73 -0
  83. package/dist/action-providers/defillama/types.js +2 -0
  84. package/dist/action-providers/defillama/utils.d.ts +10 -0
  85. package/dist/action-providers/defillama/utils.js +87 -0
  86. package/dist/action-providers/defillama/utils.test.d.ts +1 -0
  87. package/dist/action-providers/defillama/utils.test.js +124 -0
  88. package/dist/action-providers/erc20/constants.d.ts +137 -0
  89. package/dist/action-providers/erc20/constants.js +202 -0
  90. package/dist/action-providers/erc20/erc20ActionProvider.d.ts +38 -0
  91. package/dist/action-providers/erc20/erc20ActionProvider.js +142 -0
  92. package/dist/action-providers/erc20/erc20ActionProvider.test.d.ts +1 -0
  93. package/dist/action-providers/erc20/erc20ActionProvider.test.js +131 -0
  94. package/dist/action-providers/erc20/index.d.ts +1 -0
  95. package/dist/action-providers/erc20/index.js +17 -0
  96. package/dist/action-providers/erc20/schemas.d.ts +27 -0
  97. package/dist/action-providers/erc20/schemas.js +26 -0
  98. package/dist/action-providers/erc721/constants.d.ts +232 -0
  99. package/dist/action-providers/erc721/constants.js +298 -0
  100. package/dist/action-providers/erc721/erc721ActionProvider.d.ts +46 -0
  101. package/dist/action-providers/erc721/erc721ActionProvider.js +164 -0
  102. package/dist/action-providers/erc721/erc721ActionProvider.test.d.ts +1 -0
  103. package/dist/action-providers/erc721/erc721ActionProvider.test.js +137 -0
  104. package/dist/action-providers/erc721/index.d.ts +1 -0
  105. package/dist/action-providers/erc721/index.js +17 -0
  106. package/dist/action-providers/erc721/schemas.d.ts +46 -0
  107. package/dist/action-providers/erc721/schemas.js +44 -0
  108. package/dist/action-providers/farcaster/farcasterActionProvider.d.ts +57 -0
  109. package/dist/action-providers/farcaster/farcasterActionProvider.js +142 -0
  110. package/dist/action-providers/farcaster/farcasterActionProvider.test.d.ts +1 -0
  111. package/dist/action-providers/farcaster/farcasterActionProvider.test.js +151 -0
  112. package/dist/action-providers/farcaster/index.d.ts +2 -0
  113. package/dist/action-providers/farcaster/index.js +18 -0
  114. package/dist/action-providers/farcaster/schemas.d.ts +15 -0
  115. package/dist/action-providers/farcaster/schemas.js +20 -0
  116. package/dist/action-providers/index.d.ts +24 -0
  117. package/dist/action-providers/index.js +40 -0
  118. package/dist/action-providers/jupiter/index.d.ts +1 -0
  119. package/dist/action-providers/jupiter/index.js +17 -0
  120. package/dist/action-providers/jupiter/jupiterActionProvider.d.ts +36 -0
  121. package/dist/action-providers/jupiter/jupiterActionProvider.js +115 -0
  122. package/dist/action-providers/jupiter/jupiterActionProvider.test.d.ts +1 -0
  123. package/dist/action-providers/jupiter/jupiterActionProvider.test.js +146 -0
  124. package/dist/action-providers/jupiter/schemas.d.ts +20 -0
  125. package/dist/action-providers/jupiter/schemas.js +20 -0
  126. package/dist/action-providers/messari/constants.d.ts +17 -0
  127. package/dist/action-providers/messari/constants.js +20 -0
  128. package/dist/action-providers/messari/index.d.ts +5 -0
  129. package/dist/action-providers/messari/index.js +21 -0
  130. package/dist/action-providers/messari/messariActionProvider.d.ts +42 -0
  131. package/dist/action-providers/messari/messariActionProvider.js +128 -0
  132. package/dist/action-providers/messari/messariActionProvider.test.d.ts +1 -0
  133. package/dist/action-providers/messari/messariActionProvider.test.js +152 -0
  134. package/dist/action-providers/messari/schemas.d.ts +11 -0
  135. package/dist/action-providers/messari/schemas.js +16 -0
  136. package/dist/action-providers/messari/types.d.ts +40 -0
  137. package/dist/action-providers/messari/types.js +2 -0
  138. package/dist/action-providers/messari/utils.d.ts +22 -0
  139. package/dist/action-providers/messari/utils.js +65 -0
  140. package/dist/action-providers/moonwell/constants.d.ts +78 -0
  141. package/dist/action-providers/moonwell/constants.js +111 -0
  142. package/dist/action-providers/moonwell/index.d.ts +1 -0
  143. package/dist/action-providers/moonwell/index.js +5 -0
  144. package/dist/action-providers/moonwell/moonwellActionProvider.d.ts +39 -0
  145. package/dist/action-providers/moonwell/moonwellActionProvider.js +249 -0
  146. package/dist/action-providers/moonwell/moonwellActionProvider.test.d.ts +1 -0
  147. package/dist/action-providers/moonwell/moonwellActionProvider.test.js +455 -0
  148. package/dist/action-providers/moonwell/schemas.d.ts +30 -0
  149. package/dist/action-providers/moonwell/schemas.js +39 -0
  150. package/dist/action-providers/morpho/constants.d.ts +16 -0
  151. package/dist/action-providers/morpho/constants.js +27 -0
  152. package/dist/action-providers/morpho/index.d.ts +2 -0
  153. package/dist/action-providers/morpho/index.js +18 -0
  154. package/dist/action-providers/morpho/morphoActionProvider.d.ts +39 -0
  155. package/dist/action-providers/morpho/morphoActionProvider.js +154 -0
  156. package/dist/action-providers/morpho/morphoActionProvider.test.d.ts +1 -0
  157. package/dist/action-providers/morpho/morphoActionProvider.test.js +128 -0
  158. package/dist/action-providers/morpho/schemas.d.ts +36 -0
  159. package/dist/action-providers/morpho/schemas.js +47 -0
  160. package/dist/action-providers/opensea/index.d.ts +1 -0
  161. package/dist/action-providers/opensea/index.js +17 -0
  162. package/dist/action-providers/opensea/openseaActionProvider.d.ts +59 -0
  163. package/dist/action-providers/opensea/openseaActionProvider.js +146 -0
  164. package/dist/action-providers/opensea/openseaActionProvider.test.d.ts +1 -0
  165. package/dist/action-providers/opensea/openseaActionProvider.test.js +201 -0
  166. package/dist/action-providers/opensea/schemas.d.ts +30 -0
  167. package/dist/action-providers/opensea/schemas.js +33 -0
  168. package/dist/action-providers/opensea/utils.d.ts +12 -0
  169. package/dist/action-providers/opensea/utils.js +47 -0
  170. package/dist/action-providers/pyth/index.d.ts +2 -0
  171. package/dist/action-providers/pyth/index.js +18 -0
  172. package/dist/action-providers/pyth/pythActionProvider.d.ts +33 -0
  173. package/dist/action-providers/pyth/pythActionProvider.js +121 -0
  174. package/dist/action-providers/pyth/pythActionProvider.test.d.ts +1 -0
  175. package/dist/action-providers/pyth/pythActionProvider.test.js +113 -0
  176. package/dist/action-providers/pyth/schemas.d.ts +21 -0
  177. package/dist/action-providers/pyth/schemas.js +20 -0
  178. package/dist/action-providers/spl/index.d.ts +1 -0
  179. package/dist/action-providers/spl/index.js +17 -0
  180. package/dist/action-providers/spl/schemas.d.ts +30 -0
  181. package/dist/action-providers/spl/schemas.js +26 -0
  182. package/dist/action-providers/spl/splActionProvider.d.ts +45 -0
  183. package/dist/action-providers/spl/splActionProvider.js +173 -0
  184. package/dist/action-providers/spl/splActionProvider.test.d.ts +1 -0
  185. package/dist/action-providers/spl/splActionProvider.test.js +300 -0
  186. package/dist/action-providers/twitter/index.d.ts +2 -0
  187. package/dist/action-providers/twitter/index.js +18 -0
  188. package/dist/action-providers/twitter/schemas.d.ts +38 -0
  189. package/dist/action-providers/twitter/schemas.js +44 -0
  190. package/dist/action-providers/twitter/twitterActionProvider.d.ts +82 -0
  191. package/dist/action-providers/twitter/twitterActionProvider.js +204 -0
  192. package/dist/action-providers/twitter/twitterActionProvider.test.d.ts +1 -0
  193. package/dist/action-providers/twitter/twitterActionProvider.test.js +185 -0
  194. package/dist/action-providers/wallet/index.d.ts +1 -0
  195. package/dist/action-providers/wallet/index.js +17 -0
  196. package/dist/action-providers/wallet/schemas.d.ts +19 -0
  197. package/dist/action-providers/wallet/schemas.js +19 -0
  198. package/dist/action-providers/wallet/walletActionProvider.d.ts +44 -0
  199. package/dist/action-providers/wallet/walletActionProvider.js +140 -0
  200. package/dist/action-providers/wallet/walletActionProvider.test.d.ts +1 -0
  201. package/dist/action-providers/wallet/walletActionProvider.test.js +194 -0
  202. package/dist/action-providers/weth/constants.d.ts +19 -0
  203. package/dist/action-providers/weth/constants.js +29 -0
  204. package/dist/action-providers/weth/index.d.ts +1 -0
  205. package/dist/action-providers/weth/index.js +17 -0
  206. package/dist/action-providers/weth/schemas.d.ts +8 -0
  207. package/dist/action-providers/weth/schemas.js +10 -0
  208. package/dist/action-providers/weth/wethActionProvider.d.ts +30 -0
  209. package/dist/action-providers/weth/wethActionProvider.js +89 -0
  210. package/dist/action-providers/weth/wethActionProvider.test.d.ts +1 -0
  211. package/dist/action-providers/weth/wethActionProvider.test.js +92 -0
  212. package/dist/action-providers/wow/constants.d.ts +15 -0
  213. package/dist/action-providers/wow/constants.js +844 -0
  214. package/dist/action-providers/wow/index.d.ts +2 -0
  215. package/dist/action-providers/wow/index.js +18 -0
  216. package/dist/action-providers/wow/schemas.d.ts +43 -0
  217. package/dist/action-providers/wow/schemas.js +47 -0
  218. package/dist/action-providers/wow/uniswap/constants.d.ts +3 -0
  219. package/dist/action-providers/wow/uniswap/constants.js +100 -0
  220. package/dist/action-providers/wow/uniswap/utils.d.ts +82 -0
  221. package/dist/action-providers/wow/uniswap/utils.js +226 -0
  222. package/dist/action-providers/wow/utils.d.ts +27 -0
  223. package/dist/action-providers/wow/utils.js +63 -0
  224. package/dist/action-providers/wow/wowActionProvider.d.ts +46 -0
  225. package/dist/action-providers/wow/wowActionProvider.js +223 -0
  226. package/dist/action-providers/wow/wowActionProvider.test.d.ts +1 -0
  227. package/dist/action-providers/wow/wowActionProvider.test.js +291 -0
  228. package/dist/agentkit.d.ts +44 -0
  229. package/dist/agentkit.js +68 -0
  230. package/dist/analytics/index.d.ts +1 -0
  231. package/dist/analytics/index.js +17 -0
  232. package/dist/analytics/sendAnalyticsEvent.d.ts +31 -0
  233. package/dist/analytics/sendAnalyticsEvent.js +52 -0
  234. package/dist/index.d.ts +4 -0
  235. package/dist/index.js +20 -0
  236. package/dist/network/index.d.ts +3 -0
  237. package/dist/network/index.js +19 -0
  238. package/dist/network/network.d.ts +20 -0
  239. package/dist/network/network.js +86 -0
  240. package/dist/network/svm.d.ts +15 -0
  241. package/dist/network/svm.js +38 -0
  242. package/dist/network/types.d.ts +17 -0
  243. package/dist/network/types.js +2 -0
  244. package/dist/utils.d.ts +22 -0
  245. package/dist/utils.js +57 -0
  246. package/dist/utils.test.d.ts +1 -0
  247. package/dist/utils.test.js +50 -0
  248. package/dist/wallet-providers/cdpWalletProvider.d.ts +246 -0
  249. package/dist/wallet-providers/cdpWalletProvider.js +421 -0
  250. package/dist/wallet-providers/cdpWalletProvider.test.d.ts +1 -0
  251. package/dist/wallet-providers/cdpWalletProvider.test.js +701 -0
  252. package/dist/wallet-providers/evmWalletProvider.d.ts +51 -0
  253. package/dist/wallet-providers/evmWalletProvider.js +14 -0
  254. package/dist/wallet-providers/evmWalletProvider.test.d.ts +1 -0
  255. package/dist/wallet-providers/evmWalletProvider.test.js +56 -0
  256. package/dist/wallet-providers/index.d.ts +10 -0
  257. package/dist/wallet-providers/index.js +26 -0
  258. package/dist/wallet-providers/privyEvmWalletProvider.d.ts +55 -0
  259. package/dist/wallet-providers/privyEvmWalletProvider.js +140 -0
  260. package/dist/wallet-providers/privyEvmWalletProvider.test.d.ts +1 -0
  261. package/dist/wallet-providers/privyEvmWalletProvider.test.js +331 -0
  262. package/dist/wallet-providers/privyShared.d.ts +40 -0
  263. package/dist/wallet-providers/privyShared.js +49 -0
  264. package/dist/wallet-providers/privySvmWalletProvider.d.ts +128 -0
  265. package/dist/wallet-providers/privySvmWalletProvider.js +212 -0
  266. package/dist/wallet-providers/privySvmWalletProvider.test.d.ts +1 -0
  267. package/dist/wallet-providers/privySvmWalletProvider.test.js +310 -0
  268. package/dist/wallet-providers/privyWalletProvider.d.ts +35 -0
  269. package/dist/wallet-providers/privyWalletProvider.js +39 -0
  270. package/dist/wallet-providers/privyWalletProvider.test.d.ts +1 -0
  271. package/dist/wallet-providers/privyWalletProvider.test.js +124 -0
  272. package/dist/wallet-providers/smartWalletProvider.d.ts +177 -0
  273. package/dist/wallet-providers/smartWalletProvider.js +303 -0
  274. package/dist/wallet-providers/smartWalletProvider.test.d.ts +1 -0
  275. package/dist/wallet-providers/smartWalletProvider.test.js +388 -0
  276. package/dist/wallet-providers/solanaKeypairWalletProvider.d.ts +143 -0
  277. package/dist/wallet-providers/solanaKeypairWalletProvider.js +280 -0
  278. package/dist/wallet-providers/solanaKeypairWalletProvider.test.d.ts +1 -0
  279. package/dist/wallet-providers/solanaKeypairWalletProvider.test.js +218 -0
  280. package/dist/wallet-providers/svmWalletProvider.d.ts +56 -0
  281. package/dist/wallet-providers/svmWalletProvider.js +13 -0
  282. package/dist/wallet-providers/svmWalletProvider.test.d.ts +1 -0
  283. package/dist/wallet-providers/svmWalletProvider.test.js +55 -0
  284. package/dist/wallet-providers/viemWalletProvider.d.ts +103 -0
  285. package/dist/wallet-providers/viemWalletProvider.js +206 -0
  286. package/dist/wallet-providers/viemWalletProvider.test.d.ts +1 -0
  287. package/dist/wallet-providers/viemWalletProvider.test.js +338 -0
  288. package/dist/wallet-providers/walletProvider.d.ts +48 -0
  289. package/dist/wallet-providers/walletProvider.js +41 -0
  290. package/dist/wallet-providers/walletProvider.test.d.ts +1 -0
  291. package/dist/wallet-providers/walletProvider.test.js +103 -0
  292. package/package.json +83 -0
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const viem_1 = require("viem");
4
+ const basenameActionProvider_1 = require("./basenameActionProvider");
5
+ const constants_1 = require("./constants");
6
+ const schemas_1 = require("./schemas");
7
+ const coinbase_sdk_1 = require("@coinbase/coinbase-sdk");
8
+ const MOCK_AMOUNT = "0.123";
9
+ const MOCK_BASENAME = "test-basename";
10
+ describe("Register Basename Input", () => {
11
+ it("should successfully parse valid input", () => {
12
+ const validInput = {
13
+ amount: MOCK_AMOUNT,
14
+ basename: MOCK_BASENAME,
15
+ };
16
+ const result = schemas_1.RegisterBasenameSchema.safeParse(validInput);
17
+ expect(result.success).toBe(true);
18
+ expect(result.data).toEqual(validInput);
19
+ });
20
+ it("should fail parsing empty input", () => {
21
+ const emptyInput = {};
22
+ const result = schemas_1.RegisterBasenameSchema.safeParse(emptyInput);
23
+ expect(result.success).toBe(false);
24
+ });
25
+ });
26
+ describe("Register Basename Action", () => {
27
+ /**
28
+ * This is the default network.
29
+ */
30
+ const NETWORK_ID = coinbase_sdk_1.Coinbase.networks.BaseMainnet;
31
+ /**
32
+ * This is a 40 character hexadecimal string that requires lowercase alpha characters.
33
+ */
34
+ const ADDRESS_ID = "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83";
35
+ let mockWallet;
36
+ const actionProvider = (0, basenameActionProvider_1.basenameActionProvider)();
37
+ beforeEach(() => {
38
+ mockWallet = {
39
+ getAddress: jest.fn().mockReturnValue(ADDRESS_ID),
40
+ getNetwork: jest.fn().mockReturnValue({ networkId: NETWORK_ID }),
41
+ sendTransaction: jest.fn(),
42
+ waitForTransactionReceipt: jest.fn(),
43
+ };
44
+ mockWallet.sendTransaction.mockResolvedValue("some-hash");
45
+ mockWallet.waitForTransactionReceipt.mockResolvedValue({});
46
+ });
47
+ it(`should Successfully respond with ${MOCK_BASENAME}.base.eth for network: ${coinbase_sdk_1.Coinbase.networks.BaseMainnet}`, async () => {
48
+ const args = {
49
+ amount: MOCK_AMOUNT,
50
+ basename: MOCK_BASENAME,
51
+ };
52
+ const name = `${MOCK_BASENAME}.base.eth`;
53
+ mockWallet.getNetwork.mockReturnValue({
54
+ protocolFamily: "evm",
55
+ networkId: coinbase_sdk_1.Coinbase.networks.BaseMainnet,
56
+ });
57
+ const response = await actionProvider.register(mockWallet, args);
58
+ expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
59
+ to: constants_1.BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET,
60
+ data: (0, viem_1.encodeFunctionData)({
61
+ abi: constants_1.REGISTRAR_ABI,
62
+ functionName: "register",
63
+ args: [
64
+ {
65
+ name: MOCK_BASENAME,
66
+ owner: ADDRESS_ID,
67
+ duration: constants_1.REGISTRATION_DURATION,
68
+ resolver: constants_1.L2_RESOLVER_ADDRESS_MAINNET,
69
+ data: [
70
+ (0, viem_1.encodeFunctionData)({
71
+ abi: constants_1.L2_RESOLVER_ABI,
72
+ functionName: "setAddr",
73
+ args: [(0, viem_1.namehash)(name), ADDRESS_ID],
74
+ }),
75
+ (0, viem_1.encodeFunctionData)({
76
+ abi: constants_1.L2_RESOLVER_ABI,
77
+ functionName: "setName",
78
+ args: [(0, viem_1.namehash)(name), name],
79
+ }),
80
+ ],
81
+ reverseRecord: true,
82
+ },
83
+ ],
84
+ }),
85
+ value: (0, viem_1.parseEther)(MOCK_AMOUNT),
86
+ });
87
+ expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith("some-hash");
88
+ expect(response).toContain(`Successfully registered basename ${MOCK_BASENAME}.base.eth`);
89
+ expect(response).toContain(`for address ${ADDRESS_ID}`);
90
+ });
91
+ it(`should Successfully respond with ${MOCK_BASENAME}.basetest.eth for any other network`, async () => {
92
+ const args = {
93
+ amount: MOCK_AMOUNT,
94
+ basename: MOCK_BASENAME,
95
+ };
96
+ const name = `${MOCK_BASENAME}.basetest.eth`;
97
+ mockWallet.getNetwork.mockReturnValue({
98
+ protocolFamily: "evm",
99
+ networkId: "anything-else",
100
+ });
101
+ const response = await actionProvider.register(mockWallet, args);
102
+ expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
103
+ to: constants_1.BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET,
104
+ data: (0, viem_1.encodeFunctionData)({
105
+ abi: constants_1.REGISTRAR_ABI,
106
+ functionName: "register",
107
+ args: [
108
+ {
109
+ name: MOCK_BASENAME,
110
+ owner: ADDRESS_ID,
111
+ duration: constants_1.REGISTRATION_DURATION,
112
+ resolver: constants_1.L2_RESOLVER_ADDRESS_TESTNET,
113
+ data: [
114
+ (0, viem_1.encodeFunctionData)({
115
+ abi: constants_1.L2_RESOLVER_ABI,
116
+ functionName: "setAddr",
117
+ args: [(0, viem_1.namehash)(name), ADDRESS_ID],
118
+ }),
119
+ (0, viem_1.encodeFunctionData)({
120
+ abi: constants_1.L2_RESOLVER_ABI,
121
+ functionName: "setName",
122
+ args: [(0, viem_1.namehash)(name), name],
123
+ }),
124
+ ],
125
+ reverseRecord: true,
126
+ },
127
+ ],
128
+ }),
129
+ value: (0, viem_1.parseEther)(MOCK_AMOUNT),
130
+ });
131
+ expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith("some-hash");
132
+ expect(response).toContain(`Successfully registered basename ${MOCK_BASENAME}.basetest.eth`);
133
+ expect(response).toContain(`for address ${ADDRESS_ID}`);
134
+ });
135
+ it("should fail with an error", async () => {
136
+ const args = {
137
+ amount: MOCK_AMOUNT,
138
+ basename: MOCK_BASENAME,
139
+ };
140
+ const error = new Error("Failed to register basename");
141
+ mockWallet.sendTransaction.mockRejectedValue(error);
142
+ await actionProvider.register(mockWallet, args);
143
+ expect(mockWallet.sendTransaction).toHaveBeenCalled();
144
+ expect(`Error registering basename: ${error}`);
145
+ });
146
+ });
@@ -0,0 +1,52 @@
1
+ export declare const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET = "0x4cCb0BB02FCABA27e82a56646E81d8c5bC4119a5";
2
+ export declare const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET = "0x49aE3cC2e3AA768B1e5654f5D3C6002144A59581";
3
+ export declare const L2_RESOLVER_ADDRESS_MAINNET = "0xC6d566A56A1aFf6508b41f6c90ff131615583BCD";
4
+ export declare const L2_RESOLVER_ADDRESS_TESTNET = "0x6533C94869D28fAA8dF77cc63f9e2b2D6Cf77eBA";
5
+ export declare const REGISTRATION_DURATION = 31557600n;
6
+ export declare const L2_RESOLVER_ABI: {
7
+ inputs: {
8
+ internalType: string;
9
+ name: string;
10
+ type: string;
11
+ }[];
12
+ name: string;
13
+ outputs: never[];
14
+ stateMutability: string;
15
+ type: string;
16
+ }[];
17
+ export declare const REGISTRAR_ABI: readonly [{
18
+ readonly inputs: readonly [{
19
+ readonly components: readonly [{
20
+ readonly internalType: "string";
21
+ readonly name: "name";
22
+ readonly type: "string";
23
+ }, {
24
+ readonly internalType: "address";
25
+ readonly name: "owner";
26
+ readonly type: "address";
27
+ }, {
28
+ readonly internalType: "uint256";
29
+ readonly name: "duration";
30
+ readonly type: "uint256";
31
+ }, {
32
+ readonly internalType: "address";
33
+ readonly name: "resolver";
34
+ readonly type: "address";
35
+ }, {
36
+ readonly internalType: "bytes[]";
37
+ readonly name: "data";
38
+ readonly type: "bytes[]";
39
+ }, {
40
+ readonly internalType: "bool";
41
+ readonly name: "reverseRecord";
42
+ readonly type: "bool";
43
+ }];
44
+ readonly internalType: "struct RegistrarController.RegisterRequest";
45
+ readonly name: "request";
46
+ readonly type: "tuple";
47
+ }];
48
+ readonly name: "register";
49
+ readonly outputs: readonly [];
50
+ readonly stateMutability: "payable";
51
+ readonly type: "function";
52
+ }];
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REGISTRAR_ABI = exports.L2_RESOLVER_ABI = exports.REGISTRATION_DURATION = exports.L2_RESOLVER_ADDRESS_TESTNET = exports.L2_RESOLVER_ADDRESS_MAINNET = exports.BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET = exports.BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET = void 0;
4
+ // Contract addresses
5
+ exports.BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET = "0x4cCb0BB02FCABA27e82a56646E81d8c5bC4119a5";
6
+ exports.BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET = "0x49aE3cC2e3AA768B1e5654f5D3C6002144A59581";
7
+ exports.L2_RESOLVER_ADDRESS_MAINNET = "0xC6d566A56A1aFf6508b41f6c90ff131615583BCD";
8
+ exports.L2_RESOLVER_ADDRESS_TESTNET = "0x6533C94869D28fAA8dF77cc63f9e2b2D6Cf77eBA";
9
+ // Default registration duration (1 year in seconds)
10
+ exports.REGISTRATION_DURATION = 31557600n;
11
+ // Relevant ABI for L2 Resolver Contract.
12
+ exports.L2_RESOLVER_ABI = [
13
+ {
14
+ inputs: [
15
+ { internalType: "bytes32", name: "node", type: "bytes32" },
16
+ { internalType: "address", name: "a", type: "address" },
17
+ ],
18
+ name: "setAddr",
19
+ outputs: [],
20
+ stateMutability: "nonpayable",
21
+ type: "function",
22
+ },
23
+ {
24
+ inputs: [
25
+ { internalType: "bytes32", name: "node", type: "bytes32" },
26
+ { internalType: "string", name: "newName", type: "string" },
27
+ ],
28
+ name: "setName",
29
+ outputs: [],
30
+ stateMutability: "nonpayable",
31
+ type: "function",
32
+ },
33
+ ];
34
+ // Relevant ABI for Basenames Registrar Controller Contract.
35
+ exports.REGISTRAR_ABI = [
36
+ {
37
+ inputs: [
38
+ {
39
+ components: [
40
+ {
41
+ internalType: "string",
42
+ name: "name",
43
+ type: "string",
44
+ },
45
+ {
46
+ internalType: "address",
47
+ name: "owner",
48
+ type: "address",
49
+ },
50
+ {
51
+ internalType: "uint256",
52
+ name: "duration",
53
+ type: "uint256",
54
+ },
55
+ {
56
+ internalType: "address",
57
+ name: "resolver",
58
+ type: "address",
59
+ },
60
+ {
61
+ internalType: "bytes[]",
62
+ name: "data",
63
+ type: "bytes[]",
64
+ },
65
+ {
66
+ internalType: "bool",
67
+ name: "reverseRecord",
68
+ type: "bool",
69
+ },
70
+ ],
71
+ internalType: "struct RegistrarController.RegisterRequest",
72
+ name: "request",
73
+ type: "tuple",
74
+ },
75
+ ],
76
+ name: "register",
77
+ outputs: [],
78
+ stateMutability: "payable",
79
+ type: "function",
80
+ },
81
+ ];
@@ -0,0 +1,2 @@
1
+ export * from "./basenameActionProvider";
2
+ export * from "./schemas";
@@ -0,0 +1,18 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./basenameActionProvider"), exports);
18
+ __exportStar(require("./schemas"), exports);
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Input schema for registering a Basename.
4
+ */
5
+ export declare const RegisterBasenameSchema: z.ZodObject<{
6
+ basename: z.ZodString;
7
+ amount: z.ZodDefault<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ amount: string;
10
+ basename: string;
11
+ }, {
12
+ basename: string;
13
+ amount?: string | undefined;
14
+ }>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RegisterBasenameSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ /**
6
+ * Input schema for registering a Basename.
7
+ */
8
+ exports.RegisterBasenameSchema = zod_1.z
9
+ .object({
10
+ basename: zod_1.z.string().describe("The Basename to assign to the agent"),
11
+ amount: zod_1.z.string().default("0.002").describe("The amount of ETH to pay for registration"),
12
+ })
13
+ .strip()
14
+ .describe("Instructions for registering a Basename");
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ import { ActionProvider } from "../actionProvider";
3
+ import { Network } from "../../network";
4
+ import { CdpProviderConfig, WalletProvider } from "../../wallet-providers";
5
+ import { AddressReputationSchema, RequestFaucetFundsSchema } from "./schemas";
6
+ /**
7
+ * CdpApiActionProvider is an action provider for CDP API.
8
+ *
9
+ * This provider is used for any action that uses the CDP API, but does not require a CDP Wallet.
10
+ */
11
+ export declare class CdpApiActionProvider extends ActionProvider<WalletProvider> {
12
+ /**
13
+ * Constructor for the CdpApiActionProvider class.
14
+ *
15
+ * @param config - The configuration options for the CdpApiActionProvider.
16
+ */
17
+ constructor(config?: CdpProviderConfig);
18
+ /**
19
+ * Check the reputation of an address.
20
+ *
21
+ * @param args - The input arguments for the action
22
+ * @returns A string containing reputation data or error message
23
+ */
24
+ addressReputation(args: z.infer<typeof AddressReputationSchema>): Promise<string>;
25
+ /**
26
+ * Requests test tokens from the faucet for the default address in the wallet.
27
+ *
28
+ * @param walletProvider - The wallet provider to request funds from.
29
+ * @param args - The input arguments for the action.
30
+ * @returns A confirmation message with transaction details.
31
+ */
32
+ faucet(walletProvider: WalletProvider, args: z.infer<typeof RequestFaucetFundsSchema>): Promise<string>;
33
+ /**
34
+ * Checks if the Cdp action provider supports the given network.
35
+ *
36
+ * NOTE: Network scoping is done at the action implementation level
37
+ *
38
+ * @param _ - The network to check.
39
+ * @returns True if the Cdp action provider supports the network, false otherwise.
40
+ */
41
+ supportsNetwork: (_: Network) => boolean;
42
+ }
43
+ export declare const cdpApiActionProvider: (config?: CdpProviderConfig) => CdpApiActionProvider;
@@ -0,0 +1,128 @@
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.cdpApiActionProvider = exports.CdpApiActionProvider = void 0;
13
+ const package_json_1 = require("../../../package.json");
14
+ const coinbase_sdk_1 = require("@coinbase/coinbase-sdk");
15
+ const zod_1 = require("zod");
16
+ const actionDecorator_1 = require("../actionDecorator");
17
+ const actionProvider_1 = require("../actionProvider");
18
+ const wallet_providers_1 = require("../../wallet-providers");
19
+ const schemas_1 = require("./schemas");
20
+ /**
21
+ * CdpApiActionProvider is an action provider for CDP API.
22
+ *
23
+ * This provider is used for any action that uses the CDP API, but does not require a CDP Wallet.
24
+ */
25
+ class CdpApiActionProvider extends actionProvider_1.ActionProvider {
26
+ /**
27
+ * Constructor for the CdpApiActionProvider class.
28
+ *
29
+ * @param config - The configuration options for the CdpApiActionProvider.
30
+ */
31
+ constructor(config = {}) {
32
+ super("cdp_api", []);
33
+ /**
34
+ * Checks if the Cdp action provider supports the given network.
35
+ *
36
+ * NOTE: Network scoping is done at the action implementation level
37
+ *
38
+ * @param _ - The network to check.
39
+ * @returns True if the Cdp action provider supports the network, false otherwise.
40
+ */
41
+ this.supportsNetwork = (_) => true;
42
+ if (config.apiKeyName && config.apiKeyPrivateKey) {
43
+ coinbase_sdk_1.Coinbase.configure({
44
+ apiKeyName: config.apiKeyName,
45
+ privateKey: config.apiKeyPrivateKey?.replace(/\\n/g, "\n"),
46
+ source: "agentkit",
47
+ sourceVersion: package_json_1.version,
48
+ });
49
+ }
50
+ else {
51
+ coinbase_sdk_1.Coinbase.configureFromJson({ source: "agentkit", sourceVersion: package_json_1.version });
52
+ }
53
+ }
54
+ /**
55
+ * Check the reputation of an address.
56
+ *
57
+ * @param args - The input arguments for the action
58
+ * @returns A string containing reputation data or error message
59
+ */
60
+ async addressReputation(args) {
61
+ if (args.network.includes("solana")) {
62
+ return "Address reputation is only supported on Ethereum networks.";
63
+ }
64
+ try {
65
+ const address = new coinbase_sdk_1.ExternalAddress(args.network, args.address);
66
+ const reputation = await address.reputation();
67
+ return reputation.toString();
68
+ }
69
+ catch (error) {
70
+ return `Error checking address reputation: ${error}`;
71
+ }
72
+ }
73
+ /**
74
+ * Requests test tokens from the faucet for the default address in the wallet.
75
+ *
76
+ * @param walletProvider - The wallet provider to request funds from.
77
+ * @param args - The input arguments for the action.
78
+ * @returns A confirmation message with transaction details.
79
+ */
80
+ async faucet(walletProvider, args) {
81
+ const network = walletProvider.getNetwork();
82
+ if (network.networkId !== "base-sepolia" && network.networkId !== "solana-devnet") {
83
+ return `Faucet is only allowed on 'base-sepolia' or 'solana-devnet'.`;
84
+ }
85
+ try {
86
+ const address = new coinbase_sdk_1.ExternalAddress(walletProvider.getNetwork().networkId, walletProvider.getAddress());
87
+ const faucetTx = await address.faucet(args.assetId || undefined);
88
+ const result = await faucetTx.wait({ timeoutSeconds: 60 });
89
+ return `Received ${args.assetId || "ETH"} from the faucet. Transaction: ${result.getTransactionLink()}`;
90
+ }
91
+ catch (error) {
92
+ return `Error requesting faucet funds: ${error}`;
93
+ }
94
+ }
95
+ }
96
+ exports.CdpApiActionProvider = CdpApiActionProvider;
97
+ __decorate([
98
+ (0, actionDecorator_1.CreateAction)({
99
+ name: "address_reputation",
100
+ description: `
101
+ This tool checks the reputation of an address on a given network. It takes:
102
+
103
+ - network: The network to check the address on (e.g. "base-mainnet")
104
+ - address: The Ethereum address to check
105
+ `,
106
+ schema: schemas_1.AddressReputationSchema,
107
+ }),
108
+ __metadata("design:type", Function),
109
+ __metadata("design:paramtypes", [void 0]),
110
+ __metadata("design:returntype", Promise)
111
+ ], CdpApiActionProvider.prototype, "addressReputation", null);
112
+ __decorate([
113
+ (0, actionDecorator_1.CreateAction)({
114
+ name: "request_faucet_funds",
115
+ description: `This tool will request test tokens from the faucet for the default address in the wallet. It takes the wallet and asset ID as input.
116
+ Faucet is only allowed on 'base-sepolia' or 'solana-devnet'.
117
+ If fauceting on 'base-sepolia', user can only provide asset ID 'eth' or 'usdc', if no asset ID is provided, the faucet will default to 'eth'.
118
+ If fauceting on 'solana-devnet', user can only provide asset ID 'sol', if no asset ID is provided, the faucet will default to 'sol'.
119
+ You are not allowed to faucet with any other network or asset ID. If you are on another network, suggest that the user sends you some ETH
120
+ from another wallet and provide the user with your wallet details.`,
121
+ schema: schemas_1.RequestFaucetFundsSchema,
122
+ }),
123
+ __metadata("design:type", Function),
124
+ __metadata("design:paramtypes", [wallet_providers_1.WalletProvider, void 0]),
125
+ __metadata("design:returntype", Promise)
126
+ ], CdpApiActionProvider.prototype, "faucet", null);
127
+ const cdpApiActionProvider = (config = {}) => new CdpApiActionProvider(config);
128
+ exports.cdpApiActionProvider = cdpApiActionProvider;
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cdpApiActionProvider_1 = require("./cdpApiActionProvider");
4
+ const schemas_1 = require("./schemas");
5
+ jest.mock("@coinbase/coinbase-sdk");
6
+ const { ExternalAddress } = jest.requireMock("@coinbase/coinbase-sdk");
7
+ describe("CDP API Action Provider Input Schemas", () => {
8
+ describe("Address Reputation Schema", () => {
9
+ it("should successfully parse valid input", () => {
10
+ const validInput = {
11
+ address: "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83",
12
+ network: "base-mainnet",
13
+ };
14
+ const result = schemas_1.AddressReputationSchema.safeParse(validInput);
15
+ expect(result.success).toBe(true);
16
+ expect(result.data).toEqual(validInput);
17
+ });
18
+ it("should fail parsing invalid address", () => {
19
+ const invalidInput = {
20
+ address: "invalid-address",
21
+ network: "base-mainnet",
22
+ };
23
+ const result = schemas_1.AddressReputationSchema.safeParse(invalidInput);
24
+ expect(result.success).toBe(false);
25
+ });
26
+ });
27
+ describe("Request Faucet Funds Schema", () => {
28
+ it("should successfully parse with optional assetId", () => {
29
+ const validInput = {
30
+ assetId: "eth",
31
+ };
32
+ const result = schemas_1.RequestFaucetFundsSchema.safeParse(validInput);
33
+ expect(result.success).toBe(true);
34
+ expect(result.data).toEqual(validInput);
35
+ });
36
+ it("should successfully parse without assetId", () => {
37
+ const validInput = {};
38
+ const result = schemas_1.RequestFaucetFundsSchema.safeParse(validInput);
39
+ expect(result.success).toBe(true);
40
+ expect(result.data).toEqual(validInput);
41
+ });
42
+ });
43
+ });
44
+ describe("CDP API Action Provider", () => {
45
+ let actionProvider;
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ let mockExternalAddressInstance;
48
+ let mockWallet;
49
+ beforeEach(() => {
50
+ // Reset all mocks before each test
51
+ jest.clearAllMocks();
52
+ actionProvider = new cdpApiActionProvider_1.CdpApiActionProvider();
53
+ mockExternalAddressInstance = {
54
+ reputation: jest.fn(),
55
+ faucet: jest.fn(),
56
+ };
57
+ // Mock the constructor to return our mock instance
58
+ ExternalAddress.mockImplementation(() => mockExternalAddressInstance);
59
+ mockWallet = {
60
+ deployToken: jest.fn(),
61
+ deployContract: jest.fn(),
62
+ getAddress: jest.fn().mockReturnValue("0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83"),
63
+ getNetwork: jest.fn().mockReturnValue({ networkId: "base-sepolia" }),
64
+ };
65
+ });
66
+ describe("addressReputation", () => {
67
+ it("should successfully check address reputation", async () => {
68
+ const args = {
69
+ address: "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83",
70
+ network: "base-mainnet",
71
+ };
72
+ mockExternalAddressInstance.reputation.mockResolvedValue("Good reputation");
73
+ const result = await actionProvider.addressReputation(args);
74
+ expect(ExternalAddress).toHaveBeenCalledWith(args.network, args.address);
75
+ expect(ExternalAddress).toHaveBeenCalledTimes(1);
76
+ expect(mockExternalAddressInstance.reputation).toHaveBeenCalled();
77
+ expect(mockExternalAddressInstance.reputation).toHaveBeenCalledTimes(1);
78
+ expect(result).toBe("Good reputation");
79
+ });
80
+ it("should handle errors when checking reputation", async () => {
81
+ const args = {
82
+ address: "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83",
83
+ network: "base-mainnet",
84
+ };
85
+ const error = new Error("Reputation check failed");
86
+ mockExternalAddressInstance.reputation.mockRejectedValue(error);
87
+ const result = await actionProvider.addressReputation(args);
88
+ expect(ExternalAddress).toHaveBeenCalledWith(args.network, args.address);
89
+ expect(ExternalAddress).toHaveBeenCalledTimes(1);
90
+ expect(mockExternalAddressInstance.reputation).toHaveBeenCalled();
91
+ expect(mockExternalAddressInstance.reputation).toHaveBeenCalledTimes(1);
92
+ expect(result).toBe(`Error checking address reputation: ${error}`);
93
+ });
94
+ it("should return error if not on Ethereum network", async () => {
95
+ const args = {
96
+ address: "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83",
97
+ network: "solana-devnet",
98
+ };
99
+ const result = await actionProvider.addressReputation(args);
100
+ expect(result).toBe("Address reputation is only supported on Ethereum networks.");
101
+ });
102
+ });
103
+ describe("faucet", () => {
104
+ beforeEach(() => {
105
+ mockExternalAddressInstance.faucet.mockResolvedValue({
106
+ wait: jest.fn().mockResolvedValue({
107
+ getTransactionLink: jest.fn().mockReturnValue("tx-link"),
108
+ }),
109
+ });
110
+ });
111
+ it("should successfully request faucet funds with assetId", async () => {
112
+ const args = {
113
+ assetId: "eth",
114
+ };
115
+ const result = await actionProvider.faucet(mockWallet, args);
116
+ expect(ExternalAddress).toHaveBeenCalledWith("base-sepolia", mockWallet.getAddress());
117
+ expect(ExternalAddress).toHaveBeenCalledTimes(1);
118
+ expect(mockExternalAddressInstance.faucet).toHaveBeenCalledWith("eth");
119
+ expect(mockExternalAddressInstance.faucet).toHaveBeenCalledTimes(1);
120
+ expect(result).toContain("Received eth from the faucet");
121
+ expect(result).toContain("tx-link");
122
+ });
123
+ it("should successfully request faucet funds without assetId", async () => {
124
+ const args = {};
125
+ const result = await actionProvider.faucet(mockWallet, args);
126
+ expect(ExternalAddress).toHaveBeenCalledWith("base-sepolia", mockWallet.getAddress());
127
+ expect(ExternalAddress).toHaveBeenCalledTimes(1);
128
+ expect(mockExternalAddressInstance.faucet).toHaveBeenCalledWith(undefined);
129
+ expect(mockExternalAddressInstance.faucet).toHaveBeenCalledTimes(1);
130
+ expect(result).toContain("Received ETH from the faucet");
131
+ });
132
+ it("should handle faucet errors", async () => {
133
+ const args = {};
134
+ const error = new Error("Faucet request failed");
135
+ mockExternalAddressInstance.faucet.mockRejectedValue(error);
136
+ const result = await actionProvider.faucet(mockWallet, args);
137
+ expect(result).toBe(`Error requesting faucet funds: ${error}`);
138
+ });
139
+ it("should return error if not on base-sepolia or solana-devnet", async () => {
140
+ mockWallet.getNetwork.mockReturnValue({ networkId: "solana-mainnet", protocolFamily: "svm" });
141
+ const args = {};
142
+ const result = await actionProvider.faucet(mockWallet, args);
143
+ expect(result).toBe("Faucet is only allowed on 'base-sepolia' or 'solana-devnet'.");
144
+ });
145
+ });
146
+ });