@etherplay/wallet-connector-ethereum 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +116 -12
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +134 -45
- package/dist/provider.js.map +1 -1
- package/package.json +28 -3
- package/src/index.ts +108 -12
- package/src/provider.ts +169 -50
package/README.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# @etherplay/wallet-connector-ethereum
|
|
2
|
+
|
|
3
|
+
Ethereum wallet connector implementation for the `@etherplay/connect` ecosystem. This package provides EIP-6963 provider detection, account management, and chain switching support for Ethereum-compatible wallets.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @etherplay/wallet-connector-ethereum
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @etherplay/wallet-connector-ethereum
|
|
11
|
+
# or
|
|
12
|
+
yarn add @etherplay/wallet-connector-ethereum
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
- **EIP-6963 Support**: Automatic detection of multiple wallet providers via the EIP-6963 standard
|
|
18
|
+
- **Account Generation**: Generate Ethereum accounts from BIP-39 mnemonics using standard derivation paths (m/44'/60'/0'/0/x)
|
|
19
|
+
- **Message Signing**: Support for EIP-191 personal_sign messages
|
|
20
|
+
- **Chain Management**: Switch and add Ethereum chains
|
|
21
|
+
- **Always-On Provider**: Fallback RPC provider for read operations
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
### Basic Setup
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import {EthereumWalletConnector} from '@etherplay/wallet-connector-ethereum';
|
|
29
|
+
|
|
30
|
+
const connector = new EthereumWalletConnector();
|
|
31
|
+
|
|
32
|
+
// Fetch available wallets (EIP-6963)
|
|
33
|
+
connector.fetchWallets((walletHandle) => {
|
|
34
|
+
console.log('Wallet found:', walletHandle.info.name);
|
|
35
|
+
// walletHandle.walletProvider is ready to use
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Account Generation
|
|
40
|
+
|
|
41
|
+
Generate Ethereum accounts from a BIP-39 mnemonic phrase:
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
const connector = new EthereumWalletConnector();
|
|
45
|
+
|
|
46
|
+
// Generate account at index 0
|
|
47
|
+
const account = connector.accountGenerator.fromMnemonicToAccount(
|
|
48
|
+
'your twelve word mnemonic phrase goes here and more words',
|
|
49
|
+
0,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
console.log(account.address); // 0x...
|
|
53
|
+
console.log(account.publicKey); // 0x...
|
|
54
|
+
console.log(account.privateKey); // 0x...
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Message Signing
|
|
58
|
+
|
|
59
|
+
Sign messages using EIP-191 personal_sign:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const connector = new EthereumWalletConnector();
|
|
63
|
+
|
|
64
|
+
const signature = await connector.accountGenerator.signTextMessage('Hello, Ethereum!', account.privateKey);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Always-On Provider
|
|
68
|
+
|
|
69
|
+
Create a provider that falls back to an RPC endpoint when no wallet is connected:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
const connector = new EthereumWalletConnector();
|
|
73
|
+
|
|
74
|
+
const provider = connector.createAlwaysOnProvider({
|
|
75
|
+
endpoint: 'https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY',
|
|
76
|
+
chainId: '1',
|
|
77
|
+
prioritizeWalletProvider: true, // Use wallet if available
|
|
78
|
+
requestsPerSecond: 10,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// The provider can now be used for read operations
|
|
82
|
+
// even when no wallet is connected
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Wallet Provider Operations
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
connector.fetchWallets(async (walletHandle) => {
|
|
89
|
+
const {walletProvider} = walletHandle;
|
|
90
|
+
|
|
91
|
+
// Request account access
|
|
92
|
+
const accounts = await walletProvider.requestAccounts();
|
|
93
|
+
|
|
94
|
+
// Get current chain
|
|
95
|
+
const chainId = await walletProvider.getChainId();
|
|
96
|
+
|
|
97
|
+
// Sign a message
|
|
98
|
+
const signature = await walletProvider.signMessage('Sign this message', accounts[0]);
|
|
99
|
+
|
|
100
|
+
// Switch to a different chain
|
|
101
|
+
await walletProvider.switchChain('0x89'); // Polygon
|
|
102
|
+
|
|
103
|
+
// Add a new chain
|
|
104
|
+
await walletProvider.addChain({
|
|
105
|
+
chainId: '0x89',
|
|
106
|
+
chainName: 'Polygon Mainnet',
|
|
107
|
+
rpcUrls: ['https://polygon-rpc.com'],
|
|
108
|
+
nativeCurrency: {
|
|
109
|
+
name: 'MATIC',
|
|
110
|
+
symbol: 'MATIC',
|
|
111
|
+
decimals: 18,
|
|
112
|
+
},
|
|
113
|
+
blockExplorerUrls: ['https://polygonscan.com'],
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Listen for account changes
|
|
117
|
+
walletProvider.listenForAccountsChanged((accounts) => {
|
|
118
|
+
console.log('Accounts changed:', accounts);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Listen for chain changes
|
|
122
|
+
walletProvider.listenForChainChanged((chainId) => {
|
|
123
|
+
console.log('Chain changed:', chainId);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## API Reference
|
|
129
|
+
|
|
130
|
+
### EthereumWalletConnector
|
|
131
|
+
|
|
132
|
+
Main connector class implementing `WalletConnector<CurriedRPC<Methods>>`:
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
class EthereumWalletConnector {
|
|
136
|
+
accountGenerator: AccountGenerator;
|
|
137
|
+
fetchWallets(walletAnnounced: (walletHandle: WalletHandle<CurriedRPC<Methods>>) => void): void;
|
|
138
|
+
createAlwaysOnProvider(params: {
|
|
139
|
+
endpoint: string | UnderlyingEthereumProvider;
|
|
140
|
+
chainId: string;
|
|
141
|
+
prioritizeWalletProvider?: boolean;
|
|
142
|
+
requestsPerSecond?: number;
|
|
143
|
+
}): AlwaysOnProviderWrapper<CurriedRPC<Methods>>;
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### EthereumAccountGenerator
|
|
148
|
+
|
|
149
|
+
Account generator for Ethereum using BIP-32/BIP-39 standards:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
class EthereumAccountGenerator implements AccountGenerator {
|
|
153
|
+
type: 'ethereum';
|
|
154
|
+
fromMnemonicToAccount(mnemonic: string, index: number): PrivateKeyAccount;
|
|
155
|
+
signTextMessage(message: string, privateKey: `0x${string}`): Promise<`0x${string}`>;
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### EthereumWalletProvider
|
|
160
|
+
|
|
161
|
+
Wrapper for EIP-1193 wallet providers:
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
class EthereumWalletProvider implements WalletProvider<CurriedRPC<Methods>> {
|
|
165
|
+
underlyingProvider: CurriedRPC<Methods>;
|
|
166
|
+
signMessage(message: string, account: `0x${string}`): Promise<`0x${string}`>;
|
|
167
|
+
getChainId(): Promise<`0x${string}`>;
|
|
168
|
+
getAccounts(): Promise<`0x${string}`[]>;
|
|
169
|
+
requestAccounts(): Promise<`0x${string}`[]>;
|
|
170
|
+
listenForAccountsChanged(handler: (accounts: `0x${string}`[]) => void): void;
|
|
171
|
+
stopListenForAccountsChanged(handler: (accounts: `0x${string}`[]) => void): void;
|
|
172
|
+
listenForChainChanged(handler: (chainId: `0x${string}`) => void): void;
|
|
173
|
+
stopListenForChainChanged(handler: (chainId: `0x${string}`) => void): void;
|
|
174
|
+
switchChain(chainId: string): Promise<null | any>;
|
|
175
|
+
addChain(chainInfo: ChainInfo): Promise<null | any>;
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Utility Functions
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
// Add 0x prefix to hex string
|
|
183
|
+
add0x(hex: string): string;
|
|
184
|
+
|
|
185
|
+
// Remove 0x prefix from hex string
|
|
186
|
+
strip0x(hex: string): string;
|
|
187
|
+
|
|
188
|
+
// Get checksummed address
|
|
189
|
+
addChecksum(nonChecksummedAddress: string): string;
|
|
190
|
+
|
|
191
|
+
// Derive address from public key
|
|
192
|
+
fromPublicKey(key: string | Uint8Array): string;
|
|
193
|
+
|
|
194
|
+
// Derive address from private key
|
|
195
|
+
fromPrivateKey(key: string | Uint8Array): string;
|
|
196
|
+
|
|
197
|
+
// Hash a text message for signing (EIP-191)
|
|
198
|
+
hashTextMessage(str: string): string;
|
|
199
|
+
|
|
200
|
+
// Derive HD key from mnemonic
|
|
201
|
+
fromMnemonicToHDKey(mnemonic: string, index: number): HDKey;
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Dependencies
|
|
205
|
+
|
|
206
|
+
- `@etherplay/wallet-connector` - Core interfaces
|
|
207
|
+
- `@noble/curves` - Cryptographic curve operations
|
|
208
|
+
- `@noble/hashes` - Hash functions
|
|
209
|
+
- `@scure/bip32` - HD wallet derivation
|
|
210
|
+
- `@scure/bip39` - Mnemonic phrase handling
|
|
211
|
+
- `remote-procedure-call` - RPC utilities
|
|
212
|
+
|
|
213
|
+
## Related Packages
|
|
214
|
+
|
|
215
|
+
- [`@etherplay/wallet-connector`](../etherplay-wallet-connector) - Core wallet connector interfaces
|
|
216
|
+
- [`@etherplay/connect`](../etherplay-connect) - Main connection library
|
|
217
|
+
- [`@etherplay/alchemy`](../etherplay-alchemy) - Social login mechanisms
|
|
218
|
+
|
|
219
|
+
## License
|
|
220
|
+
|
|
221
|
+
MIT
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,eAAe,EACf,SAAS,EACT,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAiB,2BAA2B,EAAE,OAAO,EAAC,MAAM,UAAU,CAAC;AAGnF,OAAO,EAAuB,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAWnC,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AACD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,OAAO,QAEhC;AAGD,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM;;;EAUpC;AAED,wBAAgB,WAAW,CAAC,qBAAqB,EAAE,MAAM,GAAG,MAAM,CAUjE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAK9D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAG/D;AAGD,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAE7D,UAAU,mBAAmB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAED,UAAU,qBAAqB;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,2BAA2B,CAAC;CACtC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -56,25 +56,128 @@ export function fromPrivateKey(key) {
|
|
|
56
56
|
key = strip0x(key);
|
|
57
57
|
return fromPublicKey(secp256k1.getPublicKey(key, false));
|
|
58
58
|
}
|
|
59
|
+
function detectWindowEthereumInfo(provider) {
|
|
60
|
+
const p = provider;
|
|
61
|
+
// Check for common wallet flags
|
|
62
|
+
// Order matters - more specific checks first
|
|
63
|
+
let name = 'Browser Wallet';
|
|
64
|
+
if (p.isMetaMask && !p.isRabby && !p.isBraveWallet) {
|
|
65
|
+
name = 'MetaMask';
|
|
66
|
+
}
|
|
67
|
+
else if (p.isCoinbaseWallet) {
|
|
68
|
+
name = 'Coinbase Wallet';
|
|
69
|
+
}
|
|
70
|
+
else if (p.isTrust) {
|
|
71
|
+
name = 'Trust Wallet';
|
|
72
|
+
}
|
|
73
|
+
else if (p.isRabby) {
|
|
74
|
+
name = 'Rabby';
|
|
75
|
+
}
|
|
76
|
+
else if (p.isBraveWallet) {
|
|
77
|
+
name = 'Brave Wallet';
|
|
78
|
+
}
|
|
79
|
+
else if (p.isPhantom) {
|
|
80
|
+
name = 'Phantom';
|
|
81
|
+
}
|
|
82
|
+
else if (p.isRainbow) {
|
|
83
|
+
name = 'Rainbow';
|
|
84
|
+
}
|
|
85
|
+
else if (p.isTokenPocket) {
|
|
86
|
+
name = 'TokenPocket';
|
|
87
|
+
}
|
|
88
|
+
else if (p.isOKExWallet || p.isOkxWallet) {
|
|
89
|
+
name = 'OKX Wallet';
|
|
90
|
+
}
|
|
91
|
+
else if (p.isBitKeep) {
|
|
92
|
+
name = 'BitKeep';
|
|
93
|
+
}
|
|
94
|
+
else if (p.isZerion) {
|
|
95
|
+
name = 'Zerion';
|
|
96
|
+
}
|
|
97
|
+
else if (p.isFrame) {
|
|
98
|
+
name = 'Frame';
|
|
99
|
+
}
|
|
100
|
+
else if (p.isTally) {
|
|
101
|
+
name = 'Taho';
|
|
102
|
+
}
|
|
103
|
+
else if (p.isOneInch) {
|
|
104
|
+
name = '1inch Wallet';
|
|
105
|
+
}
|
|
106
|
+
else if (p.isImToken) {
|
|
107
|
+
name = 'imToken';
|
|
108
|
+
}
|
|
109
|
+
else if (p.isMathWallet) {
|
|
110
|
+
name = 'MathWallet';
|
|
111
|
+
}
|
|
112
|
+
else if (p.isTokenary) {
|
|
113
|
+
name = 'Tokenary';
|
|
114
|
+
}
|
|
115
|
+
else if (p.isStatus) {
|
|
116
|
+
name = 'Status';
|
|
117
|
+
}
|
|
118
|
+
else if (p.isXDEFI) {
|
|
119
|
+
name = 'XDEFI';
|
|
120
|
+
}
|
|
121
|
+
else if (p.isExodus) {
|
|
122
|
+
name = 'Exodus';
|
|
123
|
+
}
|
|
124
|
+
else if (p.isOpera) {
|
|
125
|
+
name = 'Opera Wallet';
|
|
126
|
+
}
|
|
127
|
+
else if (p.isGamestop) {
|
|
128
|
+
name = 'GameStop Wallet';
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
uuid: 'window.ethereum',
|
|
132
|
+
name,
|
|
133
|
+
icon: '', // No icon available for window.ethereum
|
|
134
|
+
rdns: 'window.ethereum',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
59
137
|
function createWalletFetcher() {
|
|
60
138
|
const walletHandles = [];
|
|
61
139
|
const walletAnnouncementFunctions = [];
|
|
140
|
+
const eip6963Providers = [];
|
|
62
141
|
let requesting = false;
|
|
142
|
+
let windowEthereumProviderAdded;
|
|
143
|
+
function announceWallet(walletHandle) {
|
|
144
|
+
walletHandles.push(walletHandle);
|
|
145
|
+
for (const walletAnnounced of walletAnnouncementFunctions) {
|
|
146
|
+
walletAnnounced(walletHandle);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
63
149
|
function onWalletAnnounced(event) {
|
|
64
150
|
const { detail } = event;
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
151
|
+
// Track EIP6963 providers to detect duplicates with window.ethereum
|
|
152
|
+
eip6963Providers.push(detail.provider);
|
|
153
|
+
// Skip if this provider was already added via window.ethereum fallback
|
|
154
|
+
if (windowEthereumProviderAdded && detail.provider === windowEthereumProviderAdded) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
70
157
|
const walletHandle = {
|
|
71
158
|
walletProvider: new EthereumWalletProvider(detail.provider),
|
|
72
159
|
info: detail.info,
|
|
73
160
|
};
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
161
|
+
announceWallet(walletHandle);
|
|
162
|
+
}
|
|
163
|
+
function addWindowEthereumIfNeeded() {
|
|
164
|
+
if (windowEthereumProviderAdded)
|
|
165
|
+
return;
|
|
166
|
+
const windowEthereumProvider = window.ethereum;
|
|
167
|
+
if (!windowEthereumProvider)
|
|
168
|
+
return;
|
|
169
|
+
// Check if window.ethereum was already announced via EIP6963
|
|
170
|
+
const alreadyAnnounced = eip6963Providers.some((provider) => provider === windowEthereumProvider);
|
|
171
|
+
if (alreadyAnnounced)
|
|
172
|
+
return;
|
|
173
|
+
// Mark as added before announcing to prevent race conditions
|
|
174
|
+
windowEthereumProviderAdded = windowEthereumProvider;
|
|
175
|
+
// Add window.ethereum with fallback info (for mobile wallet browsers without EIP6963)
|
|
176
|
+
const walletHandle = {
|
|
177
|
+
walletProvider: new EthereumWalletProvider(windowEthereumProvider),
|
|
178
|
+
info: detectWindowEthereumInfo(windowEthereumProvider),
|
|
179
|
+
};
|
|
180
|
+
announceWallet(walletHandle);
|
|
78
181
|
}
|
|
79
182
|
function fetchWallets(walletAnnounced) {
|
|
80
183
|
walletAnnouncementFunctions.push(walletAnnounced);
|
|
@@ -85,11 +188,12 @@ function createWalletFetcher() {
|
|
|
85
188
|
}
|
|
86
189
|
else if (typeof window !== 'undefined') {
|
|
87
190
|
requesting = true;
|
|
88
|
-
//
|
|
89
|
-
// console.log(defaultProvider);
|
|
90
|
-
// TODO ?
|
|
191
|
+
// First listen for EIP6963 announcements (they have proper name/icon info)
|
|
91
192
|
window.addEventListener('eip6963:announceProvider', onWalletAnnounced);
|
|
92
193
|
window.dispatchEvent(new Event('eip6963:requestProvider'));
|
|
194
|
+
// After a short delay, add window.ethereum if it wasn't announced via EIP6963
|
|
195
|
+
// This handles mobile wallet browsers that don't support EIP6963
|
|
196
|
+
setTimeout(addWindowEthereumIfNeeded, 100);
|
|
93
197
|
}
|
|
94
198
|
}
|
|
95
199
|
return {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AACvC,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAC,oBAAoB,EAAa,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AACnC,OAAO,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,mGAAmG;AACnG,4DAA4D;AAC5D,mGAAmG;AACnG,MAAM,aAAa,GAAG,QAAQ,CAAC;AAC/B,MAAM,UAAU,OAAO,CAAC,GAAW;IAClC,OAAO,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AACD,MAAM,UAAU,KAAK,CAAC,GAAW;IAChC,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,EAAE,GAAG,8BAA8B,CAAC;AAC1C,MAAM,UAAU,KAAK,CAAC,OAAe;IACpC,IAAI,CAAC,OAAO,CAAC,CAAC;IACd,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,kBAAkB,OAAO,CAAC,MAAM,SAAS,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,qBAA6B;IACxD,MAAM,GAAG,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,WAAW,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,4BAA4B;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAwB;IACrD,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe;AAClE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAwB;IACtD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC;AAkBD,SAAS,mBAAmB;IAC3B,MAAM,aAAa,GAAwC,EAAE,CAAC;IAC9D,MAAM,2BAA2B,GAAiC,EAAE,CAAC;IACrE,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,SAAS,iBAAiB,CAAC,KAAmC;QAC7D,MAAM,EAAC,MAAM,EAAC,GAAG,KAAK,CAAC;QACvB,qCAAqC;QACrC,2CAA2C;QAC3C,qCAAqC;QACrC,6DAA6D;QAC7D,6BAA6B;QAC7B,MAAM,YAAY,GAAG;YACpB,cAAc,EAAE,IAAI,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3D,IAAI,EAAE,MAAM,CAAC,IAAI;SACjB,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjC,KAAK,MAAM,eAAe,IAAI,2BAA2B,EAAE,CAAC;YAC3D,eAAe,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC;IACD,SAAS,YAAY,CAAC,eAA2C;QAChE,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,CAAC;YAChB,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;gBAC1C,eAAe,CAAC,YAAY,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAC1C,UAAU,GAAG,IAAI,CAAC;YAClB,oDAAoD;YACpD,gCAAgC;YAChC,SAAS;YACR,MAAc,CAAC,gBAAgB,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;YAChF,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC5D,CAAC;IACF,CAAC;IACD,OAAO;QACN,YAAY;KACZ,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;AAO5C,MAAM,OAAO,uBAAuB;IACnC,gBAAgB,GAAqB,IAAI,wBAAwB,EAAE,CAAC;IACpE,YAAY,CAAC,eAAwE;QACpF,aAAa,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC;IAED,sBAAsB,CAAC,MAKtB;QACA,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACD;AAED,SAAS,KAAK,CAAC,GAAe;IAC7B,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;QAC3B,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAoB,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA6B;IAC9D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;IACtB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,mBAAmB,GAAG,gCAAgC,CAAC;AAC7D,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC,MAAM,UAAU,eAAe,CAAC,GAAW;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,mBAAmB,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1D,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,KAAa;IAClE,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,MAAM,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,OAAO,wBAAwB;IACpC,IAAI,GAAG,UAAU,CAAC;IAClB,qBAAqB,CAAC,QAAgB,EAAE,KAAa;QACpD,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAChC,CAAC;QACD,OAAO;YACN,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,WAAW,EAAmB;YACxE,UAAU,EAAE,KAAK,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAmB;YAChE,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;SAChD,CAAC;IACH,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,UAAyB;QAC/D,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC;QACnC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC;IACtE,CAAC;CACD;AAED,MAAM,OAAO,sBAAsB;IAEZ;IADN,kBAAkB,CAAsB;IACxD,YAAsB,cAA2C;QAA3C,mBAAc,GAAd,cAAc,CAA6B;QAChE,IAAI,CAAC,kBAAkB,GAAG,oBAAoB,CAAU,cAAqB,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,OAAsB;QACxD,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACtC,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;SACvC,CAA2B,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU;QACf,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACtC,MAAM,EAAE,aAAa;SACrB,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACtC,MAAM,EAAE,cAAc;SACtB,CAAC,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,eAAe;QACpB,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACtC,MAAM,EAAE,qBAAqB;SAC7B,CAAC,CAAC;IACJ,CAAC;IAED,wBAAwB,CAAC,OAA4C;QACpE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IACD,4BAA4B,CAAC,OAA4C;QACxE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IACD,qBAAqB,CAAC,OAAyC;QAC9D,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,yBAAyB,CAAC,OAAyC;QAClE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,OAAe;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACpD,MAAM,EAAE,4BAA4B;YACpC,MAAM,EAAE;gBACP;oBACC,OAAO,EAAE,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAmB;iBAClE;aACD;SACD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IACf,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,SAAoB;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACpD,MAAM,EAAE,yBAAyB;YACjC,MAAM,EAAE;gBACP;oBACC,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,iBAAiB,EAAE,SAAS,CAAC,iBAAiB;oBAC9C,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,cAAc,EAAE,SAAS,CAAC,cAAc;iBACxC;aACD;SACD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IACf,CAAC;CACD"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsE,OAAO,EAAC,MAAM,UAAU,CAAC;AAC3G,OAAO,EAAuB,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAEvE,OAAO,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsE,OAAO,EAAC,MAAM,UAAU,CAAC;AAC3G,OAAO,EAAuB,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EACN,uBAAuB,EASvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,0BAA0B,EAAC,MAAM,YAAY,CAAC;AAiNtD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACtC,QAAQ,EAAE,MAAM,GAAG,0BAA0B,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,uBAAuB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAE/C"}
|
package/dist/provider.js
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
import { createCurriedJSONRPC } from 'remote-procedure-call';
|
|
2
2
|
import { withTimeout } from './utils.js';
|
|
3
|
+
import { TRACKED_REQUEST_METHODS, TRANSACTION_METHODS, } from '@etherplay/wallet-connector';
|
|
4
|
+
// Type guard for transaction methods
|
|
5
|
+
function isTransactionMethod(method) {
|
|
6
|
+
return TRANSACTION_METHODS.includes(method);
|
|
7
|
+
}
|
|
8
|
+
// Helper to create a properly typed PendingRequest
|
|
9
|
+
function createPendingRequest(id, method, startedAt) {
|
|
10
|
+
if (isTransactionMethod(method)) {
|
|
11
|
+
return { id, method, kind: 'transaction', startedAt };
|
|
12
|
+
}
|
|
13
|
+
// TypeScript knows method is SignatureMethod here
|
|
14
|
+
return { id, method: method, kind: 'signature', startedAt };
|
|
15
|
+
}
|
|
16
|
+
// Helper to check if method should be tracked
|
|
17
|
+
function isTrackedMethod(method) {
|
|
18
|
+
return TRACKED_REQUEST_METHODS.includes(method);
|
|
19
|
+
}
|
|
3
20
|
const signerMethods = [
|
|
4
21
|
'eth_accounts',
|
|
5
22
|
'eth_sign',
|
|
@@ -16,62 +33,134 @@ class AlwaysOnEthereumProviderWrapper {
|
|
|
16
33
|
walletProvider;
|
|
17
34
|
jsonRPC;
|
|
18
35
|
status = 'disconnected';
|
|
36
|
+
// Request tracking fields
|
|
37
|
+
pendingRequests = new Map();
|
|
38
|
+
requestHandlers = new Set();
|
|
39
|
+
requestCounter = 0;
|
|
19
40
|
constructor(params) {
|
|
20
41
|
const self = this;
|
|
21
42
|
this.chainId = params.chainId;
|
|
22
43
|
this.jsonRPC = createCurriedJSONRPC(params.endpoint);
|
|
23
44
|
const provider = {
|
|
24
45
|
async request(req) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
req.method.indexOf('sign') != -1;
|
|
29
|
-
if (self.walletProvider) {
|
|
30
|
-
if (params.prioritizeWalletProvider || signingMethod) {
|
|
31
|
-
if (signingMethod) {
|
|
32
|
-
if (self.status !== 'connected') {
|
|
33
|
-
return Promise.reject({ message: 'wallet provider is not connected', code: 4001 });
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
let currentChainIdAsHex;
|
|
37
|
-
try {
|
|
38
|
-
currentChainIdAsHex = await withTimeout(self.walletProvider.request({
|
|
39
|
-
method: 'eth_chainId',
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
if (signingMethod) {
|
|
44
|
-
return Promise.reject(err);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
// we fallback on jsonRPc if error while getting chain and not a signing method
|
|
48
|
-
return self.jsonRPC.request(req);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const currentChainId = Number(currentChainIdAsHex).toString();
|
|
52
|
-
if (self.chainId !== currentChainId) {
|
|
53
|
-
if (signingMethod) {
|
|
54
|
-
return Promise.reject({
|
|
55
|
-
message: `wallet provider is connected to a different chain, expected ${self.chainId} but got ${currentChainId}`,
|
|
56
|
-
code: 4001,
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
// we fallback on jsonRPc if invalid chain and not a signing method
|
|
61
|
-
return self.jsonRPC.request(req);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return self.walletProvider.request(req);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
if (signingMethod) {
|
|
68
|
-
return Promise.reject(new Error('wallet provider is not connected'));
|
|
46
|
+
// Check if this is a tracked method
|
|
47
|
+
if (isTrackedMethod(req.method)) {
|
|
48
|
+
return self.executeTrackedRequest(req, params.prioritizeWalletProvider);
|
|
69
49
|
}
|
|
70
|
-
|
|
50
|
+
// Non-tracked methods - execute directly
|
|
51
|
+
return self.executeRequest(req, params.prioritizeWalletProvider);
|
|
71
52
|
},
|
|
72
53
|
};
|
|
73
54
|
this.provider = createCurriedJSONRPC(provider, { requestsPerSecond: params.requestsPerSecond });
|
|
74
55
|
}
|
|
56
|
+
// Event subscription
|
|
57
|
+
onRequest(handler) {
|
|
58
|
+
this.requestHandlers.add(handler);
|
|
59
|
+
return () => {
|
|
60
|
+
this.requestHandlers.delete(handler);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Get current pending requests
|
|
64
|
+
getPendingRequests() {
|
|
65
|
+
return Array.from(this.pendingRequests.values());
|
|
66
|
+
}
|
|
67
|
+
// Emit event to all handlers
|
|
68
|
+
emitRequestEvent(event) {
|
|
69
|
+
for (const handler of this.requestHandlers) {
|
|
70
|
+
try {
|
|
71
|
+
handler(event);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
console.error('Request event handler error:', e);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Generate unique request ID
|
|
79
|
+
generateRequestId() {
|
|
80
|
+
return `req_${++this.requestCounter}_${Date.now()}`;
|
|
81
|
+
}
|
|
82
|
+
// Execute tracked request with event emission
|
|
83
|
+
async executeTrackedRequest(req, prioritizeWalletProvider) {
|
|
84
|
+
const method = req.method;
|
|
85
|
+
const requestId = this.generateRequestId();
|
|
86
|
+
const pendingRequest = createPendingRequest(requestId, method, Date.now());
|
|
87
|
+
// Track and emit start event
|
|
88
|
+
this.pendingRequests.set(requestId, pendingRequest);
|
|
89
|
+
this.emitRequestEvent({ type: 'requestStart', request: pendingRequest });
|
|
90
|
+
try {
|
|
91
|
+
const result = await this.executeRequest(req, prioritizeWalletProvider);
|
|
92
|
+
// Emit success event
|
|
93
|
+
this.pendingRequests.delete(requestId);
|
|
94
|
+
this.emitRequestEvent({
|
|
95
|
+
type: 'requestEnd',
|
|
96
|
+
request: pendingRequest,
|
|
97
|
+
result: 'success',
|
|
98
|
+
});
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Determine if user rejected
|
|
103
|
+
const isRejected = error?.code === 4001;
|
|
104
|
+
// Emit end event
|
|
105
|
+
this.pendingRequests.delete(requestId);
|
|
106
|
+
this.emitRequestEvent({
|
|
107
|
+
type: 'requestEnd',
|
|
108
|
+
request: pendingRequest,
|
|
109
|
+
result: isRejected ? 'rejected' : 'error',
|
|
110
|
+
error: isRejected ? undefined : error,
|
|
111
|
+
});
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Execute request (original request routing logic)
|
|
116
|
+
async executeRequest(req, prioritizeWalletProvider) {
|
|
117
|
+
const signingMethod = signerMethods.includes(req.method) ||
|
|
118
|
+
connectedAccountMethods.includes(req.method) ||
|
|
119
|
+
walletOnlyMethods.includes(req.method) ||
|
|
120
|
+
req.method.indexOf('sign') != -1;
|
|
121
|
+
if (this.walletProvider) {
|
|
122
|
+
if (prioritizeWalletProvider || signingMethod) {
|
|
123
|
+
if (signingMethod) {
|
|
124
|
+
if (this.status !== 'connected') {
|
|
125
|
+
return Promise.reject({ message: 'wallet provider is not connected', code: 4001 });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let currentChainIdAsHex;
|
|
129
|
+
try {
|
|
130
|
+
currentChainIdAsHex = await withTimeout(this.walletProvider.request({
|
|
131
|
+
method: 'eth_chainId',
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
if (signingMethod) {
|
|
136
|
+
return Promise.reject(err);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// we fallback on jsonRPc if error while getting chain and not a signing method
|
|
140
|
+
return this.jsonRPC.request(req);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const currentChainId = Number(currentChainIdAsHex).toString();
|
|
144
|
+
if (this.chainId !== currentChainId) {
|
|
145
|
+
if (signingMethod) {
|
|
146
|
+
return Promise.reject({
|
|
147
|
+
message: `wallet provider is connected to a different chain, expected ${this.chainId} but got ${currentChainId}`,
|
|
148
|
+
code: 4001,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// we fallback on jsonRPc if invalid chain and not a signing method
|
|
153
|
+
return this.jsonRPC.request(req);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return this.walletProvider.request(req);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (signingMethod) {
|
|
160
|
+
return Promise.reject(new Error('wallet provider is not connected'));
|
|
161
|
+
}
|
|
162
|
+
return this.jsonRPC.request(req);
|
|
163
|
+
}
|
|
75
164
|
setWalletProvider(walletProvider) {
|
|
76
165
|
this.walletProvider = walletProvider;
|
|
77
166
|
}
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,oBAAoB,EAAa,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@etherplay/wallet-connector-ethereum",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
|
+
"description": "Ethereum wallet connector implementation for @etherplay/connect - provides EIP-6963 provider detection, account management, and chain switching support",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ethereum",
|
|
7
|
+
"wallet",
|
|
8
|
+
"connector",
|
|
9
|
+
"eip-6963",
|
|
10
|
+
"metamask",
|
|
11
|
+
"web3",
|
|
12
|
+
"provider",
|
|
13
|
+
"chain-switching",
|
|
14
|
+
"account-management",
|
|
15
|
+
"typescript",
|
|
16
|
+
"eth_sign",
|
|
17
|
+
"personal_sign"
|
|
18
|
+
],
|
|
19
|
+
"homepage": "https://github.com/wighawag/etherplay-connect#readme",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/wighawag/etherplay-connect.git",
|
|
23
|
+
"directory": "packages/etherplay-wallet-connector-ethereum"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/wighawag/etherplay-connect/issues"
|
|
27
|
+
},
|
|
28
|
+
"author": "Ronan Sandford",
|
|
4
29
|
"license": "MIT",
|
|
5
30
|
"publishConfig": {
|
|
6
31
|
"access": "public"
|
|
@@ -30,12 +55,12 @@
|
|
|
30
55
|
"@noble/curves": "1.8.1",
|
|
31
56
|
"@noble/secp256k1": "^2.2.3",
|
|
32
57
|
"remote-procedure-call": "^0.1.1",
|
|
33
|
-
"@etherplay/wallet-connector": "0.0.
|
|
58
|
+
"@etherplay/wallet-connector": "0.0.5"
|
|
34
59
|
},
|
|
35
60
|
"scripts": {
|
|
36
61
|
"build": "tsc --project tsconfig.json",
|
|
37
62
|
"dev": "as-soon -w src pnpm build",
|
|
38
63
|
"format:check": "prettier --check .",
|
|
39
|
-
"format
|
|
64
|
+
"format": "prettier --write ."
|
|
40
65
|
}
|
|
41
66
|
}
|
package/src/index.ts
CHANGED
|
@@ -85,28 +85,121 @@ interface EIP6963ProviderDetail {
|
|
|
85
85
|
provider: EIP1193WindowWalletProvider;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
function detectWindowEthereumInfo(provider: EIP1193WindowWalletProvider): EIP6963ProviderInfo {
|
|
89
|
+
const p = provider as any;
|
|
90
|
+
|
|
91
|
+
// Check for common wallet flags
|
|
92
|
+
// Order matters - more specific checks first
|
|
93
|
+
let name = 'Browser Wallet';
|
|
94
|
+
|
|
95
|
+
if (p.isMetaMask && !p.isRabby && !p.isBraveWallet) {
|
|
96
|
+
name = 'MetaMask';
|
|
97
|
+
} else if (p.isCoinbaseWallet) {
|
|
98
|
+
name = 'Coinbase Wallet';
|
|
99
|
+
} else if (p.isTrust) {
|
|
100
|
+
name = 'Trust Wallet';
|
|
101
|
+
} else if (p.isRabby) {
|
|
102
|
+
name = 'Rabby';
|
|
103
|
+
} else if (p.isBraveWallet) {
|
|
104
|
+
name = 'Brave Wallet';
|
|
105
|
+
} else if (p.isPhantom) {
|
|
106
|
+
name = 'Phantom';
|
|
107
|
+
} else if (p.isRainbow) {
|
|
108
|
+
name = 'Rainbow';
|
|
109
|
+
} else if (p.isTokenPocket) {
|
|
110
|
+
name = 'TokenPocket';
|
|
111
|
+
} else if (p.isOKExWallet || p.isOkxWallet) {
|
|
112
|
+
name = 'OKX Wallet';
|
|
113
|
+
} else if (p.isBitKeep) {
|
|
114
|
+
name = 'BitKeep';
|
|
115
|
+
} else if (p.isZerion) {
|
|
116
|
+
name = 'Zerion';
|
|
117
|
+
} else if (p.isFrame) {
|
|
118
|
+
name = 'Frame';
|
|
119
|
+
} else if (p.isTally) {
|
|
120
|
+
name = 'Taho';
|
|
121
|
+
} else if (p.isOneInch) {
|
|
122
|
+
name = '1inch Wallet';
|
|
123
|
+
} else if (p.isImToken) {
|
|
124
|
+
name = 'imToken';
|
|
125
|
+
} else if (p.isMathWallet) {
|
|
126
|
+
name = 'MathWallet';
|
|
127
|
+
} else if (p.isTokenary) {
|
|
128
|
+
name = 'Tokenary';
|
|
129
|
+
} else if (p.isStatus) {
|
|
130
|
+
name = 'Status';
|
|
131
|
+
} else if (p.isXDEFI) {
|
|
132
|
+
name = 'XDEFI';
|
|
133
|
+
} else if (p.isExodus) {
|
|
134
|
+
name = 'Exodus';
|
|
135
|
+
} else if (p.isOpera) {
|
|
136
|
+
name = 'Opera Wallet';
|
|
137
|
+
} else if (p.isGamestop) {
|
|
138
|
+
name = 'GameStop Wallet';
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
uuid: 'window.ethereum',
|
|
143
|
+
name,
|
|
144
|
+
icon: '', // No icon available for window.ethereum
|
|
145
|
+
rdns: 'window.ethereum',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
88
149
|
type WalletAnnouncementFunction = (walletInfo: WalletHandle<CurriedRPC<Methods>>) => void;
|
|
89
150
|
function createWalletFetcher() {
|
|
90
151
|
const walletHandles: WalletHandle<CurriedRPC<Methods>>[] = [];
|
|
91
152
|
const walletAnnouncementFunctions: WalletAnnouncementFunction[] = [];
|
|
153
|
+
const eip6963Providers: EIP1193WindowWalletProvider[] = [];
|
|
92
154
|
let requesting = false;
|
|
155
|
+
let windowEthereumProviderAdded: EIP1193WindowWalletProvider | undefined;
|
|
156
|
+
|
|
157
|
+
function announceWallet(walletHandle: WalletHandle<CurriedRPC<Methods>>) {
|
|
158
|
+
walletHandles.push(walletHandle);
|
|
159
|
+
for (const walletAnnounced of walletAnnouncementFunctions) {
|
|
160
|
+
walletAnnounced(walletHandle);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
93
163
|
|
|
94
164
|
function onWalletAnnounced(event: EIP6963AnnounceProviderEvent) {
|
|
95
165
|
const {detail} = event;
|
|
96
|
-
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
//
|
|
166
|
+
|
|
167
|
+
// Track EIP6963 providers to detect duplicates with window.ethereum
|
|
168
|
+
eip6963Providers.push(detail.provider);
|
|
169
|
+
|
|
170
|
+
// Skip if this provider was already added via window.ethereum fallback
|
|
171
|
+
if (windowEthereumProviderAdded && detail.provider === windowEthereumProviderAdded) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
101
175
|
const walletHandle = {
|
|
102
176
|
walletProvider: new EthereumWalletProvider(detail.provider),
|
|
103
177
|
info: detail.info,
|
|
104
178
|
};
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
179
|
+
announceWallet(walletHandle);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function addWindowEthereumIfNeeded() {
|
|
183
|
+
if (windowEthereumProviderAdded) return;
|
|
184
|
+
|
|
185
|
+
const windowEthereumProvider = (window as any).ethereum as EIP1193WindowWalletProvider | undefined;
|
|
186
|
+
if (!windowEthereumProvider) return;
|
|
187
|
+
|
|
188
|
+
// Check if window.ethereum was already announced via EIP6963
|
|
189
|
+
const alreadyAnnounced = eip6963Providers.some((provider) => provider === windowEthereumProvider);
|
|
190
|
+
if (alreadyAnnounced) return;
|
|
191
|
+
|
|
192
|
+
// Mark as added before announcing to prevent race conditions
|
|
193
|
+
windowEthereumProviderAdded = windowEthereumProvider;
|
|
194
|
+
|
|
195
|
+
// Add window.ethereum with fallback info (for mobile wallet browsers without EIP6963)
|
|
196
|
+
const walletHandle = {
|
|
197
|
+
walletProvider: new EthereumWalletProvider(windowEthereumProvider),
|
|
198
|
+
info: detectWindowEthereumInfo(windowEthereumProvider),
|
|
199
|
+
};
|
|
200
|
+
announceWallet(walletHandle);
|
|
109
201
|
}
|
|
202
|
+
|
|
110
203
|
function fetchWallets(walletAnnounced: WalletAnnouncementFunction) {
|
|
111
204
|
walletAnnouncementFunctions.push(walletAnnounced);
|
|
112
205
|
if (requesting) {
|
|
@@ -115,11 +208,14 @@ function createWalletFetcher() {
|
|
|
115
208
|
}
|
|
116
209
|
} else if (typeof window !== 'undefined') {
|
|
117
210
|
requesting = true;
|
|
118
|
-
|
|
119
|
-
//
|
|
120
|
-
// TODO ?
|
|
211
|
+
|
|
212
|
+
// First listen for EIP6963 announcements (they have proper name/icon info)
|
|
121
213
|
(window as any).addEventListener('eip6963:announceProvider', onWalletAnnounced);
|
|
122
214
|
window.dispatchEvent(new Event('eip6963:requestProvider'));
|
|
215
|
+
|
|
216
|
+
// After a short delay, add window.ethereum if it wasn't announced via EIP6963
|
|
217
|
+
// This handles mobile wallet browsers that don't support EIP6963
|
|
218
|
+
setTimeout(addWindowEthereumIfNeeded, 100);
|
|
123
219
|
}
|
|
124
220
|
}
|
|
125
221
|
return {
|
package/src/provider.ts
CHANGED
|
@@ -1,9 +1,38 @@
|
|
|
1
1
|
import type {EIP1193Provider, EIP1193WalletProvider, EIP1193WindowWalletProvider, Methods} from 'eip-1193';
|
|
2
2
|
import {createCurriedJSONRPC, CurriedRPC} from 'remote-procedure-call';
|
|
3
3
|
import {withTimeout} from './utils.js';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
AlwaysOnProviderWrapper,
|
|
6
|
+
PendingRequest,
|
|
7
|
+
RequestEvent,
|
|
8
|
+
RequestEventHandler,
|
|
9
|
+
TrackedRequestMethod,
|
|
10
|
+
TRACKED_REQUEST_METHODS,
|
|
11
|
+
TRANSACTION_METHODS,
|
|
12
|
+
TransactionMethod,
|
|
13
|
+
SignatureMethod,
|
|
14
|
+
} from '@etherplay/wallet-connector';
|
|
5
15
|
import {UnderlyingEthereumProvider} from './index.js';
|
|
6
16
|
|
|
17
|
+
// Type guard for transaction methods
|
|
18
|
+
function isTransactionMethod(method: TrackedRequestMethod): method is TransactionMethod {
|
|
19
|
+
return (TRANSACTION_METHODS as readonly string[]).includes(method);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Helper to create a properly typed PendingRequest
|
|
23
|
+
function createPendingRequest(id: string, method: TrackedRequestMethod, startedAt: number): PendingRequest {
|
|
24
|
+
if (isTransactionMethod(method)) {
|
|
25
|
+
return {id, method, kind: 'transaction', startedAt};
|
|
26
|
+
}
|
|
27
|
+
// TypeScript knows method is SignatureMethod here
|
|
28
|
+
return {id, method: method as SignatureMethod, kind: 'signature', startedAt};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Helper to check if method should be tracked
|
|
32
|
+
function isTrackedMethod(method: string): method is TrackedRequestMethod {
|
|
33
|
+
return (TRACKED_REQUEST_METHODS as readonly string[]).includes(method);
|
|
34
|
+
}
|
|
35
|
+
|
|
7
36
|
const signerMethods = [
|
|
8
37
|
'eth_accounts',
|
|
9
38
|
'eth_sign',
|
|
@@ -24,6 +53,11 @@ class AlwaysOnEthereumProviderWrapper implements AlwaysOnProviderWrapper<Curried
|
|
|
24
53
|
private jsonRPC: CurriedRPC<Methods>;
|
|
25
54
|
private status: 'connected' | 'locked' | 'disconnected' = 'disconnected';
|
|
26
55
|
|
|
56
|
+
// Request tracking fields
|
|
57
|
+
private pendingRequests: Map<string, PendingRequest> = new Map();
|
|
58
|
+
private requestHandlers: Set<RequestEventHandler> = new Set();
|
|
59
|
+
private requestCounter = 0;
|
|
60
|
+
|
|
27
61
|
constructor(params: {
|
|
28
62
|
endpoint: string | UnderlyingEthereumProvider;
|
|
29
63
|
chainId: string;
|
|
@@ -36,63 +70,148 @@ class AlwaysOnEthereumProviderWrapper implements AlwaysOnProviderWrapper<Curried
|
|
|
36
70
|
|
|
37
71
|
const provider = {
|
|
38
72
|
async request(req: {method: string; params?: any[]}) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
walletOnlyMethods.includes(req.method) ||
|
|
43
|
-
req.method.indexOf('sign') != -1;
|
|
44
|
-
|
|
45
|
-
if (self.walletProvider) {
|
|
46
|
-
if (params.prioritizeWalletProvider || signingMethod) {
|
|
47
|
-
if (signingMethod) {
|
|
48
|
-
if (self.status !== 'connected') {
|
|
49
|
-
return Promise.reject({message: 'wallet provider is not connected', code: 4001});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
let currentChainIdAsHex: string;
|
|
54
|
-
try {
|
|
55
|
-
currentChainIdAsHex = await withTimeout(
|
|
56
|
-
self.walletProvider.request({
|
|
57
|
-
method: 'eth_chainId',
|
|
58
|
-
}),
|
|
59
|
-
);
|
|
60
|
-
} catch (err) {
|
|
61
|
-
if (signingMethod) {
|
|
62
|
-
return Promise.reject(err);
|
|
63
|
-
} else {
|
|
64
|
-
// we fallback on jsonRPc if error while getting chain and not a signing method
|
|
65
|
-
return self.jsonRPC.request(req as any);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const currentChainId = Number(currentChainIdAsHex).toString();
|
|
70
|
-
if (self.chainId !== currentChainId) {
|
|
71
|
-
if (signingMethod) {
|
|
72
|
-
return Promise.reject({
|
|
73
|
-
message: `wallet provider is connected to a different chain, expected ${self.chainId} but got ${currentChainId}`,
|
|
74
|
-
code: 4001,
|
|
75
|
-
});
|
|
76
|
-
} else {
|
|
77
|
-
// we fallback on jsonRPc if invalid chain and not a signing method
|
|
78
|
-
return self.jsonRPC.request(req as any);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return self.walletProvider.request(req as any);
|
|
82
|
-
}
|
|
73
|
+
// Check if this is a tracked method
|
|
74
|
+
if (isTrackedMethod(req.method)) {
|
|
75
|
+
return self.executeTrackedRequest(req, params.prioritizeWalletProvider);
|
|
83
76
|
}
|
|
84
77
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return self.jsonRPC.request(req as any);
|
|
78
|
+
// Non-tracked methods - execute directly
|
|
79
|
+
return self.executeRequest(req, params.prioritizeWalletProvider);
|
|
90
80
|
},
|
|
91
81
|
} as unknown as EIP1193Provider;
|
|
92
82
|
|
|
93
83
|
this.provider = createCurriedJSONRPC<Methods>(provider, {requestsPerSecond: params.requestsPerSecond});
|
|
94
84
|
}
|
|
95
85
|
|
|
86
|
+
// Event subscription
|
|
87
|
+
onRequest(handler: RequestEventHandler): () => void {
|
|
88
|
+
this.requestHandlers.add(handler);
|
|
89
|
+
return () => {
|
|
90
|
+
this.requestHandlers.delete(handler);
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Get current pending requests
|
|
95
|
+
getPendingRequests(): PendingRequest[] {
|
|
96
|
+
return Array.from(this.pendingRequests.values());
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Emit event to all handlers
|
|
100
|
+
private emitRequestEvent(event: RequestEvent): void {
|
|
101
|
+
for (const handler of this.requestHandlers) {
|
|
102
|
+
try {
|
|
103
|
+
handler(event);
|
|
104
|
+
} catch (e) {
|
|
105
|
+
console.error('Request event handler error:', e);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Generate unique request ID
|
|
111
|
+
private generateRequestId(): string {
|
|
112
|
+
return `req_${++this.requestCounter}_${Date.now()}`;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Execute tracked request with event emission
|
|
116
|
+
private async executeTrackedRequest(
|
|
117
|
+
req: {method: string; params?: any[]},
|
|
118
|
+
prioritizeWalletProvider?: boolean,
|
|
119
|
+
): Promise<any> {
|
|
120
|
+
const method = req.method as TrackedRequestMethod;
|
|
121
|
+
const requestId = this.generateRequestId();
|
|
122
|
+
const pendingRequest = createPendingRequest(requestId, method, Date.now());
|
|
123
|
+
|
|
124
|
+
// Track and emit start event
|
|
125
|
+
this.pendingRequests.set(requestId, pendingRequest);
|
|
126
|
+
this.emitRequestEvent({type: 'requestStart', request: pendingRequest});
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
const result = await this.executeRequest(req, prioritizeWalletProvider);
|
|
130
|
+
|
|
131
|
+
// Emit success event
|
|
132
|
+
this.pendingRequests.delete(requestId);
|
|
133
|
+
this.emitRequestEvent({
|
|
134
|
+
type: 'requestEnd',
|
|
135
|
+
request: pendingRequest,
|
|
136
|
+
result: 'success',
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
return result;
|
|
140
|
+
} catch (error) {
|
|
141
|
+
// Determine if user rejected
|
|
142
|
+
const isRejected = (error as any)?.code === 4001;
|
|
143
|
+
|
|
144
|
+
// Emit end event
|
|
145
|
+
this.pendingRequests.delete(requestId);
|
|
146
|
+
this.emitRequestEvent({
|
|
147
|
+
type: 'requestEnd',
|
|
148
|
+
request: pendingRequest,
|
|
149
|
+
result: isRejected ? 'rejected' : 'error',
|
|
150
|
+
error: isRejected ? undefined : error,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Execute request (original request routing logic)
|
|
158
|
+
private async executeRequest(
|
|
159
|
+
req: {method: string; params?: any[]},
|
|
160
|
+
prioritizeWalletProvider?: boolean,
|
|
161
|
+
): Promise<any> {
|
|
162
|
+
const signingMethod =
|
|
163
|
+
signerMethods.includes(req.method) ||
|
|
164
|
+
connectedAccountMethods.includes(req.method) ||
|
|
165
|
+
walletOnlyMethods.includes(req.method) ||
|
|
166
|
+
req.method.indexOf('sign') != -1;
|
|
167
|
+
|
|
168
|
+
if (this.walletProvider) {
|
|
169
|
+
if (prioritizeWalletProvider || signingMethod) {
|
|
170
|
+
if (signingMethod) {
|
|
171
|
+
if (this.status !== 'connected') {
|
|
172
|
+
return Promise.reject({message: 'wallet provider is not connected', code: 4001});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let currentChainIdAsHex: string;
|
|
177
|
+
try {
|
|
178
|
+
currentChainIdAsHex = await withTimeout(
|
|
179
|
+
this.walletProvider.request({
|
|
180
|
+
method: 'eth_chainId',
|
|
181
|
+
}),
|
|
182
|
+
);
|
|
183
|
+
} catch (err) {
|
|
184
|
+
if (signingMethod) {
|
|
185
|
+
return Promise.reject(err);
|
|
186
|
+
} else {
|
|
187
|
+
// we fallback on jsonRPc if error while getting chain and not a signing method
|
|
188
|
+
return this.jsonRPC.request(req as any);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const currentChainId = Number(currentChainIdAsHex).toString();
|
|
193
|
+
if (this.chainId !== currentChainId) {
|
|
194
|
+
if (signingMethod) {
|
|
195
|
+
return Promise.reject({
|
|
196
|
+
message: `wallet provider is connected to a different chain, expected ${this.chainId} but got ${currentChainId}`,
|
|
197
|
+
code: 4001,
|
|
198
|
+
});
|
|
199
|
+
} else {
|
|
200
|
+
// we fallback on jsonRPc if invalid chain and not a signing method
|
|
201
|
+
return this.jsonRPC.request(req as any);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return this.walletProvider.request(req as any);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (signingMethod) {
|
|
209
|
+
return Promise.reject(new Error('wallet provider is not connected'));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return this.jsonRPC.request(req as any);
|
|
213
|
+
}
|
|
214
|
+
|
|
96
215
|
setWalletProvider(walletProvider: CurriedRPC<Methods> | undefined) {
|
|
97
216
|
this.walletProvider = walletProvider;
|
|
98
217
|
}
|