@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/CHANGELOG.md +5 -0
- package/LICENSE +201 -0
- package/README.md +133 -0
- package/dist/0xkey.d.ts +34 -0
- package/dist/0xkey.d.ts.map +1 -0
- package/dist/0xkey.js +112 -0
- package/dist/0xkey.js.map +1 -0
- package/dist/0xkey.mjs +107 -0
- package/dist/0xkey.mjs.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +25 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.mjs +21 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/errors.d.ts +33 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +90 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.mjs +80 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/index.d.ts +476 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +271 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +269 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils.d.ts +18 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +110 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +105 -0
- package/dist/utils.mjs.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/dist/version.mjs +4 -0
- package/dist/version.mjs.map +1 -0
- package/package.json +63 -0
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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -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"}
|