@@ -107,8 +107,8 @@ export class Web3AuthNoModal extends SafeEventEmitter<Web3AuthNoModalEvents> imp
107107 }
108108
109109 // init config
110- this . initChainsConfig ( projectConfig ) ;
111110 this . initAccountAbstractionConfig ( projectConfig ) ;
111+ this . initChainsConfig ( projectConfig ) ;
112112 this . initCachedConnectorAndChainId ( ) ;
113113
114114 // setup common JRPC provider
@@ -226,25 +226,41 @@ export class Web3AuthNoModal extends SafeEventEmitter<Web3AuthNoModalEvents> imp
226226 }
227227
228228 protected initChainsConfig ( projectConfig : ProjectConfig ) {
229- const projectConfigChains = projectConfig . chains ;
230229 // merge chains from project config with core options, core options chains will take precedence over project config chains
231- const mergedChains = { ...projectConfigChains } ;
232- ( this . coreOptions . chains || [ ] ) . forEach ( ( chain ) => {
233- const projectConfigChain = projectConfigChains ?. [ chain . chainId ] ;
234- if ( ! projectConfigChain ) mergedChains [ chain . chainId ] = { enabled : true , config : chain } ;
235- else {
236- mergedChains [ chain . chainId ] = { ...projectConfigChain , ...{ ...chain , enabled : true } } ;
237- }
238- } ) ;
239- this . coreOptions . chains = Object . values ( mergedChains )
240- . filter ( ( chain ) => chain . enabled )
241- . map ( ( chain ) => chain . config ) ;
230+ const chainMap = new Map < string , CustomChainConfig > ( ) ;
231+ const enabledProjectConfigChains = projectConfig . chains ?. filter ( ( chain ) => chain . enabled ) . map ( ( chain ) => chain . config ) || [ ] ;
232+ const allChains = [ ...enabledProjectConfigChains , ...( this . coreOptions . chains || [ ] ) ] ;
233+ for ( const chain of allChains ) {
234+ const existingChain = chainMap . get ( chain . chainId ) ;
235+ if ( ! existingChain ) chainMap . set ( chain . chainId , chain ) ;
236+ else chainMap . set ( chain . chainId , { ...existingChain , ...chain } ) ;
237+ }
238+ this . coreOptions . chains = Array . from ( chainMap . values ( ) ) ;
242239
243240 // validate chains and namespaces
244- if ( ! this . coreOptions . chains ?. length ) throw WalletInitializationError . invalidParams ( "Please provide chains" ) ;
241+ if ( this . coreOptions . chains . length === 0 ) {
242+ log . error ( "Please provide chains" ) ;
243+ throw WalletInitializationError . invalidParams ( "Please provide chains" ) ;
244+ }
245245 for ( const chain of this . coreOptions . chains ) {
246- if ( ! chain . chainNamespace || ! Object . values ( CHAIN_NAMESPACES ) . includes ( chain . chainNamespace ) )
247- throw WalletInitializationError . invalidParams ( "Please provide a valid chainNamespace in chains" ) ;
246+ if ( ! chain . chainNamespace || ! Object . values ( CHAIN_NAMESPACES ) . includes ( chain . chainNamespace ) ) {
247+ log . error ( `Please provide a valid chainNamespace in chains for chain ${ chain . chainId } ` ) ;
248+ throw WalletInitializationError . invalidParams ( `Please provide a valid chainNamespace in chains for chain ${ chain . chainId } ` ) ;
249+ }
250+ }
251+
252+ // if AA is enabled, filter out chains that are not AA-supported
253+ if ( this . coreOptions . accountAbstractionConfig ) {
254+ const aaSupportedChainIds = new Set (
255+ this . coreOptions . accountAbstractionConfig ?. chains
256+ ?. filter ( ( chain ) => chain . chainId && chain . bundlerConfig ?. url )
257+ . map ( ( chain ) => chain . chainId ) || [ ]
258+ ) ;
259+ this . coreOptions . chains = this . coreOptions . chains . filter ( ( chain ) => aaSupportedChainIds . has ( chain . chainId ) ) ;
260+ if ( this . coreOptions . chains . length === 0 ) {
261+ log . error ( "Account Abstraction is enabled but no supported chains found" ) ;
262+ throw WalletInitializationError . invalidParams ( "Account Abstraction is enabled but no supported chains found" ) ;
263+ }
248264 }
249265 }
250266
0 commit comments