UNPKG

@xlink-network/xlink-sdk

Version:
1 lines 8.68 kB
{"version":3,"sources":["../src/utils/buildSupportedRoutes.ts"],"sourcesContent":["import { ChainId, TokenId } from \"../xlinkSdkUtils/types\"\nimport { SDKGlobalContext } from \"../xlinkSdkUtils/types.internal\"\nimport { UnsupportedBridgeRouteError } from \"./errors\"\nimport { pMemoize } from \"./pMemoize\"\nimport { KnownChainId, KnownTokenId } from \"./types/knownIds\"\n\nexport interface DefinedRoute {\n fromChain: ChainId\n toChain: ChainId\n fromToken: TokenId\n toToken: TokenId\n}\n\nexport type KnownRoute_FromStacks_ToBitcoin = {\n fromChain: KnownChainId.StacksChain\n fromToken: KnownTokenId.StacksToken\n toChain: KnownChainId.BitcoinChain\n toToken: KnownTokenId.BitcoinToken\n}\nexport type KnownRoute_FromStacks_ToEVM = {\n fromChain: KnownChainId.StacksChain\n fromToken: KnownTokenId.StacksToken\n toChain: KnownChainId.EVMChain\n toToken: KnownTokenId.EVMToken\n}\nexport type KnownRoute_FromStacks_ToBRC20 = {\n fromChain: KnownChainId.StacksChain\n fromToken: KnownTokenId.StacksToken\n toChain: KnownChainId.BRC20Chain\n toToken: KnownTokenId.BRC20Token\n}\nexport type KnownRoute_FromStacks_ToRunes = {\n fromChain: KnownChainId.StacksChain\n fromToken: KnownTokenId.StacksToken\n toChain: KnownChainId.RunesChain\n toToken: KnownTokenId.RunesToken\n}\nexport type KnownRoute_FromStacks =\n | KnownRoute_FromStacks_ToBitcoin\n | KnownRoute_FromStacks_ToEVM\n | KnownRoute_FromStacks_ToBRC20\n | KnownRoute_FromStacks_ToRunes\n\nexport type KnownRoute_FromBitcoin_ToStacks = {\n fromChain: KnownChainId.BitcoinChain\n fromToken: KnownTokenId.BitcoinToken\n toChain: KnownChainId.StacksChain\n toToken: KnownTokenId.StacksToken\n}\nexport type KnownRoute_FromBitcoin_ToEVM = {\n fromChain: KnownChainId.BitcoinChain\n fromToken: KnownTokenId.BitcoinToken\n toChain: KnownChainId.EVMChain\n toToken: KnownTokenId.EVMToken\n}\n// export type KnownRoute_FromBitcoin_ToBRC20 = {\n// fromChain: KnownChainId.BitcoinChain\n// fromToken: KnownTokenId.BitcoinToken\n// toChain: KnownChainId.BRC20Chain\n// toToken: KnownTokenId.BRC20Token\n// }\n// export type KnownRoute_FromBitcoin_ToRunes = {\n// fromChain: KnownChainId.BitcoinChain\n// fromToken: KnownTokenId.BitcoinToken\n// toChain: KnownChainId.RunesChain\n// toToken: KnownTokenId.RunesToken\n// }\nexport type KnownRoute_FromBitcoin =\n | KnownRoute_FromBitcoin_ToStacks\n | KnownRoute_FromBitcoin_ToEVM\n// | KnownRoute_FromBitcoin_ToBRC20\n// | KnownRoute_FromBitcoin_ToRunes\n\nexport type KnownRoute_FromEVM_ToStacks = {\n fromChain: KnownChainId.EVMChain\n fromToken: KnownTokenId.EVMToken\n toChain: KnownChainId.StacksChain\n toToken: KnownTokenId.StacksToken\n}\nexport type KnownRoute_FromEVM_ToBitcoin = {\n fromChain: KnownChainId.EVMChain\n fromToken: KnownTokenId.EVMToken\n toChain: KnownChainId.BitcoinChain\n toToken: KnownTokenId.BitcoinToken\n}\nexport type KnownRoute_FromEVM_ToBRC20 = {\n fromChain: KnownChainId.EVMChain\n fromToken: KnownTokenId.EVMToken\n toChain: KnownChainId.BRC20Chain\n toToken: KnownTokenId.BRC20Token\n}\nexport type KnownRoute_FromEVM_ToRunes = {\n fromChain: KnownChainId.EVMChain\n fromToken: KnownTokenId.EVMToken\n toChain: KnownChainId.RunesChain\n toToken: KnownTokenId.RunesToken\n}\nexport type KnownRoute_FromEVM_ToEVM = {\n fromChain: KnownChainId.EVMChain\n fromToken: KnownTokenId.EVMToken\n toChain: KnownChainId.EVMChain\n toToken: KnownTokenId.EVMToken\n}\nexport type KnownRoute_FromEVM =\n | KnownRoute_FromEVM_ToStacks\n | KnownRoute_FromEVM_ToBitcoin\n | KnownRoute_FromEVM_ToBRC20\n | KnownRoute_FromEVM_ToRunes\n | KnownRoute_FromEVM_ToEVM\n\nexport type _KnownRoute_FromBRC20_ToStacks = {\n fromChain: KnownChainId.BRC20Chain\n fromToken: KnownTokenId.BRC20Token\n toChain: KnownChainId.StacksChain\n toToken: KnownTokenId.StacksToken\n}\nexport type _KnownRoute_FromRunes_ToStacks = {\n fromChain: KnownChainId.RunesChain\n fromToken: KnownTokenId.RunesToken\n toChain: KnownChainId.StacksChain\n toToken: KnownTokenId.StacksToken\n}\n\nexport type KnownRoute =\n | KnownRoute_FromStacks\n | KnownRoute_FromBitcoin\n | KnownRoute_FromEVM\n\nexport function defineRoute(\n chainPairs: [fromChains: ChainId[], toChains: ChainId[]],\n tokenPairs: [fromToken: TokenId, toToken: TokenId][],\n): DefinedRoute[] {\n const result: DefinedRoute[] = []\n\n for (const fromChain of chainPairs[0]) {\n for (const toChain of chainPairs[1]) {\n tokenPairs.forEach(tokenPair => {\n result.push({\n fromChain,\n toChain,\n fromToken: tokenPair[0],\n toToken: tokenPair[1],\n })\n })\n }\n }\n\n return result\n}\n\nexport type IsSupportedFn = (\n ctx: SDKGlobalContext,\n route: DefinedRoute,\n) => Promise<boolean>\nconst memoizedIsSupportedFactory = (\n isSupported: IsSupportedFn,\n): IsSupportedFn => {\n return pMemoize(\n {\n cacheKey([, route]) {\n return `${route.fromChain}:${route.fromToken}->${route.toChain}:${route.toToken}`\n },\n skipCache: true,\n },\n isSupported,\n )\n}\n\nexport interface GetSupportedRoutesFn_Conditions {\n fromChain?: ChainId\n toChain?: ChainId\n fromToken?: TokenId\n toToken?: TokenId\n}\nexport type GetSupportedRoutesFn = (\n ctx: SDKGlobalContext,\n conditions?: GetSupportedRoutesFn_Conditions,\n) => Promise<KnownRoute[]>\n\nexport type CheckRouteValidFn = (\n ctx: SDKGlobalContext,\n route: DefinedRoute,\n) => Promise<KnownRoute>\n\nexport function buildSupportedRoutes(\n routes: DefinedRoute[],\n options: {\n isSupported?: IsSupportedFn\n } = {},\n): {\n getSupportedRoutes: GetSupportedRoutesFn\n checkRouteValid: CheckRouteValidFn\n} {\n const isSupported = memoizedIsSupportedFactory(\n options.isSupported || (() => Promise.resolve(true)),\n )\n\n const getSupportedRoutes: GetSupportedRoutesFn = async (\n ctx,\n conditions = {},\n ) => {\n const filteredDefinitions = routes.filter(r => {\n if (\n conditions.fromChain != null &&\n conditions.fromChain !== r.fromChain\n ) {\n return false\n }\n if (conditions.toChain != null && conditions.toChain !== r.toChain) {\n return false\n }\n if (\n conditions.fromToken != null &&\n conditions.fromToken !== r.fromToken\n ) {\n return false\n }\n if (conditions.toToken != null && conditions.toToken !== r.toToken) {\n return false\n }\n\n return true\n })\n\n const res = await Promise.all(\n filteredDefinitions.map(\n async route => [await isSupported(ctx, route), route] as const,\n ),\n )\n return res\n .filter(([isSupported]) => isSupported)\n .map(([, route]) => route as KnownRoute)\n }\n\n return {\n getSupportedRoutes,\n async checkRouteValid(ctx, route) {\n const isValid = await isSupported(ctx, route)\n\n if (!isValid) {\n throw new UnsupportedBridgeRouteError(\n route.fromChain,\n route.toChain,\n route.fromToken,\n route.toToken,\n )\n }\n\n return route as any\n },\n }\n}\n"],"mappings":";;;;;;;;AAgIO,SAAS,YACd,YACA,YACgB;AAChB,QAAM,SAAyB,CAAC;AAEhC,aAAW,aAAa,WAAW,CAAC,GAAG;AACrC,eAAW,WAAW,WAAW,CAAC,GAAG;AACnC,iBAAW,QAAQ,eAAa;AAC9B,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA,WAAW,UAAU,CAAC;AAAA,UACtB,SAAS,UAAU,CAAC;AAAA,QACtB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAMA,IAAM,6BAA6B,CACjC,gBACkB;AAClB,SAAO;AAAA,IACL;AAAA,MACE,SAAS,CAAC,EAAE,KAAK,GAAG;AAClB,eAAO,GAAG,MAAM,SAAS,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,IAAI,MAAM,OAAO;AAAA,MACjF;AAAA,MACA,WAAW;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;AAkBO,SAAS,qBACd,QACA,UAEI,CAAC,GAIL;AACA,QAAM,cAAc;AAAA,IAClB,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ,IAAI;AAAA,EACpD;AAEA,QAAM,qBAA2C,OAC/C,KACA,aAAa,CAAC,MACX;AACH,UAAM,sBAAsB,OAAO,OAAO,OAAK;AAC7C,UACE,WAAW,aAAa,QACxB,WAAW,cAAc,EAAE,WAC3B;AACA,eAAO;AAAA,MACT;AACA,UAAI,WAAW,WAAW,QAAQ,WAAW,YAAY,EAAE,SAAS;AAClE,eAAO;AAAA,MACT;AACA,UACE,WAAW,aAAa,QACxB,WAAW,cAAc,EAAE,WAC3B;AACA,eAAO;AAAA,MACT;AACA,UAAI,WAAW,WAAW,QAAQ,WAAW,YAAY,EAAE,SAAS;AAClE,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,MAAM,MAAM,QAAQ;AAAA,MACxB,oBAAoB;AAAA,QAClB,OAAM,UAAS,CAAC,MAAM,YAAY,KAAK,KAAK,GAAG,KAAK;AAAA,MACtD;AAAA,IACF;AACA,WAAO,IACJ,OAAO,CAAC,CAACA,YAAW,MAAMA,YAAW,EACrC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,KAAmB;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,gBAAgB,KAAK,OAAO;AAChC,YAAM,UAAU,MAAM,YAAY,KAAK,KAAK;AAE5C,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":["isSupported"]}