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.
- package/bin/alchemy.js +3810 -3889
- package/bin/commands/init.ts +41 -55
- package/bin/trpc.ts +4 -9
- package/lib/alchemy.d.ts +3 -3
- package/lib/alchemy.d.ts.map +1 -1
- package/lib/alchemy.js +2 -15
- package/lib/alchemy.js.map +1 -1
- package/lib/apply.js +24 -9
- package/lib/apply.js.map +1 -1
- package/lib/aws/utils.d.ts +2 -1
- package/lib/aws/utils.d.ts.map +1 -1
- package/lib/aws/utils.js.map +1 -1
- package/lib/clickhouse/api/client.gen.d.ts +13 -0
- package/lib/clickhouse/api/client.gen.d.ts.map +1 -0
- package/lib/clickhouse/api/client.gen.js +7 -0
- package/lib/clickhouse/api/client.gen.js.map +1 -0
- package/lib/clickhouse/api/sdk.gen.d.ts +322 -0
- package/lib/clickhouse/api/sdk.gen.d.ts.map +1 -0
- package/lib/clickhouse/api/sdk.gen.js +683 -0
- package/lib/clickhouse/api/sdk.gen.js.map +1 -0
- package/lib/clickhouse/api/types.gen.d.ts +5030 -0
- package/lib/clickhouse/api/types.gen.d.ts.map +1 -0
- package/lib/clickhouse/api/types.gen.js +2 -0
- package/lib/clickhouse/api/types.gen.js.map +1 -0
- package/lib/clickhouse/api-key.d.ts +29 -0
- package/lib/clickhouse/api-key.d.ts.map +1 -0
- package/lib/clickhouse/api-key.js +83 -0
- package/lib/clickhouse/api-key.js.map +1 -0
- package/lib/clickhouse/api.d.ts +36 -0
- package/lib/clickhouse/api.d.ts.map +1 -0
- package/lib/clickhouse/api.js +48 -0
- package/lib/clickhouse/api.js.map +1 -0
- package/lib/clickhouse/index.d.ts +4 -0
- package/lib/clickhouse/index.d.ts.map +1 -0
- package/lib/clickhouse/index.js +4 -0
- package/lib/clickhouse/index.js.map +1 -0
- package/lib/clickhouse/organization.d.ts +16 -0
- package/lib/clickhouse/organization.d.ts.map +1 -0
- package/lib/clickhouse/organization.js +21 -0
- package/lib/clickhouse/organization.js.map +1 -0
- package/lib/clickhouse/service.d.ts +275 -0
- package/lib/clickhouse/service.d.ts.map +1 -0
- package/lib/clickhouse/service.js +274 -0
- package/lib/clickhouse/service.js.map +1 -0
- package/lib/cloudflare/account-api-token.d.ts.map +1 -1
- package/lib/cloudflare/account-api-token.js +1 -1
- package/lib/cloudflare/account-api-token.js.map +1 -1
- package/lib/cloudflare/bucket-object.d.ts +5 -0
- package/lib/cloudflare/bucket-object.d.ts.map +1 -1
- package/lib/cloudflare/bucket-object.js +1 -1
- package/lib/cloudflare/bucket-object.js.map +1 -1
- package/lib/cloudflare/bucket.d.ts +6 -3
- package/lib/cloudflare/bucket.d.ts.map +1 -1
- package/lib/cloudflare/bucket.js +60 -8
- package/lib/cloudflare/bucket.js.map +1 -1
- package/lib/cloudflare/bun-spa/bun-spa.d.ts +15 -0
- package/lib/cloudflare/bun-spa/bun-spa.d.ts.map +1 -0
- package/lib/cloudflare/bun-spa/bun-spa.js +95 -0
- package/lib/cloudflare/bun-spa/bun-spa.js.map +1 -0
- package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
- package/lib/cloudflare/compatibility-date.gen.js +1 -1
- package/lib/cloudflare/container.d.ts +11 -1
- package/lib/cloudflare/container.d.ts.map +1 -1
- package/lib/cloudflare/container.js +1 -1
- package/lib/cloudflare/container.js.map +1 -1
- package/lib/cloudflare/index.d.ts +1 -0
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +1 -0
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/miniflare/build-worker-options.d.ts.map +1 -1
- package/lib/cloudflare/miniflare/build-worker-options.js +3 -3
- package/lib/cloudflare/miniflare/build-worker-options.js.map +1 -1
- package/lib/cloudflare/miniflare/miniflare-controller.d.ts.map +1 -1
- package/lib/cloudflare/miniflare/miniflare-controller.js +2 -0
- package/lib/cloudflare/miniflare/miniflare-controller.js.map +1 -1
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts +1 -1
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts.map +1 -1
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +33 -14
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
- package/lib/cloudflare/permission-groups.d.ts +2 -3
- package/lib/cloudflare/permission-groups.d.ts.map +1 -1
- package/lib/cloudflare/permission-groups.js +10 -15
- package/lib/cloudflare/permission-groups.js.map +1 -1
- package/lib/cloudflare/redwood/redwood.d.ts +1 -1
- package/lib/cloudflare/redwood/redwood.js +1 -1
- package/lib/cloudflare/tanstack-start/plugin.d.ts +2 -15
- package/lib/cloudflare/tanstack-start/plugin.d.ts.map +1 -1
- package/lib/cloudflare/tanstack-start/plugin.js +5 -25
- package/lib/cloudflare/tanstack-start/plugin.js.map +1 -1
- package/lib/cloudflare/tanstack-start/tanstack-start.d.ts.map +1 -1
- package/lib/cloudflare/tanstack-start/tanstack-start.js +15 -4
- package/lib/cloudflare/tanstack-start/tanstack-start.js.map +1 -1
- package/lib/cloudflare/util/filter-env-bindings.d.ts +62 -0
- package/lib/cloudflare/util/filter-env-bindings.d.ts.map +1 -0
- package/lib/cloudflare/util/filter-env-bindings.js +81 -0
- package/lib/cloudflare/util/filter-env-bindings.js.map +1 -0
- package/lib/cloudflare/website.d.ts +2 -2
- package/lib/cloudflare/website.d.ts.map +1 -1
- package/lib/cloudflare/website.js +7 -18
- package/lib/cloudflare/website.js.map +1 -1
- package/lib/cloudflare/worker-metadata.d.ts +5 -1
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
- package/lib/cloudflare/worker-metadata.js +3 -0
- package/lib/cloudflare/worker-metadata.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +17 -1
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +1 -0
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/wrangler.json.d.ts +15 -1
- package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
- package/lib/cloudflare/wrangler.json.js +12 -4
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/coinbase/client.d.ts +54 -0
- package/lib/coinbase/client.d.ts.map +1 -0
- package/lib/coinbase/client.js +89 -0
- package/lib/coinbase/client.js.map +1 -0
- package/lib/coinbase/evm-account.d.ts +118 -0
- package/lib/coinbase/evm-account.d.ts.map +1 -0
- package/lib/coinbase/evm-account.js +198 -0
- package/lib/coinbase/evm-account.js.map +1 -0
- package/lib/coinbase/evm-smart-account.d.ts +122 -0
- package/lib/coinbase/evm-smart-account.d.ts.map +1 -0
- package/lib/coinbase/evm-smart-account.js +213 -0
- package/lib/coinbase/evm-smart-account.js.map +1 -0
- package/lib/coinbase/faucet.d.ts +11 -0
- package/lib/coinbase/faucet.d.ts.map +1 -0
- package/lib/coinbase/faucet.js +146 -0
- package/lib/coinbase/faucet.js.map +1 -0
- package/lib/coinbase/index.d.ts +4 -0
- package/lib/coinbase/index.d.ts.map +1 -0
- package/lib/coinbase/index.js +4 -0
- package/lib/coinbase/index.js.map +1 -0
- package/lib/coinbase/types.d.ts +28 -0
- package/lib/coinbase/types.d.ts.map +1 -0
- package/lib/coinbase/types.js +4 -0
- package/lib/{util/telemetry → coinbase}/types.js.map +1 -1
- package/lib/coinbase/utils.d.ts +13 -0
- package/lib/coinbase/utils.d.ts.map +1 -0
- package/lib/coinbase/utils.js +17 -0
- package/lib/coinbase/utils.js.map +1 -0
- package/lib/docker/api.d.ts +22 -1
- package/lib/docker/api.d.ts.map +1 -1
- package/lib/docker/api.js +64 -2
- package/lib/docker/api.js.map +1 -1
- package/lib/docker/container.d.ts +88 -0
- package/lib/docker/container.d.ts.map +1 -1
- package/lib/docker/container.js +36 -0
- package/lib/docker/container.js.map +1 -1
- package/lib/neon/api/types.gen.d.ts +7 -2
- package/lib/neon/api/types.gen.d.ts.map +1 -1
- package/lib/planetscale/api/types.gen.d.ts +20 -4
- package/lib/planetscale/api/types.gen.d.ts.map +1 -1
- package/lib/planetscale/api.d.ts.map +1 -1
- package/lib/planetscale/api.js +1 -0
- package/lib/planetscale/api.js.map +1 -1
- package/lib/planetscale/password.d.ts.map +1 -1
- package/lib/planetscale/password.js +1 -13
- package/lib/planetscale/password.js.map +1 -1
- package/lib/resource.d.ts.map +1 -1
- package/lib/resource.js +7 -3
- package/lib/resource.js.map +1 -1
- package/lib/scope.d.ts +4 -9
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +16 -37
- package/lib/scope.js.map +1 -1
- package/lib/state/instrumented-state-store.d.ts +1 -3
- package/lib/state/instrumented-state-store.d.ts.map +1 -1
- package/lib/state/instrumented-state-store.js +19 -21
- package/lib/state/instrumented-state-store.js.map +1 -1
- package/lib/test/bun.d.ts.map +1 -1
- package/lib/test/bun.js +1 -2
- package/lib/test/bun.js.map +1 -1
- package/lib/test/vitest.d.ts.map +1 -1
- package/lib/test/vitest.js +1 -2
- package/lib/test/vitest.js.map +1 -1
- package/lib/util/diff.d.ts +5 -0
- package/lib/util/diff.d.ts.map +1 -0
- package/lib/util/diff.js +14 -0
- package/lib/util/diff.js.map +1 -0
- package/lib/util/telemetry.d.ts +52 -0
- package/lib/util/telemetry.d.ts.map +1 -0
- package/lib/util/telemetry.js +191 -0
- package/lib/util/telemetry.js.map +1 -0
- package/package.json +19 -1
- package/src/alchemy.ts +5 -20
- package/src/apply.ts +29 -12
- package/src/aws/utils.ts +2 -1
- package/src/clickhouse/api/client.gen.ts +28 -0
- package/src/clickhouse/api/sdk.gen.ts +1286 -0
- package/src/clickhouse/api/types.gen.ts +5898 -0
- package/src/clickhouse/api-key.ts +136 -0
- package/src/clickhouse/api.ts +84 -0
- package/src/clickhouse/index.ts +3 -0
- package/src/clickhouse/organization.ts +31 -0
- package/src/clickhouse/service.ts +668 -0
- package/src/cloudflare/account-api-token.ts +1 -4
- package/src/cloudflare/bucket-object.ts +11 -1
- package/src/cloudflare/bucket.ts +72 -6
- package/src/cloudflare/bun-spa/bun-spa.ts +139 -0
- package/src/cloudflare/compatibility-date.gen.ts +1 -1
- package/src/cloudflare/container.ts +22 -3
- package/src/cloudflare/index.ts +1 -0
- package/src/cloudflare/miniflare/build-worker-options.ts +6 -4
- package/src/cloudflare/miniflare/miniflare-controller.ts +2 -0
- package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +42 -15
- package/src/cloudflare/permission-groups.ts +21 -49
- package/src/cloudflare/redwood/redwood.ts +1 -1
- package/src/cloudflare/tanstack-start/plugin.ts +7 -28
- package/src/cloudflare/tanstack-start/tanstack-start.ts +15 -4
- package/src/cloudflare/util/filter-env-bindings.ts +96 -0
- package/src/cloudflare/website.ts +12 -24
- package/src/cloudflare/worker-metadata.ts +8 -1
- package/src/cloudflare/worker.ts +19 -1
- package/src/cloudflare/wrangler.json.ts +27 -9
- package/src/coinbase/client.ts +146 -0
- package/src/coinbase/evm-account.ts +317 -0
- package/src/coinbase/evm-smart-account.ts +339 -0
- package/src/coinbase/faucet.ts +173 -0
- package/src/coinbase/index.ts +3 -0
- package/src/coinbase/types.ts +33 -0
- package/src/coinbase/utils.ts +19 -0
- package/src/docker/api.ts +86 -2
- package/src/docker/container.ts +97 -0
- package/src/neon/api/types.gen.ts +13 -1
- package/src/planetscale/api/types.gen.ts +22 -2
- package/src/planetscale/api.ts +1 -0
- package/src/planetscale/password.ts +1 -14
- package/src/resource.ts +11 -4
- package/src/scope.ts +22 -45
- package/src/state/instrumented-state-store.ts +27 -26
- package/src/test/bun.ts +1 -2
- package/src/test/vitest.ts +1 -2
- package/src/util/diff.ts +14 -0
- package/src/util/telemetry.ts +297 -0
- package/templates/tanstack-start/.cta.json +13 -0
- package/templates/tanstack-start/README.md +267 -49
- package/templates/tanstack-start/_gitignore +9 -18
- package/templates/tanstack-start/alchemy.run.ts +2 -2
- package/templates/tanstack-start/package.json +24 -19
- package/templates/tanstack-start/public/favicon.ico +0 -0
- package/templates/tanstack-start/public/logo192.png +0 -0
- package/templates/tanstack-start/public/logo512.png +0 -0
- package/templates/tanstack-start/public/manifest.json +25 -0
- package/templates/tanstack-start/public/robots.txt +3 -0
- package/templates/tanstack-start/src/components/Header.tsx +21 -0
- package/templates/tanstack-start/src/logo.svg +12 -0
- package/templates/tanstack-start/src/router.tsx +7 -16
- package/templates/tanstack-start/src/routes/__root.tsx +13 -114
- package/templates/tanstack-start/src/routes/api.demo-names.ts +15 -0
- package/templates/tanstack-start/src/routes/demo.start.api-request.tsx +44 -0
- package/templates/tanstack-start/src/routes/demo.start.server-funcs.tsx +97 -0
- package/templates/tanstack-start/src/routes/index.tsx +31 -4
- package/templates/tanstack-start/src/styles.css +15 -0
- package/templates/tanstack-start/tsconfig.json +19 -22
- package/templates/tanstack-start/types/env.d.ts +2 -2
- package/templates/tanstack-start/vite.config.ts +16 -25
- package/workers/tunnel-proxy.js +1 -1
- package/lib/util/telemetry/client.d.ts +0 -31
- package/lib/util/telemetry/client.d.ts.map +0 -1
- package/lib/util/telemetry/client.js +0 -121
- package/lib/util/telemetry/client.js.map +0 -1
- package/lib/util/telemetry/constants.d.ts +0 -5
- package/lib/util/telemetry/constants.d.ts.map +0 -1
- package/lib/util/telemetry/constants.js +0 -8
- package/lib/util/telemetry/constants.js.map +0 -1
- package/lib/util/telemetry/context.d.ts +0 -15
- package/lib/util/telemetry/context.d.ts.map +0 -1
- package/lib/util/telemetry/context.js +0 -128
- package/lib/util/telemetry/context.js.map +0 -1
- package/lib/util/telemetry/index.d.ts +0 -3
- package/lib/util/telemetry/index.d.ts.map +0 -1
- package/lib/util/telemetry/index.js +0 -3
- package/lib/util/telemetry/index.js.map +0 -1
- package/lib/util/telemetry/types.d.ts +0 -68
- package/lib/util/telemetry/types.d.ts.map +0 -1
- package/lib/util/telemetry/types.js +0 -1
- package/src/util/telemetry/client.ts +0 -156
- package/src/util/telemetry/constants.ts +0 -13
- package/src/util/telemetry/context.ts +0 -154
- package/src/util/telemetry/index.ts +0 -2
- package/src/util/telemetry/types.ts +0 -105
- package/templates/tanstack-start/_prettierignore +0 -4
- package/templates/tanstack-start/public/android-chrome-192x192.png +0 -0
- package/templates/tanstack-start/public/android-chrome-512x512.png +0 -0
- package/templates/tanstack-start/public/apple-touch-icon.png +0 -0
- package/templates/tanstack-start/public/favicon-16x16.png +0 -0
- package/templates/tanstack-start/public/favicon-32x32.png +0 -0
- package/templates/tanstack-start/public/favicon.png +0 -0
- package/templates/tanstack-start/public/site.webmanifest +0 -19
- package/templates/tanstack-start/src/components/DefaultCatchBoundary.tsx +0 -53
- package/templates/tanstack-start/src/components/NotFound.tsx +0 -25
- package/templates/tanstack-start/src/components/PostError.tsx +0 -5
- package/templates/tanstack-start/src/components/UserError.tsx +0 -5
- package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout/route-a.tsx +0 -10
- package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout/route-b.tsx +0 -10
- package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout.tsx +0 -34
- package/templates/tanstack-start/src/routes/_pathlessLayout.tsx +0 -16
- package/templates/tanstack-start/src/routes/api/users.$userId.ts +0 -28
- package/templates/tanstack-start/src/routes/api/users.ts +0 -59
- package/templates/tanstack-start/src/routes/customScript[.]js.ts +0 -10
- package/templates/tanstack-start/src/routes/deferred.tsx +0 -62
- package/templates/tanstack-start/src/routes/posts.$postId.tsx +0 -34
- package/templates/tanstack-start/src/routes/posts.index.tsx +0 -8
- package/templates/tanstack-start/src/routes/posts.tsx +0 -38
- package/templates/tanstack-start/src/routes/posts_.$postId.deep.tsx +0 -29
- package/templates/tanstack-start/src/routes/redirect.tsx +0 -9
- package/templates/tanstack-start/src/routes/users.$userId.tsx +0 -44
- package/templates/tanstack-start/src/routes/users.index.tsx +0 -18
- package/templates/tanstack-start/src/routes/users.tsx +0 -49
- package/templates/tanstack-start/src/styles/app.css +0 -12
- package/templates/tanstack-start/src/utils/loggingMiddleware.tsx +0 -41
- package/templates/tanstack-start/src/utils/posts.tsx +0 -40
- package/templates/tanstack-start/src/utils/seo.ts +0 -33
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["
|
|
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"}
|