Skip to content

Commit

Permalink
feat: allow syncing with mixed chains
Browse files Browse the repository at this point in the history
  • Loading branch information
chybisov committed Jul 23, 2024
1 parent c18c2ab commit 95a3198
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
13 changes: 9 additions & 4 deletions packages/wallet-management/src/syncWagmiConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,22 @@ import type { Chain } from 'viem';
import { mainnet } from 'viem/chains';
import type { Config, CreateConnectorFn } from 'wagmi';
import { reconnect } from 'wagmi/actions';
import { convertExtendedChain } from './utils/convertExtendedChain.js';
import {
convertExtendedChain,
isExtendedChain,
} from './utils/convertExtendedChain.js';

export const syncWagmiConfig = (
wagmiConfig: Config,
connectors: CreateConnectorFn[],
chains: ExtendedChain[],
chains: (ExtendedChain | Chain)[],
) => {
const _chains = chains.map(convertExtendedChain) as [Chain, ...Chain[]];
const _chains = chains.map((chain) =>
isExtendedChain(chain) ? convertExtendedChain(chain) : chain,
) as [Chain, ...Chain[]];
const _mainnet = _chains.find((chain) => chain.id === mainnet.id);
if (_mainnet) {
_mainnet.contracts = mainnet.contracts;
_mainnet.contracts = { ...mainnet.contracts, ..._mainnet.contracts };
}
wagmiConfig._internal.chains.setState(_chains);
wagmiConfig._internal.connectors.setState(() =>
Expand Down
3 changes: 2 additions & 1 deletion packages/wallet-management/src/useSyncWagmiConfig.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import type { ExtendedChain } from '@lifi/sdk';
import { useEffect } from 'react';
import type { Chain } from 'viem';
import type { Config, CreateConnectorFn } from 'wagmi';
import { syncWagmiConfig } from './syncWagmiConfig.js';

export const useSyncWagmiConfig = (
wagmiConfig: Config,
connectors: CreateConnectorFn[],
chains?: ExtendedChain[],
chains?: (ExtendedChain | Chain)[],
) => {
useEffect(() => {
if (chains?.length) {
Expand Down
16 changes: 16 additions & 0 deletions packages/wallet-management/src/utils/convertExtendedChain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,19 @@ export const convertExtendedChain = (chain: ExtendedChain): Chain => ({
: undefined),
},
});

export function isExtendedChain(chain: any): chain is ExtendedChain {
return (
typeof chain === 'object' &&
chain !== null &&
'key' in chain &&
'chainType' in chain &&
'coin' in chain &&
'mainnet' in chain &&
'logoURI' in chain &&
typeof chain.metamask === 'object' &&
chain.metamask !== null &&
typeof chain.nativeToken === 'object' &&
chain.nativeToken !== null
);
}

0 comments on commit 95a3198

Please sign in to comment.