@0xsequence/provider 0.36.10 → 0.36.11
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/0xsequence-provider.cjs.dev.js +28 -9
- package/dist/0xsequence-provider.cjs.prod.js +28 -9
- package/dist/0xsequence-provider.esm.js +28 -11
- package/dist/declarations/src/utils.d.ts +2 -0
- package/package.json +8 -8
- package/src/transports/wallet-request-handler.ts +6 -2
- package/src/utils/index.ts +7 -9
- package/src/utils.ts +22 -7
|
@@ -585,7 +585,10 @@ class WalletRequestHandler {
|
|
|
585
585
|
message = data;
|
|
586
586
|
}
|
|
587
587
|
|
|
588
|
-
let sig = ''; //
|
|
588
|
+
let sig = ''; // Message must be prefixed with "\x19Ethereum Signed Message:\n"
|
|
589
|
+
// as defined by EIP-191
|
|
590
|
+
|
|
591
|
+
message = prefixEIP191Message(message); // TODO:
|
|
589
592
|
// if (process.env.TEST_MODE === 'true' && this.prompter === null) {
|
|
590
593
|
|
|
591
594
|
if (_this.prompter === null) {
|
|
@@ -597,7 +600,7 @@ class WalletRequestHandler {
|
|
|
597
600
|
if (promptResultForDeployment) {
|
|
598
601
|
sig = await _this.prompter.promptSignMessage({
|
|
599
602
|
chainId: chainId,
|
|
600
|
-
message
|
|
603
|
+
message
|
|
601
604
|
}, _this.connectOptions);
|
|
602
605
|
}
|
|
603
606
|
}
|
|
@@ -1696,6 +1699,18 @@ const hexlifyTransaction = (transaction, allowExtra) => {
|
|
|
1696
1699
|
return result;
|
|
1697
1700
|
};
|
|
1698
1701
|
|
|
1702
|
+
const eip191prefix = ethers.ethers.utils.toUtf8Bytes("\x19Ethereum Signed Message:\n");
|
|
1703
|
+
const messageToBytes = message => {
|
|
1704
|
+
if (ethers.ethers.utils.isBytes(message) || ethers.ethers.utils.isHexString(message)) {
|
|
1705
|
+
return ethers.ethers.utils.arrayify(message);
|
|
1706
|
+
}
|
|
1707
|
+
|
|
1708
|
+
return ethers.ethers.utils.toUtf8Bytes(message);
|
|
1709
|
+
};
|
|
1710
|
+
const prefixEIP191Message = message => {
|
|
1711
|
+
const messageBytes = messageToBytes(message);
|
|
1712
|
+
return ethers.ethers.utils.concat([eip191prefix, ethers.ethers.utils.toUtf8Bytes(String(messageBytes.length)), messageBytes]);
|
|
1713
|
+
};
|
|
1699
1714
|
const isValidSignature = async (address, digest, sig, provider, chainId, walletContext) => {
|
|
1700
1715
|
if (!chainId) {
|
|
1701
1716
|
var _await$provider$getNe;
|
|
@@ -1710,9 +1725,9 @@ const isValidSignature = async (address, digest, sig, provider, chainId, walletC
|
|
|
1710
1725
|
return wallet.isValidSignature(address, digest, sig, provider, walletContext, chainId);
|
|
1711
1726
|
};
|
|
1712
1727
|
const isValidMessageSignature = async (address, message, signature, provider, chainId, walletContext) => {
|
|
1713
|
-
const
|
|
1714
|
-
|
|
1715
|
-
return isValidSignature(address,
|
|
1728
|
+
const prefixed = prefixEIP191Message(message);
|
|
1729
|
+
const digest = utils.encodeMessageDigest(prefixed);
|
|
1730
|
+
return isValidSignature(address, digest, signature, provider, chainId, walletContext);
|
|
1716
1731
|
};
|
|
1717
1732
|
const isValidTypedDataSignature = (address, typedData, signature, provider, chainId, walletContext) => {
|
|
1718
1733
|
return isValidSignature(address, utils.encodeTypedDataDigest(typedData), signature, provider, chainId, walletContext);
|
|
@@ -3109,7 +3124,7 @@ class WalletUtils {
|
|
|
3109
3124
|
|
|
3110
3125
|
this.recoverWalletConfigFromMessage = async function (address, message, signature, chainId, walletContext) {
|
|
3111
3126
|
walletContext = walletContext || (await _this.wallet.getWalletContext());
|
|
3112
|
-
return recoverWalletConfig(address, utils.encodeMessageDigest(message), signature, chainId, walletContext);
|
|
3127
|
+
return recoverWalletConfig(address, utils.encodeMessageDigest(prefixEIP191Message(message)), signature, chainId, walletContext);
|
|
3113
3128
|
};
|
|
3114
3129
|
|
|
3115
3130
|
this.recoverWalletConfigFromTypedData = async function (address, typedData, signature, chainId, walletContext) {
|
|
@@ -3157,9 +3172,11 @@ class WalletUtils {
|
|
|
3157
3172
|
|
|
3158
3173
|
|
|
3159
3174
|
async isValidMessageSignature(address, message, signature, chainId, walletContext) {
|
|
3160
|
-
const
|
|
3161
|
-
if (
|
|
3162
|
-
|
|
3175
|
+
const provider = this.wallet.getProvider(chainId);
|
|
3176
|
+
if (!provider) throw new Error(`unable to get provider for chainId ${chainId}`);
|
|
3177
|
+
const prefixed = prefixEIP191Message(message);
|
|
3178
|
+
const digest = utils.encodeMessageDigest(prefixed);
|
|
3179
|
+
return isValidSignature(address, digest, signature, provider, chainId, walletContext);
|
|
3163
3180
|
} // Verify typedData signature
|
|
3164
3181
|
|
|
3165
3182
|
|
|
@@ -3770,5 +3787,7 @@ exports.isValidMessageSignature = isValidMessageSignature;
|
|
|
3770
3787
|
exports.isValidSignature = isValidSignature;
|
|
3771
3788
|
exports.isValidTypedDataSignature = isValidTypedDataSignature;
|
|
3772
3789
|
exports.isWalletUpToDate = isWalletUpToDate;
|
|
3790
|
+
exports.messageToBytes = messageToBytes;
|
|
3773
3791
|
exports.nextMessageIdx = nextMessageIdx;
|
|
3792
|
+
exports.prefixEIP191Message = prefixEIP191Message;
|
|
3774
3793
|
exports.recoverWalletConfig = recoverWalletConfig;
|
|
@@ -585,7 +585,10 @@ class WalletRequestHandler {
|
|
|
585
585
|
message = data;
|
|
586
586
|
}
|
|
587
587
|
|
|
588
|
-
let sig = ''; //
|
|
588
|
+
let sig = ''; // Message must be prefixed with "\x19Ethereum Signed Message:\n"
|
|
589
|
+
// as defined by EIP-191
|
|
590
|
+
|
|
591
|
+
message = prefixEIP191Message(message); // TODO:
|
|
589
592
|
// if (process.env.TEST_MODE === 'true' && this.prompter === null) {
|
|
590
593
|
|
|
591
594
|
if (_this.prompter === null) {
|
|
@@ -597,7 +600,7 @@ class WalletRequestHandler {
|
|
|
597
600
|
if (promptResultForDeployment) {
|
|
598
601
|
sig = await _this.prompter.promptSignMessage({
|
|
599
602
|
chainId: chainId,
|
|
600
|
-
message
|
|
603
|
+
message
|
|
601
604
|
}, _this.connectOptions);
|
|
602
605
|
}
|
|
603
606
|
}
|
|
@@ -1696,6 +1699,18 @@ const hexlifyTransaction = (transaction, allowExtra) => {
|
|
|
1696
1699
|
return result;
|
|
1697
1700
|
};
|
|
1698
1701
|
|
|
1702
|
+
const eip191prefix = ethers.ethers.utils.toUtf8Bytes("\x19Ethereum Signed Message:\n");
|
|
1703
|
+
const messageToBytes = message => {
|
|
1704
|
+
if (ethers.ethers.utils.isBytes(message) || ethers.ethers.utils.isHexString(message)) {
|
|
1705
|
+
return ethers.ethers.utils.arrayify(message);
|
|
1706
|
+
}
|
|
1707
|
+
|
|
1708
|
+
return ethers.ethers.utils.toUtf8Bytes(message);
|
|
1709
|
+
};
|
|
1710
|
+
const prefixEIP191Message = message => {
|
|
1711
|
+
const messageBytes = messageToBytes(message);
|
|
1712
|
+
return ethers.ethers.utils.concat([eip191prefix, ethers.ethers.utils.toUtf8Bytes(String(messageBytes.length)), messageBytes]);
|
|
1713
|
+
};
|
|
1699
1714
|
const isValidSignature = async (address, digest, sig, provider, chainId, walletContext) => {
|
|
1700
1715
|
if (!chainId) {
|
|
1701
1716
|
var _await$provider$getNe;
|
|
@@ -1710,9 +1725,9 @@ const isValidSignature = async (address, digest, sig, provider, chainId, walletC
|
|
|
1710
1725
|
return wallet.isValidSignature(address, digest, sig, provider, walletContext, chainId);
|
|
1711
1726
|
};
|
|
1712
1727
|
const isValidMessageSignature = async (address, message, signature, provider, chainId, walletContext) => {
|
|
1713
|
-
const
|
|
1714
|
-
|
|
1715
|
-
return isValidSignature(address,
|
|
1728
|
+
const prefixed = prefixEIP191Message(message);
|
|
1729
|
+
const digest = utils.encodeMessageDigest(prefixed);
|
|
1730
|
+
return isValidSignature(address, digest, signature, provider, chainId, walletContext);
|
|
1716
1731
|
};
|
|
1717
1732
|
const isValidTypedDataSignature = (address, typedData, signature, provider, chainId, walletContext) => {
|
|
1718
1733
|
return isValidSignature(address, utils.encodeTypedDataDigest(typedData), signature, provider, chainId, walletContext);
|
|
@@ -3109,7 +3124,7 @@ class WalletUtils {
|
|
|
3109
3124
|
|
|
3110
3125
|
this.recoverWalletConfigFromMessage = async function (address, message, signature, chainId, walletContext) {
|
|
3111
3126
|
walletContext = walletContext || (await _this.wallet.getWalletContext());
|
|
3112
|
-
return recoverWalletConfig(address, utils.encodeMessageDigest(message), signature, chainId, walletContext);
|
|
3127
|
+
return recoverWalletConfig(address, utils.encodeMessageDigest(prefixEIP191Message(message)), signature, chainId, walletContext);
|
|
3113
3128
|
};
|
|
3114
3129
|
|
|
3115
3130
|
this.recoverWalletConfigFromTypedData = async function (address, typedData, signature, chainId, walletContext) {
|
|
@@ -3157,9 +3172,11 @@ class WalletUtils {
|
|
|
3157
3172
|
|
|
3158
3173
|
|
|
3159
3174
|
async isValidMessageSignature(address, message, signature, chainId, walletContext) {
|
|
3160
|
-
const
|
|
3161
|
-
if (
|
|
3162
|
-
|
|
3175
|
+
const provider = this.wallet.getProvider(chainId);
|
|
3176
|
+
if (!provider) throw new Error(`unable to get provider for chainId ${chainId}`);
|
|
3177
|
+
const prefixed = prefixEIP191Message(message);
|
|
3178
|
+
const digest = utils.encodeMessageDigest(prefixed);
|
|
3179
|
+
return isValidSignature(address, digest, signature, provider, chainId, walletContext);
|
|
3163
3180
|
} // Verify typedData signature
|
|
3164
3181
|
|
|
3165
3182
|
|
|
@@ -3770,5 +3787,7 @@ exports.isValidMessageSignature = isValidMessageSignature;
|
|
|
3770
3787
|
exports.isValidSignature = isValidSignature;
|
|
3771
3788
|
exports.isValidTypedDataSignature = isValidTypedDataSignature;
|
|
3772
3789
|
exports.isWalletUpToDate = isWalletUpToDate;
|
|
3790
|
+
exports.messageToBytes = messageToBytes;
|
|
3773
3791
|
exports.nextMessageIdx = nextMessageIdx;
|
|
3792
|
+
exports.prefixEIP191Message = prefixEIP191Message;
|
|
3774
3793
|
exports.recoverWalletConfig = recoverWalletConfig;
|
|
@@ -4,7 +4,7 @@ import { ethers, BigNumber } from 'ethers';
|
|
|
4
4
|
import { addressOf, isConfigEqual } from '@0xsequence/config';
|
|
5
5
|
import { Web3Provider as Web3Provider$1, JsonRpcProvider } from '@ethersproject/providers';
|
|
6
6
|
import { JsonRpcSender, maybeChainId, allowProviderMiddleware, networkProviderMiddleware, CachedProvider, JsonRpcRouter, loggingProviderMiddleware, exceptionProviderMiddleware, findNetworkConfig, EagerProvider, SigningProvider, updateNetworkConfig, ensureValidNetworks } from '@0xsequence/network';
|
|
7
|
-
import { Signer, resolveArrayProperties, isValidSignature as isValidSignature$1,
|
|
7
|
+
import { Signer, resolveArrayProperties, isValidSignature as isValidSignature$1, recoverConfig } from '@0xsequence/wallet';
|
|
8
8
|
import { isSignedTransactions } from '@0xsequence/transactions';
|
|
9
9
|
import { signAuthorization } from '@0xsequence/auth';
|
|
10
10
|
|
|
@@ -581,7 +581,10 @@ class WalletRequestHandler {
|
|
|
581
581
|
message = data;
|
|
582
582
|
}
|
|
583
583
|
|
|
584
|
-
let sig = ''; //
|
|
584
|
+
let sig = ''; // Message must be prefixed with "\x19Ethereum Signed Message:\n"
|
|
585
|
+
// as defined by EIP-191
|
|
586
|
+
|
|
587
|
+
message = prefixEIP191Message(message); // TODO:
|
|
585
588
|
// if (process.env.TEST_MODE === 'true' && this.prompter === null) {
|
|
586
589
|
|
|
587
590
|
if (_this.prompter === null) {
|
|
@@ -593,7 +596,7 @@ class WalletRequestHandler {
|
|
|
593
596
|
if (promptResultForDeployment) {
|
|
594
597
|
sig = await _this.prompter.promptSignMessage({
|
|
595
598
|
chainId: chainId,
|
|
596
|
-
message
|
|
599
|
+
message
|
|
597
600
|
}, _this.connectOptions);
|
|
598
601
|
}
|
|
599
602
|
}
|
|
@@ -1692,6 +1695,18 @@ const hexlifyTransaction = (transaction, allowExtra) => {
|
|
|
1692
1695
|
return result;
|
|
1693
1696
|
};
|
|
1694
1697
|
|
|
1698
|
+
const eip191prefix = ethers.utils.toUtf8Bytes("\x19Ethereum Signed Message:\n");
|
|
1699
|
+
const messageToBytes = message => {
|
|
1700
|
+
if (ethers.utils.isBytes(message) || ethers.utils.isHexString(message)) {
|
|
1701
|
+
return ethers.utils.arrayify(message);
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
return ethers.utils.toUtf8Bytes(message);
|
|
1705
|
+
};
|
|
1706
|
+
const prefixEIP191Message = message => {
|
|
1707
|
+
const messageBytes = messageToBytes(message);
|
|
1708
|
+
return ethers.utils.concat([eip191prefix, ethers.utils.toUtf8Bytes(String(messageBytes.length)), messageBytes]);
|
|
1709
|
+
};
|
|
1695
1710
|
const isValidSignature = async (address, digest, sig, provider, chainId, walletContext) => {
|
|
1696
1711
|
if (!chainId) {
|
|
1697
1712
|
var _await$provider$getNe;
|
|
@@ -1706,9 +1721,9 @@ const isValidSignature = async (address, digest, sig, provider, chainId, walletC
|
|
|
1706
1721
|
return isValidSignature$1(address, digest, sig, provider, walletContext, chainId);
|
|
1707
1722
|
};
|
|
1708
1723
|
const isValidMessageSignature = async (address, message, signature, provider, chainId, walletContext) => {
|
|
1709
|
-
const
|
|
1710
|
-
|
|
1711
|
-
return isValidSignature(address,
|
|
1724
|
+
const prefixed = prefixEIP191Message(message);
|
|
1725
|
+
const digest = encodeMessageDigest(prefixed);
|
|
1726
|
+
return isValidSignature(address, digest, signature, provider, chainId, walletContext);
|
|
1712
1727
|
};
|
|
1713
1728
|
const isValidTypedDataSignature = (address, typedData, signature, provider, chainId, walletContext) => {
|
|
1714
1729
|
return isValidSignature(address, encodeTypedDataDigest(typedData), signature, provider, chainId, walletContext);
|
|
@@ -3105,7 +3120,7 @@ class WalletUtils {
|
|
|
3105
3120
|
|
|
3106
3121
|
this.recoverWalletConfigFromMessage = async function (address, message, signature, chainId, walletContext) {
|
|
3107
3122
|
walletContext = walletContext || (await _this.wallet.getWalletContext());
|
|
3108
|
-
return recoverWalletConfig(address, encodeMessageDigest(message), signature, chainId, walletContext);
|
|
3123
|
+
return recoverWalletConfig(address, encodeMessageDigest(prefixEIP191Message(message)), signature, chainId, walletContext);
|
|
3109
3124
|
};
|
|
3110
3125
|
|
|
3111
3126
|
this.recoverWalletConfigFromTypedData = async function (address, typedData, signature, chainId, walletContext) {
|
|
@@ -3153,9 +3168,11 @@ class WalletUtils {
|
|
|
3153
3168
|
|
|
3154
3169
|
|
|
3155
3170
|
async isValidMessageSignature(address, message, signature, chainId, walletContext) {
|
|
3156
|
-
const
|
|
3157
|
-
if (
|
|
3158
|
-
|
|
3171
|
+
const provider = this.wallet.getProvider(chainId);
|
|
3172
|
+
if (!provider) throw new Error(`unable to get provider for chainId ${chainId}`);
|
|
3173
|
+
const prefixed = prefixEIP191Message(message);
|
|
3174
|
+
const digest = encodeMessageDigest(prefixed);
|
|
3175
|
+
return isValidSignature(address, digest, signature, provider, chainId, walletContext);
|
|
3159
3176
|
} // Verify typedData signature
|
|
3160
3177
|
|
|
3161
3178
|
|
|
@@ -3736,4 +3753,4 @@ const DefaultProviderConfig = {
|
|
|
3736
3753
|
}
|
|
3737
3754
|
};
|
|
3738
3755
|
|
|
3739
|
-
export { BaseInjectedTransport, BaseProviderTransport, BaseWalletTransport, CHANNEL_ID, DefaultProviderConfig, ErrSignedInRequired, EventType, ExtensionMessageHandler, ExtensionMessageProvider, InitState, LocalStore, LocalWeb3Provider, MuxMessageProvider, OpenState, PROVIDER_OPEN_TIMEOUT, ProviderError, ProxyMessageChannel, ProxyMessageChannelPort, ProxyMessageHandler, ProxyMessageProvider, Wallet, WalletRequestHandler, Web3Provider, Web3Signer, WindowMessageHandler, WindowMessageProvider, WindowSessionParams, isBrowserExtension, isSequenceProvider, isValidMessageSignature, isValidSignature, isValidTypedDataSignature, isWalletUpToDate, nextMessageIdx, recoverWalletConfig };
|
|
3756
|
+
export { BaseInjectedTransport, BaseProviderTransport, BaseWalletTransport, CHANNEL_ID, DefaultProviderConfig, ErrSignedInRequired, EventType, ExtensionMessageHandler, ExtensionMessageProvider, InitState, LocalStore, LocalWeb3Provider, MuxMessageProvider, OpenState, PROVIDER_OPEN_TIMEOUT, ProviderError, ProxyMessageChannel, ProxyMessageChannelPort, ProxyMessageHandler, ProxyMessageProvider, Wallet, WalletRequestHandler, Web3Provider, Web3Signer, WindowMessageHandler, WindowMessageProvider, WindowSessionParams, isBrowserExtension, isSequenceProvider, isValidMessageSignature, isValidSignature, isValidTypedDataSignature, isWalletUpToDate, messageToBytes, nextMessageIdx, prefixEIP191Message, recoverWalletConfig };
|
|
@@ -4,6 +4,8 @@ import { WalletConfig, DecodedSignature } from '@0xsequence/config';
|
|
|
4
4
|
import { TypedData } from '@0xsequence/utils';
|
|
5
5
|
import { Web3Provider } from './provider';
|
|
6
6
|
import { Signer } from '@0xsequence/wallet';
|
|
7
|
+
export declare const messageToBytes: (message: BytesLike) => Uint8Array;
|
|
8
|
+
export declare const prefixEIP191Message: (message: BytesLike) => Uint8Array;
|
|
7
9
|
export declare const isValidSignature: (address: string, digest: Uint8Array, sig: string, provider: Web3Provider | ethers.providers.Web3Provider, chainId?: number | undefined, walletContext?: WalletContext | undefined) => Promise<boolean | undefined>;
|
|
8
10
|
export declare const isValidMessageSignature: (address: string, message: string | Uint8Array, signature: string, provider: Web3Provider | ethers.providers.Web3Provider, chainId?: number | undefined, walletContext?: WalletContext | undefined) => Promise<boolean | undefined>;
|
|
9
11
|
export declare const isValidTypedDataSignature: (address: string, typedData: TypedData, signature: string, provider: Web3Provider | ethers.providers.Web3Provider, chainId?: number | undefined, walletContext?: WalletContext | undefined) => Promise<boolean | undefined>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xsequence/provider",
|
|
3
|
-
"version": "0.36.
|
|
3
|
+
"version": "0.36.11",
|
|
4
4
|
"description": "provider sub-package for Sequence",
|
|
5
5
|
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/provider",
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
"typecheck": "tsc --noEmit"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@0xsequence/abi": "^0.36.
|
|
17
|
-
"@0xsequence/auth": "^0.36.
|
|
18
|
-
"@0xsequence/config": "^0.36.
|
|
19
|
-
"@0xsequence/network": "^0.36.
|
|
20
|
-
"@0xsequence/transactions": "^0.36.
|
|
21
|
-
"@0xsequence/utils": "^0.36.
|
|
22
|
-
"@0xsequence/wallet": "^0.36.
|
|
16
|
+
"@0xsequence/abi": "^0.36.11",
|
|
17
|
+
"@0xsequence/auth": "^0.36.11",
|
|
18
|
+
"@0xsequence/config": "^0.36.11",
|
|
19
|
+
"@0xsequence/network": "^0.36.11",
|
|
20
|
+
"@0xsequence/transactions": "^0.36.11",
|
|
21
|
+
"@0xsequence/utils": "^0.36.11",
|
|
22
|
+
"@0xsequence/wallet": "^0.36.11",
|
|
23
23
|
"@ethersproject/abstract-signer": "^5.5.0",
|
|
24
24
|
"@ethersproject/hash": "^5.5.0",
|
|
25
25
|
"@ethersproject/providers": "^5.5.1",
|
|
@@ -32,7 +32,7 @@ import { isSignedTransactions, TransactionRequest } from '@0xsequence/transactio
|
|
|
32
32
|
import { signAuthorization, AuthorizationOptions } from '@0xsequence/auth'
|
|
33
33
|
import { logger, TypedData } from '@0xsequence/utils'
|
|
34
34
|
|
|
35
|
-
import { isWalletUpToDate } from '../utils'
|
|
35
|
+
import { isWalletUpToDate, prefixEIP191Message } from '../utils'
|
|
36
36
|
|
|
37
37
|
const SIGNER_READY_TIMEOUT = 10000
|
|
38
38
|
|
|
@@ -305,6 +305,10 @@ export class WalletRequestHandler implements ExternalProvider, JsonRpcHandler, P
|
|
|
305
305
|
|
|
306
306
|
let sig = ''
|
|
307
307
|
|
|
308
|
+
// Message must be prefixed with "\x19Ethereum Signed Message:\n"
|
|
309
|
+
// as defined by EIP-191
|
|
310
|
+
message = prefixEIP191Message(message)
|
|
311
|
+
|
|
308
312
|
// TODO:
|
|
309
313
|
// if (process.env.TEST_MODE === 'true' && this.prompter === null) {
|
|
310
314
|
if (this.prompter === null) {
|
|
@@ -313,7 +317,7 @@ export class WalletRequestHandler implements ExternalProvider, JsonRpcHandler, P
|
|
|
313
317
|
} else {
|
|
314
318
|
const promptResultForDeployment = await this.handleConfirmWalletDeployPrompt(this.prompter, signer, chainId)
|
|
315
319
|
if (promptResultForDeployment) {
|
|
316
|
-
sig = await this.prompter.promptSignMessage({ chainId: chainId, message
|
|
320
|
+
sig = await this.prompter.promptSignMessage({ chainId: chainId, message }, this.connectOptions)
|
|
317
321
|
}
|
|
318
322
|
}
|
|
319
323
|
|
package/src/utils/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { WalletContext, ChainIdLike } from '@0xsequence/network'
|
|
|
4
4
|
import { encodeMessageDigest, TypedData, encodeTypedDataDigest } from '@0xsequence/utils'
|
|
5
5
|
import { DecodedSignature, WalletConfig } from '@0xsequence/config'
|
|
6
6
|
import { Wallet } from '../wallet'
|
|
7
|
-
import { isValidSignature, recoverWalletConfig } from '../utils'
|
|
7
|
+
import { isValidSignature, prefixEIP191Message, recoverWalletConfig } from '../utils'
|
|
8
8
|
import { isValidEIP712Signature, isValidEthSignSignature } from '@0xsequence/wallet'
|
|
9
9
|
|
|
10
10
|
export class WalletUtils {
|
|
@@ -74,13 +74,11 @@ export class WalletUtils {
|
|
|
74
74
|
chainId: number,
|
|
75
75
|
walletContext?: WalletContext
|
|
76
76
|
): Promise<boolean | undefined> {
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return this.isValidSignature(address, encodeMessageDigest(message), signature, chainId, walletContext)
|
|
77
|
+
const provider = this.wallet.getProvider(chainId)
|
|
78
|
+
if (!provider) throw new Error(`unable to get provider for chainId ${chainId}`)
|
|
79
|
+
const prefixed = prefixEIP191Message(message)
|
|
80
|
+
const digest = encodeMessageDigest(prefixed)
|
|
81
|
+
return isValidSignature(address, digest, signature, provider, chainId, walletContext)
|
|
84
82
|
}
|
|
85
83
|
|
|
86
84
|
// Verify typedData signature
|
|
@@ -115,7 +113,7 @@ export class WalletUtils {
|
|
|
115
113
|
walletContext?: WalletContext
|
|
116
114
|
): Promise<WalletConfig> => {
|
|
117
115
|
walletContext = walletContext || (await this.wallet.getWalletContext())
|
|
118
|
-
return recoverWalletConfig(address, encodeMessageDigest(message), signature, chainId, walletContext)
|
|
116
|
+
return recoverWalletConfig(address, encodeMessageDigest(prefixEIP191Message(message)), signature, chainId, walletContext)
|
|
119
117
|
}
|
|
120
118
|
|
|
121
119
|
// Recover the WalletConfig from a signature of a typedData object
|
package/src/utils.ts
CHANGED
|
@@ -5,6 +5,25 @@ import { packMessageData, encodeMessageDigest, TypedData, encodeTypedDataDigest
|
|
|
5
5
|
import { Web3Provider } from './provider'
|
|
6
6
|
import { isValidSignature as _isValidSignature, recoverConfig, Signer, isValidEIP712Signature, isValidEthSignSignature } from '@0xsequence/wallet'
|
|
7
7
|
|
|
8
|
+
const eip191prefix = ethers.utils.toUtf8Bytes("\x19Ethereum Signed Message:\n")
|
|
9
|
+
|
|
10
|
+
export const messageToBytes = (message: BytesLike): Uint8Array => {
|
|
11
|
+
if (ethers.utils.isBytes(message) || ethers.utils.isHexString(message)) {
|
|
12
|
+
return ethers.utils.arrayify(message)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return ethers.utils.toUtf8Bytes(message)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const prefixEIP191Message = (message: BytesLike): Uint8Array => {
|
|
19
|
+
const messageBytes = messageToBytes(message)
|
|
20
|
+
return ethers.utils.concat([
|
|
21
|
+
eip191prefix,
|
|
22
|
+
ethers.utils.toUtf8Bytes(String(messageBytes.length)),
|
|
23
|
+
messageBytes
|
|
24
|
+
])
|
|
25
|
+
}
|
|
26
|
+
|
|
8
27
|
export const isValidSignature = async (
|
|
9
28
|
address: string,
|
|
10
29
|
digest: Uint8Array,
|
|
@@ -30,13 +49,9 @@ export const isValidMessageSignature = async (
|
|
|
30
49
|
chainId?: number,
|
|
31
50
|
walletContext?: WalletContext
|
|
32
51
|
): Promise<boolean | undefined> => {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
isValidEthSignSignature(address, msgDigest, signature)
|
|
37
|
-
) return true
|
|
38
|
-
|
|
39
|
-
return isValidSignature(address, encodeMessageDigest(message), signature, provider, chainId, walletContext)
|
|
52
|
+
const prefixed = prefixEIP191Message(message)
|
|
53
|
+
const digest = encodeMessageDigest(prefixed)
|
|
54
|
+
return isValidSignature(address, digest, signature, provider, chainId, walletContext)
|
|
40
55
|
}
|
|
41
56
|
|
|
42
57
|
export const isValidTypedDataSignature = (
|