helius-wallet-kit 0.1.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/README.md +96 -0
- package/dist/core/index.cjs +461 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +170 -0
- package/dist/core/index.d.ts +170 -0
- package/dist/core/index.js +456 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.cjs +461 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +456 -0
- package/dist/index.js.map +1 -0
- package/dist/next/index.cjs +240 -0
- package/dist/next/index.cjs.map +1 -0
- package/dist/next/index.d.cts +53 -0
- package/dist/next/index.d.ts +53 -0
- package/dist/next/index.js +238 -0
- package/dist/next/index.js.map +1 -0
- package/dist/ui/index.cjs +4 -0
- package/dist/ui/index.cjs.map +1 -0
- package/dist/ui/index.d.cts +2 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/styles.css +58 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/next/internal/api-key.ts","../../src/next/handlers/rpc.ts","../../src/next/handlers/send.ts","../../src/next/handlers/transactions.ts","../../src/next/handlers/plan.ts","../../src/next/handlers/waas-config.ts","../../src/next/createHeliusRouteHandler.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { HeliusHandlerOptions } from \"./types\";\n\n/**\n * Resolve the Helius API key for an incoming request. Lookup order:\n * 1. Explicit `options.apiKey` override passed to the route factory.\n * 2. `x-helius-api-key` request header (the hook sends this when the key\n * is configured client-side as `NEXT_PUBLIC_HELIUS_API_KEY`).\n * 3. `HELIUS_API_KEY` server env var (preferred production path —\n * key never touches the client bundle).\n * 4. `NEXT_PUBLIC_HELIUS_API_KEY` env var (compat with apps that put the\n * key in the client today; behaves like #3 when read server-side).\n *\n * Returns empty string if none found. Individual handlers decide whether\n * that's a 400 error or passed through to Helius as-is.\n */\nexport function getApiKey(req: Request, options: HeliusHandlerOptions): string {\n if (options.apiKey) return options.apiKey;\n const headerKey = req.headers.get(\"x-helius-api-key\");\n if (headerKey) return headerKey;\n return (\n process.env.HELIUS_API_KEY ??\n process.env.NEXT_PUBLIC_HELIUS_API_KEY ??\n \"\"\n );\n}\n\nexport function jsonError(message: string, status: number): Response {\n return Response.json({ error: message }, { status });\n}\n\nexport function methodNotAllowed(): Response {\n return Response.json({ error: \"Method not allowed\" }, { status: 405 });\n}\n","import { getApiKey, jsonError, methodNotAllowed } from \"../internal/api-key\";\nimport type { HeliusHandler } from \"../internal/types\";\n\n/**\n * Proxies arbitrary Solana RPC calls through Helius. Routes to mainnet or\n * devnet endpoint based on `?cluster=` query param. Required because:\n * - Some RPC methods (`getPriorityFeeEstimate`, etc.) need the API key.\n * - Putting the key in the URL client-side exposes it; proxying keeps\n * the door open to moving the key server-only without client changes.\n *\n * Matches the Helius RPC JSON-RPC shape verbatim — the hook's `connection`\n * and `getPriorityFee()` talk to this route transparently.\n */\nexport const rpcHandler: HeliusHandler = async (req, options) => {\n if (req.method !== \"POST\") return methodNotAllowed();\n\n const apiKey = getApiKey(req, options);\n if (!apiKey) return jsonError(\"Helius API key not configured\", 500);\n\n const url = new URL(req.url);\n const cluster = url.searchParams.get(\"cluster\") ?? \"devnet\";\n\n const upstream =\n cluster === \"mainnet-beta\"\n ? `https://mainnet.helius-rpc.com/?api-key=${apiKey}`\n : `https://devnet.helius-rpc.com/?api-key=${apiKey}`;\n\n const body = await req.json();\n\n const res = await fetch(upstream, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n const data = await res.json();\n return Response.json(data);\n};\n","import { getApiKey, jsonError, methodNotAllowed } from \"../internal/api-key\";\nimport type { HeliusHandler } from \"../internal/types\";\n\n/**\n * Submits a signed transaction. Cluster-aware routing:\n * - Mainnet: Helius Sender (`sender.helius-rpc.com/fast`) with\n * `skipPreflight: true` and Jito dual routing for ultra-low latency.\n * - Devnet: standard RPC `sendTransaction` with `maxRetries: 3`.\n *\n * This is the load-bearing \"Helius-optimized\" piece of the library —\n * every `useHeliusWallet().signAndSendTransaction()` call routes through\n * this handler. The cluster-switching logic lives here (not client-side)\n * so the hook stays simple and the routing can evolve without shipping\n * a library update.\n *\n * Request body: `{ transaction: string (base64), cluster, address? }`.\n * The `address` field is currently unused in the library — the PoC used\n * it for dev-dashboard transaction tracking, which is not part of the\n * library's surface. Consumers wanting per-address tracking should wrap\n * this handler with their own logging.\n */\nexport const sendHandler: HeliusHandler = async (req, options) => {\n if (req.method !== \"POST\") return methodNotAllowed();\n\n const apiKey = getApiKey(req, options);\n if (!apiKey) return jsonError(\"Helius API key not configured\", 500);\n\n const { transaction, cluster } = (await req.json()) as {\n transaction?: string;\n cluster?: string;\n address?: string;\n };\n\n if (!transaction) return jsonError(\"transaction is required\", 400);\n\n const isMainnet = cluster === \"mainnet-beta\";\n\n const upstream = isMainnet\n ? `https://sender.helius-rpc.com/fast?api-key=${apiKey}`\n : `https://devnet.helius-rpc.com/?api-key=${apiKey}`;\n\n const sendParams = isMainnet\n ? { encoding: \"base64\", skipPreflight: true, maxRetries: 0 }\n : { encoding: \"base64\", skipPreflight: false, maxRetries: 3 };\n\n const res = await fetch(upstream, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: \"1\",\n method: \"sendTransaction\",\n params: [transaction, sendParams],\n }),\n });\n\n const data = await res.json();\n\n if (data.error) {\n return jsonError(\n data.error.message ?? (isMainnet ? \"Sender error\" : \"RPC error\"),\n 400\n );\n }\n\n return Response.json({ signature: data.result });\n};\n","import { getApiKey, jsonError, methodNotAllowed } from \"../internal/api-key\";\nimport type { HeliusHandler } from \"../internal/types\";\n\n/**\n * Proxies Helius Enhanced Transactions API. Backs\n * `useHeliusWallet().getTransactions()`.\n *\n * Query params: `address` (required), `cluster` (defaults to devnet),\n * `limit` (defaults to 10).\n *\n * Upstream differs by cluster:\n * - Mainnet: api.helius.xyz/v0/addresses/:address/transactions\n * - Devnet: api-devnet.helius.xyz/v0/addresses/:address/transactions\n */\nexport const transactionsHandler: HeliusHandler = async (req, options) => {\n if (req.method !== \"GET\") return methodNotAllowed();\n\n const apiKey = getApiKey(req, options);\n if (!apiKey) return jsonError(\"Helius API key not configured\", 500);\n\n const url = new URL(req.url);\n const address = url.searchParams.get(\"address\");\n const cluster = url.searchParams.get(\"cluster\") ?? \"devnet\";\n const limit = url.searchParams.get(\"limit\") ?? \"10\";\n\n if (!address) return jsonError(\"address is required\", 400);\n\n const host =\n cluster === \"mainnet-beta\"\n ? \"https://api.helius.xyz\"\n : \"https://api-devnet.helius.xyz\";\n\n const upstream = `${host}/v0/addresses/${encodeURIComponent(address)}/transactions?api-key=${apiKey}&limit=${limit}`;\n\n try {\n const res = await fetch(upstream);\n if (!res.ok) {\n const text = await res.text();\n return jsonError(\n `Helius API error: ${res.status} ${text}`,\n res.status\n );\n }\n const data = await res.json();\n return Response.json(data);\n } catch (err) {\n return jsonError(\n err instanceof Error ? err.message : \"Unknown error\",\n 500\n );\n }\n};\n","import { getApiKey, methodNotAllowed } from \"../internal/api-key\";\nimport type { HeliusHandler } from \"../internal/types\";\n\n// Public OpenAPI docs for Helius Admin API list api.helius.xyz as the server\n// URL, but that's the RPC host (404s on /v0/admin). The actual Admin API\n// lives on admin-api.helius.xyz (confirmed via direct probe, 2026-04-17).\nconst HELIUS_ADMIN_API_BASE = \"https://admin-api.helius.xyz\";\n\n/**\n * Strip versioned suffixes from plan names. Helius returns versioned plans\n * like `\"professional_v4\"` or `\"business_v3\"`; our HeliusPlan enum and\n * isWaasEligible check expect canonical `\"professional\"` / `\"business\"`.\n *\n * TODO when Helius platform ships canonical plan names (or a `capabilities`\n * response field): drop this normalization and use the structured field.\n */\nfunction normalizePlan(raw: string | undefined): string | undefined {\n if (!raw) return raw;\n return raw.replace(/_v\\d+$/i, \"\");\n}\n\n/**\n * Resolves an API key + project id to plan tier, credits, and billing cycle\n * via Helius Admin API. Backs dynamic plan gating at provider mount.\n *\n * Query params: `projectId` (required).\n * Upstream: GET admin-api.helius.xyz/v0/admin/projects/{id}/usage\n * Rate limit: 5 req/s per key (handler doesn't cache; upstream caching\n * belongs in the library's next runtime when it becomes hot).\n *\n * Error semantics are load-bearing. The provider distinguishes:\n * - 403 (feature-flag off): durable. Fall back to static config, don't retry.\n * - 429 (rate limited): transient. Library layer should back off.\n * - 5xx (Helius data-integrity): transient. Retry with backoff.\n * - 401 (bad key) / 400 (apiKey ≠ projectId): durable user errors.\n */\nexport const planHandler: HeliusHandler = async (req, options) => {\n if (req.method !== \"GET\") return methodNotAllowed();\n\n const { searchParams } = new URL(req.url);\n const projectId = searchParams.get(\"projectId\");\n const apiKey = getApiKey(req, options);\n\n if (!projectId) {\n return Response.json(\n { kind: \"error\", message: \"projectId query param required\" },\n { status: 400 }\n );\n }\n if (!apiKey) {\n return Response.json(\n { kind: \"error\", message: \"API key missing\" },\n { status: 400 }\n );\n }\n\n try {\n const res = await fetch(\n `${HELIUS_ADMIN_API_BASE}/v0/admin/projects/${encodeURIComponent(projectId)}/usage`,\n { headers: { \"X-Api-Key\": apiKey } }\n );\n\n if (res.status === 403) {\n return Response.json({ kind: \"not-enabled\" });\n }\n if (res.status === 429) {\n return Response.json({ kind: \"rate-limited\" });\n }\n if (res.status >= 500) {\n return Response.json({ kind: \"upstream-error\", status: res.status });\n }\n if (res.status === 401) {\n return Response.json(\n { kind: \"error\", message: \"invalid Helius API key\" },\n { status: 401 }\n );\n }\n if (res.status === 400) {\n return Response.json(\n { kind: \"error\", message: \"apiKey/projectId mismatch\" },\n { status: 400 }\n );\n }\n if (!res.ok) {\n return Response.json(\n { kind: \"error\", message: `Admin API ${res.status}` },\n { status: res.status }\n );\n }\n\n const d = await res.json();\n return Response.json({\n kind: \"ok\",\n plan: normalizePlan(d.subscriptionDetails?.plan),\n rawPlan: d.subscriptionDetails?.plan,\n creditsUsed: d.creditsUsed,\n creditsRemaining: d.creditsRemaining,\n creditsLimit: d.subscriptionDetails?.creditsLimit,\n prepaidCreditsUsed: d.prepaidCreditsUsed,\n prepaidCreditsRemaining: d.prepaidCreditsRemaining,\n billingCycle: d.subscriptionDetails?.billingCycle,\n usage: d.usage,\n });\n } catch (err) {\n return Response.json(\n {\n kind: \"error\",\n message: err instanceof Error ? err.message : \"Unknown error\",\n },\n { status: 500 }\n );\n }\n};\n","import { getApiKey, methodNotAllowed } from \"../internal/api-key\";\nimport type { HeliusHandler } from \"../internal/types\";\n\n/**\n * Returns the client-side bootstrap config needed to mount the wallet\n * provider. The specific identifiers are implementation details of the\n * backing wallet infrastructure (Architecture Decision 4 — \"backend\n * invisible to developers\"); consumers never set or see them directly.\n *\n * Today (v0.1 private alpha): reads from `HELIUS_WAAS_ORG_ID` and\n * `HELIUS_WAAS_AUTH_PROXY_ID` server env vars, provisioned for each\n * consumer by the Helius team during onboarding.\n *\n * Future (v1.0, once the Helius backend ships `/v0/waas/config`): this\n * handler becomes a thin proxy that forwards to Helius's backend, which\n * resolves the bootstrap config from per-project dashboard state. Response\n * shape stays identical — consumers who are on v0.1 upgrade transparently\n * once the library is pointed at the real endpoint.\n */\nexport const waasConfigHandler: HeliusHandler = async (req, options) => {\n if (req.method !== \"GET\") return methodNotAllowed();\n\n const apiKey = getApiKey(req, options);\n if (!apiKey) {\n return Response.json(\n { kind: \"error\", message: \"API key missing\" },\n { status: 400 }\n );\n }\n\n const organizationId = process.env.HELIUS_WAAS_ORG_ID;\n const authProxyConfigId = process.env.HELIUS_WAAS_AUTH_PROXY_ID;\n\n if (!organizationId || !authProxyConfigId) {\n return Response.json(\n {\n kind: \"error\",\n message:\n \"Helius WaaS not provisioned for this environment (missing HELIUS_WAAS_ORG_ID or HELIUS_WAAS_AUTH_PROXY_ID). Contact Helius WaaS onboarding.\",\n },\n { status: 503 }\n );\n }\n\n return Response.json({\n kind: \"ok\",\n organizationId,\n authProxyConfigId,\n });\n};\n","import type { HeliusHandler, HeliusHandlerOptions } from \"./internal/types\";\nimport { rpcHandler } from \"./handlers/rpc\";\nimport { sendHandler } from \"./handlers/send\";\nimport { transactionsHandler } from \"./handlers/transactions\";\nimport { planHandler } from \"./handlers/plan\";\nimport { waasConfigHandler } from \"./handlers/waas-config\";\n\n/** Map of suffix path (joined with \"/\") to handler. */\nconst HANDLERS: Record<string, HeliusHandler> = {\n \"rpc\": rpcHandler,\n \"send\": sendHandler,\n \"transactions\": transactionsHandler,\n \"plan\": planHandler,\n \"waas/config\": waasConfigHandler,\n};\n\n/**\n * Catch-all Next.js App Router route handler that dispatches to the right\n * internal Helius handler based on the trailing path segments.\n *\n * Intended consumer usage — drop into `src/app/api/helius/[...path]/route.ts`:\n *\n * ```ts\n * import { createHeliusRouteHandler } from '@helius-labs/wallet-kit/next';\n * export const { GET, POST } = createHeliusRouteHandler();\n * ```\n *\n * The catch-all captures the five Helius routes the library needs:\n * - POST /api/helius/rpc (backs `connection` + `getPriorityFee()`)\n * - POST /api/helius/send (Sender routing; the Helius value-add)\n * - GET /api/helius/transactions (backs `getTransactions()`)\n * - GET /api/helius/plan (dynamic plan gating)\n * - GET /api/helius/waas/config (Turnkey bootstrap)\n *\n * Next.js 15+ wraps `params` in a Promise — the dispatcher awaits it.\n * The handler signature matches the built-in App Router shape, so the\n * factory's return value plugs directly into `export const { GET, POST }`.\n */\nexport function createHeliusRouteHandler(options: HeliusHandlerOptions = {}): {\n GET: (\n req: Request,\n ctx: { params: Promise<{ path: string[] }> }\n ) => Promise<Response>;\n POST: (\n req: Request,\n ctx: { params: Promise<{ path: string[] }> }\n ) => Promise<Response>;\n} {\n async function dispatch(\n req: Request,\n ctx: { params: Promise<{ path: string[] }> }\n ): Promise<Response> {\n const { path } = await ctx.params;\n const key = (path ?? []).join(\"/\");\n const handler = HANDLERS[key];\n\n if (!handler) {\n return Response.json(\n {\n error: `No handler for /${key}. Expected one of: ${Object.keys(HANDLERS)\n .map((p) => `/${p}`)\n .join(\", \")}`,\n },\n { status: 404 }\n );\n }\n\n try {\n return await handler(req, options);\n } catch (err) {\n return Response.json(\n {\n error: err instanceof Error ? err.message : \"Internal handler error\",\n },\n { status: 500 }\n );\n }\n }\n\n return { GET: dispatch, POST: dispatch };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @helius-labs/wallet-kit/ui/styles.css
|
|
3
|
+
*
|
|
4
|
+
* Consumer-facing stylesheet. One file, one import — import this in your
|
|
5
|
+
* root layout and you're done:
|
|
6
|
+
*
|
|
7
|
+
* // src/app/layout.tsx
|
|
8
|
+
* import "@helius-labs/wallet-kit/ui/styles.css";
|
|
9
|
+
*
|
|
10
|
+
* Internally we `@import` the underlying wallet-kit's baseline styles
|
|
11
|
+
* (must appear before any other rule per CSS spec), then layer the
|
|
12
|
+
* Helius-branded overrides on top via attribute selectors + !important.
|
|
13
|
+
* Consumers never need to know what's under the hood; upgrading or
|
|
14
|
+
* swapping backends doesn't change the consumer's layout.tsx.
|
|
15
|
+
*
|
|
16
|
+
* Rationale: Architecture Decision 2 (hybrid EWK fork) — don't vendor
|
|
17
|
+
* components where a CSS override suffices. The two user-facing pieces
|
|
18
|
+
* of Turnkey branding in the modal are:
|
|
19
|
+
*
|
|
20
|
+
* 1. "Secured by Turnkey" link at the bottom of every modal screen
|
|
21
|
+
* (conditional on `showTurnkeyBranding !== false`, but consumer
|
|
22
|
+
* code can't set that per-page).
|
|
23
|
+
* 2. "Terms of Service & Privacy Policy" block linking to
|
|
24
|
+
* turnkey.com/legal/* on the auth modal's landing screen.
|
|
25
|
+
*
|
|
26
|
+
* Both are hidden here using attribute selectors keyed to Turnkey's
|
|
27
|
+
* stable URLs. If Turnkey changes those URLs in a future EWK release,
|
|
28
|
+
* these rules stop working and we re-evaluate (possibly vendor the
|
|
29
|
+
* affected component). Tracked in VENDORED.md.
|
|
30
|
+
*
|
|
31
|
+
* NOT stripped by this file (intentional, v0.1 scope):
|
|
32
|
+
* - Dev-facing error messages ("You are using Turnkey's Auth Proxy,
|
|
33
|
+
* but no auth methods are enabled..."). Only developers see these
|
|
34
|
+
* during integration; not end-user branding.
|
|
35
|
+
* - Export/Import configuration error messages. Also dev-facing.
|
|
36
|
+
* - Wallet provider `uri` fallback to turnkey.com. Only appears in a
|
|
37
|
+
* rare transient loading state; not worth a rule.
|
|
38
|
+
* - `TurnkeyLogo` SVG component in the dev error overlay. Only shown
|
|
39
|
+
* in the developer-error surface, not during normal use.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/* Baseline modal + EWK styles from the underlying wallet kit.
|
|
43
|
+
* @import must be the first non-comment rule in the file per CSS spec. */
|
|
44
|
+
@import "@turnkey/react-wallet-kit/styles.css";
|
|
45
|
+
|
|
46
|
+
/* 1. "Secured by Turnkey" link (bottom of every modal screen) */
|
|
47
|
+
a[href="https://www.turnkey.com/"][target="_blank"] {
|
|
48
|
+
display: none !important;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* 2. "Terms of Service & Privacy Policy" block on the auth landing screen.
|
|
52
|
+
* Uses :has() to target the wrapping div semantically — resilient to
|
|
53
|
+
* Tailwind class-order changes. If the browser matrix ever needs to
|
|
54
|
+
* support older engines (< Safari 15.4), we'll need an alternate
|
|
55
|
+
* selector strategy. Helius's target audience is on modern browsers. */
|
|
56
|
+
div:has(> span > a[href*="turnkey.com/legal"]) {
|
|
57
|
+
display: none !important;
|
|
58
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "helius-wallet-kit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Embedded Solana wallets for Helius customers. One provider, one hook.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/helius-labs/wallet-kit.git",
|
|
11
|
+
"directory": "packages/wallet-kit"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"module": "./dist/index.js",
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"import": "./dist/index.js",
|
|
25
|
+
"require": "./dist/index.cjs"
|
|
26
|
+
},
|
|
27
|
+
"./core": {
|
|
28
|
+
"types": "./dist/core/index.d.ts",
|
|
29
|
+
"import": "./dist/core/index.js",
|
|
30
|
+
"require": "./dist/core/index.cjs"
|
|
31
|
+
},
|
|
32
|
+
"./ui": {
|
|
33
|
+
"types": "./dist/ui/index.d.ts",
|
|
34
|
+
"import": "./dist/ui/index.js",
|
|
35
|
+
"require": "./dist/ui/index.cjs"
|
|
36
|
+
},
|
|
37
|
+
"./ui/styles.css": "./dist/ui/styles.css",
|
|
38
|
+
"./next": {
|
|
39
|
+
"types": "./dist/next/index.d.ts",
|
|
40
|
+
"import": "./dist/next/index.js",
|
|
41
|
+
"require": "./dist/next/index.cjs"
|
|
42
|
+
},
|
|
43
|
+
"./package.json": "./package.json"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsup",
|
|
47
|
+
"dev": "tsup --watch",
|
|
48
|
+
"typecheck": "tsc --noEmit",
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"test:watch": "vitest",
|
|
51
|
+
"clean": "rm -rf dist"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@turnkey/react-wallet-kit": "^1.11.1"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@solana/web3.js": "^1.98.0",
|
|
58
|
+
"next": ">=14.0.0",
|
|
59
|
+
"react": ">=18.0.0",
|
|
60
|
+
"react-dom": ">=18.0.0"
|
|
61
|
+
},
|
|
62
|
+
"peerDependenciesMeta": {
|
|
63
|
+
"next": {
|
|
64
|
+
"optional": true
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@solana/web3.js": "^1.98.4",
|
|
69
|
+
"@turnkey/react-wallet-kit": "^1.11.1",
|
|
70
|
+
"@types/react": "^19.0.2",
|
|
71
|
+
"@types/react-dom": "^19.0.2",
|
|
72
|
+
"next": "^16.2.3",
|
|
73
|
+
"react": "^19.0.0",
|
|
74
|
+
"react-dom": "^19.0.0",
|
|
75
|
+
"tsup": "^8.3.5",
|
|
76
|
+
"typescript": "^5.7.2",
|
|
77
|
+
"vitest": "^2.1.8"
|
|
78
|
+
},
|
|
79
|
+
"publishConfig": {
|
|
80
|
+
"access": "public",
|
|
81
|
+
"registry": "https://registry.npmjs.org"
|
|
82
|
+
}
|
|
83
|
+
}
|