1+ import {
2+ ProxyMessageProvider , ProviderMessageTransport , ProviderMessage , WalletRequestHandler ,
3+ ProxyMessageChannel , ProxyMessageHandler , Wallet , DefaultProviderConfig , Web3Provider ,
4+ WindowMessageHandler
5+ } from '@0xsequence/provider'
6+ import { ethers , Wallet as EOAWallet } from 'ethers'
7+ import { JsonRpcProvider } from '@ethersproject/providers'
8+ import { test , assert } from '../../utils/assert'
9+ import { Networks , WalletContext } from '@0xsequence/network'
10+ import { Wallet as SequenceWallet , Account as SequenceAccount , isValidSignature , packMessageData , recoverConfig } from '@0xsequence/wallet'
11+ import { addressOf } from '@0xsequence/config'
12+ import { LocalRelayer } from '@0xsequence/relayer'
13+ import { testAccounts , getEOAWallet , testWalletContext } from '../testutils'
14+
15+
16+ // Tests simulates a multi-message provider environment by having a wallet available via the
17+ // proxy channel and wallet window.
18+ export const tests = async ( ) => {
19+
20+ //
21+ // Providers
22+ //
23+ const provider1 = new JsonRpcProvider ( 'http://localhost:8545' )
24+ const provider2 = new JsonRpcProvider ( 'http://localhost:9545' )
25+
26+
27+ //
28+ // Deploy Sequence WalletContext (deterministic). We skip deployment
29+ // as we rely on mock-wallet to deploy it.
30+ //
31+ const deployedWalletContext = testWalletContext
32+ console . log ( 'walletContext:' , deployedWalletContext )
33+
34+
35+ //
36+ // Proxy Channel (normally would be out-of-band)
37+ //
38+ const ch = new ProxyMessageChannel ( )
39+
40+
41+ //
42+ // Wallet Handler (local mock wallet, same a mock-wallet tests)
43+ //
44+
45+ // owner account address: 0x4e37E14f5d5AAC4DF1151C6E8DF78B7541680853
46+ const owner = getEOAWallet ( testAccounts [ 0 ] . privateKey )
47+
48+
49+ // relayers, account address: 0x3631d4d374c3710c3456d6b1de1ee8745fbff8ba
50+ // const relayerAccount = getEOAWallet(testAccounts[5].privateKey)
51+ const relayer1 = new LocalRelayer ( getEOAWallet ( testAccounts [ 5 ] . privateKey ) )
52+ const relayer2 = new LocalRelayer ( getEOAWallet ( testAccounts [ 5 ] . privateKey , provider2 ) )
53+
54+
55+ // wallet account address: 0x24E78922FE5eCD765101276A422B8431d7151259 based on the chainId
56+ const swallet = ( await SequenceWallet . singleOwner ( owner , deployedWalletContext ) ) . connect ( provider1 , relayer1 )
57+
58+ // Network available list
59+ const networks : Networks = [
60+ {
61+ name : 'hardhat' ,
62+ chainId : 31337 ,
63+ rpcUrl : provider1 . connection . url ,
64+ provider : provider1 ,
65+ relayer : relayer1 ,
66+ isDefaultChain : true ,
67+ // isAuthChain: true
68+ } ,
69+ {
70+ name : 'hardhat2' ,
71+ chainId : 31338 ,
72+ rpcUrl : provider2 . connection . url ,
73+ provider : provider2 ,
74+ relayer : relayer2 ,
75+ isAuthChain : true
76+ }
77+ ]
78+
79+ // Account for managing multi-network wallets
80+ const saccount = new SequenceAccount ( {
81+ initialConfig : swallet . config ,
82+ networks,
83+ context : deployedWalletContext
84+ } , owner )
85+
86+ // the rpc signer via the wallet
87+ const walletRequestHandler = new WalletRequestHandler ( saccount , null , networks )
88+
89+ // register wallet message handler, in this case using the ProxyMessage transport.
90+ const proxyHandler = new ProxyMessageHandler ( walletRequestHandler , ch . wallet )
91+ proxyHandler . register ( )
92+
93+ // register window message transport
94+ const windowHandler = new WindowMessageHandler ( walletRequestHandler )
95+ windowHandler . register ( )
96+
97+
98+ //
99+ // Dapp, wallet provider and dapp tests
100+ //
101+
102+ // wallet provider with multiple message provider transports enabled
103+ const wallet = new Wallet ( 'hardhat' , {
104+ walletAppURL : 'http://localhost:9999/mock-wallet/mock-wallet.test.html' ,
105+ transports : {
106+ windowTransport : { enabled : true } ,
107+ proxyTransport : { enabled : true , appPort : ch . app }
108+ }
109+ } )
110+
111+ // provider + signer, by default if a chainId is not specified it will direct
112+ // requests to the defaultChain
113+ // const provider = wallet.getProvider()
114+ // const signer = wallet.getSigner()
115+
116+ // clear it in case we're testing in browser session
117+ wallet . logout ( )
118+
119+ await test ( 'is logged out' , async ( ) => {
120+ assert . false ( wallet . isLoggedIn ( ) , 'is logged out' )
121+ } )
122+
123+ await test ( 'is disconnected' , async ( ) => {
124+ assert . false ( wallet . isConnected ( ) , 'is disconnnected' )
125+ } )
126+
127+ await test ( 'login' , async ( ) => {
128+ const loggedIn = await wallet . login ( )
129+ assert . true ( loggedIn , 'is logged in' )
130+ } )
131+
132+ await test ( 'isConnected' , async ( ) => {
133+ assert . true ( wallet . isConnected ( ) , 'is connected' )
134+ } )
135+
136+ let walletContext : WalletContext
137+ await test ( 'getWalletContext' , async ( ) => {
138+ walletContext = await wallet . getWalletContext ( )
139+ assert . equal ( walletContext . factory , deployedWalletContext . factory , 'wallet context factory' )
140+ assert . equal ( walletContext . guestModule , deployedWalletContext . guestModule , 'wallet context guestModule' )
141+ } )
142+
143+ await test ( 'getChainId' , async ( ) => {
144+ const chainId = await wallet . getChainId ( )
145+ assert . equal ( chainId , 31337 , 'chainId is correct' )
146+ } )
147+
148+ await test ( 'getChainId for other chain' , async ( ) => {
149+ const p = wallet . getProvider ( 31338 )
150+ assert . equal ( await p . getChainId ( ) , 31338 , 'chainId of other chain is 31338' )
151+ } )
152+
153+ }
154+
0 commit comments