diff --git a/packages/canonical-bridge-sdk/src/adapters/base/index.ts b/packages/canonical-bridge-sdk/src/adapters/base/index.ts index 52bbdd0d..872205a9 100644 --- a/packages/canonical-bridge-sdk/src/adapters/base/index.ts +++ b/packages/canonical-bridge-sdk/src/adapters/base/index.ts @@ -1,5 +1,6 @@ import { IBaseAdapterOptions, ITokenPair } from '@/adapters/base/types'; import { isSameAddress } from '@/shared/address'; +import { uniqueArr } from '@/shared/object'; import { BridgeType, ChainType, @@ -157,9 +158,6 @@ export abstract class BaseAdapter { }; } - // 1. Native currency is ETH -> Native currency is ETH, all transfer to ETH - // 2. Native currency is ETH -> Native currency is NOT ETH, transfer to ETH first, if not, WETH - // 3. Native currency is NOT ETH -> Native currency is ETH, all transfer to ETH protected getToTokensForPair({ fromChainId, toChainId, @@ -175,6 +173,7 @@ export abstract class BaseAdapter { this.nativeCurrencies[toChainId].symbol.toUpperCase(); const tokenMap = this.symbolMap.get(toChainId); + const toTokens = [...(tokenMap?.get(fromTokenSymbol) ?? [])]; if ( ['ETH', 'WETH'].includes(fromTokenSymbol) && (fromNativeSymbol === 'ETH' || toNativeSymbol === 'ETH') && @@ -182,23 +181,22 @@ export abstract class BaseAdapter { ) { const ethTokens = tokenMap?.get('ETH') ?? []; const wethTokens = tokenMap?.get('WETH') ?? []; - return [...ethTokens, ...wethTokens]; + + toTokens.push(...ethTokens); + toTokens.push(...wethTokens); } - let toTokens = tokenMap?.get(fromTokenSymbol); - if (!toTokens) { - const bridgedGroup = this.bridgedTokenGroups.find((group) => - group.includes(fromTokenSymbol) - ); - const nextToken = bridgedGroup?.find( - (item) => item.toUpperCase() !== fromTokenSymbol - ); - if (nextToken) { - toTokens = tokenMap?.get(nextToken?.toUpperCase()); + const bridgedGroup = this.bridgedTokenGroups.find((e) => + e.includes(fromTokenSymbol) + ); + bridgedGroup?.forEach((anotherTokenSymbol) => { + const anotherToTokens = tokenMap?.get(anotherTokenSymbol.toUpperCase()); + if (anotherToTokens?.length) { + toTokens.push(...anotherToTokens); } - } + }); - return toTokens; + return uniqueArr(toTokens); } protected getTokenSymbolByTokenAddress({ diff --git a/packages/canonical-bridge-sdk/src/shared/object.ts b/packages/canonical-bridge-sdk/src/shared/object.ts index fcb2f5f0..5072b8f0 100644 --- a/packages/canonical-bridge-sdk/src/shared/object.ts +++ b/packages/canonical-bridge-sdk/src/shared/object.ts @@ -1,3 +1,14 @@ export function isEmpty(obj?: Object) { return !obj || Object.entries(obj).length === 0; } + +export function uniqueArr(arr: T[]) { + const map = new Map(); + return arr.filter((item) => { + if (map.get(item)) { + return false; + } + map.set(item, true); + return true; + }); +} diff --git a/packages/canonical-bridge-widget/src/modules/aggregator/providers/AggregatorProvider.tsx b/packages/canonical-bridge-widget/src/modules/aggregator/providers/AggregatorProvider.tsx index e759d991..aa2b8483 100644 --- a/packages/canonical-bridge-widget/src/modules/aggregator/providers/AggregatorProvider.tsx +++ b/packages/canonical-bridge-widget/src/modules/aggregator/providers/AggregatorProvider.tsx @@ -35,6 +35,45 @@ export function AggregatorProvider(props: AggregatorProviderProps) { tokenSorter, }); + // output all token pairs + // const result: any[] = []; + // const fromChains = aggregator.getFromChains(); + // fromChains.forEach((fromChain) => { + // const toChains = aggregator.getToChains({ fromChainId: fromChain.id }); + // toChains.forEach((toChain) => { + // if (fromChain.id !== toChain.id) { + // const tokens = aggregator.getTokens({ + // fromChainId: fromChain.id, + // toChainId: toChain.id, + // }); + // tokens.forEach((token) => { + // if (token.isCompatible) { + // const toTokens = aggregator.getToTokens({ + // fromChainId: fromChain.id, + // toChainId: toChain.id, + // tokenAddress: token.address, + // }); + + // result.push({ + // fromChainId: fromChain.id, + // fromChainName: fromChain.name, + // toChainId: toChain.id, + // toChainName: toChain.name, + // toTokenCount: toTokens.length, + // fromToken: token.symbol, + // fromTokenAddress: token.address, + // toTokens: toTokens.map((e) => ({ + // symbol: e.symbol, + // address: e.address, + // })), + // }); + // } + // }); + // } + // }); + // }); + // console.log(JSON.stringify(result)); + return { aggregator, };