{"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"]}