@0xkey-io/eip-1193-provider 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,271 @@
1
+ 'use strict';
2
+
3
+ var http = require('@0xkey-io/http');
4
+ var viem = require('viem');
5
+ var utils = require('viem/utils');
6
+ var EventEmitter = require('events');
7
+ var utils$1 = require('./utils.js');
8
+ var _0xkey = require('./0xkey.js');
9
+ var errors = require('./errors.js');
10
+ var version = require('./version.js');
11
+
12
+ const createEIP1193Provider = async (options) => {
13
+ const { zeroXKeyClient, organizationId, walletId, chains } = options;
14
+ // Used for public RPC requests
15
+ let id = 0;
16
+ // `activeChain` holds the current Ethereum chain that the provider is operating on to.
17
+ // It is set when the provider successfully switches to a new chain via `wallet_switchEthereumChain`
18
+ // or adds a new chain with `wallet_addEthereumChain`. This variable is crucial for ensuring that
19
+ // the provider operates with the correct chain context, including chain ID and RPC URLs.
20
+ let activeChain;
21
+ let addedChains = [];
22
+ const accounts = new Set();
23
+ // Initialize eventEmitter with a Proxy directly
24
+ const eventEmitter = new EventEmitter();
25
+ // `isInitialized` indicates that the provider is setup and ready to use.
26
+ // Used to skip setting connected for the initial RPC requests.
27
+ let isInitialized = false;
28
+ let lastEmittedEvent;
29
+ function setConnected(connected, data) {
30
+ if (!isInitialized)
31
+ return;
32
+ // Find the currently selected chain and update its connected status
33
+ addedChains = addedChains.map((chain) => chain.chainId === activeChain.chainId ? { ...chain, connected } : chain);
34
+ if (connected && lastEmittedEvent !== "connect" && isInitialized) {
35
+ // Emit 'connect' event when the provider becomes connected as per EIP-1193
36
+ // See https://eips.ethereum.org/EIPS/eip-1193#connect
37
+ eventEmitter.emit("connect", data);
38
+ lastEmittedEvent = "connect";
39
+ }
40
+ else if (addedChains.every(({ connected }) => !connected) &&
41
+ lastEmittedEvent !== "disconnect") {
42
+ // Emit 'disconnect' event when disconnected from all chains
43
+ // See https://eips.ethereum.org/EIPS/eip-1193#disconnect
44
+ const providerDisconnectedError = new viem.ProviderDisconnectedError(data);
45
+ eventEmitter.emit("disconnect", providerDisconnectedError);
46
+ // Reset 'connect' emitted flag on disconnect
47
+ lastEmittedEvent = "disconnect";
48
+ throw providerDisconnectedError;
49
+ }
50
+ else if (!connected) {
51
+ // Provider is disconnected from currentChain but connected to at least 1 other chain
52
+ // Provider is still considered 'connected' & we don't emit unless all chains disconnected
53
+ // See https://eips.ethereum.org/EIPS/eip-1193#provider-errors
54
+ throw new viem.ChainDisconnectedError(data);
55
+ }
56
+ }
57
+ const request = async ({ method, params, }) => {
58
+ try {
59
+ switch (method) {
60
+ case "web3_clientVersion": {
61
+ return version.VERSION;
62
+ }
63
+ /**
64
+ * Requests that the user provide an Ethereum address to be identified by.
65
+ * This method is specified by [EIP-1102](https://eips.ethereum.org/EIPS/eip-1102)
66
+ * This method must be called first to establish the connectivity of the client.
67
+ * @returns {Promise<Address[]>} An array of addresses after user authorization.
68
+ */
69
+ case "eth_requestAccounts": {
70
+ // Note: In the future we should add a way for developers to surface a UI
71
+ // for user to select their accounts. For now it just returns all accounts
72
+ // for the provided walletId
73
+ const walletAccounts = await zeroXKeyClient.getWalletAccounts({
74
+ organizationId,
75
+ walletId,
76
+ });
77
+ walletAccounts.accounts.map(({ address, addressFormat, }) => {
78
+ if (addressFormat === "ADDRESS_FORMAT_ETHEREUM") {
79
+ accounts.add(address);
80
+ }
81
+ });
82
+ setConnected(true, { chainId: activeChain.chainId });
83
+ return [...accounts];
84
+ }
85
+ /**
86
+ * Returns a list of addresses owned by the user.
87
+ * @returns {Promise<Address[]>} An array of addresses owned by the user.
88
+ */
89
+ case "eth_accounts":
90
+ setConnected(true, { chainId: activeChain.chainId });
91
+ return [...accounts];
92
+ case "personal_sign": {
93
+ const [message, signWith] = params;
94
+ const signedMessage = await _0xkey.signMessage({
95
+ organizationId,
96
+ message,
97
+ signWith: utils.getAddress(signWith),
98
+ client: zeroXKeyClient,
99
+ });
100
+ setConnected(true, { chainId: activeChain.chainId });
101
+ return signedMessage;
102
+ }
103
+ case "eth_sign": {
104
+ const [signWith, message] = params;
105
+ const signedMessage = await _0xkey.signMessage({
106
+ organizationId,
107
+ message,
108
+ signWith: utils.getAddress(signWith),
109
+ client: zeroXKeyClient,
110
+ });
111
+ setConnected(true, { chainId: activeChain.chainId });
112
+ return signedMessage;
113
+ }
114
+ case "eth_signTypedData_v4": {
115
+ const [signWith, typedData] = params;
116
+ const message = utils.hashTypedData(typedData);
117
+ const signedMessage = await _0xkey.signMessage({
118
+ organizationId,
119
+ message,
120
+ signWith: utils.getAddress(signWith),
121
+ client: zeroXKeyClient,
122
+ });
123
+ setConnected(true, { chainId: activeChain.chainId });
124
+ return signedMessage;
125
+ }
126
+ case "eth_signTransaction": {
127
+ const [transaction] = params;
128
+ const unsignedTransaction = utils$1.preprocessTransaction({ ...transaction });
129
+ const signedTransaction = await _0xkey.signTransaction({
130
+ organizationId,
131
+ unsignedTransaction,
132
+ signWith: utils.getAddress(transaction.from),
133
+ client: zeroXKeyClient,
134
+ });
135
+ setConnected(true, { chainId: activeChain.chainId });
136
+ return `0x${signedTransaction}`;
137
+ }
138
+ case "wallet_addEthereumChain": {
139
+ const [chain] = params;
140
+ // Validate the to be added
141
+ utils$1.validateChain(chain, addedChains);
142
+ // Store the current connected chain for potential rollback
143
+ const previousActiveChain = activeChain;
144
+ // Update the connected chain to the new chain
145
+ activeChain = chain;
146
+ // Verify the specified chain ID matches the return value of eth_chainId from the endpoint
147
+ const rpcChainId = await request({ method: "eth_chainId" });
148
+ if (activeChain.chainId !== rpcChainId) {
149
+ // Revert to the previous connected chain or to undefined if no other chain connected
150
+ activeChain = previousActiveChain;
151
+ throw new errors.ChainIdMismatchError(chain.chainId, rpcChainId);
152
+ }
153
+ // Only add if it hasn't been added already
154
+ if (!addedChains.some((c) => c.chainId === rpcChainId)) {
155
+ addedChains.push({ ...chain, connected: true });
156
+ }
157
+ return null;
158
+ }
159
+ case "wallet_switchEthereumChain": {
160
+ const [targetChainId] = params;
161
+ const targetChain = addedChains.find((chain) => {
162
+ return chain.chainId === targetChainId.chainId;
163
+ });
164
+ if (!targetChain) {
165
+ throw new errors.UnrecognizedChainError(targetChainId.chainId);
166
+ }
167
+ activeChain = targetChain;
168
+ eventEmitter.emit("chainChanged", { chainId: activeChain.chainId });
169
+ return null;
170
+ }
171
+ // @ts-expect-error fall through expected
172
+ case "eth_sendTransaction": {
173
+ const [transaction] = params;
174
+ const signedTransaction = await request({
175
+ method: "eth_signTransaction",
176
+ params: [transaction],
177
+ });
178
+ // Change the method to 'eth_sendRawTransaction' and pass the signed transaction
179
+ method = "eth_sendRawTransaction";
180
+ params = [signedTransaction];
181
+ // Fall through to 'eth_sendRawTransaction' case
182
+ }
183
+ case "eth_sendRawTransaction":
184
+ case "eth_chainId":
185
+ case "eth_subscribe":
186
+ case "eth_unsubscribe":
187
+ case "eth_blobBaseFee":
188
+ case "eth_blockNumber":
189
+ case "eth_call":
190
+ case "eth_coinbase":
191
+ case "eth_estimateGas":
192
+ case "eth_feeHistory":
193
+ case "eth_gasPrice":
194
+ case "eth_getBalance":
195
+ case "eth_getBlockByHash":
196
+ case "eth_getBlockByNumber":
197
+ case "eth_getBlockReceipts":
198
+ case "eth_getBlockTransactionCountByHash":
199
+ case "eth_getBlockTransactionCountByNumber":
200
+ case "eth_getCode":
201
+ case "eth_getFilterChanges":
202
+ case "eth_getFilterLogs":
203
+ case "eth_getLogs":
204
+ case "eth_getProof":
205
+ case "eth_getStorageAt":
206
+ case "eth_getTransactionByBlockHashAndIndex":
207
+ case "eth_getTransactionByBlockNumberAndIndex":
208
+ case "eth_getTransactionByHash":
209
+ case "eth_getTransactionCount":
210
+ case "eth_getTransactionReceipt":
211
+ case "eth_getUncleCountByBlockHash":
212
+ case "eth_getUncleCountByBlockNumber":
213
+ case "eth_maxPriorityFeePerGas":
214
+ case "eth_newBlockFilter":
215
+ case "eth_newFilter":
216
+ case "eth_newPendingTransactionFilter":
217
+ case "eth_syncing":
218
+ // @ts-expect-error fall through expected
219
+ case "eth_uninstallFilter":
220
+ const { rpcUrls: [rpcUrl], } = activeChain;
221
+ if (rpcUrl) {
222
+ const rpcClient = utils.getHttpRpcClient(rpcUrl);
223
+ let response = await rpcClient.request({
224
+ body: {
225
+ method,
226
+ params,
227
+ id: id++,
228
+ },
229
+ });
230
+ if (response.error) {
231
+ throw new viem.RpcRequestError({
232
+ body: { method, params },
233
+ error: response.error,
234
+ url: rpcUrl,
235
+ });
236
+ }
237
+ // Set connected status upon successful Ethereum RPC request
238
+ setConnected(true, { chainId: activeChain.chainId });
239
+ return response.result;
240
+ }
241
+ default:
242
+ throw new viem.MethodNotSupportedRpcError(new Error(`Invalid method: ${method}`));
243
+ }
244
+ }
245
+ catch (error) {
246
+ if ((error.name === "HttpRequestError" &&
247
+ error.details === "fetch failed") ||
248
+ (error instanceof http.ZeroXKeyRequestError && _0xkey.zeroXKeyIsDisconnected(error))) {
249
+ setConnected(false, error);
250
+ }
251
+ throw error;
252
+ }
253
+ };
254
+ if (Array.isArray(chains) && chains.length > 0) {
255
+ for (const chain of chains) {
256
+ await request({
257
+ method: "wallet_addEthereumChain",
258
+ params: [chain],
259
+ });
260
+ }
261
+ }
262
+ isInitialized = true;
263
+ return {
264
+ on: eventEmitter.on.bind(eventEmitter),
265
+ removeListener: eventEmitter.removeListener.bind(eventEmitter),
266
+ request,
267
+ };
268
+ };
269
+
270
+ exports.createEIP1193Provider = createEIP1193Provider;
271
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":["ProviderDisconnectedError","ChainDisconnectedError","VERSION","signMessage","getAddress","hashTypedData","preprocessTransaction","signTransaction","validateChain","ChainIdMismatchError","UnrecognizedChainError","getHttpRpcClient","RpcRequestError","MethodNotSupportedRpcError","ZeroXKeyRequestError","zeroXKeyIsDisconnected"],"mappings":"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"}
package/dist/index.mjs ADDED
@@ -0,0 +1,269 @@
1
+ import { ZeroXKeyRequestError } from '@0xkey-io/http';
2
+ import { MethodNotSupportedRpcError, RpcRequestError, ProviderDisconnectedError, ChainDisconnectedError } from 'viem';
3
+ import { getHttpRpcClient, getAddress, hashTypedData } from 'viem/utils';
4
+ import EventEmitter from 'events';
5
+ import { validateChain, preprocessTransaction } from './utils.mjs';
6
+ import { signTransaction, signMessage, zeroXKeyIsDisconnected } from './0xkey.mjs';
7
+ import { UnrecognizedChainError, ChainIdMismatchError } from './errors.mjs';
8
+ import { VERSION } from './version.mjs';
9
+
10
+ const createEIP1193Provider = async (options) => {
11
+ const { zeroXKeyClient, organizationId, walletId, chains } = options;
12
+ // Used for public RPC requests
13
+ let id = 0;
14
+ // `activeChain` holds the current Ethereum chain that the provider is operating on to.
15
+ // It is set when the provider successfully switches to a new chain via `wallet_switchEthereumChain`
16
+ // or adds a new chain with `wallet_addEthereumChain`. This variable is crucial for ensuring that
17
+ // the provider operates with the correct chain context, including chain ID and RPC URLs.
18
+ let activeChain;
19
+ let addedChains = [];
20
+ const accounts = new Set();
21
+ // Initialize eventEmitter with a Proxy directly
22
+ const eventEmitter = new EventEmitter();
23
+ // `isInitialized` indicates that the provider is setup and ready to use.
24
+ // Used to skip setting connected for the initial RPC requests.
25
+ let isInitialized = false;
26
+ let lastEmittedEvent;
27
+ function setConnected(connected, data) {
28
+ if (!isInitialized)
29
+ return;
30
+ // Find the currently selected chain and update its connected status
31
+ addedChains = addedChains.map((chain) => chain.chainId === activeChain.chainId ? { ...chain, connected } : chain);
32
+ if (connected && lastEmittedEvent !== "connect" && isInitialized) {
33
+ // Emit 'connect' event when the provider becomes connected as per EIP-1193
34
+ // See https://eips.ethereum.org/EIPS/eip-1193#connect
35
+ eventEmitter.emit("connect", data);
36
+ lastEmittedEvent = "connect";
37
+ }
38
+ else if (addedChains.every(({ connected }) => !connected) &&
39
+ lastEmittedEvent !== "disconnect") {
40
+ // Emit 'disconnect' event when disconnected from all chains
41
+ // See https://eips.ethereum.org/EIPS/eip-1193#disconnect
42
+ const providerDisconnectedError = new ProviderDisconnectedError(data);
43
+ eventEmitter.emit("disconnect", providerDisconnectedError);
44
+ // Reset 'connect' emitted flag on disconnect
45
+ lastEmittedEvent = "disconnect";
46
+ throw providerDisconnectedError;
47
+ }
48
+ else if (!connected) {
49
+ // Provider is disconnected from currentChain but connected to at least 1 other chain
50
+ // Provider is still considered 'connected' & we don't emit unless all chains disconnected
51
+ // See https://eips.ethereum.org/EIPS/eip-1193#provider-errors
52
+ throw new ChainDisconnectedError(data);
53
+ }
54
+ }
55
+ const request = async ({ method, params, }) => {
56
+ try {
57
+ switch (method) {
58
+ case "web3_clientVersion": {
59
+ return VERSION;
60
+ }
61
+ /**
62
+ * Requests that the user provide an Ethereum address to be identified by.
63
+ * This method is specified by [EIP-1102](https://eips.ethereum.org/EIPS/eip-1102)
64
+ * This method must be called first to establish the connectivity of the client.
65
+ * @returns {Promise<Address[]>} An array of addresses after user authorization.
66
+ */
67
+ case "eth_requestAccounts": {
68
+ // Note: In the future we should add a way for developers to surface a UI
69
+ // for user to select their accounts. For now it just returns all accounts
70
+ // for the provided walletId
71
+ const walletAccounts = await zeroXKeyClient.getWalletAccounts({
72
+ organizationId,
73
+ walletId,
74
+ });
75
+ walletAccounts.accounts.map(({ address, addressFormat, }) => {
76
+ if (addressFormat === "ADDRESS_FORMAT_ETHEREUM") {
77
+ accounts.add(address);
78
+ }
79
+ });
80
+ setConnected(true, { chainId: activeChain.chainId });
81
+ return [...accounts];
82
+ }
83
+ /**
84
+ * Returns a list of addresses owned by the user.
85
+ * @returns {Promise<Address[]>} An array of addresses owned by the user.
86
+ */
87
+ case "eth_accounts":
88
+ setConnected(true, { chainId: activeChain.chainId });
89
+ return [...accounts];
90
+ case "personal_sign": {
91
+ const [message, signWith] = params;
92
+ const signedMessage = await signMessage({
93
+ organizationId,
94
+ message,
95
+ signWith: getAddress(signWith),
96
+ client: zeroXKeyClient,
97
+ });
98
+ setConnected(true, { chainId: activeChain.chainId });
99
+ return signedMessage;
100
+ }
101
+ case "eth_sign": {
102
+ const [signWith, message] = params;
103
+ const signedMessage = await signMessage({
104
+ organizationId,
105
+ message,
106
+ signWith: getAddress(signWith),
107
+ client: zeroXKeyClient,
108
+ });
109
+ setConnected(true, { chainId: activeChain.chainId });
110
+ return signedMessage;
111
+ }
112
+ case "eth_signTypedData_v4": {
113
+ const [signWith, typedData] = params;
114
+ const message = hashTypedData(typedData);
115
+ const signedMessage = await signMessage({
116
+ organizationId,
117
+ message,
118
+ signWith: getAddress(signWith),
119
+ client: zeroXKeyClient,
120
+ });
121
+ setConnected(true, { chainId: activeChain.chainId });
122
+ return signedMessage;
123
+ }
124
+ case "eth_signTransaction": {
125
+ const [transaction] = params;
126
+ const unsignedTransaction = preprocessTransaction({ ...transaction });
127
+ const signedTransaction = await signTransaction({
128
+ organizationId,
129
+ unsignedTransaction,
130
+ signWith: getAddress(transaction.from),
131
+ client: zeroXKeyClient,
132
+ });
133
+ setConnected(true, { chainId: activeChain.chainId });
134
+ return `0x${signedTransaction}`;
135
+ }
136
+ case "wallet_addEthereumChain": {
137
+ const [chain] = params;
138
+ // Validate the to be added
139
+ validateChain(chain, addedChains);
140
+ // Store the current connected chain for potential rollback
141
+ const previousActiveChain = activeChain;
142
+ // Update the connected chain to the new chain
143
+ activeChain = chain;
144
+ // Verify the specified chain ID matches the return value of eth_chainId from the endpoint
145
+ const rpcChainId = await request({ method: "eth_chainId" });
146
+ if (activeChain.chainId !== rpcChainId) {
147
+ // Revert to the previous connected chain or to undefined if no other chain connected
148
+ activeChain = previousActiveChain;
149
+ throw new ChainIdMismatchError(chain.chainId, rpcChainId);
150
+ }
151
+ // Only add if it hasn't been added already
152
+ if (!addedChains.some((c) => c.chainId === rpcChainId)) {
153
+ addedChains.push({ ...chain, connected: true });
154
+ }
155
+ return null;
156
+ }
157
+ case "wallet_switchEthereumChain": {
158
+ const [targetChainId] = params;
159
+ const targetChain = addedChains.find((chain) => {
160
+ return chain.chainId === targetChainId.chainId;
161
+ });
162
+ if (!targetChain) {
163
+ throw new UnrecognizedChainError(targetChainId.chainId);
164
+ }
165
+ activeChain = targetChain;
166
+ eventEmitter.emit("chainChanged", { chainId: activeChain.chainId });
167
+ return null;
168
+ }
169
+ // @ts-expect-error fall through expected
170
+ case "eth_sendTransaction": {
171
+ const [transaction] = params;
172
+ const signedTransaction = await request({
173
+ method: "eth_signTransaction",
174
+ params: [transaction],
175
+ });
176
+ // Change the method to 'eth_sendRawTransaction' and pass the signed transaction
177
+ method = "eth_sendRawTransaction";
178
+ params = [signedTransaction];
179
+ // Fall through to 'eth_sendRawTransaction' case
180
+ }
181
+ case "eth_sendRawTransaction":
182
+ case "eth_chainId":
183
+ case "eth_subscribe":
184
+ case "eth_unsubscribe":
185
+ case "eth_blobBaseFee":
186
+ case "eth_blockNumber":
187
+ case "eth_call":
188
+ case "eth_coinbase":
189
+ case "eth_estimateGas":
190
+ case "eth_feeHistory":
191
+ case "eth_gasPrice":
192
+ case "eth_getBalance":
193
+ case "eth_getBlockByHash":
194
+ case "eth_getBlockByNumber":
195
+ case "eth_getBlockReceipts":
196
+ case "eth_getBlockTransactionCountByHash":
197
+ case "eth_getBlockTransactionCountByNumber":
198
+ case "eth_getCode":
199
+ case "eth_getFilterChanges":
200
+ case "eth_getFilterLogs":
201
+ case "eth_getLogs":
202
+ case "eth_getProof":
203
+ case "eth_getStorageAt":
204
+ case "eth_getTransactionByBlockHashAndIndex":
205
+ case "eth_getTransactionByBlockNumberAndIndex":
206
+ case "eth_getTransactionByHash":
207
+ case "eth_getTransactionCount":
208
+ case "eth_getTransactionReceipt":
209
+ case "eth_getUncleCountByBlockHash":
210
+ case "eth_getUncleCountByBlockNumber":
211
+ case "eth_maxPriorityFeePerGas":
212
+ case "eth_newBlockFilter":
213
+ case "eth_newFilter":
214
+ case "eth_newPendingTransactionFilter":
215
+ case "eth_syncing":
216
+ // @ts-expect-error fall through expected
217
+ case "eth_uninstallFilter":
218
+ const { rpcUrls: [rpcUrl], } = activeChain;
219
+ if (rpcUrl) {
220
+ const rpcClient = getHttpRpcClient(rpcUrl);
221
+ let response = await rpcClient.request({
222
+ body: {
223
+ method,
224
+ params,
225
+ id: id++,
226
+ },
227
+ });
228
+ if (response.error) {
229
+ throw new RpcRequestError({
230
+ body: { method, params },
231
+ error: response.error,
232
+ url: rpcUrl,
233
+ });
234
+ }
235
+ // Set connected status upon successful Ethereum RPC request
236
+ setConnected(true, { chainId: activeChain.chainId });
237
+ return response.result;
238
+ }
239
+ default:
240
+ throw new MethodNotSupportedRpcError(new Error(`Invalid method: ${method}`));
241
+ }
242
+ }
243
+ catch (error) {
244
+ if ((error.name === "HttpRequestError" &&
245
+ error.details === "fetch failed") ||
246
+ (error instanceof ZeroXKeyRequestError && zeroXKeyIsDisconnected(error))) {
247
+ setConnected(false, error);
248
+ }
249
+ throw error;
250
+ }
251
+ };
252
+ if (Array.isArray(chains) && chains.length > 0) {
253
+ for (const chain of chains) {
254
+ await request({
255
+ method: "wallet_addEthereumChain",
256
+ params: [chain],
257
+ });
258
+ }
259
+ }
260
+ isInitialized = true;
261
+ return {
262
+ on: eventEmitter.on.bind(eventEmitter),
263
+ removeListener: eventEmitter.removeListener.bind(eventEmitter),
264
+ request,
265
+ };
266
+ };
267
+
268
+ export { createEIP1193Provider };
269
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /// <reference types="node" />
2
+ import type { ZeroXKeyClient } from "@0xkey-io/http";
3
+ import type { ZeroXKeyBrowserClient } from "@0xkey-io/sdk-browser";
4
+ import type { UUID } from "crypto";
5
+ import type { AddEthereumChainParameter, Address, Chain, EIP1193Provider, EIP1193RequestFn, EIP1474Methods, Hash, TypedDataDefinition } from "viem";
6
+ export type ZeroXKeyEIP1193ProviderOptions = {
7
+ walletId: UUID;
8
+ organizationId: UUID;
9
+ zeroXKeyClient: ZeroXKeyClient | ZeroXKeyBrowserClient;
10
+ chains: AddEthereumChainParameter[];
11
+ };
12
+ export type ZeroXKeyEIP1193Provider = Omit<EIP1193Provider, "request"> & {
13
+ request: EIP1193RequestFn<[
14
+ ...EIP1474Methods,
15
+ {
16
+ Method: "eth_signTypedData_v4";
17
+ Parameters: [address: Address, typedData: TypedDataDefinition];
18
+ ReturnType: Promise<Hash>;
19
+ }
20
+ ]>;
21
+ };
22
+ export type ProviderChain = Omit<Chain, "nativeCurrency"> & {
23
+ nativeCurrency?: Chain["nativeCurrency"] | undefined;
24
+ };
25
+ export type HTTPSUrl = `https://${string}`;
26
+ export type WalletAddEthereumChain = Omit<AddEthereumChainParameter, "rpcUrls" | "blockExplorerUrls"> & {
27
+ rpcUrls: [string, ...string[]];
28
+ blockExplorerUrls: [HTTPSUrl, ...HTTPSUrl[]] | null;
29
+ };
30
+ export interface ConnectInfo {
31
+ chainId: string;
32
+ }
33
+ export type TransactionType = "legacy" | "eip2930" | "eip1559" | "eip4844" | "eip7702" | undefined;
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EACV,yBAAyB,EACzB,OAAO,EACP,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,IAAI,EACJ,mBAAmB,EACpB,MAAM,MAAM,CAAC;AAEd,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,EAAE,IAAI,CAAC;IACf,cAAc,EAAE,IAAI,CAAC;IACrB,cAAc,EAAE,cAAc,GAAG,qBAAqB,CAAC;IACvD,MAAM,EAAE,yBAAyB,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG;IACvE,OAAO,EAAE,gBAAgB,CACvB;QACE,GAAG,cAAc;QACjB;YACE,MAAM,EAAE,sBAAsB,CAAC;YAC/B,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;YAC/D,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;SAC3B;KACF,CACF,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,GAAG;IAC1D,cAAc,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,WAAW,MAAM,EAAE,CAAC;AAE3C,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,yBAAyB,EACzB,SAAS,GAAG,mBAAmB,CAChC,GAAG;IACF,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC/B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;CACrD,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { AddEthereumChainParameter, Chain, RpcTransactionRequest } from "viem";
2
+ import type { WalletAddEthereumChain } from "./types";
3
+ export declare const preprocessTransaction: ({ from, ...transaction }: RpcTransactionRequest) => string;
4
+ export declare const isValidUrl: (url: string) => boolean;
5
+ export declare const validateBlockExplorerUrls: (blockExplorerUrls: WalletAddEthereumChain["blockExplorerUrls"], chainName: string) => Chain["blockExplorers"];
6
+ /**
7
+ * Validates the array of RPC URLs provided in the AddEthereumChainParameter.
8
+ * It checks if the array is not empty and if every URL in the array starts with "https://".
9
+ * Throws an RpcUrlsRequiredError if the array is empty or undefined.
10
+ * Throws an InvalidRpcUrlError if any URL in the array does not start with "https://".
11
+ *
12
+ * @param {AddEthereumChainParameter['rpcUrls']} rpcUrls - The array of RPC URLs to validate.
13
+ * @throws {RpcUrlsRequiredError} If the rpcUrls array is empty or undefined.
14
+ * @throws {InvalidRpcUrlError} If any URL in the rpcUrls array is invalid.
15
+ */
16
+ export declare const validateRpcUrls: (rpcUrls: AddEthereumChainParameter["rpcUrls"]) => void;
17
+ export declare const validateChain: (chain: AddEthereumChainParameter, addedChains: AddEthereumChainParameter[]) => void;
18
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,KAAK,EACL,qBAAqB,EAGtB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,sBAAsB,EAAmB,MAAM,SAAS,CAAC;AAavE,eAAO,MAAM,qBAAqB,6BAG/B,qBAAqB,WA0CvB,CAAC;AAEF,eAAO,MAAM,UAAU,QAAS,MAAM,YAMrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,sBACjB,sBAAsB,CAAC,mBAAmB,CAAC,aACnD,MAAM,KAChB,KAAK,CAAC,gBAAgB,CAexB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,YACjB,yBAAyB,CAAC,SAAS,CAAC,KAC5C,IAOF,CAAC;AAEF,eAAO,MAAM,aAAa,UACjB,yBAAyB,eACnB,yBAAyB,EAAE,SA4DzC,CAAC"}