{"version":3,"sources":["../src/metaUtils/peggingHelpers.ts"],"sourcesContent":["import { toCorrespondingStacksToken } from \"../evmUtils/peggingHelpers\"\nimport { getEVMTokenContractInfo } from \"../evmUtils/xlinkContractHelpers\"\nimport { BigNumber } from \"../utils/BigNumber\"\nimport {\n  _KnownRoute_FromBRC20_ToStacks,\n  _KnownRoute_FromRunes_ToStacks,\n  IsSupportedFn,\n  KnownRoute_FromStacks_ToBRC20,\n  KnownRoute_FromStacks_ToRunes,\n} from \"../utils/buildSupportedRoutes\"\nimport { checkNever, isNotNull } from \"../utils/typeHelpers\"\nimport { TransferProphet } from \"../utils/types/TransferProphet\"\nimport {\n  _allNoLongerSupportedEVMChains,\n  KnownChainId,\n  KnownTokenId,\n} from \"../utils/types/knownIds\"\nimport { SDKGlobalContext } from \"../xlinkSdkUtils/types.internal\"\nimport { getMetaPegInAddress } from \"./btcAddresses\"\nimport {\n  BRC20SupportedRoute,\n  getBRC20SupportedRoutes,\n  getRunesSupportedRoutes,\n  RunesSupportedRoute,\n} from \"./xlinkContractHelpers\"\n\nexport const getMeta2StacksFeeInfo = async (\n  ctx: SDKGlobalContext,\n  route: _KnownRoute_FromBRC20_ToStacks | _KnownRoute_FromRunes_ToStacks,\n): Promise<undefined | TransferProphet> => {\n  const filteredRoutes = KnownChainId.isBRC20Chain(route.fromChain)\n    ? await getBRC20SupportedRoutes(ctx, route.fromChain).then(routes =>\n        routes.filter(\n          _route =>\n            _route.brc20Token === route.fromToken &&\n            _route.stacksToken === route.toToken,\n        ),\n      )\n    : await getRunesSupportedRoutes(ctx, route.fromChain).then(routes =>\n        routes.filter(\n          _route =>\n            _route.runesToken === route.fromToken &&\n            _route.stacksToken === route.toToken,\n        ),\n      )\n  const filteredRoute = filteredRoutes[0]\n  if (filteredRoute == null) return\n\n  return {\n    isPaused: filteredRoute.pegInPaused,\n    bridgeToken: route.fromToken,\n    fees: [\n      {\n        type: \"rate\" as const,\n        token: route.fromToken,\n        rate: filteredRoute.pegInFeeRate,\n        minimumAmount: BigNumber.ZERO,\n      },\n      filteredRoute.pegInFeeBitcoinAmount == null\n        ? null\n        : {\n            type: \"fixed\" as const,\n            token: KnownTokenId.Stacks.aBTC,\n            amount: filteredRoute.pegInFeeBitcoinAmount,\n          },\n    ].filter(isNotNull),\n    minBridgeAmount: BigNumber.ZERO,\n    maxBridgeAmount: null,\n  }\n}\n\nexport const getStacks2MetaFeeInfo = async (\n  ctx: SDKGlobalContext,\n  route: KnownRoute_FromStacks_ToBRC20 | KnownRoute_FromStacks_ToRunes,\n): Promise<undefined | TransferProphet> => {\n  const filteredRoutes = KnownChainId.isBRC20Chain(route.toChain)\n    ? await getBRC20SupportedRoutes(ctx, route.toChain).then(routes =>\n        routes.filter(\n          _route =>\n            _route.stacksToken === route.fromToken &&\n            _route.brc20Token === route.toToken,\n        ),\n      )\n    : await getRunesSupportedRoutes(ctx, route.toChain).then(routes =>\n        routes.filter(\n          _route =>\n            _route.stacksToken === route.fromToken &&\n            _route.runesToken === route.toToken,\n        ),\n      )\n  const filteredRoute = filteredRoutes[0]\n  if (filteredRoute == null) return\n\n  return {\n    isPaused: filteredRoute.pegOutPaused,\n    bridgeToken: route.fromToken,\n    fees: [\n      {\n        type: \"rate\" as const,\n        token: route.fromToken,\n        rate: filteredRoute.pegOutFeeRate,\n        minimumAmount: BigNumber.ZERO,\n      },\n      filteredRoute.pegOutFeeBitcoinAmount == null\n        ? null\n        : {\n            type: \"fixed\" as const,\n            token: KnownTokenId.Stacks.aBTC,\n            amount: filteredRoute.pegOutFeeBitcoinAmount,\n          },\n    ].filter(isNotNull),\n    minBridgeAmount: BigNumber.ZERO,\n    maxBridgeAmount: null,\n  }\n}\n\nexport const isSupportedMetaRoute: IsSupportedFn = async (ctx, route) => {\n  const { fromChain, toChain, fromToken, toToken } = route\n\n  if (fromChain === toChain && fromToken === toToken) {\n    return false\n  }\n\n  if (!KnownChainId.isKnownChain(toChain)) return false\n\n  if (\n    KnownChainId.isEVMChain(fromChain) &&\n    _allNoLongerSupportedEVMChains.includes(fromChain)\n  ) {\n    return false\n  }\n  if (\n    KnownChainId.isEVMChain(toChain) &&\n    _allNoLongerSupportedEVMChains.includes(toChain)\n  ) {\n    return false\n  }\n\n  if (KnownChainId.isBitcoinChain(toChain)) {\n    return false\n  }\n\n  if (\n    !KnownChainId.isRunesChain(fromChain) &&\n    !KnownChainId.isBRC20Chain(fromChain)\n  ) {\n    return false\n  }\n\n  const pegInAddress = getMetaPegInAddress(fromChain, toChain)\n  if (pegInAddress == null) return false\n\n  if (KnownChainId.isBitcoinChain(toChain)) {\n    return false\n  }\n\n  if (KnownChainId.isStacksChain(toChain)) {\n    if (!KnownTokenId.isStacksToken(toToken)) return false\n\n    if (KnownChainId.isRunesChain(fromChain)) {\n      const runesRoutes = await getRunesSupportedRoutes(ctx, fromChain)\n      return runesRoutes.some(route => route.stacksToken === toToken)\n    }\n\n    if (KnownChainId.isBRC20Chain(fromChain)) {\n      const brc20Routes = await getBRC20SupportedRoutes(ctx, fromChain)\n      return brc20Routes.some(route => route.stacksToken === toToken)\n    }\n\n    checkNever(fromChain)\n    return false\n  }\n\n  if (KnownChainId.isEVMChain(toChain)) {\n    if (!KnownTokenId.isEVMToken(toToken)) return false\n\n    const info = await getEVMTokenContractInfo(ctx, toChain, toToken)\n    if (info == null) return false\n\n    const transitStacksToken = await toCorrespondingStacksToken(toToken)\n    if (transitStacksToken == null) return false\n\n    if (KnownChainId.isRunesChain(fromChain)) {\n      const runesRoutes = await getRunesSupportedRoutes(ctx, fromChain)\n      return runesRoutes.some(route => route.stacksToken === transitStacksToken)\n    }\n\n    if (KnownChainId.isBRC20Chain(fromChain)) {\n      const brc20Routes = await getBRC20SupportedRoutes(ctx, fromChain)\n      return brc20Routes.some(route => route.stacksToken === transitStacksToken)\n    }\n\n    checkNever(fromChain)\n    return false\n  }\n\n  if (KnownChainId.isRunesChain(toChain)) {\n    if (!KnownTokenId.isRunesToken(toToken)) return false\n\n    // TODO: runes -> runes (swap) is not supported yet\n    if (KnownChainId.isRunesChain(fromChain)) return false\n\n    const brc20Routes = await getBRC20SupportedRoutes(ctx, fromChain)\n    const runesRoutes = await getRunesSupportedRoutes(ctx, toChain)\n    return getRoutesOverlapping(brc20Routes, runesRoutes) != null\n  }\n\n  if (KnownChainId.isBRC20Chain(toChain)) {\n    if (!KnownTokenId.isBRC20Token(toToken)) return false\n\n    // TODO: brc20 -> brc20 (swap) is not supported yet\n    if (KnownChainId.isBRC20Chain(fromChain)) return false\n\n    const brc20Routes = await getBRC20SupportedRoutes(ctx, toChain)\n    const runesRoutes = await getRunesSupportedRoutes(ctx, fromChain)\n    return getRoutesOverlapping(brc20Routes, runesRoutes) != null\n  }\n\n  checkNever(toChain)\n  return false\n}\n\nconst getRoutesOverlapping = (\n  brc20Routes: BRC20SupportedRoute[],\n  runesRoutes: RunesSupportedRoute[],\n): null | [BRC20SupportedRoute, RunesSupportedRoute] => {\n  for (const brc20Route of brc20Routes) {\n    for (const runesRoute of runesRoutes) {\n      if (brc20Route.stacksToken === runesRoute.stacksToken) {\n        return [brc20Route, runesRoute]\n      }\n    }\n  }\n  return null\n}\n"],"mappings":"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","names":["route"]}