@@ -21,6 +21,8 @@ import {
2121 MagicTEESigner ,
2222 ChainConfig ,
2323 ConfirmationScreen ,
24+ EvmChain ,
25+ getChainConfig ,
2426} from '@imtbl/wallet' ;
2527import type { LinkWalletParams , LinkedWallet } from '@imtbl/wallet' ;
2628import {
@@ -200,19 +202,53 @@ export class Passport {
200202 * Uses: Auth + Wallet packages
201203 * @param {Object } options - Configuration options
202204 * @param {boolean } options.announceProvider - Whether to announce the provider via EIP-6963 for wallet discovery (defaults to true)
205+ * @param {EvmChain } options.chain - The EVM chain to connect to (defaults to ZKEVM)
203206 * @returns {Promise<Provider> } The EVM provider instance
204207 */
205208 public async connectEvm ( options : ConnectEvmArguments = { announceProvider : true } ) : Promise < ZkEvmProvider > {
206209 return withMetricsAsync ( async ( ) => {
207- // Access PassportOverrides from PassportConfiguration
208- const passportOverrides = this . passportConfig . overrides ;
210+ const chain = options ?. chain ?? EvmChain . ZKEVM ;
209211
210- // Build complete chain configuration
211- let chainConfig : ChainConfig ;
212+ // TODO: Remove this check once other chains are fully implemented
213+ if ( chain !== EvmChain . ZKEVM ) {
214+ throw new Error ( `Chain ${ chain } is not yet supported. Only ZKEVM is currently available.` ) ;
215+ }
216+
217+ // Build chain configuration based on selected chain
218+ const chainConfig = this . buildChainConfig ( chain ) ;
219+
220+ // Use fee token from chain config, default to IMX for zkEVM
221+ const feeTokenSymbol = chainConfig . feeTokenSymbol ?? 'IMX' ;
222+
223+ // Use connectWallet to create the provider (it will create WalletConfiguration internally)
224+ const provider = await connectWallet ( {
225+ auth : this . auth ,
226+ chains : [ chainConfig ] ,
227+ crossSdkBridgeEnabled : this . passportConfig . crossSdkBridgeEnabled ,
228+ jsonRpcReferrer : this . passportConfig . jsonRpcReferrer ,
229+ forceScwDeployBeforeMessageSignature : this . passportConfig . forceScwDeployBeforeMessageSignature ,
230+ passportEventEmitter : this . auth . eventEmitter ,
231+ feeTokenSymbol,
232+ announceProvider : options ?. announceProvider ?? true ,
233+ } ) ;
212234
235+ return provider ;
236+ } , 'connectEvm' , false ) ;
237+ }
238+
239+ /**
240+ * Build chain configuration based on selected chain and environment
241+ * @internal
242+ */
243+ private buildChainConfig ( chain : EvmChain ) : ChainConfig {
244+ // Access PassportOverrides from PassportConfiguration
245+ const passportOverrides = this . passportConfig . overrides ;
246+
247+ // For zkEVM chain (default)
248+ if ( chain === EvmChain . ZKEVM ) {
213249 if ( passportOverrides ?. zkEvmChainId ) {
214250 // Dev environment with custom chain
215- chainConfig = {
251+ return {
216252 chainId : passportOverrides . zkEvmChainId ,
217253 name : passportOverrides . zkEvmChainName || 'Dev Chain' ,
218254 rpcUrl : this . passportConfig . zkEvmRpcUrl ,
@@ -223,9 +259,11 @@ export class Passport {
223259 magicProviderId : this . passportConfig . magicProviderId ,
224260 magicTeeBasePath : passportOverrides . magicTeeBasePath || this . passportConfig . magicTeeBasePath ,
225261 } ;
226- } else if ( this . environment === Environment . PRODUCTION ) {
262+ }
263+
264+ if ( this . environment === Environment . PRODUCTION ) {
227265 // Production environment
228- chainConfig = {
266+ return {
229267 chainId : 13371 ,
230268 name : 'Immutable zkEVM' ,
231269 rpcUrl : this . passportConfig . zkEvmRpcUrl ,
@@ -236,35 +274,40 @@ export class Passport {
236274 magicProviderId : this . passportConfig . magicProviderId ,
237275 magicTeeBasePath : this . passportConfig . magicTeeBasePath ,
238276 } ;
239- } else {
240- // Sandbox/testnet environment
241- chainConfig = {
242- chainId : 13473 ,
243- name : 'Immutable zkEVM Testnet' ,
244- rpcUrl : this . passportConfig . zkEvmRpcUrl ,
245- relayerUrl : this . passportConfig . relayerUrl ,
246- apiUrl : this . passportConfig . multiRollupConfig . indexer . basePath || this . passportConfig . passportDomain ,
247- passportDomain : this . passportConfig . passportDomain ,
248- magicPublishableApiKey : this . passportConfig . magicPublishableApiKey ,
249- magicProviderId : this . passportConfig . magicProviderId ,
250- magicTeeBasePath : this . passportConfig . magicTeeBasePath ,
251- } ;
252277 }
253278
254- // Use connectWallet to create the provider (it will create WalletConfiguration internally)
255- const provider = await connectWallet ( {
256- auth : this . auth ,
257- chains : [ chainConfig ] ,
258- crossSdkBridgeEnabled : this . passportConfig . crossSdkBridgeEnabled ,
259- jsonRpcReferrer : this . passportConfig . jsonRpcReferrer ,
260- forceScwDeployBeforeMessageSignature : this . passportConfig . forceScwDeployBeforeMessageSignature ,
261- passportEventEmitter : this . auth . eventEmitter ,
262- feeTokenSymbol : 'IMX' ,
263- announceProvider : options ?. announceProvider ?? true ,
264- } ) ;
279+ // Sandbox/testnet environment
280+ return {
281+ chainId : 13473 ,
282+ name : 'Immutable zkEVM Testnet' ,
283+ rpcUrl : this . passportConfig . zkEvmRpcUrl ,
284+ relayerUrl : this . passportConfig . relayerUrl ,
285+ apiUrl : this . passportConfig . multiRollupConfig . indexer . basePath || this . passportConfig . passportDomain ,
286+ passportDomain : this . passportConfig . passportDomain ,
287+ magicPublishableApiKey : this . passportConfig . magicPublishableApiKey ,
288+ magicProviderId : this . passportConfig . magicProviderId ,
289+ magicTeeBasePath : this . passportConfig . magicTeeBasePath ,
290+ } ;
291+ }
265292
266- return provider ;
267- } , 'connectEvm' , false ) ;
293+ // For all other chains, use the registry lookup
294+ const chainConfig = getChainConfig ( chain , this . environment ) ;
295+
296+ // If dev overrides exist, use dev-specific Passport config
297+ if ( passportOverrides ) {
298+ return {
299+ ...chainConfig ,
300+ apiUrl : this . passportConfig . multiRollupConfig . indexer . basePath || chainConfig . apiUrl ,
301+ passportDomain : this . passportConfig . passportDomain ,
302+ } ;
303+ }
304+
305+ // Standard SANDBOX/PRODUCTION
306+ return {
307+ ...chainConfig ,
308+ apiUrl : this . passportConfig . multiRollupConfig . indexer . basePath || chainConfig . apiUrl ,
309+ passportDomain : this . passportConfig . passportDomain ,
310+ } ;
268311 }
269312
270313 // ============================================================================
0 commit comments