@etherplay/wallet-connector-ethereum 0.0.11 → 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.d.ts.map +1 -1
- package/dist/index.js +25 -5
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +92 -7
- package/dist/provider.js.map +1 -1
- package/dist/utils.d.ts +13 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +16 -0
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +29 -5
- package/src/provider.ts +113 -7
- package/src/utils.ts +23 -0
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;AA+DD,KAAK,0BAA0B,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG;IAC3B,YAAY,CAAC,eAAe,EAAE,0BAA0B,GAAG,IAAI,CAAC;CAChE,CAAC;
|
|
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;AA+DD,KAAK,0BAA0B,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG;IAC3B,YAAY,CAAC,eAAe,EAAE,0BAA0B,GAAG,IAAI,CAAC;CAChE,CAAC;AAgHF,MAAM,WAAW,4BAA6B,SAAQ,WAAW;IAChE,IAAI,EAAE,0BAA0B,CAAC;IACjC,MAAM,EAAE,qBAAqB,CAAC;CAC9B;AAED,qBAAa,uBAAwB,YAAW,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnF,gBAAgB,EAAE,gBAAgB,CAAkC;IACpE,aAAa,EAAE,aAAa,CAAC;;IAM7B,YAAY,CAAC,eAAe,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAI5F,sBAAsB,CAAC,MAAM,EAAE;QAC9B,QAAQ,EAAE,MAAM,GAAG,0BAA0B,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC;QAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;QACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,uBAAuB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;CAGhD;AAUD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAY3E;AAKD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAI1E;AAED,qBAAa,wBAAyB,YAAW,gBAAgB;IAChE,IAAI,SAAc;IAClB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB;IAWnE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;CAiBzF;AAED,qBAAa,sBAAuB,YAAW,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAErE,SAAS,CAAC,cAAc,EAAE,2BAA2B;IADjE,SAAgB,kBAAkB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;gBAClC,cAAc,EAAE,2BAA2B;IAG3D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;IAI5E,UAAU,IAAI,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;IAMpC,WAAW,IAAI,OAAO,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC;IAKvC,eAAe,IAAI,OAAO,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC;IAMjD,wBAAwB,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE,EAAE,KAAK,IAAI;IAGrE,4BAA4B,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE,EAAE,KAAK,IAAI;IAGzE,qBAAqB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI;IAG/D,yBAAyB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI;IAG7D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC;IAWjD,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC;CAgBzD"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { personalSign } from './utils.js';
|
|
2
2
|
import { createProvider } from './provider.js';
|
|
3
3
|
import { createCurriedJSONRPC } from 'remote-procedure-call';
|
|
4
4
|
import { HDKey } from '@scure/bip32';
|
|
@@ -141,7 +141,22 @@ function createWalletFetcher() {
|
|
|
141
141
|
let eip6963Received = false;
|
|
142
142
|
// Track the actual window.ethereum provider reference for late EIP-6963 comparison
|
|
143
143
|
let windowEthereumProviderAdded;
|
|
144
|
+
// EIP-6963 discovery is page-wide: any code dispatching `eip6963:requestProvider` (a second
|
|
145
|
+
// fetcher, a second connection, an unrelated library) makes every installed wallet announce
|
|
146
|
+
// itself again to every listener currently attached. Without this guard the same physical wallet
|
|
147
|
+
// is recorded, and re-announced to every subscriber, once per request that happened to overlap
|
|
148
|
+
// with our listening window.
|
|
149
|
+
//
|
|
150
|
+
// `uuid` is the EIP-6963 identity of the announcement; `rdns` is the stable identity of the
|
|
151
|
+
// wallet itself and is checked as a fallback for wallets that regenerate their uuid.
|
|
152
|
+
function alreadyAnnounced(walletHandle) {
|
|
153
|
+
return walletHandles.some((existing) => (!!existing.info.uuid && existing.info.uuid === walletHandle.info.uuid) ||
|
|
154
|
+
(!!existing.info.rdns && existing.info.rdns === walletHandle.info.rdns));
|
|
155
|
+
}
|
|
144
156
|
function announceWallet(walletHandle) {
|
|
157
|
+
if (alreadyAnnounced(walletHandle)) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
145
160
|
walletHandles.push(walletHandle);
|
|
146
161
|
for (const walletAnnounced of walletAnnouncementFunctions) {
|
|
147
162
|
walletAnnounced(walletHandle);
|
|
@@ -198,6 +213,14 @@ function createWalletFetcher() {
|
|
|
198
213
|
// After a short delay, add window.ethereum only if no EIP6963 providers were announced
|
|
199
214
|
// This handles mobile wallet browsers that don't support EIP6963
|
|
200
215
|
// we also stop listenning for more
|
|
216
|
+
//
|
|
217
|
+
// Known limitation, deliberately left as is: a wallet that announces later than this window
|
|
218
|
+
// is dropped. Simply keeping the listener attached is now safe from a duplication point of
|
|
219
|
+
// view (see `alreadyAnnounced`), but it would introduce a different duplicate: once the
|
|
220
|
+
// window.ethereum fallback has been added below, a late EIP-6963 announcement from that same
|
|
221
|
+
// wallet under a *different* provider object and a different uuid/rdns (Rabby does this)
|
|
222
|
+
// would be added as a second entry. Fixing that needs a way to supersede an already-announced
|
|
223
|
+
// handle, which the announcement API has no notion of. Not changed here.
|
|
201
224
|
setTimeout(() => {
|
|
202
225
|
window.removeEventListener('eip6963:announceProvider', onWalletAnnounced);
|
|
203
226
|
addWindowEthereumIfNeeded();
|
|
@@ -295,10 +318,7 @@ export class EthereumWalletProvider {
|
|
|
295
318
|
this.underlyingProvider = createCurriedJSONRPC(windowProvider);
|
|
296
319
|
}
|
|
297
320
|
async signMessage(message, account) {
|
|
298
|
-
return this.underlyingProvider
|
|
299
|
-
method: 'personal_sign',
|
|
300
|
-
params: [hashMessage(message), account],
|
|
301
|
-
});
|
|
321
|
+
return personalSign(this.underlyingProvider, message, account);
|
|
302
322
|
}
|
|
303
323
|
async getChainId() {
|
|
304
324
|
return this.underlyingProvider.request({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
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,EACN,uBAAuB,
|
|
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,EAUvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,0BAA0B,EAAC,MAAM,YAAY,CAAC;AA0TtD,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,17 +1,63 @@
|
|
|
1
1
|
import { createCurriedJSONRPC } from 'remote-procedure-call';
|
|
2
|
-
import { withTimeout } from './utils.js';
|
|
2
|
+
import { personalSign, withTimeout } from './utils.js';
|
|
3
3
|
import { TRACKED_REQUEST_METHODS, TRANSACTION_METHODS, } from '@etherplay/wallet-connector';
|
|
4
4
|
// Type guard for transaction methods
|
|
5
5
|
function isTransactionMethod(method) {
|
|
6
6
|
return TRANSACTION_METHODS.includes(method);
|
|
7
7
|
}
|
|
8
8
|
// Helper to create a properly typed PendingRequest
|
|
9
|
-
function createPendingRequest(id, method, startedAt) {
|
|
9
|
+
function createPendingRequest(id, method, startedAt, about = {}) {
|
|
10
|
+
// Spread rather than assigning directly, so a request without a purpose or a readable account has
|
|
11
|
+
// NO such key instead of one set to `undefined`. The two are the same to `toEqual` and to
|
|
12
|
+
// `JSON.stringify`, and different to `toStrictEqual` and to `'account' in request`, and this shape
|
|
13
|
+
// is handed to consumers whose assertions we do not control.
|
|
14
|
+
const extra = {
|
|
15
|
+
...(about.purpose === undefined ? {} : { purpose: about.purpose }),
|
|
16
|
+
...(about.account === undefined ? {} : { account: about.account }),
|
|
17
|
+
};
|
|
10
18
|
if (isTransactionMethod(method)) {
|
|
11
|
-
return { id, method, kind: 'transaction', startedAt };
|
|
19
|
+
return { id, method, kind: 'transaction', startedAt, ...extra };
|
|
12
20
|
}
|
|
13
21
|
// TypeScript knows method is SignatureMethod here
|
|
14
|
-
return { id, method: method, kind: 'signature', startedAt };
|
|
22
|
+
return { id, method: method, kind: 'signature', startedAt, ...extra };
|
|
23
|
+
}
|
|
24
|
+
function asAddress(value) {
|
|
25
|
+
return typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value) ? value : undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* WHO the wallet is being asked to answer as, read out of the request itself.
|
|
29
|
+
*
|
|
30
|
+
* Every one of these methods carries the address, and NO TWO OF THEM AGREE ON WHERE. In particular
|
|
31
|
+
* `personal_sign` and `eth_sign` take the same two values in the OPPOSITE order, which is a
|
|
32
|
+
* long-standing wart of the JSON-RPC surface rather than anything this library chose:
|
|
33
|
+
*
|
|
34
|
+
* personal_sign [data, address]
|
|
35
|
+
* eth_sign [address, data]
|
|
36
|
+
* eth_signTypedData* [address, typedData]
|
|
37
|
+
* eth_sendTransaction [{from, ...}]
|
|
38
|
+
* eth_signTransaction [{from, ...}]
|
|
39
|
+
*
|
|
40
|
+
* Every branch is shape-checked rather than trusted, so a caller passing something unexpected loses
|
|
41
|
+
* the address and keeps the announcement, instead of announcing a confident wrong answer. Reporting
|
|
42
|
+
* the DATA of a `personal_sign` as the account is exactly the mistake the order above invites.
|
|
43
|
+
*/
|
|
44
|
+
function accountForRequest(method, params) {
|
|
45
|
+
if (!params || params.length === 0) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
switch (method) {
|
|
49
|
+
case 'eth_sendTransaction':
|
|
50
|
+
case 'eth_signTransaction':
|
|
51
|
+
return asAddress(params[0]?.from);
|
|
52
|
+
case 'personal_sign':
|
|
53
|
+
return asAddress(params[1]);
|
|
54
|
+
case 'eth_sign':
|
|
55
|
+
case 'eth_signTypedData':
|
|
56
|
+
case 'eth_signTypedData_v4':
|
|
57
|
+
return asAddress(params[0]);
|
|
58
|
+
default:
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
15
61
|
}
|
|
16
62
|
// Helper to check if method should be tracked
|
|
17
63
|
function isTrackedMethod(method) {
|
|
@@ -80,15 +126,26 @@ class AlwaysOnEthereumProviderWrapper {
|
|
|
80
126
|
return `req_${++this.requestCounter}_${Date.now()}`;
|
|
81
127
|
}
|
|
82
128
|
// Execute tracked request with event emission
|
|
83
|
-
|
|
129
|
+
executeTrackedRequest(req, prioritizeWalletProvider) {
|
|
84
130
|
const method = req.method;
|
|
131
|
+
// No `purpose`: this is the app asking through `provider`, and it knows what it sent.
|
|
132
|
+
return this.announce(method, { account: accountForRequest(method, req.params) }, () => this.executeRequest(req, prioritizeWalletProvider));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Run something that reaches the user's wallet, with the pending-request bookkeeping around it.
|
|
136
|
+
*
|
|
137
|
+
* Separated from HOW the request is delivered on purpose. Announcing and routing are different
|
|
138
|
+
* jobs, and `signMessage` needs the first without the second: it must be visible like every other
|
|
139
|
+
* wallet request, but it must not inherit the always-on provider's single-chain guard.
|
|
140
|
+
*/
|
|
141
|
+
async announce(method, about, deliver) {
|
|
85
142
|
const requestId = this.generateRequestId();
|
|
86
|
-
const pendingRequest = createPendingRequest(requestId, method, Date.now());
|
|
143
|
+
const pendingRequest = createPendingRequest(requestId, method, Date.now(), about);
|
|
87
144
|
// Track and emit start event
|
|
88
145
|
this.pendingRequests.set(requestId, pendingRequest);
|
|
89
146
|
this.emitRequestEvent({ type: 'requestStart', request: pendingRequest });
|
|
90
147
|
try {
|
|
91
|
-
const result = await
|
|
148
|
+
const result = await deliver();
|
|
92
149
|
// Emit success event
|
|
93
150
|
this.pendingRequests.delete(requestId);
|
|
94
151
|
this.emitRequestEvent({
|
|
@@ -112,6 +169,34 @@ class AlwaysOnEthereumProviderWrapper {
|
|
|
112
169
|
throw error;
|
|
113
170
|
}
|
|
114
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* See the interface doc on `AlwaysOnProviderWrapper.signMessage` for why this is its own surface
|
|
174
|
+
* rather than a call through `provider.request`.
|
|
175
|
+
*
|
|
176
|
+
* Delivery is deliberately identical to `EthereumWalletProvider.signMessage` — both go through
|
|
177
|
+
* `personalSign` — so routing a signature through here changes WHO CAN SEE IT and nothing else.
|
|
178
|
+
* That means it differs from the generic `executeRequest` path in BOTH of that path's guards, and
|
|
179
|
+
* both omissions are deliberate:
|
|
180
|
+
*
|
|
181
|
+
* - No CHAIN check. `personal_sign` over text is chain-independent, and a delegation names the
|
|
182
|
+
* chain it authorises INSIDE the signed bytes, so `getDelegation` is expected to mint one for a
|
|
183
|
+
* chain the connection is not on.
|
|
184
|
+
* - No `status === 'connected'` check. Not because the check would be wrong, but because adding it
|
|
185
|
+
* here would be a behaviour change smuggled in with an observability fix: the calls being moved
|
|
186
|
+
* onto this method never had one. If it turns out to be wanted, it should land as its own
|
|
187
|
+
* change, with its own reasoning about what a caller should do when it fails.
|
|
188
|
+
*
|
|
189
|
+
* The one thing it does insist on is a registered wallet: signing has no meaningful fallback, so
|
|
190
|
+
* there is nothing sensible to do without one. That rejection happens BEFORE `announce`, so a
|
|
191
|
+
* request that never reached the wallet is never announced as pending.
|
|
192
|
+
*/
|
|
193
|
+
async signMessage(message, account, options) {
|
|
194
|
+
const walletProvider = this.walletProvider;
|
|
195
|
+
if (!walletProvider) {
|
|
196
|
+
return Promise.reject(new Error('wallet provider is not connected'));
|
|
197
|
+
}
|
|
198
|
+
return this.announce('personal_sign', { purpose: options?.purpose, account }, () => personalSign(walletProvider, message, account));
|
|
199
|
+
}
|
|
115
200
|
// Execute request (original request routing logic)
|
|
116
201
|
async executeRequest(req, prioritizeWalletProvider) {
|
|
117
202
|
const signingMethod = signerMethods.includes(req.method) ||
|
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/dist/utils.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Methods } from 'eip-1193';
|
|
2
|
+
import type { CurriedRPC } from 'remote-procedure-call';
|
|
1
3
|
/**
|
|
2
4
|
* Wraps any promise with a timeout
|
|
3
5
|
* @param promise The promise to wrap with a timeout
|
|
@@ -7,4 +9,15 @@
|
|
|
7
9
|
*/
|
|
8
10
|
export declare function withTimeout<T>(promise: Promise<T>, timeoutMs?: number, timeoutMessage?: string): Promise<T>;
|
|
9
11
|
export declare function hashMessage(message: string): `0x${string}`;
|
|
12
|
+
/**
|
|
13
|
+
* The ONE spelling of a text signature request.
|
|
14
|
+
*
|
|
15
|
+
* Two callers send this: `EthereumWalletProvider.signMessage`, which sign-in still uses, and
|
|
16
|
+
* `AlwaysOnEthereumProviderWrapper.signMessage`, which announces the signatures the library asks
|
|
17
|
+
* for (see ADR-0001). They hold different objects and neither can call the other, so without this
|
|
18
|
+
* they would each spell out the method name and the hex encoding and be free to drift. A signature
|
|
19
|
+
* produced over differently encoded bytes recovers to a different address, so the drift would show
|
|
20
|
+
* up as a credential that verifies against nobody rather than as an error.
|
|
21
|
+
*/
|
|
22
|
+
export declare function personalSign(rpc: CurriedRPC<Methods>, message: string, account: `0x${string}`): Promise<`0x${string}`>;
|
|
10
23
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAEtD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,GAAE,MAAa,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CA0BjH;AAID,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAI1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC3B,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,MAAM,EAAE,GACpB,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAKxB"}
|
package/dist/utils.js
CHANGED
|
@@ -38,4 +38,20 @@ export function hashMessage(message) {
|
|
|
38
38
|
const msg = `0x${bytesToHex(messageAsBytes)}`;
|
|
39
39
|
return msg;
|
|
40
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* The ONE spelling of a text signature request.
|
|
43
|
+
*
|
|
44
|
+
* Two callers send this: `EthereumWalletProvider.signMessage`, which sign-in still uses, and
|
|
45
|
+
* `AlwaysOnEthereumProviderWrapper.signMessage`, which announces the signatures the library asks
|
|
46
|
+
* for (see ADR-0001). They hold different objects and neither can call the other, so without this
|
|
47
|
+
* they would each spell out the method name and the hex encoding and be free to drift. A signature
|
|
48
|
+
* produced over differently encoded bytes recovers to a different address, so the drift would show
|
|
49
|
+
* up as a credential that verifies against nobody rather than as an error.
|
|
50
|
+
*/
|
|
51
|
+
export function personalSign(rpc, message, account) {
|
|
52
|
+
return rpc.request({
|
|
53
|
+
method: 'personal_sign',
|
|
54
|
+
params: [hashMessage(message), account],
|
|
55
|
+
});
|
|
56
|
+
}
|
|
41
57
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAI/C;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAI,OAAmB,EAAE,YAAoB,IAAI,EAAE,cAAuB;IACpG,4DAA4D;IAC5D,IAAI,EAAsB,CAAC;IAC3B,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACvD,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;YACpB,IAAI,EAAE,EAAE,CAAC;gBACR,mCAAmC;gBACnC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACjB,EAAE,GAAG,SAAS,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,IAAI,2BAA2B,SAAS,IAAI,CAAC,CAAC,CAAC;YAC/E,CAAC;QACF,CAAC,EAAE,SAAS,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACvB,IAAI,EAAE,EAAE,CAAC;YACR,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,EAAE,GAAG,SAAS,CAAC;YACf,mDAAmD;QACpD,CAAC;aAAM,CAAC;YACP,4CAA4C;QAC7C,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,gDAAgD;IAChD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC,MAAM,UAAU,WAAW,CAAC,OAAe;IAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,KAAK,UAAU,CAAC,cAAc,CAAC,EAAmB,CAAC;IAC/D,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC3B,GAAwB,EACxB,OAAe,EACf,OAAsB;IAEtB,OAAO,GAAG,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;KACvC,CAA2B,CAAC;AAC9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@etherplay/wallet-connector-ethereum",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Ethereum wallet connector implementation for @etherplay/connect - provides EIP-6963 provider detection, account management, and chain switching support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ethereum",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"@noble/curves": "1.8.1",
|
|
56
56
|
"@noble/secp256k1": "^2.2.3",
|
|
57
57
|
"remote-procedure-call": "^0.1.1",
|
|
58
|
-
"@etherplay/wallet-connector": "0.0
|
|
58
|
+
"@etherplay/wallet-connector": "0.1.0"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
61
|
"build": "tsc --project tsconfig.json",
|
package/src/index.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type {
|
|
|
8
8
|
PrivateKeyAccount,
|
|
9
9
|
} from '@etherplay/wallet-connector';
|
|
10
10
|
import type {EIP1193ChainId, EIP1193WindowWalletProvider, Methods} from 'eip-1193';
|
|
11
|
-
import {
|
|
11
|
+
import {personalSign} from './utils.js';
|
|
12
12
|
import {createProvider} from './provider.js';
|
|
13
13
|
import {createCurriedJSONRPC, CurriedRPC} from 'remote-procedure-call';
|
|
14
14
|
import {HDKey} from '@scure/bip32';
|
|
@@ -158,7 +158,26 @@ function createWalletFetcher(): WalletFetcher {
|
|
|
158
158
|
// Track the actual window.ethereum provider reference for late EIP-6963 comparison
|
|
159
159
|
let windowEthereumProviderAdded: EIP1193WindowWalletProvider | undefined;
|
|
160
160
|
|
|
161
|
+
// EIP-6963 discovery is page-wide: any code dispatching `eip6963:requestProvider` (a second
|
|
162
|
+
// fetcher, a second connection, an unrelated library) makes every installed wallet announce
|
|
163
|
+
// itself again to every listener currently attached. Without this guard the same physical wallet
|
|
164
|
+
// is recorded, and re-announced to every subscriber, once per request that happened to overlap
|
|
165
|
+
// with our listening window.
|
|
166
|
+
//
|
|
167
|
+
// `uuid` is the EIP-6963 identity of the announcement; `rdns` is the stable identity of the
|
|
168
|
+
// wallet itself and is checked as a fallback for wallets that regenerate their uuid.
|
|
169
|
+
function alreadyAnnounced(walletHandle: WalletHandle<CurriedRPC<Methods>>): boolean {
|
|
170
|
+
return walletHandles.some(
|
|
171
|
+
(existing) =>
|
|
172
|
+
(!!existing.info.uuid && existing.info.uuid === walletHandle.info.uuid) ||
|
|
173
|
+
(!!existing.info.rdns && existing.info.rdns === walletHandle.info.rdns),
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
161
177
|
function announceWallet(walletHandle: WalletHandle<CurriedRPC<Methods>>) {
|
|
178
|
+
if (alreadyAnnounced(walletHandle)) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
162
181
|
walletHandles.push(walletHandle);
|
|
163
182
|
for (const walletAnnounced of walletAnnouncementFunctions) {
|
|
164
183
|
walletAnnounced(walletHandle);
|
|
@@ -223,6 +242,14 @@ function createWalletFetcher(): WalletFetcher {
|
|
|
223
242
|
// After a short delay, add window.ethereum only if no EIP6963 providers were announced
|
|
224
243
|
// This handles mobile wallet browsers that don't support EIP6963
|
|
225
244
|
// we also stop listenning for more
|
|
245
|
+
//
|
|
246
|
+
// Known limitation, deliberately left as is: a wallet that announces later than this window
|
|
247
|
+
// is dropped. Simply keeping the listener attached is now safe from a duplication point of
|
|
248
|
+
// view (see `alreadyAnnounced`), but it would introduce a different duplicate: once the
|
|
249
|
+
// window.ethereum fallback has been added below, a late EIP-6963 announcement from that same
|
|
250
|
+
// wallet under a *different* provider object and a different uuid/rdns (Rabby does this)
|
|
251
|
+
// would be added as a second entry. Fixing that needs a way to supersede an already-announced
|
|
252
|
+
// handle, which the announcement API has no notion of. Not changed here.
|
|
226
253
|
setTimeout(() => {
|
|
227
254
|
(window as any).removeEventListener('eip6963:announceProvider', onWalletAnnounced);
|
|
228
255
|
addWindowEthereumIfNeeded();
|
|
@@ -337,10 +364,7 @@ export class EthereumWalletProvider implements WalletProvider<CurriedRPC<Methods
|
|
|
337
364
|
this.underlyingProvider = createCurriedJSONRPC<Methods>(windowProvider as any);
|
|
338
365
|
}
|
|
339
366
|
async signMessage(message: string, account: `0x${string}`): Promise<`0x${string}`> {
|
|
340
|
-
return this.underlyingProvider
|
|
341
|
-
method: 'personal_sign',
|
|
342
|
-
params: [hashMessage(message), account],
|
|
343
|
-
}) as Promise<`0x${string}`>;
|
|
367
|
+
return personalSign(this.underlyingProvider, message, account);
|
|
344
368
|
}
|
|
345
369
|
|
|
346
370
|
async getChainId(): Promise<`0x${string}`> {
|
package/src/provider.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type {EIP1193Provider, EIP1193WalletProvider, EIP1193WindowWalletProvider, Methods} from 'eip-1193';
|
|
2
2
|
import {createCurriedJSONRPC, CurriedRPC} from 'remote-procedure-call';
|
|
3
|
-
import {withTimeout} from './utils.js';
|
|
3
|
+
import {personalSign, withTimeout} from './utils.js';
|
|
4
4
|
import {
|
|
5
5
|
AlwaysOnProviderWrapper,
|
|
6
6
|
PendingRequest,
|
|
7
7
|
RequestEvent,
|
|
8
8
|
RequestEventHandler,
|
|
9
|
+
RequestPurpose,
|
|
9
10
|
TrackedRequestMethod,
|
|
10
11
|
TRACKED_REQUEST_METHODS,
|
|
11
12
|
TRANSACTION_METHODS,
|
|
@@ -19,13 +20,69 @@ function isTransactionMethod(method: TrackedRequestMethod): method is Transactio
|
|
|
19
20
|
return (TRANSACTION_METHODS as readonly string[]).includes(method);
|
|
20
21
|
}
|
|
21
22
|
|
|
23
|
+
/** What this layer knows about a request beyond its method. */
|
|
24
|
+
type RequestAbout = {purpose?: RequestPurpose; account?: `0x${string}`};
|
|
25
|
+
|
|
22
26
|
// Helper to create a properly typed PendingRequest
|
|
23
|
-
function createPendingRequest(
|
|
27
|
+
function createPendingRequest(
|
|
28
|
+
id: string,
|
|
29
|
+
method: TrackedRequestMethod,
|
|
30
|
+
startedAt: number,
|
|
31
|
+
about: RequestAbout = {},
|
|
32
|
+
): PendingRequest {
|
|
33
|
+
// Spread rather than assigning directly, so a request without a purpose or a readable account has
|
|
34
|
+
// NO such key instead of one set to `undefined`. The two are the same to `toEqual` and to
|
|
35
|
+
// `JSON.stringify`, and different to `toStrictEqual` and to `'account' in request`, and this shape
|
|
36
|
+
// is handed to consumers whose assertions we do not control.
|
|
37
|
+
const extra = {
|
|
38
|
+
...(about.purpose === undefined ? {} : {purpose: about.purpose}),
|
|
39
|
+
...(about.account === undefined ? {} : {account: about.account}),
|
|
40
|
+
};
|
|
24
41
|
if (isTransactionMethod(method)) {
|
|
25
|
-
return {id, method, kind: 'transaction', startedAt};
|
|
42
|
+
return {id, method, kind: 'transaction', startedAt, ...extra};
|
|
26
43
|
}
|
|
27
44
|
// TypeScript knows method is SignatureMethod here
|
|
28
|
-
return {id, method: method as SignatureMethod, kind: 'signature', startedAt};
|
|
45
|
+
return {id, method: method as SignatureMethod, kind: 'signature', startedAt, ...extra};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function asAddress(value: unknown): `0x${string}` | undefined {
|
|
49
|
+
return typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value) ? (value as `0x${string}`) : undefined;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* WHO the wallet is being asked to answer as, read out of the request itself.
|
|
54
|
+
*
|
|
55
|
+
* Every one of these methods carries the address, and NO TWO OF THEM AGREE ON WHERE. In particular
|
|
56
|
+
* `personal_sign` and `eth_sign` take the same two values in the OPPOSITE order, which is a
|
|
57
|
+
* long-standing wart of the JSON-RPC surface rather than anything this library chose:
|
|
58
|
+
*
|
|
59
|
+
* personal_sign [data, address]
|
|
60
|
+
* eth_sign [address, data]
|
|
61
|
+
* eth_signTypedData* [address, typedData]
|
|
62
|
+
* eth_sendTransaction [{from, ...}]
|
|
63
|
+
* eth_signTransaction [{from, ...}]
|
|
64
|
+
*
|
|
65
|
+
* Every branch is shape-checked rather than trusted, so a caller passing something unexpected loses
|
|
66
|
+
* the address and keeps the announcement, instead of announcing a confident wrong answer. Reporting
|
|
67
|
+
* the DATA of a `personal_sign` as the account is exactly the mistake the order above invites.
|
|
68
|
+
*/
|
|
69
|
+
function accountForRequest(method: TrackedRequestMethod, params?: any[]): `0x${string}` | undefined {
|
|
70
|
+
if (!params || params.length === 0) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
switch (method) {
|
|
74
|
+
case 'eth_sendTransaction':
|
|
75
|
+
case 'eth_signTransaction':
|
|
76
|
+
return asAddress(params[0]?.from);
|
|
77
|
+
case 'personal_sign':
|
|
78
|
+
return asAddress(params[1]);
|
|
79
|
+
case 'eth_sign':
|
|
80
|
+
case 'eth_signTypedData':
|
|
81
|
+
case 'eth_signTypedData_v4':
|
|
82
|
+
return asAddress(params[0]);
|
|
83
|
+
default:
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
29
86
|
}
|
|
30
87
|
|
|
31
88
|
// Helper to check if method should be tracked
|
|
@@ -113,20 +170,34 @@ class AlwaysOnEthereumProviderWrapper implements AlwaysOnProviderWrapper<Curried
|
|
|
113
170
|
}
|
|
114
171
|
|
|
115
172
|
// Execute tracked request with event emission
|
|
116
|
-
private
|
|
173
|
+
private executeTrackedRequest(
|
|
117
174
|
req: {method: string; params?: any[]},
|
|
118
175
|
prioritizeWalletProvider?: boolean,
|
|
119
176
|
): Promise<any> {
|
|
120
177
|
const method = req.method as TrackedRequestMethod;
|
|
178
|
+
// No `purpose`: this is the app asking through `provider`, and it knows what it sent.
|
|
179
|
+
return this.announce(method, {account: accountForRequest(method, req.params)}, () =>
|
|
180
|
+
this.executeRequest(req, prioritizeWalletProvider),
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Run something that reaches the user's wallet, with the pending-request bookkeeping around it.
|
|
186
|
+
*
|
|
187
|
+
* Separated from HOW the request is delivered on purpose. Announcing and routing are different
|
|
188
|
+
* jobs, and `signMessage` needs the first without the second: it must be visible like every other
|
|
189
|
+
* wallet request, but it must not inherit the always-on provider's single-chain guard.
|
|
190
|
+
*/
|
|
191
|
+
private async announce<T>(method: TrackedRequestMethod, about: RequestAbout, deliver: () => Promise<T>): Promise<T> {
|
|
121
192
|
const requestId = this.generateRequestId();
|
|
122
|
-
const pendingRequest = createPendingRequest(requestId, method, Date.now());
|
|
193
|
+
const pendingRequest = createPendingRequest(requestId, method, Date.now(), about);
|
|
123
194
|
|
|
124
195
|
// Track and emit start event
|
|
125
196
|
this.pendingRequests.set(requestId, pendingRequest);
|
|
126
197
|
this.emitRequestEvent({type: 'requestStart', request: pendingRequest});
|
|
127
198
|
|
|
128
199
|
try {
|
|
129
|
-
const result = await
|
|
200
|
+
const result = await deliver();
|
|
130
201
|
|
|
131
202
|
// Emit success event
|
|
132
203
|
this.pendingRequests.delete(requestId);
|
|
@@ -154,6 +225,41 @@ class AlwaysOnEthereumProviderWrapper implements AlwaysOnProviderWrapper<Curried
|
|
|
154
225
|
}
|
|
155
226
|
}
|
|
156
227
|
|
|
228
|
+
/**
|
|
229
|
+
* See the interface doc on `AlwaysOnProviderWrapper.signMessage` for why this is its own surface
|
|
230
|
+
* rather than a call through `provider.request`.
|
|
231
|
+
*
|
|
232
|
+
* Delivery is deliberately identical to `EthereumWalletProvider.signMessage` — both go through
|
|
233
|
+
* `personalSign` — so routing a signature through here changes WHO CAN SEE IT and nothing else.
|
|
234
|
+
* That means it differs from the generic `executeRequest` path in BOTH of that path's guards, and
|
|
235
|
+
* both omissions are deliberate:
|
|
236
|
+
*
|
|
237
|
+
* - No CHAIN check. `personal_sign` over text is chain-independent, and a delegation names the
|
|
238
|
+
* chain it authorises INSIDE the signed bytes, so `getDelegation` is expected to mint one for a
|
|
239
|
+
* chain the connection is not on.
|
|
240
|
+
* - No `status === 'connected'` check. Not because the check would be wrong, but because adding it
|
|
241
|
+
* here would be a behaviour change smuggled in with an observability fix: the calls being moved
|
|
242
|
+
* onto this method never had one. If it turns out to be wanted, it should land as its own
|
|
243
|
+
* change, with its own reasoning about what a caller should do when it fails.
|
|
244
|
+
*
|
|
245
|
+
* The one thing it does insist on is a registered wallet: signing has no meaningful fallback, so
|
|
246
|
+
* there is nothing sensible to do without one. That rejection happens BEFORE `announce`, so a
|
|
247
|
+
* request that never reached the wallet is never announced as pending.
|
|
248
|
+
*/
|
|
249
|
+
async signMessage(
|
|
250
|
+
message: string,
|
|
251
|
+
account: `0x${string}`,
|
|
252
|
+
options?: {purpose?: RequestPurpose},
|
|
253
|
+
): Promise<`0x${string}`> {
|
|
254
|
+
const walletProvider = this.walletProvider;
|
|
255
|
+
if (!walletProvider) {
|
|
256
|
+
return Promise.reject(new Error('wallet provider is not connected'));
|
|
257
|
+
}
|
|
258
|
+
return this.announce('personal_sign', {purpose: options?.purpose, account}, () =>
|
|
259
|
+
personalSign(walletProvider, message, account),
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
|
|
157
263
|
// Execute request (original request routing logic)
|
|
158
264
|
private async executeRequest(
|
|
159
265
|
req: {method: string; params?: any[]},
|
package/src/utils.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {bytesToHex} from '@noble/hashes/utils';
|
|
2
|
+
import type {Methods} from 'eip-1193';
|
|
3
|
+
import type {CurriedRPC} from 'remote-procedure-call';
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* Wraps any promise with a timeout
|
|
@@ -42,3 +44,24 @@ export function hashMessage(message: string): `0x${string}` {
|
|
|
42
44
|
const msg = `0x${bytesToHex(messageAsBytes)}` as `0x${string}`;
|
|
43
45
|
return msg;
|
|
44
46
|
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The ONE spelling of a text signature request.
|
|
50
|
+
*
|
|
51
|
+
* Two callers send this: `EthereumWalletProvider.signMessage`, which sign-in still uses, and
|
|
52
|
+
* `AlwaysOnEthereumProviderWrapper.signMessage`, which announces the signatures the library asks
|
|
53
|
+
* for (see ADR-0001). They hold different objects and neither can call the other, so without this
|
|
54
|
+
* they would each spell out the method name and the hex encoding and be free to drift. A signature
|
|
55
|
+
* produced over differently encoded bytes recovers to a different address, so the drift would show
|
|
56
|
+
* up as a credential that verifies against nobody rather than as an error.
|
|
57
|
+
*/
|
|
58
|
+
export function personalSign(
|
|
59
|
+
rpc: CurriedRPC<Methods>,
|
|
60
|
+
message: string,
|
|
61
|
+
account: `0x${string}`,
|
|
62
|
+
): Promise<`0x${string}`> {
|
|
63
|
+
return rpc.request({
|
|
64
|
+
method: 'personal_sign',
|
|
65
|
+
params: [hashMessage(message), account],
|
|
66
|
+
}) as Promise<`0x${string}`>;
|
|
67
|
+
}
|