@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.
@@ -585,7 +585,10 @@ class WalletRequestHandler {
585
585
  message = data;
586
586
  }
587
587
 
588
- let sig = ''; // TODO:
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: 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 msgDigest = ethers.ethers.utils.arrayify(ethers.ethers.utils.hashMessage(message));
1714
- if (wallet.isValidEIP712Signature(address, msgDigest, signature) || wallet.isValidEthSignSignature(address, msgDigest, signature)) return true;
1715
- return isValidSignature(address, utils.encodeMessageDigest(message), signature, provider, chainId, walletContext);
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 msgDigest = ethers.ethers.utils.arrayify(ethers.ethers.utils.hashMessage(message));
3161
- if (wallet.isValidEIP712Signature(address, msgDigest, signature) || wallet.isValidEthSignSignature(address, msgDigest, signature)) return true;
3162
- return this.isValidSignature(address, utils.encodeMessageDigest(message), signature, chainId, walletContext);
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 = ''; // TODO:
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: 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 msgDigest = ethers.ethers.utils.arrayify(ethers.ethers.utils.hashMessage(message));
1714
- if (wallet.isValidEIP712Signature(address, msgDigest, signature) || wallet.isValidEthSignSignature(address, msgDigest, signature)) return true;
1715
- return isValidSignature(address, utils.encodeMessageDigest(message), signature, provider, chainId, walletContext);
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 msgDigest = ethers.ethers.utils.arrayify(ethers.ethers.utils.hashMessage(message));
3161
- if (wallet.isValidEIP712Signature(address, msgDigest, signature) || wallet.isValidEthSignSignature(address, msgDigest, signature)) return true;
3162
- return this.isValidSignature(address, utils.encodeMessageDigest(message), signature, chainId, walletContext);
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, isValidEIP712Signature, isValidEthSignSignature, recoverConfig } from '@0xsequence/wallet';
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 = ''; // TODO:
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: 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 msgDigest = ethers.utils.arrayify(ethers.utils.hashMessage(message));
1710
- if (isValidEIP712Signature(address, msgDigest, signature) || isValidEthSignSignature(address, msgDigest, signature)) return true;
1711
- return isValidSignature(address, encodeMessageDigest(message), signature, provider, chainId, walletContext);
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 msgDigest = ethers.utils.arrayify(ethers.utils.hashMessage(message));
3157
- if (isValidEIP712Signature(address, msgDigest, signature) || isValidEthSignSignature(address, msgDigest, signature)) return true;
3158
- return this.isValidSignature(address, encodeMessageDigest(message), signature, chainId, walletContext);
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.10",
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.10",
17
- "@0xsequence/auth": "^0.36.10",
18
- "@0xsequence/config": "^0.36.10",
19
- "@0xsequence/network": "^0.36.10",
20
- "@0xsequence/transactions": "^0.36.10",
21
- "@0xsequence/utils": "^0.36.10",
22
- "@0xsequence/wallet": "^0.36.10",
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: message }, this.connectOptions)
320
+ sig = await this.prompter.promptSignMessage({ chainId: chainId, message }, this.connectOptions)
317
321
  }
318
322
  }
319
323
 
@@ -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 msgDigest = ethers.utils.arrayify(ethers.utils.hashMessage(message))
78
- if (
79
- isValidEIP712Signature(address, msgDigest, signature) ||
80
- isValidEthSignSignature(address, msgDigest, signature)
81
- ) return true
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 msgDigest = ethers.utils.arrayify(ethers.utils.hashMessage(message))
34
- if (
35
- isValidEIP712Signature(address, msgDigest, signature) ||
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 = (