alchemy 0.69.0 → 0.70.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 (314) hide show
  1. package/bin/alchemy.js +3810 -3889
  2. package/bin/commands/init.ts +41 -55
  3. package/bin/trpc.ts +4 -9
  4. package/lib/alchemy.d.ts +3 -3
  5. package/lib/alchemy.d.ts.map +1 -1
  6. package/lib/alchemy.js +2 -15
  7. package/lib/alchemy.js.map +1 -1
  8. package/lib/apply.js +24 -9
  9. package/lib/apply.js.map +1 -1
  10. package/lib/aws/utils.d.ts +2 -1
  11. package/lib/aws/utils.d.ts.map +1 -1
  12. package/lib/aws/utils.js.map +1 -1
  13. package/lib/clickhouse/api/client.gen.d.ts +13 -0
  14. package/lib/clickhouse/api/client.gen.d.ts.map +1 -0
  15. package/lib/clickhouse/api/client.gen.js +7 -0
  16. package/lib/clickhouse/api/client.gen.js.map +1 -0
  17. package/lib/clickhouse/api/sdk.gen.d.ts +322 -0
  18. package/lib/clickhouse/api/sdk.gen.d.ts.map +1 -0
  19. package/lib/clickhouse/api/sdk.gen.js +683 -0
  20. package/lib/clickhouse/api/sdk.gen.js.map +1 -0
  21. package/lib/clickhouse/api/types.gen.d.ts +5030 -0
  22. package/lib/clickhouse/api/types.gen.d.ts.map +1 -0
  23. package/lib/clickhouse/api/types.gen.js +2 -0
  24. package/lib/clickhouse/api/types.gen.js.map +1 -0
  25. package/lib/clickhouse/api-key.d.ts +29 -0
  26. package/lib/clickhouse/api-key.d.ts.map +1 -0
  27. package/lib/clickhouse/api-key.js +83 -0
  28. package/lib/clickhouse/api-key.js.map +1 -0
  29. package/lib/clickhouse/api.d.ts +36 -0
  30. package/lib/clickhouse/api.d.ts.map +1 -0
  31. package/lib/clickhouse/api.js +48 -0
  32. package/lib/clickhouse/api.js.map +1 -0
  33. package/lib/clickhouse/index.d.ts +4 -0
  34. package/lib/clickhouse/index.d.ts.map +1 -0
  35. package/lib/clickhouse/index.js +4 -0
  36. package/lib/clickhouse/index.js.map +1 -0
  37. package/lib/clickhouse/organization.d.ts +16 -0
  38. package/lib/clickhouse/organization.d.ts.map +1 -0
  39. package/lib/clickhouse/organization.js +21 -0
  40. package/lib/clickhouse/organization.js.map +1 -0
  41. package/lib/clickhouse/service.d.ts +275 -0
  42. package/lib/clickhouse/service.d.ts.map +1 -0
  43. package/lib/clickhouse/service.js +274 -0
  44. package/lib/clickhouse/service.js.map +1 -0
  45. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  46. package/lib/cloudflare/account-api-token.js +1 -1
  47. package/lib/cloudflare/account-api-token.js.map +1 -1
  48. package/lib/cloudflare/bucket-object.d.ts +5 -0
  49. package/lib/cloudflare/bucket-object.d.ts.map +1 -1
  50. package/lib/cloudflare/bucket-object.js +1 -1
  51. package/lib/cloudflare/bucket-object.js.map +1 -1
  52. package/lib/cloudflare/bucket.d.ts +6 -3
  53. package/lib/cloudflare/bucket.d.ts.map +1 -1
  54. package/lib/cloudflare/bucket.js +60 -8
  55. package/lib/cloudflare/bucket.js.map +1 -1
  56. package/lib/cloudflare/bun-spa/bun-spa.d.ts +15 -0
  57. package/lib/cloudflare/bun-spa/bun-spa.d.ts.map +1 -0
  58. package/lib/cloudflare/bun-spa/bun-spa.js +95 -0
  59. package/lib/cloudflare/bun-spa/bun-spa.js.map +1 -0
  60. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  61. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  62. package/lib/cloudflare/container.d.ts +11 -1
  63. package/lib/cloudflare/container.d.ts.map +1 -1
  64. package/lib/cloudflare/container.js +1 -1
  65. package/lib/cloudflare/container.js.map +1 -1
  66. package/lib/cloudflare/index.d.ts +1 -0
  67. package/lib/cloudflare/index.d.ts.map +1 -1
  68. package/lib/cloudflare/index.js +1 -0
  69. package/lib/cloudflare/index.js.map +1 -1
  70. package/lib/cloudflare/miniflare/build-worker-options.d.ts.map +1 -1
  71. package/lib/cloudflare/miniflare/build-worker-options.js +3 -3
  72. package/lib/cloudflare/miniflare/build-worker-options.js.map +1 -1
  73. package/lib/cloudflare/miniflare/miniflare-controller.d.ts.map +1 -1
  74. package/lib/cloudflare/miniflare/miniflare-controller.js +2 -0
  75. package/lib/cloudflare/miniflare/miniflare-controller.js.map +1 -1
  76. package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts +1 -1
  77. package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts.map +1 -1
  78. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +33 -14
  79. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  80. package/lib/cloudflare/permission-groups.d.ts +2 -3
  81. package/lib/cloudflare/permission-groups.d.ts.map +1 -1
  82. package/lib/cloudflare/permission-groups.js +10 -15
  83. package/lib/cloudflare/permission-groups.js.map +1 -1
  84. package/lib/cloudflare/redwood/redwood.d.ts +1 -1
  85. package/lib/cloudflare/redwood/redwood.js +1 -1
  86. package/lib/cloudflare/tanstack-start/plugin.d.ts +2 -15
  87. package/lib/cloudflare/tanstack-start/plugin.d.ts.map +1 -1
  88. package/lib/cloudflare/tanstack-start/plugin.js +5 -25
  89. package/lib/cloudflare/tanstack-start/plugin.js.map +1 -1
  90. package/lib/cloudflare/tanstack-start/tanstack-start.d.ts.map +1 -1
  91. package/lib/cloudflare/tanstack-start/tanstack-start.js +15 -4
  92. package/lib/cloudflare/tanstack-start/tanstack-start.js.map +1 -1
  93. package/lib/cloudflare/util/filter-env-bindings.d.ts +62 -0
  94. package/lib/cloudflare/util/filter-env-bindings.d.ts.map +1 -0
  95. package/lib/cloudflare/util/filter-env-bindings.js +81 -0
  96. package/lib/cloudflare/util/filter-env-bindings.js.map +1 -0
  97. package/lib/cloudflare/website.d.ts +2 -2
  98. package/lib/cloudflare/website.d.ts.map +1 -1
  99. package/lib/cloudflare/website.js +7 -18
  100. package/lib/cloudflare/website.js.map +1 -1
  101. package/lib/cloudflare/worker-metadata.d.ts +5 -1
  102. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  103. package/lib/cloudflare/worker-metadata.js +3 -0
  104. package/lib/cloudflare/worker-metadata.js.map +1 -1
  105. package/lib/cloudflare/worker.d.ts +17 -1
  106. package/lib/cloudflare/worker.d.ts.map +1 -1
  107. package/lib/cloudflare/worker.js +1 -0
  108. package/lib/cloudflare/worker.js.map +1 -1
  109. package/lib/cloudflare/wrangler.json.d.ts +15 -1
  110. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  111. package/lib/cloudflare/wrangler.json.js +12 -4
  112. package/lib/cloudflare/wrangler.json.js.map +1 -1
  113. package/lib/coinbase/client.d.ts +54 -0
  114. package/lib/coinbase/client.d.ts.map +1 -0
  115. package/lib/coinbase/client.js +89 -0
  116. package/lib/coinbase/client.js.map +1 -0
  117. package/lib/coinbase/evm-account.d.ts +118 -0
  118. package/lib/coinbase/evm-account.d.ts.map +1 -0
  119. package/lib/coinbase/evm-account.js +198 -0
  120. package/lib/coinbase/evm-account.js.map +1 -0
  121. package/lib/coinbase/evm-smart-account.d.ts +122 -0
  122. package/lib/coinbase/evm-smart-account.d.ts.map +1 -0
  123. package/lib/coinbase/evm-smart-account.js +213 -0
  124. package/lib/coinbase/evm-smart-account.js.map +1 -0
  125. package/lib/coinbase/faucet.d.ts +11 -0
  126. package/lib/coinbase/faucet.d.ts.map +1 -0
  127. package/lib/coinbase/faucet.js +146 -0
  128. package/lib/coinbase/faucet.js.map +1 -0
  129. package/lib/coinbase/index.d.ts +4 -0
  130. package/lib/coinbase/index.d.ts.map +1 -0
  131. package/lib/coinbase/index.js +4 -0
  132. package/lib/coinbase/index.js.map +1 -0
  133. package/lib/coinbase/types.d.ts +28 -0
  134. package/lib/coinbase/types.d.ts.map +1 -0
  135. package/lib/coinbase/types.js +4 -0
  136. package/lib/{util/telemetry → coinbase}/types.js.map +1 -1
  137. package/lib/coinbase/utils.d.ts +13 -0
  138. package/lib/coinbase/utils.d.ts.map +1 -0
  139. package/lib/coinbase/utils.js +17 -0
  140. package/lib/coinbase/utils.js.map +1 -0
  141. package/lib/docker/api.d.ts +22 -1
  142. package/lib/docker/api.d.ts.map +1 -1
  143. package/lib/docker/api.js +64 -2
  144. package/lib/docker/api.js.map +1 -1
  145. package/lib/docker/container.d.ts +88 -0
  146. package/lib/docker/container.d.ts.map +1 -1
  147. package/lib/docker/container.js +36 -0
  148. package/lib/docker/container.js.map +1 -1
  149. package/lib/neon/api/types.gen.d.ts +7 -2
  150. package/lib/neon/api/types.gen.d.ts.map +1 -1
  151. package/lib/planetscale/api/types.gen.d.ts +20 -4
  152. package/lib/planetscale/api/types.gen.d.ts.map +1 -1
  153. package/lib/planetscale/api.d.ts.map +1 -1
  154. package/lib/planetscale/api.js +1 -0
  155. package/lib/planetscale/api.js.map +1 -1
  156. package/lib/planetscale/password.d.ts.map +1 -1
  157. package/lib/planetscale/password.js +1 -13
  158. package/lib/planetscale/password.js.map +1 -1
  159. package/lib/resource.d.ts.map +1 -1
  160. package/lib/resource.js +7 -3
  161. package/lib/resource.js.map +1 -1
  162. package/lib/scope.d.ts +4 -9
  163. package/lib/scope.d.ts.map +1 -1
  164. package/lib/scope.js +16 -37
  165. package/lib/scope.js.map +1 -1
  166. package/lib/state/instrumented-state-store.d.ts +1 -3
  167. package/lib/state/instrumented-state-store.d.ts.map +1 -1
  168. package/lib/state/instrumented-state-store.js +19 -21
  169. package/lib/state/instrumented-state-store.js.map +1 -1
  170. package/lib/test/bun.d.ts.map +1 -1
  171. package/lib/test/bun.js +1 -2
  172. package/lib/test/bun.js.map +1 -1
  173. package/lib/test/vitest.d.ts.map +1 -1
  174. package/lib/test/vitest.js +1 -2
  175. package/lib/test/vitest.js.map +1 -1
  176. package/lib/util/diff.d.ts +5 -0
  177. package/lib/util/diff.d.ts.map +1 -0
  178. package/lib/util/diff.js +14 -0
  179. package/lib/util/diff.js.map +1 -0
  180. package/lib/util/telemetry.d.ts +52 -0
  181. package/lib/util/telemetry.d.ts.map +1 -0
  182. package/lib/util/telemetry.js +191 -0
  183. package/lib/util/telemetry.js.map +1 -0
  184. package/package.json +19 -1
  185. package/src/alchemy.ts +5 -20
  186. package/src/apply.ts +29 -12
  187. package/src/aws/utils.ts +2 -1
  188. package/src/clickhouse/api/client.gen.ts +28 -0
  189. package/src/clickhouse/api/sdk.gen.ts +1286 -0
  190. package/src/clickhouse/api/types.gen.ts +5898 -0
  191. package/src/clickhouse/api-key.ts +136 -0
  192. package/src/clickhouse/api.ts +84 -0
  193. package/src/clickhouse/index.ts +3 -0
  194. package/src/clickhouse/organization.ts +31 -0
  195. package/src/clickhouse/service.ts +668 -0
  196. package/src/cloudflare/account-api-token.ts +1 -4
  197. package/src/cloudflare/bucket-object.ts +11 -1
  198. package/src/cloudflare/bucket.ts +72 -6
  199. package/src/cloudflare/bun-spa/bun-spa.ts +139 -0
  200. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  201. package/src/cloudflare/container.ts +22 -3
  202. package/src/cloudflare/index.ts +1 -0
  203. package/src/cloudflare/miniflare/build-worker-options.ts +6 -4
  204. package/src/cloudflare/miniflare/miniflare-controller.ts +2 -0
  205. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +42 -15
  206. package/src/cloudflare/permission-groups.ts +21 -49
  207. package/src/cloudflare/redwood/redwood.ts +1 -1
  208. package/src/cloudflare/tanstack-start/plugin.ts +7 -28
  209. package/src/cloudflare/tanstack-start/tanstack-start.ts +15 -4
  210. package/src/cloudflare/util/filter-env-bindings.ts +96 -0
  211. package/src/cloudflare/website.ts +12 -24
  212. package/src/cloudflare/worker-metadata.ts +8 -1
  213. package/src/cloudflare/worker.ts +19 -1
  214. package/src/cloudflare/wrangler.json.ts +27 -9
  215. package/src/coinbase/client.ts +146 -0
  216. package/src/coinbase/evm-account.ts +317 -0
  217. package/src/coinbase/evm-smart-account.ts +339 -0
  218. package/src/coinbase/faucet.ts +173 -0
  219. package/src/coinbase/index.ts +3 -0
  220. package/src/coinbase/types.ts +33 -0
  221. package/src/coinbase/utils.ts +19 -0
  222. package/src/docker/api.ts +86 -2
  223. package/src/docker/container.ts +97 -0
  224. package/src/neon/api/types.gen.ts +13 -1
  225. package/src/planetscale/api/types.gen.ts +22 -2
  226. package/src/planetscale/api.ts +1 -0
  227. package/src/planetscale/password.ts +1 -14
  228. package/src/resource.ts +11 -4
  229. package/src/scope.ts +22 -45
  230. package/src/state/instrumented-state-store.ts +27 -26
  231. package/src/test/bun.ts +1 -2
  232. package/src/test/vitest.ts +1 -2
  233. package/src/util/diff.ts +14 -0
  234. package/src/util/telemetry.ts +297 -0
  235. package/templates/tanstack-start/.cta.json +13 -0
  236. package/templates/tanstack-start/README.md +267 -49
  237. package/templates/tanstack-start/_gitignore +9 -18
  238. package/templates/tanstack-start/alchemy.run.ts +2 -2
  239. package/templates/tanstack-start/package.json +24 -19
  240. package/templates/tanstack-start/public/favicon.ico +0 -0
  241. package/templates/tanstack-start/public/logo192.png +0 -0
  242. package/templates/tanstack-start/public/logo512.png +0 -0
  243. package/templates/tanstack-start/public/manifest.json +25 -0
  244. package/templates/tanstack-start/public/robots.txt +3 -0
  245. package/templates/tanstack-start/src/components/Header.tsx +21 -0
  246. package/templates/tanstack-start/src/logo.svg +12 -0
  247. package/templates/tanstack-start/src/router.tsx +7 -16
  248. package/templates/tanstack-start/src/routes/__root.tsx +13 -114
  249. package/templates/tanstack-start/src/routes/api.demo-names.ts +15 -0
  250. package/templates/tanstack-start/src/routes/demo.start.api-request.tsx +44 -0
  251. package/templates/tanstack-start/src/routes/demo.start.server-funcs.tsx +97 -0
  252. package/templates/tanstack-start/src/routes/index.tsx +31 -4
  253. package/templates/tanstack-start/src/styles.css +15 -0
  254. package/templates/tanstack-start/tsconfig.json +19 -22
  255. package/templates/tanstack-start/types/env.d.ts +2 -2
  256. package/templates/tanstack-start/vite.config.ts +16 -25
  257. package/workers/tunnel-proxy.js +1 -1
  258. package/lib/util/telemetry/client.d.ts +0 -31
  259. package/lib/util/telemetry/client.d.ts.map +0 -1
  260. package/lib/util/telemetry/client.js +0 -121
  261. package/lib/util/telemetry/client.js.map +0 -1
  262. package/lib/util/telemetry/constants.d.ts +0 -5
  263. package/lib/util/telemetry/constants.d.ts.map +0 -1
  264. package/lib/util/telemetry/constants.js +0 -8
  265. package/lib/util/telemetry/constants.js.map +0 -1
  266. package/lib/util/telemetry/context.d.ts +0 -15
  267. package/lib/util/telemetry/context.d.ts.map +0 -1
  268. package/lib/util/telemetry/context.js +0 -128
  269. package/lib/util/telemetry/context.js.map +0 -1
  270. package/lib/util/telemetry/index.d.ts +0 -3
  271. package/lib/util/telemetry/index.d.ts.map +0 -1
  272. package/lib/util/telemetry/index.js +0 -3
  273. package/lib/util/telemetry/index.js.map +0 -1
  274. package/lib/util/telemetry/types.d.ts +0 -68
  275. package/lib/util/telemetry/types.d.ts.map +0 -1
  276. package/lib/util/telemetry/types.js +0 -1
  277. package/src/util/telemetry/client.ts +0 -156
  278. package/src/util/telemetry/constants.ts +0 -13
  279. package/src/util/telemetry/context.ts +0 -154
  280. package/src/util/telemetry/index.ts +0 -2
  281. package/src/util/telemetry/types.ts +0 -105
  282. package/templates/tanstack-start/_prettierignore +0 -4
  283. package/templates/tanstack-start/public/android-chrome-192x192.png +0 -0
  284. package/templates/tanstack-start/public/android-chrome-512x512.png +0 -0
  285. package/templates/tanstack-start/public/apple-touch-icon.png +0 -0
  286. package/templates/tanstack-start/public/favicon-16x16.png +0 -0
  287. package/templates/tanstack-start/public/favicon-32x32.png +0 -0
  288. package/templates/tanstack-start/public/favicon.png +0 -0
  289. package/templates/tanstack-start/public/site.webmanifest +0 -19
  290. package/templates/tanstack-start/src/components/DefaultCatchBoundary.tsx +0 -53
  291. package/templates/tanstack-start/src/components/NotFound.tsx +0 -25
  292. package/templates/tanstack-start/src/components/PostError.tsx +0 -5
  293. package/templates/tanstack-start/src/components/UserError.tsx +0 -5
  294. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout/route-a.tsx +0 -10
  295. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout/route-b.tsx +0 -10
  296. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout.tsx +0 -34
  297. package/templates/tanstack-start/src/routes/_pathlessLayout.tsx +0 -16
  298. package/templates/tanstack-start/src/routes/api/users.$userId.ts +0 -28
  299. package/templates/tanstack-start/src/routes/api/users.ts +0 -59
  300. package/templates/tanstack-start/src/routes/customScript[.]js.ts +0 -10
  301. package/templates/tanstack-start/src/routes/deferred.tsx +0 -62
  302. package/templates/tanstack-start/src/routes/posts.$postId.tsx +0 -34
  303. package/templates/tanstack-start/src/routes/posts.index.tsx +0 -8
  304. package/templates/tanstack-start/src/routes/posts.tsx +0 -38
  305. package/templates/tanstack-start/src/routes/posts_.$postId.deep.tsx +0 -29
  306. package/templates/tanstack-start/src/routes/redirect.tsx +0 -9
  307. package/templates/tanstack-start/src/routes/users.$userId.tsx +0 -44
  308. package/templates/tanstack-start/src/routes/users.index.tsx +0 -18
  309. package/templates/tanstack-start/src/routes/users.tsx +0 -49
  310. package/templates/tanstack-start/src/styles/app.css +0 -12
  311. package/templates/tanstack-start/src/utils/loggingMiddleware.tsx +0 -41
  312. package/templates/tanstack-start/src/utils/posts.tsx +0 -40
  313. package/templates/tanstack-start/src/utils/seo.ts +0 -33
  314. package/templates/tanstack-start/src/utils/users.tsx +0 -5
@@ -0,0 +1,122 @@
1
+ import type { Context } from "../context.ts";
2
+ import { Resource } from "../resource.ts";
3
+ import { type CoinbaseClientOptions } from "./client.ts";
4
+ import type { EvmAccount } from "./evm-account.ts";
5
+ import type { Address, FaucetConfig } from "./types.ts";
6
+ export interface EvmSmartAccountProps extends CoinbaseClientOptions {
7
+ /**
8
+ * Name for the smart account.
9
+ * If not provided, inherits the name from the owner account.
10
+ * This allows EOA and Smart Account to have matching names in CDP.
11
+ * Used for identification in CDP.
12
+ * Must contain only letters, numbers, and hyphens.
13
+ * @default Inherits from owner account name
14
+ */
15
+ name?: string;
16
+ /**
17
+ * The owner account that controls this smart account.
18
+ * Can be either an EvmAccount resource or an owner address.
19
+ */
20
+ owner: EvmAccount | Address;
21
+ /**
22
+ * Whether to adopt an existing smart account with the same name if it already exists.
23
+ * Without adoption, creation will fail if a smart account with the same name exists.
24
+ * With adoption, the existing smart account will be used.
25
+ * @default false
26
+ */
27
+ adopt?: boolean;
28
+ /**
29
+ * Faucet configuration for development funding.
30
+ * Declares which tokens this smart account should have.
31
+ * Used by external funding scripts - not processed by the resource.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * faucet: {
36
+ * "base-sepolia": ["eth", "usdc"],
37
+ * "ethereum-sepolia": ["eth"]
38
+ * }
39
+ * ```
40
+ */
41
+ faucet?: FaucetConfig;
42
+ }
43
+ export interface EvmSmartAccount extends Resource<"coinbase::evm-smart-account"> {
44
+ /**
45
+ * The smart account name in CDP
46
+ */
47
+ name: string;
48
+ /**
49
+ * The smart account address (same across all EVM networks)
50
+ */
51
+ address: Address;
52
+ /**
53
+ * The owner account address
54
+ */
55
+ ownerAddress: Address;
56
+ /**
57
+ * Faucet configuration (passed through from props)
58
+ */
59
+ faucet?: FaucetConfig;
60
+ }
61
+ /**
62
+ * Manages ERC-4337 smart accounts on Coinbase Developer Platform.
63
+ * Smart accounts enable gasless transactions and advanced features like batch operations.
64
+ *
65
+ * @example
66
+ * ## Create a smart account with an EVM account owner
67
+ *
68
+ * ```ts
69
+ * const owner = await EvmAccount("owner", {
70
+ * name: "owner-account"
71
+ * });
72
+ *
73
+ * const smartAccount = await EvmSmartAccount("my-smart-account", {
74
+ * name: "my-smart-account",
75
+ * owner: owner
76
+ * });
77
+ *
78
+ * console.log("Smart account address:", smartAccount.address);
79
+ * ```
80
+ *
81
+ * @example
82
+ * ## Create a smart account with existing owner
83
+ *
84
+ * ```ts
85
+ * const smartAccount = await EvmSmartAccount("my-smart-account", {
86
+ * name: "my-smart-account",
87
+ * owner: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb" // Owner address
88
+ * });
89
+ * ```
90
+ *
91
+ * @example
92
+ * ## Smart account with inherited name
93
+ *
94
+ * When name is omitted, the smart account inherits the owner's name
95
+ *
96
+ * ```ts
97
+ * const owner = await EvmAccount("owner", {
98
+ * name: "my-app-wallet"
99
+ * });
100
+ *
101
+ * // Smart account will also be named "my-app-wallet" in CDP
102
+ * const smartAccount = await EvmSmartAccount("smart", {
103
+ * owner: owner
104
+ * // name is omitted, inherits "my-app-wallet" from owner
105
+ * });
106
+ *
107
+ * console.log(smartAccount.name); // "my-app-wallet"
108
+ * ```
109
+ *
110
+ * @example
111
+ * ## Adopt an existing smart account
112
+ *
113
+ * ```ts
114
+ * const smartAccount = await EvmSmartAccount("my-smart-account", {
115
+ * name: "existing-smart-account",
116
+ * owner: ownerAccount, // or "0x..." address
117
+ * adopt: true // Uses existing smart account if it exists
118
+ * });
119
+ * ```
120
+ */
121
+ export declare const EvmSmartAccount: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<EvmSmartAccount>, _id: string, props: EvmSmartAccountProps) => Promise<EvmSmartAccount>);
122
+ //# sourceMappingURL=evm-smart-account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm-smart-account.d.ts","sourceRoot":"","sources":["../../src/coinbase/evm-smart-account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EAGb,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,eACf,SAAQ,QAAQ,CAAC,6BAA6B,CAAC;IAC/C;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,eAAO,MAAM,eAAe,yFAGlB,OAAO,CAAC,eAAe,CAAC,OACzB,MAAM,SACJ,oBAAoB,KAC1B,OAAO,CAAC,eAAe,CAAC,CA0M5B,CAAC"}
@@ -0,0 +1,213 @@
1
+ import { Resource } from "../resource.js";
2
+ import { createCdpClient } from "./client.js";
3
+ import { validateAccountName } from "./utils.js";
4
+ /**
5
+ * Manages ERC-4337 smart accounts on Coinbase Developer Platform.
6
+ * Smart accounts enable gasless transactions and advanced features like batch operations.
7
+ *
8
+ * @example
9
+ * ## Create a smart account with an EVM account owner
10
+ *
11
+ * ```ts
12
+ * const owner = await EvmAccount("owner", {
13
+ * name: "owner-account"
14
+ * });
15
+ *
16
+ * const smartAccount = await EvmSmartAccount("my-smart-account", {
17
+ * name: "my-smart-account",
18
+ * owner: owner
19
+ * });
20
+ *
21
+ * console.log("Smart account address:", smartAccount.address);
22
+ * ```
23
+ *
24
+ * @example
25
+ * ## Create a smart account with existing owner
26
+ *
27
+ * ```ts
28
+ * const smartAccount = await EvmSmartAccount("my-smart-account", {
29
+ * name: "my-smart-account",
30
+ * owner: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb" // Owner address
31
+ * });
32
+ * ```
33
+ *
34
+ * @example
35
+ * ## Smart account with inherited name
36
+ *
37
+ * When name is omitted, the smart account inherits the owner's name
38
+ *
39
+ * ```ts
40
+ * const owner = await EvmAccount("owner", {
41
+ * name: "my-app-wallet"
42
+ * });
43
+ *
44
+ * // Smart account will also be named "my-app-wallet" in CDP
45
+ * const smartAccount = await EvmSmartAccount("smart", {
46
+ * owner: owner
47
+ * // name is omitted, inherits "my-app-wallet" from owner
48
+ * });
49
+ *
50
+ * console.log(smartAccount.name); // "my-app-wallet"
51
+ * ```
52
+ *
53
+ * @example
54
+ * ## Adopt an existing smart account
55
+ *
56
+ * ```ts
57
+ * const smartAccount = await EvmSmartAccount("my-smart-account", {
58
+ * name: "existing-smart-account",
59
+ * owner: ownerAccount, // or "0x..." address
60
+ * adopt: true // Uses existing smart account if it exists
61
+ * });
62
+ * ```
63
+ */
64
+ export const EvmSmartAccount = Resource("coinbase::evm-smart-account", async function (_id, props) {
65
+ // Initialize CDP client with credentials from props or environment
66
+ const cdp = await createCdpClient({
67
+ apiKeyId: props.apiKeyId,
68
+ apiKeySecret: props.apiKeySecret,
69
+ walletSecret: props.walletSecret,
70
+ });
71
+ // Get owner address
72
+ const ownerAddress = typeof props.owner === "string" ? props.owner : props.owner.address;
73
+ // Get owner account for CDP operations
74
+ // When owner is an address string, we use it to get the account
75
+ const ownerAccount = typeof props.owner === "string"
76
+ ? await cdp.evm.getAccount({ address: props.owner })
77
+ : await cdp.evm.getAccount({ address: props.owner.address });
78
+ // If no name provided, inherit from owner
79
+ // this mean that if you pass only { owner } the created smartAccount will be same name as the EOA owner
80
+ // this to support https://github.com/base/account-sdk/blob/master/packages/account-sdk/src/interface/payment/charge.ts#L120
81
+ let accountName = props.name ? props.name : ownerAccount.name;
82
+ if (!accountName) {
83
+ throw new Error(`Smart account requires a name. Either provide 'name' in props or ensure the owner account has a name. Owner address: ${ownerAddress}`);
84
+ }
85
+ // Validate account name format
86
+ validateAccountName(accountName);
87
+ // Handle update phase
88
+ if (this.phase === "update" && this.output) {
89
+ // Check if owner changed (which would require replacement)
90
+ if (ownerAddress !== this.output.ownerAddress) {
91
+ this.replace();
92
+ }
93
+ // Check if name changed
94
+ if (accountName !== this.output.name) {
95
+ await cdp.evm.updateSmartAccount({
96
+ address: this.output.address,
97
+ owner: ownerAccount,
98
+ update: {
99
+ name: accountName,
100
+ },
101
+ });
102
+ return {
103
+ ...this.output,
104
+ name: accountName,
105
+ // faucet: props.faucet, not sure we need this?
106
+ };
107
+ }
108
+ // Update faucet configuration if changed
109
+ if (JSON.stringify(props.faucet) !== JSON.stringify(this.output.faucet)) {
110
+ // Only fund NEW combinations that weren't in the previous config
111
+ try {
112
+ // Get all old combinations
113
+ const oldCombinations = new Set(Object.entries(this.output.faucet ?? {}).flatMap(([network, tokens]) => tokens.map((token) => `${network}:${token}`)));
114
+ // Get all new combinations
115
+ const newCombinations = Object.entries(props.faucet ?? {}).flatMap(([network, tokens]) => tokens.map((token) => ({
116
+ network: network,
117
+ token: token,
118
+ key: `${network}:${token}`,
119
+ })));
120
+ // Filter to only combinations that are actually new
121
+ const toFund = newCombinations.filter(({ key }) => !oldCombinations.has(key));
122
+ if (toFund.length > 0) {
123
+ await Promise.all(toFund.map(({ network, token }) => cdp.evm
124
+ .requestFaucet({
125
+ address: this.output.address,
126
+ network,
127
+ token,
128
+ })
129
+ .catch((err) => {
130
+ console.warn(`⚠️ Failed to request ${token} on ${network} for smart account ${this.output.address}: ${err.message}`);
131
+ return null;
132
+ })));
133
+ console.log(`💧 Requested ${toFund.length} new faucet fund${toFund.length === 1 ? "" : "s"} for smart account ${this.output.address}`);
134
+ }
135
+ }
136
+ catch (error) {
137
+ console.warn(`⚠️ Failed to request additional faucet funds for smart account ${this.output.address}: ${error.message}`);
138
+ // Continue - don't break the update
139
+ }
140
+ return {
141
+ ...this.output,
142
+ faucet: props.faucet,
143
+ };
144
+ }
145
+ return this.output;
146
+ }
147
+ // Handle delete phase
148
+ if (this.phase === "delete") {
149
+ // CDP SDK doesn't support deleting accounts
150
+ // Accounts remain in CDP but are no longer tracked by Alchemy
151
+ console.log(`🗑️ Untracking Smart Account: ${this.output?.address}`);
152
+ return this.destroy();
153
+ }
154
+ let smartAccount;
155
+ // Check for adoption or use getOrCreate pattern
156
+ const adopt = props.adopt ?? this.scope.adopt;
157
+ if (adopt) {
158
+ // With adoption, use getOrCreateSmartAccount which returns existing if it exists
159
+ smartAccount = await cdp.evm.getOrCreateSmartAccount({
160
+ name: accountName,
161
+ owner: ownerAccount,
162
+ });
163
+ }
164
+ else {
165
+ // Without adoption, create a new smart account
166
+ try {
167
+ smartAccount = await cdp.evm.createSmartAccount({
168
+ name: accountName,
169
+ owner: ownerAccount,
170
+ });
171
+ }
172
+ catch (error) {
173
+ // Provide helpful error message if smart account already exists
174
+ if (error.errorType === "already_exists") {
175
+ throw new Error(`Smart account with name '${accountName}' already exists. Use adopt: true to use the existing smart account.`);
176
+ }
177
+ // Rethrow other errors unchanged
178
+ throw error;
179
+ }
180
+ }
181
+ // Fund the smart account if faucet configuration is provided
182
+ if (props.faucet) {
183
+ try {
184
+ const combinations = Object.entries(props.faucet).flatMap(([network, tokens]) => tokens.map((token) => ({
185
+ network: network,
186
+ token: token,
187
+ })));
188
+ await Promise.all(combinations.map(({ network, token }) => cdp.evm
189
+ .requestFaucet({
190
+ address: smartAccount.address,
191
+ network,
192
+ token,
193
+ })
194
+ .catch((err) => {
195
+ console.warn(`⚠️ Failed to request ${token} on ${network} for smart account ${smartAccount.address}: ${err.message}`);
196
+ return null;
197
+ })));
198
+ console.log(`💧 Requested faucet funds for smart account ${smartAccount.address}`);
199
+ }
200
+ catch (error) {
201
+ console.warn(`⚠️ Failed to request faucet funds for smart account ${smartAccount.address}: ${error.message}`);
202
+ // Continue - don't break account creation
203
+ }
204
+ }
205
+ // Return smart account details
206
+ return {
207
+ name: accountName,
208
+ address: smartAccount.address,
209
+ ownerAddress,
210
+ faucet: props.faucet,
211
+ };
212
+ });
213
+ //# sourceMappingURL=evm-smart-account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm-smart-account.js","sourceRoot":"","sources":["../../src/coinbase/evm-smart-account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Request testnet tokens from Coinbase faucet for accounts with faucet metadata
4
+ *
5
+ * Usage:
6
+ * bun node_modules/alchemy/src/coinbase/faucet.ts # Fund all accounts with faucet config
7
+ * bun node_modules/alchemy/src/coinbase/faucet.ts dev # Fund only accounts in dev scope
8
+ * bun node_modules/alchemy/src/coinbase/faucet.ts backend/dev # Fund specific scope
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=faucet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faucet.d.ts","sourceRoot":"","sources":["../../src/coinbase/faucet.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Request testnet tokens from Coinbase faucet for accounts with faucet metadata
4
+ *
5
+ * Usage:
6
+ * bun node_modules/alchemy/src/coinbase/faucet.ts # Fund all accounts with faucet config
7
+ * bun node_modules/alchemy/src/coinbase/faucet.ts dev # Fund only accounts in dev scope
8
+ * bun node_modules/alchemy/src/coinbase/faucet.ts backend/dev # Fund specific scope
9
+ */
10
+ import { readFile, access } from "node:fs/promises";
11
+ import { join } from "node:path";
12
+ import { glob } from "glob";
13
+ import { createCdpClient } from "./client.js";
14
+ // Track funded combinations to avoid duplicates within this run
15
+ const funded = new Set();
16
+ // Get optional scope argument
17
+ const scope = process.argv[2];
18
+ // Initialize CDP client (uses CDP_* env vars automatically)
19
+ const cdp = await createCdpClient();
20
+ let stateFiles;
21
+ if (scope) {
22
+ // If scope provided, find matching directories
23
+ const scopePath = join(".alchemy", scope);
24
+ let scopeExists = false;
25
+ try {
26
+ await access(scopePath);
27
+ scopeExists = true;
28
+ }
29
+ catch {
30
+ scopeExists = false;
31
+ }
32
+ if (scopeExists) {
33
+ // Exact match found
34
+ console.log(`Using scope: ${scope}`);
35
+ stateFiles = await glob("*.json", {
36
+ cwd: scopePath,
37
+ absolute: true,
38
+ });
39
+ }
40
+ else {
41
+ // Try to find directories that end with the provided scope
42
+ // We need to find directories, so we'll look for JSON files and extract the directory paths
43
+ const allFiles = await glob(`**/${scope}/*.json`, {
44
+ cwd: ".alchemy",
45
+ });
46
+ // Extract unique directory paths
47
+ const possibleScopes = [
48
+ ...new Set(allFiles.map((f) => f.replace(/\/[^/]+\.json$/, ""))),
49
+ ];
50
+ if (possibleScopes.length === 0) {
51
+ console.error(`No scope found matching: ${scope}`);
52
+ process.exit(1);
53
+ }
54
+ else if (possibleScopes.length === 1) {
55
+ // Found exactly one match
56
+ const foundScope = possibleScopes[0];
57
+ console.log(`Using scope: ${foundScope}`);
58
+ stateFiles = await glob("*.json", {
59
+ cwd: join(".alchemy", foundScope),
60
+ absolute: true,
61
+ });
62
+ }
63
+ else {
64
+ // Multiple matches found - use all of them
65
+ console.log(`Found ${possibleScopes.length} scopes matching '${scope}':`);
66
+ for (const s of possibleScopes) {
67
+ console.log(` - ${s}`);
68
+ }
69
+ // Collect state files from all matching scopes
70
+ stateFiles = [];
71
+ for (const foundScope of possibleScopes) {
72
+ const files = await glob("*.json", {
73
+ cwd: join(".alchemy", foundScope),
74
+ absolute: true,
75
+ });
76
+ stateFiles.push(...files);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ else {
82
+ // No scope provided, search all .alchemy subdirectories
83
+ console.log("Searching all scopes for accounts with faucet configuration...");
84
+ stateFiles = await glob("**/*.json", {
85
+ cwd: ".alchemy",
86
+ absolute: true,
87
+ });
88
+ }
89
+ const allStates = (await Promise.all(stateFiles.map(async (file) => {
90
+ try {
91
+ const content = await readFile(file, "utf-8");
92
+ return JSON.parse(content);
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }))).filter(Boolean);
98
+ const accounts = allStates
99
+ .filter((state) => state?.kind?.startsWith("coinbase::evm") &&
100
+ state.output &&
101
+ state.output.faucet)
102
+ .map((state) => {
103
+ const output = state.output;
104
+ return {
105
+ address: output.address,
106
+ name: output.name,
107
+ faucet: output.faucet,
108
+ };
109
+ });
110
+ if (accounts.length === 0) {
111
+ console.log("No accounts with faucet configuration found");
112
+ process.exit(0);
113
+ }
114
+ console.log(`Found ${accounts.length} accounts with faucet configuration\n`);
115
+ for (const account of accounts) {
116
+ console.log(`Account: ${account.name} (${account.address})`);
117
+ for (const [network, tokens] of Object.entries(account.faucet)) {
118
+ for (const token of tokens) {
119
+ const key = `${account.address}-${network}-${token}`;
120
+ // Skip if already processed in this run
121
+ if (funded.has(key)) {
122
+ console.log(` ⏭️ Skipping ${token} on ${network} (already requested)`);
123
+ continue;
124
+ }
125
+ // Request tokens from faucet
126
+ try {
127
+ console.log(` 💧 Requesting ${token} on ${network}...`);
128
+ const response = await cdp.evm.requestFaucet({
129
+ address: account.address,
130
+ network: network,
131
+ token: token,
132
+ });
133
+ console.log(` ✅ Funded: ${response.transactionHash}`);
134
+ funded.add(key);
135
+ // Small delay to avoid rate limits
136
+ await new Promise((resolve) => setTimeout(resolve, 1000));
137
+ }
138
+ catch (error) {
139
+ console.log(` ❌ Error funding ${token} on ${network}: ${error.message}`);
140
+ }
141
+ }
142
+ }
143
+ console.log();
144
+ }
145
+ console.log("✨ Funding complete!");
146
+ //# sourceMappingURL=faucet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faucet.js","sourceRoot":"","sources":["../../src/coinbase/faucet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./types.ts";
2
+ export * from "./evm-account.ts";
3
+ export * from "./evm-smart-account.ts";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coinbase/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./evm-account.js";
3
+ export * from "./evm-smart-account.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coinbase/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Common types for Coinbase CDP resources
3
+ */
4
+ /**
5
+ * Ethereum address format (20 bytes, 40 hex chars)
6
+ */
7
+ export type Address = `0x${string}`;
8
+ /**
9
+ * Private key format (32 bytes, 64 hex chars)
10
+ */
11
+ export type PrivateKey = `0x${string}`;
12
+ /**
13
+ * Transaction hash format (32 bytes, 64 hex chars)
14
+ */
15
+ export type TransactionHash = `0x${string}`;
16
+ /**
17
+ * Supported testnet networks for faucet requests
18
+ */
19
+ export type FaucetNetwork = "base-sepolia" | "ethereum-sepolia";
20
+ /**
21
+ * Supported tokens for faucet requests
22
+ */
23
+ export type FaucetToken = "eth" | "usdc" | "eurc" | "cbbtc";
24
+ /**
25
+ * Faucet configuration for requesting testnet tokens
26
+ */
27
+ export type FaucetConfig = Partial<Record<FaucetNetwork, FaucetToken[]>>;
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/coinbase/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,KAAK,MAAM,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,MAAM,EAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Common types for Coinbase CDP resources
3
+ */
4
+ //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/telemetry/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/coinbase/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Utility functions for Coinbase CDP resources
3
+ */
4
+ /**
5
+ * Validates that a CDP account name follows the required format.
6
+ * CDP only allows letters, numbers, and hyphens in account names.
7
+ * Names cannot start or end with a hyphen.
8
+ *
9
+ * @param name - The account name to validate
10
+ * @throws Error if the name contains invalid characters or starts/ends with hyphen
11
+ */
12
+ export declare function validateAccountName(name: string): void;
13
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/coinbase/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMtD"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Utility functions for Coinbase CDP resources
3
+ */
4
+ /**
5
+ * Validates that a CDP account name follows the required format.
6
+ * CDP only allows letters, numbers, and hyphens in account names.
7
+ * Names cannot start or end with a hyphen.
8
+ *
9
+ * @param name - The account name to validate
10
+ * @throws Error if the name contains invalid characters or starts/ends with hyphen
11
+ */
12
+ export function validateAccountName(name) {
13
+ if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(name)) {
14
+ throw new Error(`Invalid account name '${name}'. CDP only allows letters, numbers, and hyphens. Names cannot start or end with a hyphen.`);
15
+ }
16
+ }
17
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/coinbase/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,0CAA0C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,4FAA4F,CAC1H,CAAC;IACJ,CAAC;AACH,CAAC"}