opentool 0.7.13 → 0.8.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/dist/adapters/hyperliquid/index.d.ts +414 -0
- package/dist/adapters/hyperliquid/index.js +1411 -0
- package/dist/adapters/hyperliquid/index.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.js +74 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +1527 -98
- package/dist/index.js.map +1 -1
- package/dist/store/index.d.ts +24 -1
- package/dist/store/index.js +45 -2
- package/dist/store/index.js.map +1 -1
- package/dist/{wallets/index.d.ts → types-BVLpaY4O.d.ts} +7 -24
- package/dist/wallet/index.d.ts +29 -0
- package/dist/{wallets → wallet}/index.js +65 -19
- package/dist/wallet/index.js.map +1 -0
- package/package.json +11 -8
- package/dist/wallets/index.js.map +0 -1
package/dist/store/index.d.ts
CHANGED
|
@@ -28,6 +28,25 @@ interface StoreResponse {
|
|
|
28
28
|
id: string;
|
|
29
29
|
status?: StoreStatus | null;
|
|
30
30
|
}
|
|
31
|
+
type StoreRetrieveParams = {
|
|
32
|
+
source?: string;
|
|
33
|
+
walletAddress?: `0x${string}`;
|
|
34
|
+
symbol?: string;
|
|
35
|
+
status?: StoreStatus[];
|
|
36
|
+
since?: number;
|
|
37
|
+
until?: number;
|
|
38
|
+
limit?: number;
|
|
39
|
+
cursor?: string;
|
|
40
|
+
history?: boolean;
|
|
41
|
+
};
|
|
42
|
+
type StoreRetrieveResult = {
|
|
43
|
+
items: Array<StoreEventInput & {
|
|
44
|
+
timestamp?: number;
|
|
45
|
+
updatedBy?: string | null;
|
|
46
|
+
signerKeyId?: string | null;
|
|
47
|
+
}>;
|
|
48
|
+
cursor?: string | null;
|
|
49
|
+
};
|
|
31
50
|
declare class StoreError extends Error {
|
|
32
51
|
readonly status?: number | undefined;
|
|
33
52
|
readonly causeData?: unknown | undefined;
|
|
@@ -37,5 +56,9 @@ declare class StoreError extends Error {
|
|
|
37
56
|
* Store a generic activity event (onchain tx, Hyperliquid order, etc.) in OpenPond.
|
|
38
57
|
*/
|
|
39
58
|
declare function store(input: StoreEventInput, options?: StoreOptions): Promise<StoreResponse>;
|
|
59
|
+
/**
|
|
60
|
+
* Retrieve stored activity events for an app.
|
|
61
|
+
*/
|
|
62
|
+
declare function retrieve(params?: StoreRetrieveParams, options?: StoreOptions): Promise<StoreRetrieveResult>;
|
|
40
63
|
|
|
41
|
-
export { type StoreAction, StoreError, type StoreEventInput, type StoreOptions, type StoreResponse, store };
|
|
64
|
+
export { type StoreAction, StoreError, type StoreEventInput, type StoreOptions, type StoreResponse, type StoreRetrieveParams, type StoreRetrieveResult, retrieve, store };
|
package/dist/store/index.js
CHANGED
|
@@ -8,7 +8,7 @@ var StoreError = class extends Error {
|
|
|
8
8
|
}
|
|
9
9
|
};
|
|
10
10
|
function resolveConfig(options) {
|
|
11
|
-
const baseUrl = options?.baseUrl ?? process.env.BASE_URL;
|
|
11
|
+
const baseUrl = options?.baseUrl ?? process.env.BASE_URL ?? "https://api.openpond.ai";
|
|
12
12
|
const apiKey = options?.apiKey ?? process.env.OPENPOND_API_KEY;
|
|
13
13
|
if (!baseUrl) {
|
|
14
14
|
throw new StoreError("BASE_URL is required to store activity events");
|
|
@@ -64,7 +64,50 @@ async function store(input, options) {
|
|
|
64
64
|
return { id: "", status: null };
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
+
async function retrieve(params, options) {
|
|
68
|
+
const { baseUrl, apiKey, fetchFn } = resolveConfig(options);
|
|
69
|
+
const url = new URL(`${baseUrl}/apps/positions/tx`);
|
|
70
|
+
if (params?.source) url.searchParams.set("source", params.source);
|
|
71
|
+
if (params?.walletAddress) url.searchParams.set("walletAddress", params.walletAddress);
|
|
72
|
+
if (params?.symbol) url.searchParams.set("symbol", params.symbol);
|
|
73
|
+
if (params?.status?.length) url.searchParams.set("status", params.status.join(","));
|
|
74
|
+
if (typeof params?.since === "number") url.searchParams.set("since", params.since.toString());
|
|
75
|
+
if (typeof params?.until === "number") url.searchParams.set("until", params.until.toString());
|
|
76
|
+
if (typeof params?.limit === "number") url.searchParams.set("limit", params.limit.toString());
|
|
77
|
+
if (params?.cursor) url.searchParams.set("cursor", params.cursor);
|
|
78
|
+
if (params?.history) url.searchParams.set("history", "true");
|
|
79
|
+
let response;
|
|
80
|
+
try {
|
|
81
|
+
response = await fetchFn(url.toString(), {
|
|
82
|
+
method: "GET",
|
|
83
|
+
headers: {
|
|
84
|
+
"content-type": "application/json",
|
|
85
|
+
"openpond-api-key": apiKey
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
} catch (error) {
|
|
89
|
+
throw new StoreError("Failed to reach store endpoint", void 0, error);
|
|
90
|
+
}
|
|
91
|
+
if (!response.ok) {
|
|
92
|
+
let body;
|
|
93
|
+
try {
|
|
94
|
+
body = await response.json();
|
|
95
|
+
} catch {
|
|
96
|
+
body = await response.text().catch(() => void 0);
|
|
97
|
+
}
|
|
98
|
+
throw new StoreError(
|
|
99
|
+
`Store retrieve failed with status ${response.status}`,
|
|
100
|
+
response.status,
|
|
101
|
+
body
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
const data = await response.json().catch(() => null);
|
|
105
|
+
if (!data) {
|
|
106
|
+
return { items: [], cursor: null };
|
|
107
|
+
}
|
|
108
|
+
return data;
|
|
109
|
+
}
|
|
67
110
|
|
|
68
|
-
export { StoreError, store };
|
|
111
|
+
export { StoreError, retrieve, store };
|
|
69
112
|
//# sourceMappingURL=index.js.map
|
|
70
113
|
//# sourceMappingURL=index.js.map
|
package/dist/store/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/store/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../src/store/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["type StoreStatus =\n | \"submitted\"\n | \"pending\"\n | \"confirmed\"\n | \"failed\"\n | \"cancelled\"\n | \"filled\"\n | \"partial_fill\"\n | \"settled\"\n | \"info\";\n\nexport type StoreAction =\n | \"stake\"\n | \"swap\"\n | \"bridge\"\n | \"order\"\n | \"lend\"\n | \"repay\"\n | \"withdraw\"\n | \"custom\"\n | string;\n\ntype ChainScope =\n | { chainId: number; network?: never }\n | { network: string; chainId?: never }\n | { chainId?: never; network?: never };\n\nexport type StoreEventInput = ChainScope & {\n source: string;\n ref: string;\n status: StoreStatus;\n walletAddress?: `0x${string}`;\n action?: StoreAction;\n notional?: string; // decimal string recommended to avoid float precision issues\n metadata?: Record<string, unknown>;\n};\n\nexport interface StoreOptions {\n baseUrl?: string;\n apiKey?: string;\n fetchFn?: typeof fetch;\n}\n\nexport interface StoreResponse {\n id: string;\n status?: StoreStatus | null;\n}\n\nexport type StoreRetrieveParams = {\n source?: string;\n walletAddress?: `0x${string}`;\n symbol?: string;\n status?: StoreStatus[];\n since?: number;\n until?: number;\n limit?: number;\n cursor?: string;\n history?: boolean;\n};\n\nexport type StoreRetrieveResult = {\n items: Array<\n StoreEventInput & {\n timestamp?: number;\n updatedBy?: string | null;\n signerKeyId?: string | null;\n }\n >;\n cursor?: string | null;\n};\nexport class StoreError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly causeData?: unknown\n ) {\n super(message);\n this.name = \"StoreError\";\n }\n}\n\nfunction resolveConfig(options?: StoreOptions) {\n const baseUrl = options?.baseUrl ?? process.env.BASE_URL ?? \"https://api.openpond.ai\";\n const apiKey = options?.apiKey ?? process.env.OPENPOND_API_KEY;\n\n if (!baseUrl) {\n throw new StoreError(\"BASE_URL is required to store activity events\");\n }\n if (!apiKey) {\n throw new StoreError(\n \"OPENPOND_API_KEY is required to store activity events\"\n );\n }\n\n const normalizedBaseUrl = baseUrl.replace(/\\/$/, \"\");\n const fetchFn = options?.fetchFn ?? globalThis.fetch;\n if (!fetchFn) {\n throw new StoreError(\"Fetch is not available in this environment\");\n }\n\n return { baseUrl: normalizedBaseUrl, apiKey, fetchFn };\n}\n\n/**\n * Store a generic activity event (onchain tx, Hyperliquid order, etc.) in OpenPond.\n */\nexport async function store(\n input: StoreEventInput,\n options?: StoreOptions\n): Promise<StoreResponse> {\n const { baseUrl, apiKey, fetchFn } = resolveConfig(options);\n\n const url = `${baseUrl}/apps/positions/tx`;\n\n let response: Response;\n try {\n response = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"openpond-api-key\": apiKey,\n },\n body: JSON.stringify(input),\n });\n } catch (error) {\n throw new StoreError(\"Failed to reach store endpoint\", undefined, error);\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new StoreError(\n `Store request failed with status ${response.status}`,\n response.status,\n body\n );\n }\n\n try {\n const data = (await response.json()) as Partial<StoreResponse>;\n return {\n id: data.id ?? \"\",\n status: data.status ?? null,\n };\n } catch {\n // Response is optional; return empty success\n return { id: \"\", status: null };\n }\n}\n\n/**\n * Retrieve stored activity events for an app.\n */\nexport async function retrieve(\n params?: StoreRetrieveParams,\n options?: StoreOptions\n): Promise<StoreRetrieveResult> {\n const { baseUrl, apiKey, fetchFn } = resolveConfig(options);\n\n const url = new URL(`${baseUrl}/apps/positions/tx`);\n if (params?.source) url.searchParams.set(\"source\", params.source);\n if (params?.walletAddress) url.searchParams.set(\"walletAddress\", params.walletAddress);\n if (params?.symbol) url.searchParams.set(\"symbol\", params.symbol);\n if (params?.status?.length) url.searchParams.set(\"status\", params.status.join(\",\"));\n if (typeof params?.since === \"number\") url.searchParams.set(\"since\", params.since.toString());\n if (typeof params?.until === \"number\") url.searchParams.set(\"until\", params.until.toString());\n if (typeof params?.limit === \"number\") url.searchParams.set(\"limit\", params.limit.toString());\n if (params?.cursor) url.searchParams.set(\"cursor\", params.cursor);\n if (params?.history) url.searchParams.set(\"history\", \"true\");\n\n let response: Response;\n try {\n response = await fetchFn(url.toString(), {\n method: \"GET\",\n headers: {\n \"content-type\": \"application/json\",\n \"openpond-api-key\": apiKey,\n },\n });\n } catch (error) {\n throw new StoreError(\"Failed to reach store endpoint\", undefined, error);\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new StoreError(\n `Store retrieve failed with status ${response.status}`,\n response.status,\n body\n );\n }\n\n const data = (await response.json().catch(() => null)) as StoreRetrieveResult | null;\n if (!data) {\n return { items: [], cursor: null };\n }\n return data;\n}\n"]}
|
|
@@ -78,6 +78,10 @@ interface WalletSignerContext {
|
|
|
78
78
|
sendTransaction(params: WalletSendTransactionParams): Promise<Hex>;
|
|
79
79
|
getNativeBalance(): Promise<bigint>;
|
|
80
80
|
transfer(params: WalletTransferParams): Promise<Hex>;
|
|
81
|
+
/**
|
|
82
|
+
* Optional monotonic nonce provider for systems that require client-side nonces.
|
|
83
|
+
*/
|
|
84
|
+
nonceSource?: () => number;
|
|
81
85
|
}
|
|
82
86
|
interface WalletBaseContext {
|
|
83
87
|
chain: ChainMetadata;
|
|
@@ -86,32 +90,11 @@ interface WalletBaseContext {
|
|
|
86
90
|
providerType: WalletProviderType;
|
|
87
91
|
publicClient: PublicClient;
|
|
88
92
|
getRpcUrl(options?: RpcProviderOptions): string;
|
|
93
|
+
/** Address is present when a signer is configured; undefined for read-only wallets. */
|
|
94
|
+
address?: HexAddress;
|
|
89
95
|
}
|
|
90
96
|
type WalletReadonlyContext = WalletBaseContext;
|
|
91
97
|
type WalletFullContext = WalletBaseContext & WalletSignerContext;
|
|
92
98
|
type WalletContext = WalletReadonlyContext | WalletFullContext;
|
|
93
99
|
|
|
94
|
-
|
|
95
|
-
declare const tokens: Record<string, ChainTokenMap>;
|
|
96
|
-
declare const DEFAULT_CHAIN: ChainMetadata;
|
|
97
|
-
declare const DEFAULT_TOKENS: ChainTokenMap;
|
|
98
|
-
declare const registry: WalletRegistry;
|
|
99
|
-
|
|
100
|
-
type ChainSlug = keyof typeof chains;
|
|
101
|
-
declare function getRpcUrl(chain: ChainSlug | number, options?: RpcProviderOptions): string;
|
|
102
|
-
declare function wallet(options: WalletPrivateKeyOptions): Promise<WalletFullContext>;
|
|
103
|
-
declare function wallet(options: WalletTurnkeyOptions): Promise<WalletFullContext>;
|
|
104
|
-
declare function wallet(options?: WalletReadonlyOptions): Promise<WalletReadonlyContext>;
|
|
105
|
-
declare const walletToolkit: {
|
|
106
|
-
readonly chains: Record<string, ChainMetadata>;
|
|
107
|
-
readonly tokens: Record<string, ChainTokenMap>;
|
|
108
|
-
readonly registry: WalletRegistry;
|
|
109
|
-
readonly defaults: {
|
|
110
|
-
readonly chain: ChainMetadata;
|
|
111
|
-
readonly tokens: ChainTokenMap;
|
|
112
|
-
};
|
|
113
|
-
readonly getRpcUrl: typeof getRpcUrl;
|
|
114
|
-
readonly wallet: typeof wallet;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
export { type ChainMetadata, type ChainReference, type ChainTokenMap, DEFAULT_CHAIN, DEFAULT_TOKENS, type Hex, type HexAddress, type RpcProviderOptions, type RpcUrlResolver, type TokenMetadata, type TurnkeyOptions, type TurnkeySignWith, type WalletBaseContext, type WalletContext, type WalletFullContext, type WalletOptions, type WalletOptionsBase, type WalletPrivateKeyOptions, type WalletProviderType, type WalletReadonlyContext, type WalletReadonlyOptions, type WalletRegistry, type WalletSendTransactionParams, type WalletSignerContext, type WalletTransferParams, type WalletTurnkeyOptions, chains, getRpcUrl, registry, tokens, wallet, walletToolkit };
|
|
100
|
+
export type { ChainMetadata as C, Hex as H, RpcProviderOptions as R, TokenMetadata as T, WalletRegistry as W, ChainTokenMap as a, WalletPrivateKeyOptions as b, WalletFullContext as c, WalletTurnkeyOptions as d, WalletReadonlyOptions as e, WalletReadonlyContext as f, HexAddress as g, RpcUrlResolver as h, ChainReference as i, WalletProviderType as j, TurnkeySignWith as k, TurnkeyOptions as l, WalletOptionsBase as m, WalletOptions as n, WalletSendTransactionParams as o, WalletTransferParams as p, WalletSignerContext as q, WalletBaseContext as r, WalletContext as s };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { C as ChainMetadata, a as ChainTokenMap, W as WalletRegistry, R as RpcProviderOptions, b as WalletPrivateKeyOptions, c as WalletFullContext, d as WalletTurnkeyOptions, e as WalletReadonlyOptions, f as WalletReadonlyContext } from '../types-BVLpaY4O.js';
|
|
2
|
+
export { i as ChainReference, H as Hex, g as HexAddress, h as RpcUrlResolver, T as TokenMetadata, l as TurnkeyOptions, k as TurnkeySignWith, r as WalletBaseContext, s as WalletContext, n as WalletOptions, m as WalletOptionsBase, j as WalletProviderType, o as WalletSendTransactionParams, q as WalletSignerContext, p as WalletTransferParams } from '../types-BVLpaY4O.js';
|
|
3
|
+
import 'viem';
|
|
4
|
+
import 'viem/accounts';
|
|
5
|
+
|
|
6
|
+
declare const chains: Record<string, ChainMetadata>;
|
|
7
|
+
declare const tokens: Record<string, ChainTokenMap>;
|
|
8
|
+
declare const DEFAULT_CHAIN: ChainMetadata;
|
|
9
|
+
declare const DEFAULT_TOKENS: ChainTokenMap;
|
|
10
|
+
declare const registry: WalletRegistry;
|
|
11
|
+
|
|
12
|
+
type ChainSlug = keyof typeof chains;
|
|
13
|
+
declare function getRpcUrl(chain: ChainSlug | number, options?: RpcProviderOptions): string;
|
|
14
|
+
declare function wallet(options: WalletPrivateKeyOptions): Promise<WalletFullContext>;
|
|
15
|
+
declare function wallet(options: WalletTurnkeyOptions): Promise<WalletFullContext>;
|
|
16
|
+
declare function wallet(options?: WalletReadonlyOptions): Promise<WalletReadonlyContext>;
|
|
17
|
+
declare const walletToolkit: {
|
|
18
|
+
readonly chains: Record<string, ChainMetadata>;
|
|
19
|
+
readonly tokens: Record<string, ChainTokenMap>;
|
|
20
|
+
readonly registry: WalletRegistry;
|
|
21
|
+
readonly defaults: {
|
|
22
|
+
readonly chain: ChainMetadata;
|
|
23
|
+
readonly tokens: ChainTokenMap;
|
|
24
|
+
};
|
|
25
|
+
readonly getRpcUrl: typeof getRpcUrl;
|
|
26
|
+
readonly wallet: typeof wallet;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { ChainMetadata, ChainTokenMap, DEFAULT_CHAIN, DEFAULT_TOKENS, RpcProviderOptions, WalletFullContext, WalletPrivateKeyOptions, WalletReadonlyContext, WalletReadonlyOptions, WalletRegistry, WalletTurnkeyOptions, chains, getRpcUrl, registry, tokens, wallet, walletToolkit };
|
|
@@ -4,7 +4,7 @@ import { privateKeyToAccount } from 'viem/accounts';
|
|
|
4
4
|
import { Turnkey } from '@turnkey/sdk-server';
|
|
5
5
|
import { createAccount } from '@turnkey/viem';
|
|
6
6
|
|
|
7
|
-
// src/
|
|
7
|
+
// src/wallet/constants.ts
|
|
8
8
|
var BASE_ALCHEMY_HOST = "https://base-mainnet.g.alchemy.com/v2/";
|
|
9
9
|
var ETHEREUM_ALCHEMY_HOST = "https://eth-mainnet.g.alchemy.com/v2/";
|
|
10
10
|
var BASE_SEPOLIA_ALCHEMY_HOST = "https://base-sepolia.g.alchemy.com/v2/";
|
|
@@ -156,6 +156,18 @@ function normalizePrivateKey(raw) {
|
|
|
156
156
|
}
|
|
157
157
|
return withPrefix;
|
|
158
158
|
}
|
|
159
|
+
function createNonceSource(start = Date.now()) {
|
|
160
|
+
let last = start;
|
|
161
|
+
return () => {
|
|
162
|
+
const now = Date.now();
|
|
163
|
+
if (now > last) {
|
|
164
|
+
last = now;
|
|
165
|
+
} else {
|
|
166
|
+
last += 1;
|
|
167
|
+
}
|
|
168
|
+
return last;
|
|
169
|
+
};
|
|
170
|
+
}
|
|
159
171
|
function createPrivateKeyProvider(config) {
|
|
160
172
|
const privateKey = normalizePrivateKey(config.privateKey);
|
|
161
173
|
const account = privateKeyToAccount(privateKey);
|
|
@@ -201,7 +213,20 @@ function createPrivateKeyProvider(config) {
|
|
|
201
213
|
publicClient,
|
|
202
214
|
sendTransaction,
|
|
203
215
|
getNativeBalance,
|
|
204
|
-
transfer
|
|
216
|
+
transfer,
|
|
217
|
+
nonceSource: createNonceSource()
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function createNonceSource2(start = Date.now()) {
|
|
221
|
+
let last = start;
|
|
222
|
+
return () => {
|
|
223
|
+
const now = Date.now();
|
|
224
|
+
if (now > last) {
|
|
225
|
+
last = now;
|
|
226
|
+
} else {
|
|
227
|
+
last += 1;
|
|
228
|
+
}
|
|
229
|
+
return last;
|
|
205
230
|
};
|
|
206
231
|
}
|
|
207
232
|
async function createTurnkeyProvider(config) {
|
|
@@ -259,11 +284,12 @@ async function createTurnkeyProvider(config) {
|
|
|
259
284
|
publicClient,
|
|
260
285
|
sendTransaction,
|
|
261
286
|
getNativeBalance,
|
|
262
|
-
transfer
|
|
287
|
+
transfer,
|
|
288
|
+
nonceSource: createNonceSource2()
|
|
263
289
|
};
|
|
264
290
|
}
|
|
265
291
|
|
|
266
|
-
// src/
|
|
292
|
+
// src/wallet/index.ts
|
|
267
293
|
function resolveChainSlug(reference) {
|
|
268
294
|
if (reference === void 0) {
|
|
269
295
|
return Object.entries(chains).find(([, meta]) => meta.id === DEFAULT_CHAIN.id)?.[0] || DEFAULT_CHAIN.slug;
|
|
@@ -305,40 +331,59 @@ function getRpcUrl(chain, options) {
|
|
|
305
331
|
return entry.rpcUrl(options);
|
|
306
332
|
}
|
|
307
333
|
async function wallet(options = {}) {
|
|
308
|
-
|
|
334
|
+
const envPrivateKey = process.env.PRIVATE_KEY?.trim();
|
|
335
|
+
const envTurnkey = {
|
|
336
|
+
organizationId: process.env.TURNKEY_SUBORG_ID?.trim(),
|
|
337
|
+
apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY?.trim(),
|
|
338
|
+
apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY?.trim(),
|
|
339
|
+
signWith: process.env.TURNKEY_WALLET_ADDRESS?.trim(),
|
|
340
|
+
apiBaseUrl: process.env.TURNKEY_API_BASE_URL?.trim()
|
|
341
|
+
};
|
|
342
|
+
const effectivePrivateKey = options.privateKey ?? envPrivateKey;
|
|
343
|
+
const hasTurnkeyEnv = envTurnkey.organizationId && envTurnkey.apiPublicKey && envTurnkey.apiPrivateKey && envTurnkey.signWith;
|
|
344
|
+
const effectiveTurnkey = options.turnkey ?? (hasTurnkeyEnv ? {
|
|
345
|
+
organizationId: envTurnkey.organizationId,
|
|
346
|
+
apiPublicKey: envTurnkey.apiPublicKey,
|
|
347
|
+
apiPrivateKey: envTurnkey.apiPrivateKey,
|
|
348
|
+
signWith: envTurnkey.signWith,
|
|
349
|
+
...envTurnkey.apiBaseUrl ? { apiBaseUrl: envTurnkey.apiBaseUrl } : {}
|
|
350
|
+
} : void 0);
|
|
351
|
+
if (effectivePrivateKey && effectiveTurnkey) {
|
|
309
352
|
throw new Error("wallet() cannot be initialized with both privateKey and turnkey credentials");
|
|
310
353
|
}
|
|
311
354
|
const slug = resolveChainSlug(options.chain);
|
|
312
355
|
const chain = chains[slug];
|
|
313
356
|
const tokens2 = tokens[slug] ?? {};
|
|
314
357
|
const overrides = {};
|
|
315
|
-
|
|
316
|
-
|
|
358
|
+
const envRpcUrl = process.env.RPC_URL?.trim();
|
|
359
|
+
const envApiKey = process.env.ALCHEMY_API_KEY?.trim();
|
|
360
|
+
if (options.rpcUrl ?? envRpcUrl) {
|
|
361
|
+
overrides.url = options.rpcUrl ?? envRpcUrl;
|
|
317
362
|
}
|
|
318
|
-
if (options.apiKey) {
|
|
319
|
-
overrides.apiKey = options.apiKey;
|
|
363
|
+
if (options.apiKey ?? envApiKey) {
|
|
364
|
+
overrides.apiKey = options.apiKey ?? envApiKey;
|
|
320
365
|
}
|
|
321
366
|
const rpcUrl = getRpcUrl(slug, overrides);
|
|
322
367
|
let providerType = "readonly";
|
|
323
368
|
let signerProvider;
|
|
324
|
-
if (
|
|
369
|
+
if (effectivePrivateKey) {
|
|
325
370
|
signerProvider = createPrivateKeyProvider({
|
|
326
371
|
chain,
|
|
327
372
|
rpcUrl,
|
|
328
|
-
privateKey:
|
|
373
|
+
privateKey: effectivePrivateKey
|
|
329
374
|
});
|
|
330
375
|
providerType = "privateKey";
|
|
331
|
-
} else if (
|
|
376
|
+
} else if (effectiveTurnkey) {
|
|
332
377
|
const turnkeyConfig = {
|
|
333
378
|
chain,
|
|
334
379
|
rpcUrl,
|
|
335
|
-
organizationId:
|
|
336
|
-
apiPublicKey:
|
|
337
|
-
apiPrivateKey:
|
|
338
|
-
signWith:
|
|
380
|
+
organizationId: effectiveTurnkey.organizationId,
|
|
381
|
+
apiPublicKey: effectiveTurnkey.apiPublicKey,
|
|
382
|
+
apiPrivateKey: effectiveTurnkey.apiPrivateKey,
|
|
383
|
+
signWith: effectiveTurnkey.signWith
|
|
339
384
|
};
|
|
340
|
-
if (
|
|
341
|
-
turnkeyConfig.apiBaseUrl =
|
|
385
|
+
if (effectiveTurnkey.apiBaseUrl) {
|
|
386
|
+
turnkeyConfig.apiBaseUrl = effectiveTurnkey.apiBaseUrl;
|
|
342
387
|
}
|
|
343
388
|
signerProvider = await createTurnkeyProvider(turnkeyConfig);
|
|
344
389
|
providerType = "turnkey";
|
|
@@ -353,7 +398,8 @@ async function wallet(options = {}) {
|
|
|
353
398
|
rpcUrl,
|
|
354
399
|
providerType,
|
|
355
400
|
publicClient,
|
|
356
|
-
getRpcUrl: (override) => getRpcUrl(slug, override)
|
|
401
|
+
getRpcUrl: (override) => getRpcUrl(slug, override),
|
|
402
|
+
...signerProvider ? { address: signerProvider.address } : {}
|
|
357
403
|
};
|
|
358
404
|
if (signerProvider) {
|
|
359
405
|
const { publicClient: _ignored, ...rest } = signerProvider;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/wallet/constants.ts","../../src/wallet/providers/private-key.ts","../../src/wallet/providers/turnkey.ts","../../src/wallet/index.ts"],"names":["createNonceSource","http","createPublicClient","createWalletClient","tokens"],"mappings":"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","file":"index.js","sourcesContent":["import { zeroAddress } from \"viem\";\nimport {\n arbitrum,\n arbitrumSepolia,\n base,\n baseSepolia,\n mainnet,\n} from \"viem/chains\";\n\nimport type {\n ChainMetadata,\n ChainTokenMap,\n HexAddress,\n RpcUrlResolver,\n WalletRegistry,\n} from \"./types\";\n\nconst BASE_ALCHEMY_HOST = \"https://base-mainnet.g.alchemy.com/v2/\";\nconst ETHEREUM_ALCHEMY_HOST = \"https://eth-mainnet.g.alchemy.com/v2/\";\nconst BASE_SEPOLIA_ALCHEMY_HOST = \"https://base-sepolia.g.alchemy.com/v2/\";\nconst ARBITRUM_ALCHEMY_HOST = \"https://arb-mainnet.g.alchemy.com/v2/\";\nconst ARBITRUM_SEPOLIA_ALCHEMY_HOST = \"https://arb-sepolia.g.alchemy.com/v2/\";\n\nfunction buildRpcResolver(\n host: string,\n fallbackUrls: readonly string[]\n): RpcUrlResolver {\n return (options) => {\n if (options?.url) {\n return options.url;\n }\n\n if (options?.apiKey) {\n return `${host}${options.apiKey}`;\n }\n\n if (fallbackUrls.length > 0) {\n return fallbackUrls[0];\n }\n\n throw new Error(\n \"No RPC URL available: supply a full url via options or an apiKey for the default host\"\n );\n };\n}\n\nconst chains: Record<string, ChainMetadata> = {\n base: {\n id: base.id,\n slug: \"base\",\n name: \"Base\",\n chain: base,\n rpcUrl: buildRpcResolver(BASE_ALCHEMY_HOST, base.rpcUrls.default.http),\n publicRpcUrls: base.rpcUrls.default.http,\n },\n ethereum: {\n id: mainnet.id,\n slug: \"ethereum\",\n name: \"Ethereum\",\n chain: mainnet,\n rpcUrl: buildRpcResolver(\n ETHEREUM_ALCHEMY_HOST,\n mainnet.rpcUrls.default.http\n ),\n publicRpcUrls: mainnet.rpcUrls.default.http,\n },\n baseSepolia: {\n id: baseSepolia.id,\n slug: \"base-sepolia\",\n name: \"Base Sepolia\",\n chain: baseSepolia,\n rpcUrl: buildRpcResolver(\n BASE_SEPOLIA_ALCHEMY_HOST,\n baseSepolia.rpcUrls.default.http\n ),\n },\n arbitrum: {\n id: arbitrum.id,\n slug: \"arbitrum\",\n name: \"Arbitrum One\",\n chain: arbitrum,\n rpcUrl: buildRpcResolver(\n ARBITRUM_ALCHEMY_HOST,\n arbitrum.rpcUrls.default.http\n ),\n publicRpcUrls: arbitrum.rpcUrls.default.http,\n },\n arbitrumSepolia: {\n id: arbitrumSepolia.id,\n slug: \"arbitrum-sepolia\",\n name: \"Arbitrum Sepolia\",\n chain: arbitrumSepolia,\n rpcUrl: buildRpcResolver(\n ARBITRUM_SEPOLIA_ALCHEMY_HOST,\n arbitrumSepolia.rpcUrls.default.http\n ),\n publicRpcUrls: arbitrumSepolia.rpcUrls.default.http,\n },\n};\n\nfunction createNativeToken(\n chainId: number,\n symbol: string,\n name: string\n): ChainTokenMap {\n return {\n [symbol]: {\n symbol,\n name,\n decimals: 18,\n address: zeroAddress,\n chainId,\n isNative: true,\n },\n };\n}\n\nfunction token(\n chainId: number,\n symbol: string,\n name: string,\n address: HexAddress,\n decimals: number\n) {\n return {\n symbol,\n name,\n decimals,\n address,\n chainId,\n };\n}\n\nconst tokens: Record<string, ChainTokenMap> = {\n base: {\n ...createNativeToken(base.id, \"ETH\", \"Ether\"),\n USDC: token(\n base.id,\n \"USDC\",\n \"USD Coin\",\n \"0x833589fCD6eDb6E08f4c7C31c9A8Ba32D74b86B2\",\n 6\n ),\n },\n ethereum: {\n ...createNativeToken(mainnet.id, \"ETH\", \"Ether\"),\n USDC: token(\n mainnet.id,\n \"USDC\",\n \"USD Coin\",\n \"0xA0b86991c6218b36c1d19d4a2e9Eb0cE3606eB48\",\n 6\n ),\n },\n arbitrum: {\n ...createNativeToken(arbitrum.id, \"ETH\", \"Ether\"),\n USDC: token(\n arbitrum.id,\n \"USDC\",\n \"USD Coin\",\n \"0xaf88d065e77c8cc2239327c5edb3a432268e5831\",\n 6\n ),\n },\n arbitrumSepolia: {\n ...createNativeToken(arbitrumSepolia.id, \"ETH\", \"Ether\"),\n USDC: token(\n arbitrumSepolia.id,\n \"USDC\",\n \"USD Coin\",\n \"0x1baAbB04529D43a73232B713C0FE471f7c7334d5\",\n 6\n ),\n },\n};\n\nexport const DEFAULT_CHAIN = chains.base;\nexport const DEFAULT_TOKENS = tokens.base;\n\nexport const registry: WalletRegistry = {\n chains,\n tokens,\n};\n\nexport { chains, tokens };\n","import { createPublicClient, createWalletClient, http, type Chain, type PublicClient, type Transport } from \"viem\";\nimport { privateKeyToAccount, type Account } from \"viem/accounts\";\n\nimport type {\n ChainMetadata,\n HexAddress,\n WalletSignerContext,\n WalletSendTransactionParams,\n WalletTransferParams,\n} from \"../types\";\n\nfunction normalizePrivateKey(raw: string): `0x${string}` {\n const trimmed = raw.trim();\n const withPrefix = trimmed.startsWith(\"0x\") ? trimmed : `0x${trimmed}`;\n if (!/^0x[0-9a-fA-F]{64}$/.test(withPrefix)) {\n throw new Error(\"wallet() privateKey must be a 32-byte hex string\");\n }\n return withPrefix as `0x${string}`;\n}\n\nexport interface PrivateKeyProviderConfig {\n chain: ChainMetadata;\n rpcUrl: string;\n privateKey: string;\n}\n\nexport interface PrivateKeyProviderResult extends WalletSignerContext {\n publicClient: PublicClient<Transport, Chain>;\n}\n\nfunction createNonceSource(start: number = Date.now()) {\n let last = start;\n return () => {\n const now = Date.now();\n if (now > last) {\n last = now;\n } else {\n last += 1;\n }\n return last;\n };\n}\n\nexport function createPrivateKeyProvider(\n config: PrivateKeyProviderConfig\n): PrivateKeyProviderResult {\n const privateKey = normalizePrivateKey(config.privateKey);\n const account = privateKeyToAccount(privateKey);\n\n const transport = http(config.rpcUrl);\n const publicClient = createPublicClient<Transport, Chain>({\n chain: config.chain.chain,\n transport,\n });\n\n const walletClient = createWalletClient<Transport, Chain, Account>({\n account,\n chain: config.chain.chain,\n transport,\n });\n\n async function sendTransaction(params: WalletSendTransactionParams) {\n const tx: any = {\n account,\n };\n if (params.to) {\n tx.to = params.to;\n }\n if (params.value !== undefined) {\n tx.value = params.value;\n }\n if (params.data !== undefined) {\n tx.data = params.data;\n }\n\n return walletClient.sendTransaction(tx);\n }\n\n async function getNativeBalance() {\n return publicClient.getBalance({ address: account.address });\n }\n\n async function transfer(params: WalletTransferParams) {\n return sendTransaction({\n to: params.to,\n value: params.amount,\n ...(params.data !== undefined ? { data: params.data } : {}),\n });\n }\n\n return {\n address: account.address as HexAddress,\n account,\n walletClient,\n publicClient,\n sendTransaction,\n getNativeBalance,\n transfer,\n nonceSource: createNonceSource(),\n };\n}\n","import { Turnkey } from \"@turnkey/sdk-server\";\nimport { createAccount } from \"@turnkey/viem\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n} from \"viem\";\nimport type { Account } from \"viem/accounts\";\n\nimport type {\n ChainMetadata,\n HexAddress,\n TurnkeySignWith,\n WalletSignerContext,\n WalletSendTransactionParams,\n WalletTransferParams,\n} from \"../types\";\n\nexport interface TurnkeyProviderConfig {\n chain: ChainMetadata;\n rpcUrl: string;\n organizationId: string;\n apiPublicKey: string;\n apiPrivateKey: string;\n signWith: TurnkeySignWith;\n apiBaseUrl?: string;\n}\n\nexport interface TurnkeyProviderResult extends WalletSignerContext {\n publicClient: PublicClient<Transport, Chain>;\n}\n\nfunction createNonceSource(start: number = Date.now()) {\n let last = start;\n return () => {\n const now = Date.now();\n if (now > last) {\n last = now;\n } else {\n last += 1;\n }\n return last;\n };\n}\n\nexport async function createTurnkeyProvider(\n config: TurnkeyProviderConfig\n): Promise<TurnkeyProviderResult> {\n const turnkey = new Turnkey({\n apiBaseUrl: config.apiBaseUrl ?? \"https://api.turnkey.com\",\n // The delegated sub-organization the API key pair belongs to.\n defaultOrganizationId: config.organizationId,\n apiPublicKey: config.apiPublicKey,\n apiPrivateKey: config.apiPrivateKey,\n });\n\n const account = (await createAccount({\n client: turnkey.apiClient(),\n organizationId: config.organizationId,\n signWith: config.signWith,\n })) as Account;\n\n const transport = http(config.rpcUrl);\n const publicClient = createPublicClient<Transport, Chain>({\n chain: config.chain.chain,\n transport,\n });\n\n const walletClient = createWalletClient<Transport, Chain, Account>({\n account,\n chain: config.chain.chain,\n transport,\n });\n\n async function sendTransaction(params: WalletSendTransactionParams) {\n const tx: any = {\n account,\n };\n if (params.to) {\n tx.to = params.to;\n }\n if (params.value !== undefined) {\n tx.value = params.value;\n }\n if (params.data !== undefined) {\n tx.data = params.data;\n }\n\n return walletClient.sendTransaction(tx);\n }\n\n async function getNativeBalance() {\n return publicClient.getBalance({ address: account.address });\n }\n\n async function transfer(params: WalletTransferParams) {\n return sendTransaction({\n to: params.to,\n value: params.amount,\n ...(params.data !== undefined ? { data: params.data } : {}),\n });\n }\n\n return {\n address: account.address as HexAddress,\n account,\n walletClient,\n publicClient,\n sendTransaction,\n getNativeBalance,\n transfer,\n nonceSource: createNonceSource(),\n };\n}\n","export * from \"./types\";\nexport { chains, tokens, registry, DEFAULT_CHAIN, DEFAULT_TOKENS } from \"./constants\";\n\nimport { createPublicClient, http } from \"viem\";\n\nimport type {\n RpcProviderOptions,\n WalletContext,\n WalletFullContext,\n WalletReadonlyContext,\n WalletOptions,\n WalletProviderType,\n WalletPrivateKeyOptions,\n WalletTurnkeyOptions,\n WalletReadonlyOptions,\n} from \"./types\";\nimport {\n chains as chainRegistry,\n tokens as tokenRegistry,\n registry as walletRegistry,\n DEFAULT_CHAIN,\n DEFAULT_TOKENS,\n} from \"./constants\";\nimport { createPrivateKeyProvider } from \"./providers/private-key\";\nimport { createTurnkeyProvider } from \"./providers/turnkey\";\n\ntype ChainSlug = keyof typeof chainRegistry;\n\nfunction resolveChainSlug(reference?: string | number): ChainSlug {\n if (reference === undefined) {\n return (Object.entries(chainRegistry).find(([, meta]) => meta.id === DEFAULT_CHAIN.id)?.[0] ||\n DEFAULT_CHAIN.slug) as ChainSlug;\n }\n\n if (typeof reference === \"number\") {\n const match = Object.entries(chainRegistry).find(([, meta]) => meta.id === reference);\n if (match) {\n return match[0] as ChainSlug;\n }\n } else if (typeof reference === \"string\") {\n const sanitize = (value: string) => value.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n\n if (reference in chainRegistry) {\n return reference as ChainSlug;\n }\n\n const normalized = sanitize(reference);\n\n const keyMatch = Object.entries(chainRegistry).find(([key]) => sanitize(key) === normalized);\n if (keyMatch) {\n return keyMatch[0] as ChainSlug;\n }\n\n const slugMatch = Object.entries(chainRegistry).find(([, meta]) => {\n return meta.slug && sanitize(meta.slug) === normalized;\n });\n if (slugMatch) {\n return slugMatch[0] as ChainSlug;\n }\n\n const asNumber = Number.parseInt(normalized, 10);\n if (!Number.isNaN(asNumber)) {\n const match = Object.entries(chainRegistry).find(([, meta]) => meta.id === asNumber);\n if (match) {\n return match[0] as ChainSlug;\n }\n }\n }\n\n throw new Error(`Unknown chain reference: ${reference}`);\n}\n\nexport function getRpcUrl(chain: ChainSlug | number, options?: RpcProviderOptions): string {\n const slug = resolveChainSlug(chain);\n const entry = chainRegistry[slug];\n return entry.rpcUrl(options);\n}\n\nexport function wallet(options: WalletPrivateKeyOptions): Promise<WalletFullContext>;\nexport function wallet(options: WalletTurnkeyOptions): Promise<WalletFullContext>;\nexport function wallet(options?: WalletReadonlyOptions): Promise<WalletReadonlyContext>;\nexport async function wallet(options: WalletOptions = {}): Promise<WalletContext> {\n const envPrivateKey = process.env.PRIVATE_KEY?.trim();\n const envTurnkey = {\n organizationId: process.env.TURNKEY_SUBORG_ID?.trim(),\n apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY?.trim(),\n apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY?.trim(),\n signWith: process.env.TURNKEY_WALLET_ADDRESS?.trim(),\n apiBaseUrl: process.env.TURNKEY_API_BASE_URL?.trim(),\n };\n\n const effectivePrivateKey = options.privateKey ?? envPrivateKey;\n const hasTurnkeyEnv =\n envTurnkey.organizationId &&\n envTurnkey.apiPublicKey &&\n envTurnkey.apiPrivateKey &&\n envTurnkey.signWith;\n const effectiveTurnkey = options.turnkey ?? (hasTurnkeyEnv\n ? {\n organizationId: envTurnkey.organizationId!,\n apiPublicKey: envTurnkey.apiPublicKey!,\n apiPrivateKey: envTurnkey.apiPrivateKey!,\n signWith: envTurnkey.signWith!,\n ...(envTurnkey.apiBaseUrl ? { apiBaseUrl: envTurnkey.apiBaseUrl } : {}),\n }\n : undefined);\n\n if (effectivePrivateKey && effectiveTurnkey) {\n throw new Error(\"wallet() cannot be initialized with both privateKey and turnkey credentials\");\n }\n\n const slug = resolveChainSlug(options.chain);\n const chain = chainRegistry[slug];\n const tokens = tokenRegistry[slug] ?? {};\n const overrides: RpcProviderOptions = {};\n const envRpcUrl = process.env.RPC_URL?.trim();\n const envApiKey = process.env.ALCHEMY_API_KEY?.trim();\n if (options.rpcUrl ?? envRpcUrl) {\n overrides.url = (options.rpcUrl ?? envRpcUrl)!;\n }\n if (options.apiKey ?? envApiKey) {\n overrides.apiKey = (options.apiKey ?? envApiKey)!;\n }\n\n const rpcUrl = getRpcUrl(slug, overrides);\n\n let providerType: WalletProviderType = \"readonly\";\n let signerProvider:\n | ReturnType<typeof createPrivateKeyProvider>\n | (Awaited<ReturnType<typeof createTurnkeyProvider>>)\n | undefined;\n\n if (effectivePrivateKey) {\n signerProvider = createPrivateKeyProvider({\n chain,\n rpcUrl,\n privateKey: effectivePrivateKey,\n });\n providerType = \"privateKey\";\n } else if (effectiveTurnkey) {\n const turnkeyConfig = {\n chain,\n rpcUrl,\n organizationId: effectiveTurnkey.organizationId,\n apiPublicKey: effectiveTurnkey.apiPublicKey,\n apiPrivateKey: effectiveTurnkey.apiPrivateKey,\n signWith: effectiveTurnkey.signWith,\n } as Parameters<typeof createTurnkeyProvider>[0];\n\n if (effectiveTurnkey.apiBaseUrl) {\n turnkeyConfig.apiBaseUrl = effectiveTurnkey.apiBaseUrl;\n }\n\n signerProvider = await createTurnkeyProvider(turnkeyConfig);\n providerType = \"turnkey\";\n }\n\n const publicClient = signerProvider?.publicClient ??\n createPublicClient({\n chain: chain.chain,\n transport: http(rpcUrl),\n });\n\n const baseContext = {\n chain,\n tokens,\n rpcUrl,\n providerType,\n publicClient,\n getRpcUrl: (override?: RpcProviderOptions) => getRpcUrl(slug, override),\n ...(signerProvider ? { address: signerProvider.address } : {}),\n } satisfies WalletReadonlyContext;\n\n if (signerProvider) {\n const { publicClient: _ignored, ...rest } = signerProvider;\n return {\n ...baseContext,\n ...rest,\n } as WalletFullContext;\n }\n\n return baseContext;\n}\n\nexport const walletToolkit = {\n chains: chainRegistry,\n tokens: tokenRegistry,\n registry: walletRegistry,\n defaults: {\n chain: DEFAULT_CHAIN,\n tokens: DEFAULT_TOKENS,\n },\n getRpcUrl,\n wallet,\n} as const;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opentool",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "OpenTool framework for building serverless MCP tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -54,12 +54,15 @@
|
|
|
54
54
|
"@modelcontextprotocol/sdk": "^1.15.1",
|
|
55
55
|
"@turnkey/sdk-server": "4.10.2",
|
|
56
56
|
"@turnkey/viem": "0.14.5",
|
|
57
|
+
"@msgpack/msgpack": "^3.1.1",
|
|
58
|
+
"@noble/hashes": "^1.4.0",
|
|
57
59
|
"commander": "^11.0.0",
|
|
58
60
|
"esbuild": "^0.25.0",
|
|
59
61
|
"tsx": "^4.0.0",
|
|
60
62
|
"viem": "^2.31.7",
|
|
61
63
|
"zod": "^4.1.11",
|
|
62
|
-
"@alcyone-labs/zod-to-json-schema": "^4.0.10"
|
|
64
|
+
"@alcyone-labs/zod-to-json-schema": "^4.0.10",
|
|
65
|
+
"dotenv": "^17.2.3"
|
|
63
66
|
},
|
|
64
67
|
"devDependencies": {
|
|
65
68
|
"@changesets/cli": "^2.29.5",
|
|
@@ -98,13 +101,13 @@
|
|
|
98
101
|
"import": "./dist/x402/index.js",
|
|
99
102
|
"types": "./dist/x402/index.d.ts"
|
|
100
103
|
},
|
|
101
|
-
"./wallets": {
|
|
102
|
-
"import": "./dist/wallets/index.js",
|
|
103
|
-
"types": "./dist/wallets/index.d.ts"
|
|
104
|
-
},
|
|
105
104
|
"./wallet": {
|
|
106
|
-
"import": "./dist/
|
|
107
|
-
"types": "./dist/
|
|
105
|
+
"import": "./dist/wallet/index.js",
|
|
106
|
+
"types": "./dist/wallet/index.d.ts"
|
|
107
|
+
},
|
|
108
|
+
"./adapters/hyperliquid": {
|
|
109
|
+
"import": "./dist/adapters/hyperliquid/index.js",
|
|
110
|
+
"types": "./dist/adapters/hyperliquid/index.d.ts"
|
|
108
111
|
},
|
|
109
112
|
"./store": {
|
|
110
113
|
"import": "./dist/store/index.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/wallets/constants.ts","../../src/wallets/providers/private-key.ts","../../src/wallets/providers/turnkey.ts","../../src/wallets/index.ts"],"names":["http","createPublicClient","createWalletClient","tokens"],"mappings":"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","file":"index.js","sourcesContent":["import { zeroAddress } from \"viem\";\nimport {\n arbitrum,\n arbitrumSepolia,\n base,\n baseSepolia,\n mainnet,\n} from \"viem/chains\";\n\nimport type {\n ChainMetadata,\n ChainTokenMap,\n HexAddress,\n RpcUrlResolver,\n WalletRegistry,\n} from \"./types\";\n\nconst BASE_ALCHEMY_HOST = \"https://base-mainnet.g.alchemy.com/v2/\";\nconst ETHEREUM_ALCHEMY_HOST = \"https://eth-mainnet.g.alchemy.com/v2/\";\nconst BASE_SEPOLIA_ALCHEMY_HOST = \"https://base-sepolia.g.alchemy.com/v2/\";\nconst ARBITRUM_ALCHEMY_HOST = \"https://arb-mainnet.g.alchemy.com/v2/\";\nconst ARBITRUM_SEPOLIA_ALCHEMY_HOST = \"https://arb-sepolia.g.alchemy.com/v2/\";\n\nfunction buildRpcResolver(\n host: string,\n fallbackUrls: readonly string[]\n): RpcUrlResolver {\n return (options) => {\n if (options?.url) {\n return options.url;\n }\n\n if (options?.apiKey) {\n return `${host}${options.apiKey}`;\n }\n\n if (fallbackUrls.length > 0) {\n return fallbackUrls[0];\n }\n\n throw new Error(\n \"No RPC URL available: supply a full url via options or an apiKey for the default host\"\n );\n };\n}\n\nconst chains: Record<string, ChainMetadata> = {\n base: {\n id: base.id,\n slug: \"base\",\n name: \"Base\",\n chain: base,\n rpcUrl: buildRpcResolver(BASE_ALCHEMY_HOST, base.rpcUrls.default.http),\n publicRpcUrls: base.rpcUrls.default.http,\n },\n ethereum: {\n id: mainnet.id,\n slug: \"ethereum\",\n name: \"Ethereum\",\n chain: mainnet,\n rpcUrl: buildRpcResolver(\n ETHEREUM_ALCHEMY_HOST,\n mainnet.rpcUrls.default.http\n ),\n publicRpcUrls: mainnet.rpcUrls.default.http,\n },\n baseSepolia: {\n id: baseSepolia.id,\n slug: \"base-sepolia\",\n name: \"Base Sepolia\",\n chain: baseSepolia,\n rpcUrl: buildRpcResolver(\n BASE_SEPOLIA_ALCHEMY_HOST,\n baseSepolia.rpcUrls.default.http\n ),\n },\n arbitrum: {\n id: arbitrum.id,\n slug: \"arbitrum\",\n name: \"Arbitrum One\",\n chain: arbitrum,\n rpcUrl: buildRpcResolver(\n ARBITRUM_ALCHEMY_HOST,\n arbitrum.rpcUrls.default.http\n ),\n publicRpcUrls: arbitrum.rpcUrls.default.http,\n },\n arbitrumSepolia: {\n id: arbitrumSepolia.id,\n slug: \"arbitrum-sepolia\",\n name: \"Arbitrum Sepolia\",\n chain: arbitrumSepolia,\n rpcUrl: buildRpcResolver(\n ARBITRUM_SEPOLIA_ALCHEMY_HOST,\n arbitrumSepolia.rpcUrls.default.http\n ),\n publicRpcUrls: arbitrumSepolia.rpcUrls.default.http,\n },\n};\n\nfunction createNativeToken(\n chainId: number,\n symbol: string,\n name: string\n): ChainTokenMap {\n return {\n [symbol]: {\n symbol,\n name,\n decimals: 18,\n address: zeroAddress,\n chainId,\n isNative: true,\n },\n };\n}\n\nfunction token(\n chainId: number,\n symbol: string,\n name: string,\n address: HexAddress,\n decimals: number\n) {\n return {\n symbol,\n name,\n decimals,\n address,\n chainId,\n };\n}\n\nconst tokens: Record<string, ChainTokenMap> = {\n base: {\n ...createNativeToken(base.id, \"ETH\", \"Ether\"),\n USDC: token(\n base.id,\n \"USDC\",\n \"USD Coin\",\n \"0x833589fCD6eDb6E08f4c7C31c9A8Ba32D74b86B2\",\n 6\n ),\n },\n ethereum: {\n ...createNativeToken(mainnet.id, \"ETH\", \"Ether\"),\n USDC: token(\n mainnet.id,\n \"USDC\",\n \"USD Coin\",\n \"0xA0b86991c6218b36c1d19d4a2e9Eb0cE3606eB48\",\n 6\n ),\n },\n arbitrum: {\n ...createNativeToken(arbitrum.id, \"ETH\", \"Ether\"),\n USDC: token(\n arbitrum.id,\n \"USDC\",\n \"USD Coin\",\n \"0xaf88d065e77c8cc2239327c5edb3a432268e5831\",\n 6\n ),\n },\n arbitrumSepolia: {\n ...createNativeToken(arbitrumSepolia.id, \"ETH\", \"Ether\"),\n USDC: token(\n arbitrumSepolia.id,\n \"USDC\",\n \"USD Coin\",\n \"0x1baAbB04529D43a73232B713C0FE471f7c7334d5\",\n 6\n ),\n },\n};\n\nexport const DEFAULT_CHAIN = chains.base;\nexport const DEFAULT_TOKENS = tokens.base;\n\nexport const registry: WalletRegistry = {\n chains,\n tokens,\n};\n\nexport { chains, tokens };\n","import { createPublicClient, createWalletClient, http, type Chain, type PublicClient, type Transport } from \"viem\";\nimport { privateKeyToAccount, type Account } from \"viem/accounts\";\n\nimport type {\n ChainMetadata,\n HexAddress,\n WalletSignerContext,\n WalletSendTransactionParams,\n WalletTransferParams,\n} from \"../types\";\n\nfunction normalizePrivateKey(raw: string): `0x${string}` {\n const trimmed = raw.trim();\n const withPrefix = trimmed.startsWith(\"0x\") ? trimmed : `0x${trimmed}`;\n if (!/^0x[0-9a-fA-F]{64}$/.test(withPrefix)) {\n throw new Error(\"wallet() privateKey must be a 32-byte hex string\");\n }\n return withPrefix as `0x${string}`;\n}\n\nexport interface PrivateKeyProviderConfig {\n chain: ChainMetadata;\n rpcUrl: string;\n privateKey: string;\n}\n\nexport interface PrivateKeyProviderResult extends WalletSignerContext {\n publicClient: PublicClient<Transport, Chain>;\n}\n\nexport function createPrivateKeyProvider(\n config: PrivateKeyProviderConfig\n): PrivateKeyProviderResult {\n const privateKey = normalizePrivateKey(config.privateKey);\n const account = privateKeyToAccount(privateKey);\n\n const transport = http(config.rpcUrl);\n const publicClient = createPublicClient<Transport, Chain>({\n chain: config.chain.chain,\n transport,\n });\n\n const walletClient = createWalletClient<Transport, Chain, Account>({\n account,\n chain: config.chain.chain,\n transport,\n });\n\n async function sendTransaction(params: WalletSendTransactionParams) {\n const tx: any = {\n account,\n };\n if (params.to) {\n tx.to = params.to;\n }\n if (params.value !== undefined) {\n tx.value = params.value;\n }\n if (params.data !== undefined) {\n tx.data = params.data;\n }\n\n return walletClient.sendTransaction(tx);\n }\n\n async function getNativeBalance() {\n return publicClient.getBalance({ address: account.address });\n }\n\n async function transfer(params: WalletTransferParams) {\n return sendTransaction({\n to: params.to,\n value: params.amount,\n ...(params.data !== undefined ? { data: params.data } : {}),\n });\n }\n\n return {\n address: account.address as HexAddress,\n account,\n walletClient,\n publicClient,\n sendTransaction,\n getNativeBalance,\n transfer,\n };\n}\n","import { Turnkey } from \"@turnkey/sdk-server\";\nimport { createAccount } from \"@turnkey/viem\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n} from \"viem\";\nimport type { Account } from \"viem/accounts\";\n\nimport type {\n ChainMetadata,\n HexAddress,\n TurnkeySignWith,\n WalletSignerContext,\n WalletSendTransactionParams,\n WalletTransferParams,\n} from \"../types\";\n\nexport interface TurnkeyProviderConfig {\n chain: ChainMetadata;\n rpcUrl: string;\n organizationId: string;\n apiPublicKey: string;\n apiPrivateKey: string;\n signWith: TurnkeySignWith;\n apiBaseUrl?: string;\n}\n\nexport interface TurnkeyProviderResult extends WalletSignerContext {\n publicClient: PublicClient<Transport, Chain>;\n}\n\nexport async function createTurnkeyProvider(\n config: TurnkeyProviderConfig\n): Promise<TurnkeyProviderResult> {\n const turnkey = new Turnkey({\n apiBaseUrl: config.apiBaseUrl ?? \"https://api.turnkey.com\",\n // The delegated sub-organization the API key pair belongs to.\n defaultOrganizationId: config.organizationId,\n apiPublicKey: config.apiPublicKey,\n apiPrivateKey: config.apiPrivateKey,\n });\n\n const account = (await createAccount({\n client: turnkey.apiClient(),\n organizationId: config.organizationId,\n signWith: config.signWith,\n })) as Account;\n\n const transport = http(config.rpcUrl);\n const publicClient = createPublicClient<Transport, Chain>({\n chain: config.chain.chain,\n transport,\n });\n\n const walletClient = createWalletClient<Transport, Chain, Account>({\n account,\n chain: config.chain.chain,\n transport,\n });\n\n async function sendTransaction(params: WalletSendTransactionParams) {\n const tx: any = {\n account,\n };\n if (params.to) {\n tx.to = params.to;\n }\n if (params.value !== undefined) {\n tx.value = params.value;\n }\n if (params.data !== undefined) {\n tx.data = params.data;\n }\n\n return walletClient.sendTransaction(tx);\n }\n\n async function getNativeBalance() {\n return publicClient.getBalance({ address: account.address });\n }\n\n async function transfer(params: WalletTransferParams) {\n return sendTransaction({\n to: params.to,\n value: params.amount,\n ...(params.data !== undefined ? { data: params.data } : {}),\n });\n }\n\n return {\n address: account.address as HexAddress,\n account,\n walletClient,\n publicClient,\n sendTransaction,\n getNativeBalance,\n transfer,\n };\n}\n","export * from \"./types\";\nexport { chains, tokens, registry, DEFAULT_CHAIN, DEFAULT_TOKENS } from \"./constants\";\n\nimport { createPublicClient, http } from \"viem\";\n\nimport type {\n RpcProviderOptions,\n WalletContext,\n WalletFullContext,\n WalletReadonlyContext,\n WalletOptions,\n WalletProviderType,\n WalletPrivateKeyOptions,\n WalletTurnkeyOptions,\n WalletReadonlyOptions,\n} from \"./types\";\nimport {\n chains as chainRegistry,\n tokens as tokenRegistry,\n registry as walletRegistry,\n DEFAULT_CHAIN,\n DEFAULT_TOKENS,\n} from \"./constants\";\nimport { createPrivateKeyProvider } from \"./providers/private-key\";\nimport { createTurnkeyProvider } from \"./providers/turnkey\";\n\ntype ChainSlug = keyof typeof chainRegistry;\n\nfunction resolveChainSlug(reference?: string | number): ChainSlug {\n if (reference === undefined) {\n return (Object.entries(chainRegistry).find(([, meta]) => meta.id === DEFAULT_CHAIN.id)?.[0] ||\n DEFAULT_CHAIN.slug) as ChainSlug;\n }\n\n if (typeof reference === \"number\") {\n const match = Object.entries(chainRegistry).find(([, meta]) => meta.id === reference);\n if (match) {\n return match[0] as ChainSlug;\n }\n } else if (typeof reference === \"string\") {\n const sanitize = (value: string) => value.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n\n if (reference in chainRegistry) {\n return reference as ChainSlug;\n }\n\n const normalized = sanitize(reference);\n\n const keyMatch = Object.entries(chainRegistry).find(([key]) => sanitize(key) === normalized);\n if (keyMatch) {\n return keyMatch[0] as ChainSlug;\n }\n\n const slugMatch = Object.entries(chainRegistry).find(([, meta]) => {\n return meta.slug && sanitize(meta.slug) === normalized;\n });\n if (slugMatch) {\n return slugMatch[0] as ChainSlug;\n }\n\n const asNumber = Number.parseInt(normalized, 10);\n if (!Number.isNaN(asNumber)) {\n const match = Object.entries(chainRegistry).find(([, meta]) => meta.id === asNumber);\n if (match) {\n return match[0] as ChainSlug;\n }\n }\n }\n\n throw new Error(`Unknown chain reference: ${reference}`);\n}\n\nexport function getRpcUrl(chain: ChainSlug | number, options?: RpcProviderOptions): string {\n const slug = resolveChainSlug(chain);\n const entry = chainRegistry[slug];\n return entry.rpcUrl(options);\n}\n\nexport function wallet(options: WalletPrivateKeyOptions): Promise<WalletFullContext>;\nexport function wallet(options: WalletTurnkeyOptions): Promise<WalletFullContext>;\nexport function wallet(options?: WalletReadonlyOptions): Promise<WalletReadonlyContext>;\nexport async function wallet(options: WalletOptions = {}): Promise<WalletContext> {\n if (options.privateKey && options.turnkey) {\n throw new Error(\"wallet() cannot be initialized with both privateKey and turnkey credentials\");\n }\n\n const slug = resolveChainSlug(options.chain);\n const chain = chainRegistry[slug];\n const tokens = tokenRegistry[slug] ?? {};\n const overrides: RpcProviderOptions = {};\n if (options.rpcUrl) {\n overrides.url = options.rpcUrl;\n }\n if (options.apiKey) {\n overrides.apiKey = options.apiKey;\n }\n\n const rpcUrl = getRpcUrl(slug, overrides);\n\n let providerType: WalletProviderType = \"readonly\";\n let signerProvider:\n | ReturnType<typeof createPrivateKeyProvider>\n | (Awaited<ReturnType<typeof createTurnkeyProvider>>)\n | undefined;\n\n if (options.privateKey) {\n signerProvider = createPrivateKeyProvider({\n chain,\n rpcUrl,\n privateKey: options.privateKey,\n });\n providerType = \"privateKey\";\n } else if (options.turnkey) {\n const turnkeyConfig = {\n chain,\n rpcUrl,\n organizationId: options.turnkey.organizationId,\n apiPublicKey: options.turnkey.apiPublicKey,\n apiPrivateKey: options.turnkey.apiPrivateKey,\n signWith: options.turnkey.signWith,\n } as Parameters<typeof createTurnkeyProvider>[0];\n\n if (options.turnkey.apiBaseUrl) {\n turnkeyConfig.apiBaseUrl = options.turnkey.apiBaseUrl;\n }\n\n signerProvider = await createTurnkeyProvider(turnkeyConfig);\n providerType = \"turnkey\";\n }\n\n const publicClient = signerProvider?.publicClient ??\n createPublicClient({\n chain: chain.chain,\n transport: http(rpcUrl),\n });\n\n const baseContext: WalletReadonlyContext = {\n chain,\n tokens,\n rpcUrl,\n providerType,\n publicClient,\n getRpcUrl: (override?: RpcProviderOptions) => getRpcUrl(slug, override),\n };\n\n if (signerProvider) {\n const { publicClient: _ignored, ...rest } = signerProvider;\n return {\n ...baseContext,\n ...rest,\n } as WalletFullContext;\n }\n\n return baseContext;\n}\n\nexport const walletToolkit = {\n chains: chainRegistry,\n tokens: tokenRegistry,\n registry: walletRegistry,\n defaults: {\n chain: DEFAULT_CHAIN,\n tokens: DEFAULT_TOKENS,\n },\n getRpcUrl,\n wallet,\n} as const;\n"]}
|