11import { CB_WALLET_RPC_URL } from ':core/constants.js' ;
22import { standardErrorCodes } from ':core/error/constants.js' ;
33import { standardErrors } from ':core/error/errors.js' ;
4- import { ProviderEventCallback , RequestArguments } from ':core/provider/interface.js' ;
4+ import { RequestArguments } from ':core/provider/interface.js' ;
55import { store } from ':store/store.js' ;
66import { CoinbaseWalletProvider } from './CoinbaseWalletProvider.js' ;
7- import * as util from './sign/util.js' ;
87import * as providerUtil from './util/provider.js' ;
98
109function createProvider ( ) {
@@ -18,28 +17,18 @@ const mockHandshake = vi.fn();
1817const mockRequest = vi . fn ( ) ;
1918const mockCleanup = vi . fn ( ) ;
2019const mockFetchRPCRequest = vi . fn ( ) ;
21- const mockFetchSignerType = vi . spyOn ( util , 'fetchSignerType' ) ;
22- const mockStoreSignerType = vi . spyOn ( util , 'storeSignerType' ) ;
23- const mockLoadSignerType = vi . spyOn ( util , 'loadSignerType' ) ;
2420
2521let provider : CoinbaseWalletProvider ;
26- let callback : ProviderEventCallback ;
2722
2823beforeEach ( ( ) => {
2924 vi . resetAllMocks ( ) ;
30- vi . spyOn ( util , 'createSigner' ) . mockImplementation ( ( params ) => {
31- callback = params . callback ;
32- return {
33- accounts : [ '0x123' ] ,
34- chainId : 1 ,
35- handshake : mockHandshake ,
36- request : mockRequest ,
37- cleanup : mockCleanup ,
38- } ;
39- } ) ;
25+
4026 vi . spyOn ( providerUtil , 'fetchRPCRequest' ) . mockImplementation ( mockFetchRPCRequest ) ;
4127
4228 provider = createProvider ( ) ;
29+ provider [ 'signer' ] . request = mockRequest ;
30+ provider [ 'signer' ] . handshake = mockHandshake ;
31+ provider [ 'signer' ] . cleanup = mockCleanup ;
4332} ) ;
4433
4534describe ( 'Event handling' , ( ) => {
@@ -58,8 +47,7 @@ describe('Event handling', () => {
5847 const chainChangedListener = vi . fn ( ) ;
5948 provider . on ( 'chainChanged' , chainChangedListener ) ;
6049
61- await provider . request ( { method : 'eth_requestAccounts' } ) ;
62- callback ( 'chainChanged' , '0x1' ) ;
50+ provider [ 'signer' ] ?. [ 'callback' ] ?.( 'chainChanged' , '0x1' ) ;
6351
6452 expect ( chainChangedListener ) . toHaveBeenCalledWith ( '0x1' ) ;
6553 } ) ;
@@ -68,8 +56,7 @@ describe('Event handling', () => {
6856 const accountsChangedListener = vi . fn ( ) ;
6957 provider . on ( 'accountsChanged' , accountsChangedListener ) ;
7058
71- await provider . request ( { method : 'eth_requestAccounts' } ) ;
72- callback ( 'accountsChanged' , [ '0x123' ] ) ;
59+ provider [ 'signer' ] ?. [ 'callback' ] ?.( 'accountsChanged' , [ '0x123' ] ) ;
7360
7461 expect ( accountsChangedListener ) . toHaveBeenCalledWith ( [ '0x123' ] ) ;
7562 } ) ;
@@ -103,123 +90,29 @@ describe('Request Handling', () => {
10390describe ( 'Ephemeral methods' , ( ) => {
10491 it ( 'should post requests to wallet rpc url for wallet_getCallsStatus' , async ( ) => {
10592 const args = { method : 'wallet_getCallsStatus' } ;
106- expect ( provider [ 'signer' ] ) . toBeNull ( ) ;
10793 await provider . request ( args ) ;
10894 expect ( mockFetchRPCRequest ) . toHaveBeenCalledWith ( args , CB_WALLET_RPC_URL ) ;
109- expect ( provider [ 'signer' ] ) . toBeNull ( ) ;
11095 } ) ;
11196
11297 it . each ( [ 'wallet_sendCalls' , 'wallet_sign' ] ) (
11398 'should perform a successful request after handshake' ,
11499 async ( method ) => {
115100 const args = { method, params : [ '0xdeadbeef' ] } ;
116- expect ( provider [ 'signer' ] ) . toBeNull ( ) ;
117101 await provider . request ( args ) ;
118102 expect ( mockHandshake ) . toHaveBeenCalledWith ( { method : 'handshake' } ) ;
119103 expect ( mockRequest ) . toHaveBeenCalledWith ( args ) ;
120104 expect ( mockCleanup ) . toHaveBeenCalled ( ) ;
121- expect ( provider [ 'signer' ] ) . toBeNull ( ) ;
122105 }
123106 ) ;
124107} ) ;
125108
126- describe ( 'Signer configuration' , ( ) => {
127- it ( 'should complete signerType selection correctly' , async ( ) => {
128- mockFetchSignerType . mockResolvedValue ( 'scw' ) ;
129-
130- const args = { method : 'eth_requestAccounts' } ;
131- await provider . request ( args ) ;
132- expect ( mockHandshake ) . toHaveBeenCalledWith ( args ) ;
133- } ) ;
134-
135- it ( 'should support enable' , async ( ) => {
136- mockFetchSignerType . mockResolvedValue ( 'scw' ) ;
137- vi . spyOn ( console , 'warn' ) . mockImplementation ( ( ) => { } ) ;
138-
139- await provider . enable ( ) ;
140- expect ( mockHandshake ) . toHaveBeenCalledWith ( { method : 'eth_requestAccounts' } ) ;
141- } ) ;
142-
143- it ( 'should pass handshake request args' , async ( ) => {
144- mockFetchSignerType . mockResolvedValue ( 'scw' ) ;
145-
146- const argsWithCustomParams = {
147- method : 'eth_requestAccounts' ,
148- params : [ { scwOnboardMode : 'create' } ] ,
149- } ;
150- await provider . request ( argsWithCustomParams ) ;
151- expect ( mockFetchSignerType ) . toHaveBeenCalledWith (
152- expect . objectContaining ( {
153- handshakeRequest : argsWithCustomParams ,
154- } )
155- ) ;
156- } ) ;
157-
158- it ( 'should throw error if signer selection failed' , async ( ) => {
159- const error = new Error ( 'Signer selection failed' ) ;
160- mockFetchSignerType . mockRejectedValue ( error ) ;
161-
162- await expect ( provider . request ( { method : 'eth_requestAccounts' } ) ) . rejects . toMatchObject ( {
163- code : standardErrorCodes . rpc . internal ,
164- message : error . message ,
165- } ) ;
166- expect ( mockHandshake ) . not . toHaveBeenCalled ( ) ;
167- expect ( mockStoreSignerType ) . not . toHaveBeenCalled ( ) ;
168- } ) ;
169-
170- it ( 'should not store signer type unless handshake is successful' , async ( ) => {
171- const error = new Error ( 'Handshake failed' ) ;
172- mockFetchSignerType . mockResolvedValue ( 'scw' ) ;
173- mockHandshake . mockRejectedValue ( error ) ;
174-
175- await expect ( provider . request ( { method : 'eth_requestAccounts' } ) ) . rejects . toMatchObject ( {
176- code : standardErrorCodes . rpc . internal ,
177- message : error . message ,
178- } ) ;
179- expect ( mockHandshake ) . toHaveBeenCalled ( ) ;
180- expect ( mockStoreSignerType ) . not . toHaveBeenCalled ( ) ;
181- } ) ;
182-
183- it ( 'should load signer from storage when available' , async ( ) => {
184- mockLoadSignerType . mockReturnValue ( 'scw' ) ;
185- const providerLoadedFromStorage = createProvider ( ) ;
186-
187- await providerLoadedFromStorage . request ( { method : 'eth_requestAccounts' } ) ;
188- expect ( mockHandshake ) . not . toHaveBeenCalled ( ) ;
189-
190- const request = { method : 'personal_sign' , params : [ '0x123' , '0xdeadbeef' ] } ;
191- await providerLoadedFromStorage . request ( request ) ;
192- expect ( mockRequest ) . toHaveBeenCalledWith ( request ) ;
193-
194- await providerLoadedFromStorage . disconnect ( ) ;
195- expect ( mockCleanup ) . toHaveBeenCalled ( ) ;
196- expect ( provider [ 'signer' ] ) . toBeNull ( ) ;
197- } ) ;
198-
199- it ( 'should throw error if signer is not initialized' , async ( ) => {
200- await expect ( provider . request ( { method : 'personal_sign' } ) ) . rejects . toMatchObject ( {
201- code : standardErrorCodes . provider . unauthorized ,
202- message : `Must call 'eth_requestAccounts' before other methods` ,
109+ describe ( 'Auto sub account' , ( ) => {
110+ it ( 'call handshake without method when enableAutoSubAccounts is true' , async ( ) => {
111+ vi . spyOn ( store . subAccountsConfig , 'get' ) . mockReturnValue ( {
112+ enableAutoSubAccounts : true ,
203113 } ) ;
204- } ) ;
205114
206- it ( 'should set signer to null' , async ( ) => {
207115 await provider . request ( { method : 'eth_requestAccounts' } ) ;
208-
209- await provider . disconnect ( ) ;
210- expect ( mockCleanup ) . toHaveBeenCalled ( ) ;
211- expect ( provider [ 'signer' ] ) . toBeNull ( ) ;
212- } ) ;
213-
214- describe ( 'Auto sub account' , ( ) => {
215- it ( 'call handshake without method when enableAutoSubAccounts is true' , async ( ) => {
216- mockLoadSignerType . mockReturnValue ( 'scw' ) ;
217- vi . spyOn ( store . subAccountsConfig , 'get' ) . mockReturnValue ( {
218- enableAutoSubAccounts : true ,
219- } ) ;
220-
221- await provider . request ( { method : 'eth_requestAccounts' } ) ;
222- expect ( mockHandshake ) . toHaveBeenCalledWith ( { method : 'handshake' } ) ;
223- } ) ;
116+ expect ( mockHandshake ) . toHaveBeenCalledWith ( { method : 'handshake' } ) ;
224117 } ) ;
225118} ) ;
0 commit comments