opentool 0.10.3 → 0.10.5

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.
@@ -3,6 +3,7 @@ import { Account } from 'viem/accounts';
3
3
 
4
4
  type Hex = `0x${string}`;
5
5
  type HexAddress = `0x${string}`;
6
+ type NonceSource = () => number;
6
7
  interface RpcProviderOptions {
7
8
  /** Optional fully-qualified RPC URL override. */
8
9
  url?: string;
@@ -81,7 +82,7 @@ interface WalletSignerContext {
81
82
  /**
82
83
  * Optional monotonic nonce provider for systems that require client-side nonces.
83
84
  */
84
- nonceSource?: () => number;
85
+ nonceSource?: NonceSource;
85
86
  }
86
87
  interface WalletBaseContext {
87
88
  chain: ChainMetadata;
@@ -97,4 +98,4 @@ type WalletReadonlyContext = WalletBaseContext;
97
98
  type WalletFullContext = WalletBaseContext & WalletSignerContext;
98
99
  type WalletContext = WalletReadonlyContext | WalletFullContext;
99
100
 
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, ChainReference as g, HexAddress as h, RpcUrlResolver as i, TurnkeyOptions as j, TurnkeySignWith as k, WalletBaseContext as l, WalletContext as m, WalletOptions as n, WalletOptionsBase as o, WalletProviderType as p, WalletSendTransactionParams as q, WalletSignerContext as r, WalletTransferParams as s };
101
+ export type { ChainReference as C, HexAddress as H, NonceSource as N, RpcProviderOptions as R, TurnkeySignWith as T, WalletProviderType as W, ChainMetadata as a, WalletFullContext as b, ChainTokenMap as c, WalletRegistry as d, WalletPrivateKeyOptions as e, WalletTurnkeyOptions as f, WalletReadonlyOptions as g, WalletReadonlyContext as h, Hex as i, RpcUrlResolver as j, TokenMetadata as k, TurnkeyOptions as l, WalletBaseContext as m, WalletContext as n, WalletOptions as o, WalletOptionsBase as p, WalletSendTransactionParams as q, WalletSignerContext as r, WalletTransferParams as s };
@@ -0,0 +1,33 @@
1
+ import { createAccount } from '@turnkey/viem';
2
+ import { WalletClient, Transport, Chain, PublicClient } from 'viem';
3
+ import { Account } from 'viem/accounts';
4
+ import { C as ChainReference, H as HexAddress, W as WalletProviderType, a as ChainMetadata, T as TurnkeySignWith, b as WalletFullContext } from '../types-rAQrDrah.js';
5
+
6
+ type NonceSource = () => number;
7
+ declare function createMonotonicNonceSource(start?: number): NonceSource;
8
+
9
+ type TurnkeyBrowserClientLike = Parameters<typeof createAccount>[0]["client"];
10
+ interface BrowserWalletContextOptions {
11
+ chain?: ChainReference;
12
+ apiKey?: string;
13
+ rpcUrl?: string;
14
+ address: HexAddress;
15
+ account: Account;
16
+ walletClient: WalletClient<Transport, Chain, Account>;
17
+ publicClient?: PublicClient<Transport, Chain> | undefined;
18
+ nonceSource?: NonceSource | undefined;
19
+ providerType?: WalletProviderType | undefined;
20
+ }
21
+ declare function createBrowserWalletContext(options: BrowserWalletContextOptions): WalletFullContext;
22
+ interface TurnkeyBrowserProviderConfig {
23
+ chain: ChainMetadata;
24
+ rpcUrl: string;
25
+ organizationId: string;
26
+ signWith: TurnkeySignWith;
27
+ client: TurnkeyBrowserClientLike;
28
+ ethereumAddress?: HexAddress | undefined;
29
+ nonceSource?: NonceSource | undefined;
30
+ }
31
+ declare function createTurnkeyBrowserProvider(config: TurnkeyBrowserProviderConfig): Promise<WalletFullContext>;
32
+
33
+ export { type BrowserWalletContextOptions, type NonceSource, type TurnkeyBrowserProviderConfig, createBrowserWalletContext, createMonotonicNonceSource, createTurnkeyBrowserProvider };
@@ -0,0 +1,271 @@
1
+ import { createAccount } from '@turnkey/viem';
2
+ import { zeroAddress, createPublicClient, http, createWalletClient } from 'viem';
3
+ import { arbitrumSepolia, arbitrum, baseSepolia, mainnet, base } from 'viem/chains';
4
+
5
+ // src/wallet/browser.ts
6
+ var BASE_ALCHEMY_HOST = "https://base-mainnet.g.alchemy.com/v2/";
7
+ var ETHEREUM_ALCHEMY_HOST = "https://eth-mainnet.g.alchemy.com/v2/";
8
+ var BASE_SEPOLIA_ALCHEMY_HOST = "https://base-sepolia.g.alchemy.com/v2/";
9
+ var ARBITRUM_ALCHEMY_HOST = "https://arb-mainnet.g.alchemy.com/v2/";
10
+ var ARBITRUM_SEPOLIA_ALCHEMY_HOST = "https://arb-sepolia.g.alchemy.com/v2/";
11
+ function buildRpcResolver(host, fallbackUrls) {
12
+ return (options) => {
13
+ if (options?.url) {
14
+ return options.url;
15
+ }
16
+ if (options?.apiKey) {
17
+ return `${host}${options.apiKey}`;
18
+ }
19
+ if (fallbackUrls.length > 0) {
20
+ return fallbackUrls[0];
21
+ }
22
+ throw new Error(
23
+ "No RPC URL available: supply a full url via options or an apiKey for the default host"
24
+ );
25
+ };
26
+ }
27
+ var chains = {
28
+ base: {
29
+ id: base.id,
30
+ slug: "base",
31
+ name: "Base",
32
+ chain: base,
33
+ rpcUrl: buildRpcResolver(BASE_ALCHEMY_HOST, base.rpcUrls.default.http),
34
+ publicRpcUrls: base.rpcUrls.default.http
35
+ },
36
+ ethereum: {
37
+ id: mainnet.id,
38
+ slug: "ethereum",
39
+ name: "Ethereum",
40
+ chain: mainnet,
41
+ rpcUrl: buildRpcResolver(ETHEREUM_ALCHEMY_HOST, mainnet.rpcUrls.default.http),
42
+ publicRpcUrls: mainnet.rpcUrls.default.http
43
+ },
44
+ baseSepolia: {
45
+ id: baseSepolia.id,
46
+ slug: "base-sepolia",
47
+ name: "Base Sepolia",
48
+ chain: baseSepolia,
49
+ rpcUrl: buildRpcResolver(BASE_SEPOLIA_ALCHEMY_HOST, baseSepolia.rpcUrls.default.http)
50
+ },
51
+ arbitrum: {
52
+ id: arbitrum.id,
53
+ slug: "arbitrum",
54
+ name: "Arbitrum One",
55
+ chain: arbitrum,
56
+ rpcUrl: buildRpcResolver(ARBITRUM_ALCHEMY_HOST, arbitrum.rpcUrls.default.http),
57
+ publicRpcUrls: arbitrum.rpcUrls.default.http
58
+ },
59
+ arbitrumSepolia: {
60
+ id: arbitrumSepolia.id,
61
+ slug: "arbitrum-sepolia",
62
+ name: "Arbitrum Sepolia",
63
+ chain: arbitrumSepolia,
64
+ rpcUrl: buildRpcResolver(ARBITRUM_SEPOLIA_ALCHEMY_HOST, arbitrumSepolia.rpcUrls.default.http),
65
+ publicRpcUrls: arbitrumSepolia.rpcUrls.default.http
66
+ }
67
+ };
68
+ function createNativeToken(chainId, symbol, name) {
69
+ return {
70
+ [symbol]: {
71
+ symbol,
72
+ name,
73
+ decimals: 18,
74
+ address: zeroAddress,
75
+ chainId,
76
+ isNative: true
77
+ }
78
+ };
79
+ }
80
+ function token(chainId, symbol, name, address, decimals) {
81
+ return {
82
+ symbol,
83
+ name,
84
+ decimals,
85
+ address,
86
+ chainId
87
+ };
88
+ }
89
+ var tokens = {
90
+ base: {
91
+ ...createNativeToken(base.id, "ETH", "Ether"),
92
+ USDC: token(base.id, "USDC", "USD Coin", "0x833589fCD6eDb6E08f4c7C31c9A8Ba32D74b86B2", 6)
93
+ },
94
+ ethereum: {
95
+ ...createNativeToken(mainnet.id, "ETH", "Ether"),
96
+ USDC: token(mainnet.id, "USDC", "USD Coin", "0xA0b86991c6218b36c1d19d4a2e9Eb0cE3606eB48", 6)
97
+ },
98
+ arbitrum: {
99
+ ...createNativeToken(arbitrum.id, "ETH", "Ether"),
100
+ USDC: token(arbitrum.id, "USDC", "USD Coin", "0xaf88d065e77c8cc2239327c5edb3a432268e5831", 6)
101
+ },
102
+ arbitrumSepolia: {
103
+ ...createNativeToken(arbitrumSepolia.id, "ETH", "Ether"),
104
+ USDC: token(
105
+ arbitrumSepolia.id,
106
+ "USDC",
107
+ "USD Coin",
108
+ "0x1baAbB04529D43a73232B713C0FE471f7c7334d5",
109
+ 6
110
+ )
111
+ }
112
+ };
113
+ var DEFAULT_CHAIN = chains.base;
114
+ var DEFAULT_TOKENS = tokens.base;
115
+
116
+ // src/wallet/nonces.ts
117
+ function createMonotonicNonceSource(start = Date.now()) {
118
+ let last = start;
119
+ return () => {
120
+ const now = Date.now();
121
+ if (now > last) {
122
+ last = now;
123
+ } else {
124
+ last += 1;
125
+ }
126
+ return last;
127
+ };
128
+ }
129
+
130
+ // src/wallet/browser.ts
131
+ function resolveChainSlug(reference) {
132
+ if (reference === void 0) {
133
+ return Object.entries(chains).find(([, meta]) => meta.id === DEFAULT_CHAIN.id)?.[0] || DEFAULT_CHAIN.slug;
134
+ }
135
+ if (typeof reference === "number") {
136
+ const match = Object.entries(chains).find(([, meta]) => meta.id === reference);
137
+ if (match) {
138
+ return match[0];
139
+ }
140
+ } else if (typeof reference === "string") {
141
+ const sanitize = (value) => value.toLowerCase().replace(/[^a-z0-9]/g, "");
142
+ if (reference in chains) {
143
+ return reference;
144
+ }
145
+ const normalized = sanitize(reference);
146
+ const keyMatch = Object.entries(chains).find(([key]) => sanitize(key) === normalized);
147
+ if (keyMatch) {
148
+ return keyMatch[0];
149
+ }
150
+ const slugMatch = Object.entries(chains).find(([, meta]) => {
151
+ return meta.slug && sanitize(meta.slug) === normalized;
152
+ });
153
+ if (slugMatch) {
154
+ return slugMatch[0];
155
+ }
156
+ const asNumber = Number.parseInt(normalized, 10);
157
+ if (!Number.isNaN(asNumber)) {
158
+ const match = Object.entries(chains).find(([, meta]) => meta.id === asNumber);
159
+ if (match) {
160
+ return match[0];
161
+ }
162
+ }
163
+ }
164
+ throw new Error(`Unknown chain reference: ${reference}`);
165
+ }
166
+ function getRpcUrl(chain, options) {
167
+ const slug = resolveChainSlug(chain);
168
+ const entry = chains[slug];
169
+ return entry.rpcUrl(options);
170
+ }
171
+ function createWalletHelpers(params) {
172
+ async function sendTransaction(options) {
173
+ const tx = {
174
+ account: params.account
175
+ };
176
+ if (options.to) {
177
+ tx.to = options.to;
178
+ }
179
+ if (options.value !== void 0) {
180
+ tx.value = options.value;
181
+ }
182
+ if (options.data !== void 0) {
183
+ tx.data = options.data;
184
+ }
185
+ return params.walletClient.sendTransaction(tx);
186
+ }
187
+ async function getNativeBalance() {
188
+ return params.publicClient.getBalance({ address: params.account.address });
189
+ }
190
+ async function transfer(options) {
191
+ return sendTransaction({
192
+ to: options.to,
193
+ value: options.amount,
194
+ ...options.data !== void 0 ? { data: options.data } : {}
195
+ });
196
+ }
197
+ return {
198
+ sendTransaction,
199
+ getNativeBalance,
200
+ transfer
201
+ };
202
+ }
203
+ function createBrowserWalletContext(options) {
204
+ const slug = resolveChainSlug(options.chain);
205
+ const chain = chains[slug];
206
+ const tokens2 = tokens[slug] ?? DEFAULT_TOKENS;
207
+ const overrides = {};
208
+ if (options.rpcUrl) {
209
+ overrides.url = options.rpcUrl;
210
+ }
211
+ if (options.apiKey) {
212
+ overrides.apiKey = options.apiKey;
213
+ }
214
+ const rpcUrl = getRpcUrl(slug, overrides);
215
+ const publicClient = options.publicClient ?? createPublicClient({
216
+ chain: chain.chain,
217
+ transport: http(rpcUrl)
218
+ });
219
+ const walletClient = options.walletClient;
220
+ const helperNonceSource = options.nonceSource ?? createMonotonicNonceSource();
221
+ const helpers = createWalletHelpers({
222
+ account: options.account,
223
+ publicClient,
224
+ walletClient
225
+ });
226
+ return {
227
+ chain,
228
+ tokens: tokens2,
229
+ rpcUrl,
230
+ providerType: options.providerType ?? "turnkey",
231
+ publicClient,
232
+ address: options.address,
233
+ account: options.account,
234
+ walletClient,
235
+ nonceSource: helperNonceSource,
236
+ getRpcUrl: (override) => getRpcUrl(slug, override),
237
+ ...helpers
238
+ };
239
+ }
240
+ async function createTurnkeyBrowserProvider(config) {
241
+ const account = await createAccount({
242
+ client: config.client,
243
+ organizationId: config.organizationId,
244
+ signWith: config.signWith,
245
+ ...config.ethereumAddress ? { ethereumAddress: config.ethereumAddress } : {}
246
+ });
247
+ const transport = http(config.rpcUrl);
248
+ const publicClient = createPublicClient({
249
+ chain: config.chain.chain,
250
+ transport
251
+ });
252
+ const walletClient = createWalletClient({
253
+ account,
254
+ chain: config.chain.chain,
255
+ transport
256
+ });
257
+ return createBrowserWalletContext({
258
+ chain: config.chain.slug,
259
+ rpcUrl: config.rpcUrl,
260
+ address: account.address,
261
+ account,
262
+ walletClient,
263
+ publicClient,
264
+ ...config.nonceSource ? { nonceSource: config.nonceSource } : {},
265
+ providerType: "turnkey"
266
+ });
267
+ }
268
+
269
+ export { createBrowserWalletContext, createMonotonicNonceSource, createTurnkeyBrowserProvider };
270
+ //# sourceMappingURL=browser.js.map
271
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/wallet/constants.ts","../../src/wallet/nonces.ts","../../src/wallet/browser.ts"],"names":["tokens"],"mappings":"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","file":"browser.js","sourcesContent":["import { zeroAddress } from \"viem\";\nimport { arbitrum, arbitrumSepolia, base, baseSepolia, mainnet } 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(host: string, fallbackUrls: readonly string[]): 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(ETHEREUM_ALCHEMY_HOST, mainnet.rpcUrls.default.http),\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(BASE_SEPOLIA_ALCHEMY_HOST, baseSepolia.rpcUrls.default.http),\n },\n arbitrum: {\n id: arbitrum.id,\n slug: \"arbitrum\",\n name: \"Arbitrum One\",\n chain: arbitrum,\n rpcUrl: buildRpcResolver(ARBITRUM_ALCHEMY_HOST, arbitrum.rpcUrls.default.http),\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(ARBITRUM_SEPOLIA_ALCHEMY_HOST, arbitrumSepolia.rpcUrls.default.http),\n publicRpcUrls: arbitrumSepolia.rpcUrls.default.http,\n },\n};\n\nfunction createNativeToken(chainId: number, symbol: string, name: string): 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(base.id, \"USDC\", \"USD Coin\", \"0x833589fCD6eDb6E08f4c7C31c9A8Ba32D74b86B2\", 6),\n },\n ethereum: {\n ...createNativeToken(mainnet.id, \"ETH\", \"Ether\"),\n USDC: token(mainnet.id, \"USDC\", \"USD Coin\", \"0xA0b86991c6218b36c1d19d4a2e9Eb0cE3606eB48\", 6),\n },\n arbitrum: {\n ...createNativeToken(arbitrum.id, \"ETH\", \"Ether\"),\n USDC: token(arbitrum.id, \"USDC\", \"USD Coin\", \"0xaf88d065e77c8cc2239327c5edb3a432268e5831\", 6),\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","export type NonceSource = () => number;\n\nexport function createMonotonicNonceSource(start: number = Date.now()): NonceSource {\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","import { createAccount } from \"@turnkey/viem\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n type WalletClient,\n} from \"viem\";\nimport type { Account } from \"viem/accounts\";\n\nimport {\n chains as chainRegistry,\n tokens as tokenRegistry,\n DEFAULT_CHAIN,\n DEFAULT_TOKENS,\n} from \"./constants\";\nimport { createMonotonicNonceSource, type NonceSource } from \"./nonces\";\nimport type {\n ChainMetadata,\n ChainReference,\n HexAddress,\n RpcProviderOptions,\n TurnkeySignWith,\n WalletFullContext,\n WalletProviderType,\n WalletSendTransactionParams,\n WalletTransferParams,\n} from \"./types\";\n\ntype ChainSlug = keyof typeof chainRegistry;\ntype TurnkeyBrowserClientLike = Parameters<typeof createAccount>[0][\"client\"];\n\nfunction resolveChainSlug(reference?: ChainReference): 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\nfunction getRpcUrl(chain: ChainSlug | number, options?: RpcProviderOptions): string {\n const slug = resolveChainSlug(chain);\n const entry = chainRegistry[slug];\n return entry.rpcUrl(options);\n}\n\nfunction createWalletHelpers(params: {\n account: Account;\n publicClient: PublicClient<Transport, Chain>;\n walletClient: WalletClient<Transport, Chain, Account>;\n}) {\n async function sendTransaction(options: WalletSendTransactionParams) {\n const tx: {\n account: Account;\n to?: HexAddress;\n value?: bigint;\n data?: `0x${string}`;\n } = {\n account: params.account,\n };\n\n if (options.to) {\n tx.to = options.to;\n }\n if (options.value !== undefined) {\n tx.value = options.value;\n }\n if (options.data !== undefined) {\n tx.data = options.data;\n }\n\n return params.walletClient.sendTransaction(tx);\n }\n\n async function getNativeBalance() {\n return params.publicClient.getBalance({ address: params.account.address });\n }\n\n async function transfer(options: WalletTransferParams) {\n return sendTransaction({\n to: options.to,\n value: options.amount,\n ...(options.data !== undefined ? { data: options.data } : {}),\n });\n }\n\n return {\n sendTransaction,\n getNativeBalance,\n transfer,\n };\n}\n\nexport interface BrowserWalletContextOptions {\n chain?: ChainReference;\n apiKey?: string;\n rpcUrl?: string;\n address: HexAddress;\n account: Account;\n walletClient: WalletClient<Transport, Chain, Account>;\n publicClient?: PublicClient<Transport, Chain> | undefined;\n nonceSource?: NonceSource | undefined;\n providerType?: WalletProviderType | undefined;\n}\n\nexport function createBrowserWalletContext(\n options: BrowserWalletContextOptions,\n): WalletFullContext {\n const slug = resolveChainSlug(options.chain);\n const chain = chainRegistry[slug];\n const tokens = tokenRegistry[slug] ?? DEFAULT_TOKENS;\n const overrides: RpcProviderOptions = {};\n\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 const publicClient =\n options.publicClient ??\n createPublicClient<Transport, Chain>({\n chain: chain.chain,\n transport: http(rpcUrl),\n });\n const walletClient = options.walletClient;\n const helperNonceSource = options.nonceSource ?? createMonotonicNonceSource();\n const helpers = createWalletHelpers({\n account: options.account,\n publicClient,\n walletClient,\n });\n\n return {\n chain,\n tokens,\n rpcUrl,\n providerType: options.providerType ?? \"turnkey\",\n publicClient,\n address: options.address,\n account: options.account,\n walletClient,\n nonceSource: helperNonceSource,\n getRpcUrl: (override?: RpcProviderOptions) => getRpcUrl(slug, override),\n ...helpers,\n };\n}\n\nexport interface TurnkeyBrowserProviderConfig {\n chain: ChainMetadata;\n rpcUrl: string;\n organizationId: string;\n signWith: TurnkeySignWith;\n client: TurnkeyBrowserClientLike;\n ethereumAddress?: HexAddress | undefined;\n nonceSource?: NonceSource | undefined;\n}\n\nexport async function createTurnkeyBrowserProvider(\n config: TurnkeyBrowserProviderConfig,\n): Promise<WalletFullContext> {\n const account = (await createAccount({\n client: config.client,\n organizationId: config.organizationId,\n signWith: config.signWith,\n ...(config.ethereumAddress ? { ethereumAddress: config.ethereumAddress } : {}),\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 return createBrowserWalletContext({\n chain: config.chain.slug,\n rpcUrl: config.rpcUrl,\n address: account.address as HexAddress,\n account,\n walletClient,\n publicClient,\n ...(config.nonceSource ? { nonceSource: config.nonceSource } : {}),\n providerType: \"turnkey\",\n });\n}\n\nexport { createMonotonicNonceSource };\nexport type { NonceSource };\n"]}
@@ -1,5 +1,5 @@
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-3w880w_t.js';
2
- export { g as ChainReference, H as Hex, h as HexAddress, i as RpcUrlResolver, T as TokenMetadata, j as TurnkeyOptions, k as TurnkeySignWith, l as WalletBaseContext, m as WalletContext, n as WalletOptions, o as WalletOptionsBase, p as WalletProviderType, q as WalletSendTransactionParams, r as WalletSignerContext, s as WalletTransferParams } from '../types-3w880w_t.js';
1
+ import { a as ChainMetadata, c as ChainTokenMap, d as WalletRegistry, R as RpcProviderOptions, e as WalletPrivateKeyOptions, b as WalletFullContext, f as WalletTurnkeyOptions, g as WalletReadonlyOptions, h as WalletReadonlyContext } from '../types-rAQrDrah.js';
2
+ export { C as ChainReference, i as Hex, H as HexAddress, N as NonceSource, j as RpcUrlResolver, k as TokenMetadata, l as TurnkeyOptions, T as TurnkeySignWith, m as WalletBaseContext, n as WalletContext, o as WalletOptions, p as WalletOptionsBase, W as WalletProviderType, q as WalletSendTransactionParams, r as WalletSignerContext, s as WalletTransferParams } from '../types-rAQrDrah.js';
3
3
  import 'viem';
4
4
  import 'viem/accounts';
5
5
 
@@ -118,15 +118,9 @@ var registry = {
118
118
  chains,
119
119
  tokens
120
120
  };
121
- function normalizePrivateKey(raw) {
122
- const trimmed = raw.trim();
123
- const withPrefix = trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
124
- if (!/^0x[0-9a-fA-F]{64}$/.test(withPrefix)) {
125
- throw new Error("wallet() privateKey must be a 32-byte hex string");
126
- }
127
- return withPrefix;
128
- }
129
- function createNonceSource(start = Date.now()) {
121
+
122
+ // src/wallet/nonces.ts
123
+ function createMonotonicNonceSource(start = Date.now()) {
130
124
  let last = start;
131
125
  return () => {
132
126
  const now = Date.now();
@@ -138,6 +132,16 @@ function createNonceSource(start = Date.now()) {
138
132
  return last;
139
133
  };
140
134
  }
135
+
136
+ // src/wallet/providers/private-key.ts
137
+ function normalizePrivateKey(raw) {
138
+ const trimmed = raw.trim();
139
+ const withPrefix = trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
140
+ if (!/^0x[0-9a-fA-F]{64}$/.test(withPrefix)) {
141
+ throw new Error("wallet() privateKey must be a 32-byte hex string");
142
+ }
143
+ return withPrefix;
144
+ }
141
145
  function createPrivateKeyProvider(config) {
142
146
  const privateKey = normalizePrivateKey(config.privateKey);
143
147
  const account = privateKeyToAccount(privateKey);
@@ -184,19 +188,7 @@ function createPrivateKeyProvider(config) {
184
188
  sendTransaction,
185
189
  getNativeBalance,
186
190
  transfer,
187
- nonceSource: createNonceSource()
188
- };
189
- }
190
- function createNonceSource2(start = Date.now()) {
191
- let last = start;
192
- return () => {
193
- const now = Date.now();
194
- if (now > last) {
195
- last = now;
196
- } else {
197
- last += 1;
198
- }
199
- return last;
191
+ nonceSource: createMonotonicNonceSource()
200
192
  };
201
193
  }
202
194
  async function createTurnkeyProvider(config) {
@@ -255,7 +247,7 @@ async function createTurnkeyProvider(config) {
255
247
  sendTransaction,
256
248
  getNativeBalance,
257
249
  transfer,
258
- nonceSource: createNonceSource2()
250
+ nonceSource: createMonotonicNonceSource()
259
251
  };
260
252
  }
261
253
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/wallet/constants.ts","../../src/wallet/providers/private-key.ts","../../src/wallet/providers/turnkey.ts","../../src/wallet/env.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 { arbitrum, arbitrumSepolia, base, baseSepolia, mainnet } 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(host: string, fallbackUrls: readonly string[]): 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(ETHEREUM_ALCHEMY_HOST, mainnet.rpcUrls.default.http),\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(BASE_SEPOLIA_ALCHEMY_HOST, baseSepolia.rpcUrls.default.http),\n },\n arbitrum: {\n id: arbitrum.id,\n slug: \"arbitrum\",\n name: \"Arbitrum One\",\n chain: arbitrum,\n rpcUrl: buildRpcResolver(ARBITRUM_ALCHEMY_HOST, arbitrum.rpcUrls.default.http),\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(ARBITRUM_SEPOLIA_ALCHEMY_HOST, arbitrumSepolia.rpcUrls.default.http),\n publicRpcUrls: arbitrumSepolia.rpcUrls.default.http,\n },\n};\n\nfunction createNativeToken(chainId: number, symbol: string, name: string): 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(base.id, \"USDC\", \"USD Coin\", \"0x833589fCD6eDb6E08f4c7C31c9A8Ba32D74b86B2\", 6),\n },\n ethereum: {\n ...createNativeToken(mainnet.id, \"ETH\", \"Ether\"),\n USDC: token(mainnet.id, \"USDC\", \"USD Coin\", \"0xA0b86991c6218b36c1d19d4a2e9Eb0cE3606eB48\", 6),\n },\n arbitrum: {\n ...createNativeToken(arbitrum.id, \"ETH\", \"Ether\"),\n USDC: token(arbitrum.id, \"USDC\", \"USD Coin\", \"0xaf88d065e77c8cc2239327c5edb3a432268e5831\", 6),\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 {\n createPublicClient,\n createWalletClient,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n} 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 type TurnkeyEnvConfig = {\n organizationId: string;\n apiPublicKey: string;\n apiPrivateKey: string;\n signWith: string;\n apiBaseUrl?: string;\n};\n\nfunction readTrimmed(name: string): string | undefined {\n const value = process.env[name];\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n return trimmed.length ? trimmed : undefined;\n}\n\n/**\n * Reads Turnkey configuration from environment variables.\n */\nexport function readTurnkeyEnv(): TurnkeyEnvConfig | undefined {\n const suborgId = readTrimmed(\"TURNKEY_SUBORG_ID\");\n if (!suborgId) return undefined;\n\n const apiPublicKey = readTrimmed(\"TURNKEY_API_PUBLIC_KEY\");\n const apiPrivateKey = readTrimmed(\"TURNKEY_API_PRIVATE_KEY\");\n const signWith = readTrimmed(\"TURNKEY_WALLET_ADDRESS\");\n if (!apiPublicKey || !apiPrivateKey || !signWith) return undefined;\n\n const apiBaseUrl = readTrimmed(\"TURNKEY_API_BASE_URL\");\n\n return {\n organizationId: suborgId,\n apiPublicKey,\n apiPrivateKey,\n signWith,\n ...(apiBaseUrl ? { apiBaseUrl } : {}),\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\";\nimport { readTurnkeyEnv } from \"./env\";\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 = readTurnkeyEnv();\n\n const effectivePrivateKey = options.privateKey ?? envPrivateKey;\n const effectiveTurnkey = options.turnkey ?? envTurnkey;\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 =\n 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"]}
1
+ {"version":3,"sources":["../../src/wallet/constants.ts","../../src/wallet/nonces.ts","../../src/wallet/providers/private-key.ts","../../src/wallet/providers/turnkey.ts","../../src/wallet/env.ts","../../src/wallet/index.ts"],"names":["http","createPublicClient","createWalletClient","tokens"],"mappings":"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","file":"index.js","sourcesContent":["import { zeroAddress } from \"viem\";\nimport { arbitrum, arbitrumSepolia, base, baseSepolia, mainnet } 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(host: string, fallbackUrls: readonly string[]): 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(ETHEREUM_ALCHEMY_HOST, mainnet.rpcUrls.default.http),\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(BASE_SEPOLIA_ALCHEMY_HOST, baseSepolia.rpcUrls.default.http),\n },\n arbitrum: {\n id: arbitrum.id,\n slug: \"arbitrum\",\n name: \"Arbitrum One\",\n chain: arbitrum,\n rpcUrl: buildRpcResolver(ARBITRUM_ALCHEMY_HOST, arbitrum.rpcUrls.default.http),\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(ARBITRUM_SEPOLIA_ALCHEMY_HOST, arbitrumSepolia.rpcUrls.default.http),\n publicRpcUrls: arbitrumSepolia.rpcUrls.default.http,\n },\n};\n\nfunction createNativeToken(chainId: number, symbol: string, name: string): 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(base.id, \"USDC\", \"USD Coin\", \"0x833589fCD6eDb6E08f4c7C31c9A8Ba32D74b86B2\", 6),\n },\n ethereum: {\n ...createNativeToken(mainnet.id, \"ETH\", \"Ether\"),\n USDC: token(mainnet.id, \"USDC\", \"USD Coin\", \"0xA0b86991c6218b36c1d19d4a2e9Eb0cE3606eB48\", 6),\n },\n arbitrum: {\n ...createNativeToken(arbitrum.id, \"ETH\", \"Ether\"),\n USDC: token(arbitrum.id, \"USDC\", \"USD Coin\", \"0xaf88d065e77c8cc2239327c5edb3a432268e5831\", 6),\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","export type NonceSource = () => number;\n\nexport function createMonotonicNonceSource(start: number = Date.now()): NonceSource {\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","import {\n createPublicClient,\n createWalletClient,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n} from \"viem\";\nimport { privateKeyToAccount, type Account } from \"viem/accounts\";\n\nimport { createMonotonicNonceSource } from \"../nonces\";\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 nonceSource: createMonotonicNonceSource(),\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 { createMonotonicNonceSource } from \"../nonces\";\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 nonceSource: createMonotonicNonceSource(),\n };\n}\n","export type TurnkeyEnvConfig = {\n organizationId: string;\n apiPublicKey: string;\n apiPrivateKey: string;\n signWith: string;\n apiBaseUrl?: string;\n};\n\nfunction readTrimmed(name: string): string | undefined {\n const value = process.env[name];\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n return trimmed.length ? trimmed : undefined;\n}\n\n/**\n * Reads Turnkey configuration from environment variables.\n */\nexport function readTurnkeyEnv(): TurnkeyEnvConfig | undefined {\n const suborgId = readTrimmed(\"TURNKEY_SUBORG_ID\");\n if (!suborgId) return undefined;\n\n const apiPublicKey = readTrimmed(\"TURNKEY_API_PUBLIC_KEY\");\n const apiPrivateKey = readTrimmed(\"TURNKEY_API_PRIVATE_KEY\");\n const signWith = readTrimmed(\"TURNKEY_WALLET_ADDRESS\");\n if (!apiPublicKey || !apiPrivateKey || !signWith) return undefined;\n\n const apiBaseUrl = readTrimmed(\"TURNKEY_API_BASE_URL\");\n\n return {\n organizationId: suborgId,\n apiPublicKey,\n apiPrivateKey,\n signWith,\n ...(apiBaseUrl ? { apiBaseUrl } : {}),\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\";\nimport { readTurnkeyEnv } from \"./env\";\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 = readTurnkeyEnv();\n\n const effectivePrivateKey = options.privateKey ?? envPrivateKey;\n const effectiveTurnkey = options.turnkey ?? envTurnkey;\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 =\n 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.10.3",
3
+ "version": "0.10.5",
4
4
  "description": "OpenTool framework for building serverless MCP tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -94,6 +94,10 @@
94
94
  "import": "./dist/wallet/index.js",
95
95
  "types": "./dist/wallet/index.d.ts"
96
96
  },
97
+ "./wallet/browser": {
98
+ "import": "./dist/wallet/browser.js",
99
+ "types": "./dist/wallet/browser.d.ts"
100
+ },
97
101
  "./adapters/hyperliquid": {
98
102
  "import": "./dist/adapters/hyperliquid/index.js",
99
103
  "types": "./dist/adapters/hyperliquid/index.d.ts"
@@ -102,6 +106,10 @@
102
106
  "import": "./dist/adapters/polymarket/index.js",
103
107
  "types": "./dist/adapters/polymarket/index.d.ts"
104
108
  },
109
+ "./adapters/news": {
110
+ "import": "./dist/adapters/news/index.js",
111
+ "types": "./dist/adapters/news/index.d.ts"
112
+ },
105
113
  "./store": {
106
114
  "import": "./dist/store/index.js",
107
115
  "types": "./dist/store/index.d.ts"
@@ -10,7 +10,7 @@
10
10
  "validate": "opentool validate"
11
11
  },
12
12
  "dependencies": {
13
- "opentool": "^0.10.3",
13
+ "opentool": "^0.10.5",
14
14
  "zod": "^4.3.6"
15
15
  },
16
16
  "devDependencies": {