@0xsequence/provider 0.0.0-2021823181734

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.
Files changed (54) hide show
  1. package/CHANGELOG.md +909 -0
  2. package/README.md +4 -0
  3. package/dist/0xsequence-provider.cjs.d.ts +1 -0
  4. package/dist/0xsequence-provider.cjs.dev.js +3540 -0
  5. package/dist/0xsequence-provider.cjs.js +7 -0
  6. package/dist/0xsequence-provider.cjs.prod.js +3540 -0
  7. package/dist/0xsequence-provider.esm.js +3508 -0
  8. package/dist/declarations/src/commands/index.d.ts +20 -0
  9. package/dist/declarations/src/index.d.ts +5 -0
  10. package/dist/declarations/src/provider.d.ts +59 -0
  11. package/dist/declarations/src/transports/base-provider-transport.d.ts +40 -0
  12. package/dist/declarations/src/transports/base-wallet-transport.d.ts +38 -0
  13. package/dist/declarations/src/transports/extension-transport/base-injected-transport.d.ts +18 -0
  14. package/dist/declarations/src/transports/extension-transport/extension-message-handler.d.ts +12 -0
  15. package/dist/declarations/src/transports/extension-transport/extension-message-provider.d.ts +11 -0
  16. package/dist/declarations/src/transports/extension-transport/index.d.ts +3 -0
  17. package/dist/declarations/src/transports/index.d.ts +7 -0
  18. package/dist/declarations/src/transports/mux-transport/index.d.ts +1 -0
  19. package/dist/declarations/src/transports/mux-transport/mux-message-provider.d.ts +22 -0
  20. package/dist/declarations/src/transports/proxy-transport/index.d.ts +3 -0
  21. package/dist/declarations/src/transports/proxy-transport/proxy-message-channel.d.ts +15 -0
  22. package/dist/declarations/src/transports/proxy-transport/proxy-message-handler.d.ts +12 -0
  23. package/dist/declarations/src/transports/proxy-transport/proxy-message-provider.d.ts +12 -0
  24. package/dist/declarations/src/transports/wallet-request-handler.d.ts +51 -0
  25. package/dist/declarations/src/transports/window-transport/index.d.ts +2 -0
  26. package/dist/declarations/src/transports/window-transport/window-message-handler.d.ts +15 -0
  27. package/dist/declarations/src/transports/window-transport/window-message-provider.d.ts +13 -0
  28. package/dist/declarations/src/types.d.ts +170 -0
  29. package/dist/declarations/src/utils.d.ts +14 -0
  30. package/dist/declarations/src/wallet.d.ts +99 -0
  31. package/package.json +37 -0
  32. package/src/commands/index.ts +146 -0
  33. package/src/index.ts +5 -0
  34. package/src/provider.ts +494 -0
  35. package/src/transports/base-provider-transport.ts +411 -0
  36. package/src/transports/base-wallet-transport.ts +441 -0
  37. package/src/transports/extension-transport/base-injected-transport.ts +100 -0
  38. package/src/transports/extension-transport/extension-message-handler.ts +25 -0
  39. package/src/transports/extension-transport/extension-message-provider.ts +41 -0
  40. package/src/transports/extension-transport/index.ts +3 -0
  41. package/src/transports/index.ts +7 -0
  42. package/src/transports/mux-transport/index.ts +1 -0
  43. package/src/transports/mux-transport/mux-message-provider.ts +160 -0
  44. package/src/transports/proxy-transport/index.ts +3 -0
  45. package/src/transports/proxy-transport/proxy-message-channel.ts +58 -0
  46. package/src/transports/proxy-transport/proxy-message-handler.ts +46 -0
  47. package/src/transports/proxy-transport/proxy-message-provider.ts +81 -0
  48. package/src/transports/wallet-request-handler.ts +702 -0
  49. package/src/transports/window-transport/index.ts +2 -0
  50. package/src/transports/window-transport/window-message-handler.ts +166 -0
  51. package/src/transports/window-transport/window-message-provider.ts +183 -0
  52. package/src/types.ts +252 -0
  53. package/src/utils.ts +76 -0
  54. package/src/wallet.ts +692 -0
@@ -0,0 +1,99 @@
1
+ import { NetworkConfig, WalletContext, ChainIdLike } from '@0xsequence/network';
2
+ import { WalletConfig, WalletState } from '@0xsequence/config';
3
+ import { Web3Provider, Web3Signer } from './provider';
4
+ import { ProxyMessageChannelPort } from './transports';
5
+ import { WalletSession, ProviderEventTypes, ConnectOptions, OpenWalletIntent, ConnectDetails } from './types';
6
+ import { WalletCommands } from './commands';
7
+ import { Runtime } from 'webextension-polyfill-ts';
8
+ export interface WalletProvider {
9
+ connect(options?: ConnectOptions): Promise<ConnectDetails>;
10
+ disconnect(): void;
11
+ isOpened(): boolean;
12
+ isConnected(): boolean;
13
+ getSession(): WalletSession | undefined;
14
+ getAddress(): Promise<string>;
15
+ getNetworks(chainId?: ChainIdLike): Promise<NetworkConfig[]>;
16
+ getChainId(): Promise<number>;
17
+ getAuthChainId(): Promise<number>;
18
+ openWallet(path?: string, intent?: OpenWalletIntent, networkId?: string | number): Promise<boolean>;
19
+ closeWallet(): void;
20
+ getProvider(chainId?: ChainIdLike): Web3Provider | undefined;
21
+ getSigner(chainId?: ChainIdLike): Web3Signer;
22
+ getWalletContext(): Promise<WalletContext>;
23
+ getWalletConfig(chainId?: ChainIdLike): Promise<WalletConfig[]>;
24
+ getWalletState(chainId?: ChainIdLike): Promise<WalletState[]>;
25
+ isDeployed(chainId?: ChainIdLike): Promise<boolean>;
26
+ getProviderConfig(): ProviderConfig;
27
+ on<K extends keyof ProviderEventTypes>(event: K, fn: ProviderEventTypes[K]): void;
28
+ once<K extends keyof ProviderEventTypes>(event: K, fn: ProviderEventTypes[K]): void;
29
+ commands: WalletCommands;
30
+ }
31
+ export declare class Wallet implements WalletProvider {
32
+ commands: WalletCommands;
33
+ private config;
34
+ private session?;
35
+ private connectedSites;
36
+ private transport;
37
+ private networks;
38
+ private providers;
39
+ constructor(defaultNetworkId?: string | number, config?: Partial<ProviderConfig>);
40
+ private init;
41
+ connect: (options?: ConnectOptions | undefined) => Promise<ConnectDetails>;
42
+ addConnectedSite(origin: string | undefined): void;
43
+ removeConnectedSite(origin: string): void;
44
+ getConnectedSites(): string[] | undefined;
45
+ private isSiteConnected;
46
+ authorize: (options?: ConnectOptions | undefined) => Promise<ConnectDetails>;
47
+ disconnect(): void;
48
+ getProviderConfig(): ProviderConfig;
49
+ isOpened(): boolean;
50
+ isConnected(): boolean;
51
+ getSession: () => WalletSession | undefined;
52
+ getAddress: () => Promise<string>;
53
+ getNetworks: (chainId?: any) => Promise<NetworkConfig[]>;
54
+ getChainId: () => Promise<number>;
55
+ getAuthChainId: () => Promise<number>;
56
+ openWallet: (path?: string | undefined, intent?: OpenWalletIntent | undefined, networkId?: string | number | undefined) => Promise<boolean>;
57
+ closeWallet: () => void;
58
+ getProvider(chainId?: ChainIdLike): Web3Provider | undefined;
59
+ getAuthProvider(): Promise<Web3Provider>;
60
+ getAuthNetwork(): Promise<NetworkConfig>;
61
+ getAllProviders(): {
62
+ [chainId: number]: Web3Provider;
63
+ };
64
+ getSigner(chainId?: ChainIdLike): Web3Signer;
65
+ getAuthSigner(): Promise<Web3Signer>;
66
+ getWalletConfig(chainId?: ChainIdLike): Promise<WalletConfig[]>;
67
+ getWalletState(chainId?: ChainIdLike): Promise<WalletState[]>;
68
+ getWalletContext(): Promise<WalletContext>;
69
+ isDeployed(chainId?: ChainIdLike): Promise<boolean>;
70
+ on<K extends keyof ProviderEventTypes>(event: K, fn: ProviderEventTypes[K]): void;
71
+ once<K extends keyof ProviderEventTypes>(event: K, fn: ProviderEventTypes[K]): void;
72
+ private loadSession;
73
+ private saveSession;
74
+ private useSession;
75
+ private useAccountAddress;
76
+ private useNetworks;
77
+ private clearSession;
78
+ }
79
+ export interface ProviderConfig {
80
+ walletAppURL: string;
81
+ networks?: Partial<NetworkConfig>[];
82
+ networkRpcUrl?: string;
83
+ defaultNetworkId?: string | number;
84
+ transports?: {
85
+ windowTransport?: {
86
+ enabled: boolean;
87
+ };
88
+ proxyTransport?: {
89
+ enabled: boolean;
90
+ appPort?: ProxyMessageChannelPort;
91
+ };
92
+ extensionTransport?: {
93
+ enabled: boolean;
94
+ runtime: Runtime.Static;
95
+ };
96
+ };
97
+ walletContext?: WalletContext;
98
+ }
99
+ export declare const DefaultProviderConfig: ProviderConfig;
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@0xsequence/provider",
3
+ "version": "0.0.0-2021823181734",
4
+ "description": "provider sub-package for Sequence",
5
+ "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/provider",
6
+ "source": "src/index.ts",
7
+ "main": "dist/0xsequence-provider.cjs.js",
8
+ "module": "dist/0xsequence-provider.esm.js",
9
+ "author": "Horizon Blockchain Games",
10
+ "license": "Apache-2.0",
11
+ "scripts": {
12
+ "test": "echo",
13
+ "typecheck": "tsc --noEmit"
14
+ },
15
+ "dependencies": {
16
+ "@0xsequence/abi": "^0.28.0",
17
+ "@0xsequence/auth": "^0.0.0-2021823181734",
18
+ "@0xsequence/config": "^0.0.0-2021823181734",
19
+ "@0xsequence/network": "^0.0.0-2021823181734",
20
+ "@0xsequence/transactions": "^0.0.0-2021823181734",
21
+ "@0xsequence/utils": "^0.28.0",
22
+ "@0xsequence/wallet": "^0.0.0-2021823181734",
23
+ "@ethersproject/abstract-signer": "5.0.14",
24
+ "@ethersproject/hash": "^5.0.12",
25
+ "@ethersproject/providers": "^5.0.24",
26
+ "@ethersproject/web": "^5.0.14",
27
+ "ethers": "^5.0.32",
28
+ "eventemitter2": "^6.4.4",
29
+ "webextension-polyfill-ts": "^0.26.0"
30
+ },
31
+ "peerDependencies": {},
32
+ "devDependencies": {},
33
+ "files": [
34
+ "src",
35
+ "dist"
36
+ ]
37
+ }
@@ -0,0 +1,146 @@
1
+ import { BigNumberish, BytesLike } from 'ethers'
2
+ import { TypedDataDomain, TypedDataField, TypedDataSigner } from '@ethersproject/abstract-signer'
3
+ import { WalletContext, ChainIdLike } from '@0xsequence/network'
4
+ import { encodeMessageDigest, TypedData, encodeTypedDataDigest } from '@0xsequence/utils'
5
+ import { DecodedSignature, WalletConfig } from '@0xsequence/config'
6
+ import { Wallet } from '../wallet'
7
+ import { isValidSignature, recoverWalletConfig } from '../utils'
8
+
9
+ export class WalletCommands {
10
+ private wallet: Wallet
11
+
12
+ constructor(walletProvider: Wallet) {
13
+ this.wallet = walletProvider
14
+ }
15
+
16
+ // Sign message on a specified chain, or DefaultChain by default
17
+ signMessage(message: BytesLike, chainId?: ChainIdLike, allSigners?: boolean): Promise<string> {
18
+ const signer = this.wallet.getSigner()
19
+ if (!signer) throw new Error('unable to get signer')
20
+ return signer.signMessage(message, chainId, allSigners)
21
+ }
22
+
23
+ // Sign message on the AuthChain
24
+ async signAuthMessage(message: BytesLike, allSigners?: boolean): Promise<string> {
25
+ const signer = await this.wallet.getAuthSigner()
26
+ if (!signer) throw new Error('unable to get AuthChain signer')
27
+ return signer.signMessage(message, await signer.getChainId(), allSigners)
28
+ }
29
+
30
+ // Sign EIP-712 TypedData on a specified chain, or DefaultChain by default
31
+ signTypedData(
32
+ domain: TypedDataDomain,
33
+ types: Record<string, Array<TypedDataField>>,
34
+ message: Record<string, any>,
35
+ chainId?: ChainIdLike,
36
+ allSigners?: boolean
37
+ ): Promise<string> {
38
+ const signer = this.wallet.getSigner()
39
+ if (!signer) throw new Error('unable to get signer')
40
+ return signer.signTypedData(domain, types, message, chainId, allSigners)
41
+ }
42
+
43
+ // Sign EIP-712 TypedData on the AuthChain
44
+ async signAuthTypedData(
45
+ domain: TypedDataDomain,
46
+ types: Record<string, Array<TypedDataField>>,
47
+ message: Record<string, any>,
48
+ allSigners?: boolean
49
+ ): Promise<string> {
50
+ const signer = await this.wallet.getAuthSigner()
51
+ if (!signer) throw new Error('unable to get AuthChain signer')
52
+ return signer.signTypedData(domain, types, message, await signer.getChainId(), allSigners)
53
+ }
54
+
55
+ // Verify signature of a digest, one of a message, typedData or other
56
+ async isValidSignature(
57
+ address: string,
58
+ digest: Uint8Array,
59
+ signature: string,
60
+ chainId: number,
61
+ walletContext?: WalletContext
62
+ ): Promise<boolean | undefined> {
63
+ const provider = this.wallet.getProvider(chainId)
64
+ if (!provider) throw new Error(`unable to get provider for chainId ${chainId}`)
65
+ return isValidSignature(address, digest, signature, provider, chainId, walletContext)
66
+ }
67
+
68
+ // Verify message signature
69
+ isValidMessageSignature(
70
+ address: string,
71
+ message: string | Uint8Array,
72
+ signature: string,
73
+ chainId: number,
74
+ walletContext?: WalletContext
75
+ ): Promise<boolean | undefined> {
76
+ return this.isValidSignature(address, encodeMessageDigest(message), signature, chainId, walletContext)
77
+ }
78
+
79
+ // Verify typedData signature
80
+ isValidTypedDataSignature(
81
+ address: string,
82
+ typedData: TypedData,
83
+ signature: string,
84
+ chainId: number,
85
+ walletContext?: WalletContext
86
+ ): Promise<boolean | undefined> {
87
+ return this.isValidSignature(address, encodeTypedDataDigest(typedData), signature, chainId, walletContext)
88
+ }
89
+
90
+ // Recover the WalletConfig from a signature + digest combo
91
+ recoverWalletConfig = async (
92
+ address: string,
93
+ digest: BytesLike,
94
+ signature: string | DecodedSignature,
95
+ chainId: BigNumberish,
96
+ walletContext?: WalletContext
97
+ ): Promise<WalletConfig> => {
98
+ walletContext = walletContext || (await this.wallet.getWalletContext())
99
+ return recoverWalletConfig(address, digest, signature, chainId, walletContext)
100
+ }
101
+
102
+ // Recover the WalletConfig from a signature of a message
103
+ recoverWalletConfigFromMessage = async (
104
+ address: string,
105
+ message: string | Uint8Array,
106
+ signature: string | DecodedSignature,
107
+ chainId: BigNumberish,
108
+ walletContext?: WalletContext
109
+ ): Promise<WalletConfig> => {
110
+ walletContext = walletContext || (await this.wallet.getWalletContext())
111
+ return recoverWalletConfig(address, encodeMessageDigest(message), signature, chainId, walletContext)
112
+ }
113
+
114
+ // Recover the WalletConfig from a signature of a typedData object
115
+ recoverWalletConfigFromTypedData = async (
116
+ address: string,
117
+ typedData: TypedData,
118
+ signature: string | DecodedSignature,
119
+ chainId: BigNumberish,
120
+ walletContext?: WalletContext
121
+ ): Promise<WalletConfig> => {
122
+ walletContext = walletContext || (await this.wallet.getWalletContext())
123
+ return recoverWalletConfig(address, encodeTypedDataDigest(typedData), signature, chainId, walletContext)
124
+ }
125
+
126
+ // sendTransaction()
127
+ // sendTransactions()
128
+
129
+ // sendETH()
130
+ // sendToken()
131
+ // sendCoin() -- sugar for sendToken()
132
+ // sendCollectible() -- sugar for sendToken()
133
+ // callContract()
134
+
135
+ // transactionHistory()
136
+ // getReceipt()
137
+ // getLogs()
138
+ // // ..
139
+
140
+ // isWalletDeployed()
141
+ // deployWallet()
142
+
143
+ // validateSignature()
144
+ // recoverWalletConfig()
145
+ // recoverAddress()
146
+ }
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './transports'
2
+ export * from './types'
3
+ export * from './wallet'
4
+ export * from './provider'
5
+ export * from './utils'