@0xsequence/provider 0.40.2 → 0.40.5

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.
@@ -0,0 +1,121 @@
1
+ import { OpenWalletIntent, ProviderMessage, InitState, WindowSessionParams } from '../../types'
2
+ import { BaseProviderTransport } from '../base-provider-transport'
3
+ import { base64EncodeObject } from '@0xsequence/utils'
4
+ import { overrideLogs } from './overridelogs'
5
+
6
+ let registeredUnrealMessageProvider: UnrealMessageProvider | undefined
7
+
8
+ // all lowercase is an annoying limitation of Unreal CEF BindUObject
9
+ interface UnrealInjectedSequenceJSWindow {
10
+ ue?: {
11
+ sequencewallettransport?: {
12
+ onmessagefromwallet?: (message: ProviderMessage<any>) => void
13
+ sendmessagetowallet: (message: string) => void
14
+ }
15
+ }
16
+ }
17
+
18
+ declare const window: Window & typeof globalThis & UnrealInjectedSequenceJSWindow
19
+
20
+ /**
21
+ * Initialized on dApp side
22
+ */
23
+ export class UnrealMessageProvider extends BaseProviderTransport {
24
+ private walletURL: URL
25
+
26
+ constructor(walletAppURL: string) {
27
+ super()
28
+ this.walletURL = new URL(walletAppURL)
29
+ }
30
+
31
+ register = () => {
32
+ overrideLogs('dapp')
33
+ if (registeredUnrealMessageProvider) {
34
+ // overriding the registered message provider
35
+ registeredUnrealMessageProvider.unregister()
36
+ registeredUnrealMessageProvider = this
37
+ }
38
+
39
+ // listen for incoming messages from wallet
40
+ if (window.ue?.sequencewallettransport) {
41
+ window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback
42
+ }
43
+ registeredUnrealMessageProvider = this
44
+
45
+ this._registered = true
46
+ console.log('registering transport!')
47
+ }
48
+
49
+ unregister = () => {
50
+ this._registered = false
51
+ this.closeWallet()
52
+
53
+ // disable message listener
54
+ if (registeredUnrealMessageProvider === this) {
55
+ registeredUnrealMessageProvider = undefined
56
+ }
57
+ if (window.ue?.sequencewallettransport?.onmessagefromwallet === this.onUnrealCallback) {
58
+ delete window.ue.sequencewallettransport.onmessagefromwallet
59
+ }
60
+
61
+ // clear event listeners
62
+ this.events.removeAllListeners()
63
+ }
64
+
65
+ openWallet = (path?: string, intent?: OpenWalletIntent, networkId?: string | number): void => {
66
+ if (this.isOpened()) {
67
+ // TODO focus wallet
68
+ console.log('wallet already open!')
69
+ return
70
+ }
71
+
72
+ console.log('opening wallet!')
73
+ // Instantiate new walletURL for this call
74
+ const walletURL = new URL(this.walletURL.href)
75
+ const windowSessionParams = new WindowSessionParams()
76
+
77
+ if (path) {
78
+ walletURL.pathname = path.toLowerCase()
79
+ }
80
+
81
+ // Set session, intent and network id on walletURL
82
+ this._init = InitState.NIL
83
+ this._sessionId = `${performance.now()}`
84
+ windowSessionParams.set('sid', this._sessionId)
85
+
86
+ if (intent) {
87
+ // encode intent as base64 url-encoded param
88
+ windowSessionParams.set('intent', base64EncodeObject(intent))
89
+ }
90
+ if (networkId) {
91
+ windowSessionParams.set('net', `${networkId}`)
92
+ }
93
+ // serialize params
94
+ walletURL.search = windowSessionParams.toString()
95
+
96
+ console.log('opening wallet to', walletURL.href)
97
+
98
+ window.open(walletURL.href)
99
+ }
100
+
101
+ closeWallet() {
102
+ this.close()
103
+ }
104
+
105
+ // onmessage, receives ProviderMessageResponse from the wallet unreal transport
106
+ private onUnrealCallback = (message: ProviderMessage<any>) => {
107
+ if (!message) {
108
+ throw new Error('ProviderMessage object is empty')
109
+ }
110
+
111
+ // handle message with base message provider
112
+ this.handleMessage(message)
113
+ }
114
+
115
+ // all lowercase is an annoying limitation of Unreal CEF BindUObject
116
+ sendMessage(message: ProviderMessage<unknown>) {
117
+ const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message
118
+ console.log('Sending message to wallet:', postedMessage)
119
+ window.ue?.sequencewallettransport?.sendmessagetowallet(postedMessage)
120
+ }
121
+ }
@@ -300,17 +300,17 @@ export class WalletRequestHandler implements ExternalProvider, JsonRpcHandler, P
300
300
 
301
301
  // Message must be prefixed with "\x19Ethereum Signed Message:\n"
302
302
  // as defined by EIP-191
303
- message = prefixEIP191Message(message)
303
+ const prefixedMessage = prefixEIP191Message(message)
304
304
 
305
305
  // TODO:
306
306
  // if (process.env.TEST_MODE === 'true' && this.prompter === null) {
307
307
  if (this.prompter === null) {
308
308
  // prompter is null, so we'll sign from here
309
- sig = await signer.signMessage(ethers.utils.arrayify(message), chainId)
309
+ sig = await signer.signMessage(prefixedMessage, chainId)
310
310
  } else {
311
311
  const promptResultForDeployment = await this.handleConfirmWalletDeployPrompt(this.prompter, signer, chainId)
312
312
  if (promptResultForDeployment) {
313
- sig = await this.prompter.promptSignMessage({ chainId: chainId, message }, this.connectOptions)
313
+ sig = await this.prompter.promptSignMessage({ chainId: chainId, message: prefixedMessage }, this.connectOptions)
314
314
  }
315
315
  }
316
316
 
package/src/types.ts CHANGED
@@ -247,7 +247,7 @@ export type OpenWalletIntent =
247
247
  | { type: 'jsonRpcRequest'; method: string }
248
248
 
249
249
  export interface MessageToSign {
250
- message?: string
250
+ message?: Uint8Array
251
251
  typedData?: TypedData
252
252
  chainId?: number
253
253
  }
package/src/wallet.ts CHANGED
@@ -19,9 +19,15 @@ import {
19
19
  } from '@0xsequence/network'
20
20
  import { WalletConfig, WalletState } from '@0xsequence/config'
21
21
  import { logger } from '@0xsequence/utils'
22
- import { JsonRpcProvider, JsonRpcSigner, ExternalProvider } from '@ethersproject/providers'
22
+ import { JsonRpcProvider } from '@ethersproject/providers'
23
23
  import { Web3Provider, Web3Signer } from './provider'
24
- import { MuxMessageProvider, WindowMessageProvider, ProxyMessageProvider, ProxyMessageChannelPort } from './transports'
24
+ import {
25
+ MuxMessageProvider,
26
+ WindowMessageProvider,
27
+ ProxyMessageProvider,
28
+ ProxyMessageChannelPort,
29
+ UnrealMessageProvider
30
+ } from './transports'
25
31
  import { WalletSession, ProviderEventTypes, ConnectOptions, OpenWalletIntent, ConnectDetails } from './types'
26
32
  import { ethers } from 'ethers'
27
33
  import { ExtensionMessageProvider } from './transports/extension-transport/extension-message-provider'
@@ -36,12 +42,12 @@ export interface WalletProvider {
36
42
 
37
43
  isConnected(): boolean
38
44
  getSession(): WalletSession | undefined
39
-
45
+
40
46
  getAddress(): Promise<string>
41
47
  getNetworks(chainId?: ChainIdLike): Promise<NetworkConfig[]>
42
48
  getChainId(): Promise<number>
43
49
  getAuthChainId(): Promise<number>
44
-
50
+
45
51
  isOpened(): boolean
46
52
  openWallet(path?: string, intent?: OpenWalletIntent, networkId?: string | number): Promise<boolean>
47
53
  closeWallet(): void
@@ -85,6 +91,7 @@ export class Wallet implements WalletProvider {
85
91
  windowMessageProvider?: WindowMessageProvider
86
92
  proxyMessageProvider?: ProxyMessageProvider
87
93
  extensionMessageProvider?: ExtensionMessageProvider
94
+ unrealMessageProvider?: UnrealMessageProvider
88
95
  }
89
96
 
90
97
  private networks: NetworkConfig[]
@@ -147,6 +154,10 @@ export class Wallet implements WalletProvider {
147
154
  //
148
155
  // this.transport.messageProvider.add(this.transport.extensionMessageProvider)
149
156
  }
157
+ if (this.config.transports?.unrealTransport?.enabled) {
158
+ this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL)
159
+ this.transport.messageProvider.add(this.transport.unrealMessageProvider)
160
+ }
150
161
  this.transport.messageProvider.register()
151
162
 
152
163
  // .....
@@ -692,6 +703,11 @@ export interface ProviderConfig {
692
703
  enabled: boolean
693
704
  runtime: Runtime.Static
694
705
  }
706
+
707
+ // Unreal Engine transport (optional)
708
+ unrealTransport?: {
709
+ enabled: boolean
710
+ }
695
711
  }
696
712
 
697
713
  // Sequence Wallet Modules Context override. By default (and recommended), the