@0xsequence/provider 0.36.8 → 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 +30 -11
- package/dist/0xsequence-provider.cjs.prod.js +30 -11
- package/dist/0xsequence-provider.esm.js +30 -13
- package/dist/declarations/src/types.d.ts +6 -0
- package/dist/declarations/src/utils.d.ts +2 -0
- package/package.json +8 -8
- package/src/transports/extension-transport/base-injected-transport.ts +2 -1
- package/src/transports/extension-transport/extension-message-handler.ts +2 -1
- package/src/transports/wallet-request-handler.ts +6 -2
- package/src/types.ts +8 -0
- 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);
|
|
@@ -2963,7 +2978,7 @@ class ExtensionMessageHandler extends BaseWalletTransport {
|
|
|
2963
2978
|
}
|
|
2964
2979
|
|
|
2965
2980
|
sendMessage(message) {
|
|
2966
|
-
|
|
2981
|
+
utils.logger.info('[ExtensionMessageHandler send]', message);
|
|
2967
2982
|
this.port.postMessage(message);
|
|
2968
2983
|
}
|
|
2969
2984
|
|
|
@@ -3019,7 +3034,7 @@ class BaseInjectedTransport extends eventemitter2.EventEmitter2 {
|
|
|
3019
3034
|
return;
|
|
3020
3035
|
}
|
|
3021
3036
|
|
|
3022
|
-
|
|
3037
|
+
utils.logger.info('[received message]', message);
|
|
3023
3038
|
const requestIdx = message.idx;
|
|
3024
3039
|
const responseCallback = this.responseCallbacks.get(requestIdx);
|
|
3025
3040
|
|
|
@@ -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);
|
|
@@ -2963,7 +2978,7 @@ class ExtensionMessageHandler extends BaseWalletTransport {
|
|
|
2963
2978
|
}
|
|
2964
2979
|
|
|
2965
2980
|
sendMessage(message) {
|
|
2966
|
-
|
|
2981
|
+
utils.logger.info('[ExtensionMessageHandler send]', message);
|
|
2967
2982
|
this.port.postMessage(message);
|
|
2968
2983
|
}
|
|
2969
2984
|
|
|
@@ -3019,7 +3034,7 @@ class BaseInjectedTransport extends eventemitter2.EventEmitter2 {
|
|
|
3019
3034
|
return;
|
|
3020
3035
|
}
|
|
3021
3036
|
|
|
3022
|
-
|
|
3037
|
+
utils.logger.info('[received message]', message);
|
|
3023
3038
|
const requestIdx = message.idx;
|
|
3024
3039
|
const responseCallback = this.responseCallbacks.get(requestIdx);
|
|
3025
3040
|
|
|
@@ -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);
|
|
@@ -2959,7 +2974,7 @@ class ExtensionMessageHandler extends BaseWalletTransport {
|
|
|
2959
2974
|
}
|
|
2960
2975
|
|
|
2961
2976
|
sendMessage(message) {
|
|
2962
|
-
|
|
2977
|
+
logger.info('[ExtensionMessageHandler send]', message);
|
|
2963
2978
|
this.port.postMessage(message);
|
|
2964
2979
|
}
|
|
2965
2980
|
|
|
@@ -3015,7 +3030,7 @@ class BaseInjectedTransport extends EventEmitter2 {
|
|
|
3015
3030
|
return;
|
|
3016
3031
|
}
|
|
3017
3032
|
|
|
3018
|
-
|
|
3033
|
+
logger.info('[received message]', message);
|
|
3019
3034
|
const requestIdx = message.idx;
|
|
3020
3035
|
const responseCallback = this.responseCallbacks.get(requestIdx);
|
|
3021
3036
|
|
|
@@ -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 };
|
|
@@ -136,6 +136,9 @@ export interface Settings {
|
|
|
136
136
|
* Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent
|
|
137
137
|
* to set when you open the wallet for user. */
|
|
138
138
|
theme?: ThemeOption;
|
|
139
|
+
/** Specify a banner image. This image, if provided, will be displayed on the wallet during
|
|
140
|
+
* the connect/authorize process */
|
|
141
|
+
bannerUrl?: string;
|
|
139
142
|
/** Specify payment providers to use. If not specified,
|
|
140
143
|
* all available payment providers will be enabled.
|
|
141
144
|
* Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent
|
|
@@ -153,6 +156,9 @@ export interface Settings {
|
|
|
153
156
|
* Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent
|
|
154
157
|
* to set when you open the wallet for user. */
|
|
155
158
|
lockFundingCurrencyToDefault?: boolean;
|
|
159
|
+
/** Specify auxiliary data
|
|
160
|
+
*/
|
|
161
|
+
aux?: any;
|
|
156
162
|
}
|
|
157
163
|
/** light and dark are the main themes, to use other themes in wallet settings,
|
|
158
164
|
* you can use the camel case version of the name in the wallet settings.
|
|
@@ -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",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { JsonRpcRequest, JsonRpcResponse } from '@0xsequence/network'
|
|
2
|
+
import { logger } from '@0xsequence/utils'
|
|
2
3
|
import { EventEmitter2 as EventEmitter } from 'eventemitter2'
|
|
3
4
|
import {
|
|
4
5
|
ProviderMessageResponseCallback,
|
|
@@ -32,7 +33,7 @@ export abstract class BaseInjectedTransport extends EventEmitter {
|
|
|
32
33
|
return
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
logger.info('[received message]', message)
|
|
36
37
|
|
|
37
38
|
const requestIdx = message.idx
|
|
38
39
|
const responseCallback = this.responseCallbacks.get(requestIdx)
|
|
@@ -2,6 +2,7 @@ import { WalletRequestHandler } from '../wallet-request-handler'
|
|
|
2
2
|
import { BaseWalletTransport } from '../base-wallet-transport'
|
|
3
3
|
import { InitState, ProviderMessage } from '../../types'
|
|
4
4
|
import { Runtime } from 'webextension-polyfill-ts'
|
|
5
|
+
import { logger } from '@0xsequence/utils'
|
|
5
6
|
|
|
6
7
|
export const CHANNEL_ID = 'sequence-extension-message-handler'
|
|
7
8
|
|
|
@@ -19,7 +20,7 @@ export class ExtensionMessageHandler extends BaseWalletTransport {
|
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
sendMessage(message: ProviderMessage<any>) {
|
|
22
|
-
|
|
23
|
+
logger.info('[ExtensionMessageHandler send]', message)
|
|
23
24
|
this.port.postMessage(message)
|
|
24
25
|
}
|
|
25
26
|
}
|
|
@@ -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/types.ts
CHANGED
|
@@ -176,6 +176,10 @@ export interface Settings {
|
|
|
176
176
|
* to set when you open the wallet for user. */
|
|
177
177
|
theme?: ThemeOption
|
|
178
178
|
|
|
179
|
+
/** Specify a banner image. This image, if provided, will be displayed on the wallet during
|
|
180
|
+
* the connect/authorize process */
|
|
181
|
+
bannerUrl?: string
|
|
182
|
+
|
|
179
183
|
/** Specify payment providers to use. If not specified,
|
|
180
184
|
* all available payment providers will be enabled.
|
|
181
185
|
* Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent
|
|
@@ -195,6 +199,10 @@ export interface Settings {
|
|
|
195
199
|
* Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent
|
|
196
200
|
* to set when you open the wallet for user. */
|
|
197
201
|
lockFundingCurrencyToDefault?: boolean
|
|
202
|
+
|
|
203
|
+
/** Specify auxiliary data
|
|
204
|
+
*/
|
|
205
|
+
aux?: any
|
|
198
206
|
}
|
|
199
207
|
|
|
200
208
|
/** light and dark are the main themes, to use other themes in wallet settings,
|
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 = (
|