@xlink-network/xlink-sdk
Version:
1 lines • 11.2 kB
Source Map (JSON)
{"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"]}