{"version":3,"sources":["../src/xlinkSdkUtils/bridgeFromEVM.ts"],"sourcesContent":["import { encodeFunctionData, Hex, toHex } from \"viem\"\nimport { estimateGas } from \"viem/actions\"\nimport { nativeCurrencyAddress } from \"../evmUtils/addressHelpers\"\nimport { BridgeEndpointAbi } from \"../evmUtils/contractAbi/bridgeEndpoint\"\nimport { NativeBridgeEndpointAbi } from \"../evmUtils/contractAbi/nativeBridgeEndpoint\"\nimport { sendMessageAbi } from \"../evmUtils/contractMessageHelpers\"\nimport { isSupportedEVMRoute } from \"../evmUtils/peggingHelpers\"\nimport {\n  getEVMContractCallInfo,\n  getEVMTokenContractInfo,\n  numberToSolidityContractNumber,\n} from \"../evmUtils/xlinkContractHelpers\"\nimport { contractAssignedChainIdFromKnownChain } from \"../stacksUtils/crossContractDataMapping\"\nimport {\n  addressToBuffer,\n  getStacksTokenContractInfo,\n} from \"../stacksUtils/xlinkContractHelpers\"\nimport { BigNumber } from \"../utils/BigNumber\"\nimport {\n  buildSupportedRoutes,\n  defineRoute,\n  KnownRoute_FromEVM_ToBitcoin,\n  KnownRoute_FromEVM_ToBRC20,\n  KnownRoute_FromEVM_ToEVM,\n  KnownRoute_FromEVM_ToRunes,\n  KnownRoute_FromEVM_ToStacks,\n} from \"../utils/buildSupportedRoutes\"\nimport {\n  InvalidMethodParametersError,\n  UnsupportedBridgeRouteError,\n} from \"../utils/errors\"\nimport { decodeHex, encodeZeroPrefixedHex } from \"../utils/hexHelpers\"\nimport { assertExclude, checkNever } from \"../utils/typeHelpers\"\nimport {\n  _allKnownEVMMainnetChains,\n  _allKnownEVMTestnetChains,\n  _knownChainIdToErrorMessagePart,\n  KnownChainId,\n  KnownTokenId,\n} from \"../utils/types/knownIds\"\nimport {\n  ChainId,\n  EVMAddress,\n  SDKNumber,\n  TokenId,\n  toSDKNumberOrUndefined,\n} from \"./types\"\nimport { SDKGlobalContext } from \"./types.internal\"\nimport { metaTokenToCorrespondingStacksToken } from \"../metaUtils/peggingHelpers\"\n\nexport const supportedRoutes = buildSupportedRoutes(\n  [\n    // from mainnet\n    ...defineRoute(\n      // to Bitcoin\n      [[..._allKnownEVMMainnetChains], [KnownChainId.Bitcoin.Mainnet]],\n      [\n        [KnownTokenId.EVM.aBTC, KnownTokenId.Bitcoin.BTC],\n        [KnownTokenId.EVM.WBTC, KnownTokenId.Bitcoin.BTC],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.Bitcoin.BTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.Bitcoin.BTC],\n      ],\n    ),\n    ...defineRoute(\n      // to Stacks\n      [[..._allKnownEVMMainnetChains], [KnownChainId.Stacks.Mainnet]],\n      [\n        // BTCs\n        [KnownTokenId.EVM.aBTC, KnownTokenId.Stacks.aBTC],\n        [KnownTokenId.EVM.WBTC, KnownTokenId.Stacks.aBTC],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.Stacks.aBTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.Stacks.aBTC],\n        // USDTs\n        [KnownTokenId.EVM.USDT, KnownTokenId.Stacks.sUSDT],\n        [KnownTokenId.EVM.sUSDT, KnownTokenId.Stacks.sUSDT],\n        // others\n        [KnownTokenId.EVM.SKO, KnownTokenId.Stacks.sSKO],\n        [KnownTokenId.EVM.ALEX, KnownTokenId.Stacks.ALEX],\n        [KnownTokenId.EVM.vLiSTX, KnownTokenId.Stacks.vLiSTX],\n        [KnownTokenId.EVM.vLiALEX, KnownTokenId.Stacks.vLiALEX],\n        [KnownTokenId.EVM.uBTC, KnownTokenId.Stacks.uBTC],\n        [KnownTokenId.EVM.wuBTC, KnownTokenId.Stacks.uBTC],\n        [KnownTokenId.EVM.DB20, KnownTokenId.Stacks.DB20],\n        [KnownTokenId.EVM.DOG, KnownTokenId.Stacks.DOG],\n      ],\n    ),\n    ...defineRoute(\n      // to EVM\n      [[..._allKnownEVMMainnetChains], [..._allKnownEVMMainnetChains]],\n      [\n        // BTCs\n        [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.aBTC],\n        [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.WBTC],\n        [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.BTCB],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.WBTC],\n        [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.cbBTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.WBTC],\n\n        [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.aBTC],\n        [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.BTCB],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.cbBTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.BTCB],\n\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.aBTC],\n        [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.cbBTC],\n\n        [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.WBTC],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.BTCB],\n        [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.aBTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.cbBTC],\n\n        // USDTs\n        [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.USDT],\n        [KnownTokenId.EVM.USDT, KnownTokenId.EVM.sUSDT],\n\n        [KnownTokenId.EVM.USDT, KnownTokenId.EVM.USDT],\n        [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.sUSDT],\n\n        // others\n        [KnownTokenId.EVM.SKO, KnownTokenId.EVM.SKO],\n        [KnownTokenId.EVM.ALEX, KnownTokenId.EVM.ALEX],\n        [KnownTokenId.EVM.vLiSTX, KnownTokenId.EVM.vLiSTX],\n        [KnownTokenId.EVM.vLiALEX, KnownTokenId.EVM.vLiALEX],\n\n        [KnownTokenId.EVM.uBTC, KnownTokenId.EVM.uBTC],\n        [KnownTokenId.EVM.wuBTC, KnownTokenId.EVM.wuBTC],\n        [KnownTokenId.EVM.uBTC, KnownTokenId.EVM.wuBTC],\n        [KnownTokenId.EVM.wuBTC, KnownTokenId.EVM.uBTC],\n\n        [KnownTokenId.EVM.DB20, KnownTokenId.EVM.DB20],\n        [KnownTokenId.EVM.DOG, KnownTokenId.EVM.DOG],\n      ],\n    ),\n\n    // from testnet\n    ...defineRoute(\n      // to Bitcoin\n      [[..._allKnownEVMTestnetChains], [KnownChainId.Bitcoin.Testnet]],\n      [\n        [KnownTokenId.EVM.aBTC, KnownTokenId.Bitcoin.BTC],\n        [KnownTokenId.EVM.WBTC, KnownTokenId.Bitcoin.BTC],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.Bitcoin.BTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.Bitcoin.BTC],\n      ],\n    ),\n    ...defineRoute(\n      // to Stacks\n      [[..._allKnownEVMTestnetChains], [KnownChainId.Stacks.Testnet]],\n      [\n        // BTCs\n        [KnownTokenId.EVM.aBTC, KnownTokenId.Stacks.aBTC],\n        [KnownTokenId.EVM.WBTC, KnownTokenId.Stacks.aBTC],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.Stacks.aBTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.Stacks.aBTC],\n        // USDTs\n        [KnownTokenId.EVM.USDT, KnownTokenId.Stacks.sUSDT],\n        [KnownTokenId.EVM.sUSDT, KnownTokenId.Stacks.sUSDT],\n        // others\n        [KnownTokenId.EVM.SKO, KnownTokenId.Stacks.sSKO],\n        [KnownTokenId.EVM.ALEX, KnownTokenId.Stacks.ALEX],\n        [KnownTokenId.EVM.vLiSTX, KnownTokenId.Stacks.vLiSTX],\n        [KnownTokenId.EVM.vLiALEX, KnownTokenId.Stacks.vLiALEX],\n        [KnownTokenId.EVM.uBTC, KnownTokenId.Stacks.uBTC],\n        [KnownTokenId.EVM.wuBTC, KnownTokenId.Stacks.uBTC],\n        [KnownTokenId.EVM.DB20, KnownTokenId.Stacks.DB20],\n        [KnownTokenId.EVM.DOG, KnownTokenId.Stacks.DOG],\n      ],\n    ),\n    ...defineRoute(\n      // to EVM\n      [[..._allKnownEVMTestnetChains], [..._allKnownEVMTestnetChains]],\n      [\n        // BTCs\n        [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.aBTC],\n        [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.WBTC],\n        [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.BTCB],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.WBTC],\n        [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.cbBTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.WBTC],\n\n        [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.aBTC],\n        [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.BTCB],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.cbBTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.BTCB],\n\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.aBTC],\n        [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.cbBTC],\n\n        [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.WBTC],\n        [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.BTCB],\n        [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.aBTC],\n        [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.cbBTC],\n\n        // USDTs\n        [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.USDT],\n        [KnownTokenId.EVM.USDT, KnownTokenId.EVM.sUSDT],\n\n        [KnownTokenId.EVM.USDT, KnownTokenId.EVM.USDT],\n        [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.sUSDT],\n\n        // others\n        [KnownTokenId.EVM.SKO, KnownTokenId.EVM.SKO],\n        [KnownTokenId.EVM.ALEX, KnownTokenId.EVM.ALEX],\n        [KnownTokenId.EVM.vLiSTX, KnownTokenId.EVM.vLiSTX],\n        [KnownTokenId.EVM.vLiALEX, KnownTokenId.EVM.vLiALEX],\n\n        [KnownTokenId.EVM.uBTC, KnownTokenId.EVM.uBTC],\n        [KnownTokenId.EVM.wuBTC, KnownTokenId.EVM.wuBTC],\n        [KnownTokenId.EVM.uBTC, KnownTokenId.EVM.wuBTC],\n        [KnownTokenId.EVM.wuBTC, KnownTokenId.EVM.uBTC],\n\n        [KnownTokenId.EVM.DB20, KnownTokenId.EVM.DB20],\n        [KnownTokenId.EVM.DOG, KnownTokenId.EVM.DOG],\n      ],\n    ),\n  ],\n  {\n    isSupported: isSupportedEVMRoute,\n  },\n)\n\nexport type BridgeFromEVMInput = {\n  fromChain: ChainId\n  toChain: ChainId\n  fromToken: TokenId\n  toToken: TokenId\n  fromAddress: EVMAddress\n  toAddress: string\n  /**\n   * **Required** when `toChain` is one of bitcoin chains\n   */\n  toAddressScriptPubKey?: Uint8Array\n  amount: SDKNumber\n  sendTransaction: (tx: {\n    from: EVMAddress\n    to: EVMAddress\n    data: Uint8Array\n    recommendedGasLimit: SDKNumber\n    value?: SDKNumber\n  }) => Promise<{\n    txHash: string\n  }>\n}\n\nexport interface BridgeFromEVMOutput {\n  txHash: string\n}\n\nexport async function bridgeFromEVM(\n  ctx: SDKGlobalContext,\n  info: BridgeFromEVMInput,\n): Promise<BridgeFromEVMOutput> {\n  const route = await supportedRoutes.checkRouteValid(ctx, info)\n\n  if (KnownChainId.isEVMChain(route.fromChain)) {\n    if (KnownChainId.isStacksChain(route.toChain)) {\n      if (\n        KnownTokenId.isEVMToken(route.fromToken) &&\n        KnownTokenId.isStacksToken(route.toToken)\n      ) {\n        return bridgeFromEVM_toStacks(ctx, {\n          ...info,\n          fromChain: route.fromChain,\n          toChain: route.toChain,\n          fromToken: route.fromToken,\n          toToken: route.toToken,\n        })\n      }\n    } else if (KnownChainId.isBitcoinChain(route.toChain)) {\n      if (\n        KnownTokenId.isEVMToken(route.fromToken) &&\n        KnownTokenId.isBitcoinToken(route.toToken)\n      ) {\n        return bridgeFromEVM_toBitcoin(ctx, {\n          ...info,\n          fromChain: route.fromChain,\n          toChain: route.toChain,\n          fromToken: route.fromToken,\n          toToken: route.toToken,\n        })\n      }\n    } else if (KnownChainId.isEVMChain(route.toChain)) {\n      if (\n        KnownTokenId.isEVMToken(route.fromToken) &&\n        KnownTokenId.isEVMToken(route.toToken)\n      ) {\n        return bridgeFromEVM_toEVM(ctx, {\n          ...info,\n          fromChain: route.fromChain,\n          toChain: route.toChain,\n          fromToken: route.fromToken,\n          toToken: route.toToken,\n        })\n      }\n    } else if (KnownChainId.isBRC20Chain(route.toChain)) {\n      if (\n        KnownTokenId.isEVMToken(route.fromToken) &&\n        KnownTokenId.isBRC20Token(route.toToken)\n      ) {\n        return bridgeFromEVM_toMeta(ctx, {\n          ...info,\n          fromChain: route.fromChain,\n          toChain: route.toChain,\n          fromToken: route.fromToken,\n          toToken: route.toToken,\n        })\n      }\n    } else if (KnownChainId.isRunesChain(route.toChain)) {\n      if (\n        KnownTokenId.isEVMToken(route.fromToken) &&\n        KnownTokenId.isRunesToken(route.toToken)\n      ) {\n        return bridgeFromEVM_toMeta(ctx, {\n          ...info,\n          fromChain: route.fromChain,\n          toChain: route.toChain,\n          fromToken: route.fromToken,\n          toToken: route.toToken,\n        })\n      }\n    } else {\n      checkNever(route.toChain)\n    }\n  } else {\n    assertExclude(route.fromChain, assertExclude.i<KnownChainId.BitcoinChain>())\n    assertExclude(route.fromChain, assertExclude.i<KnownChainId.StacksChain>())\n    checkNever(route)\n  }\n\n  throw new UnsupportedBridgeRouteError(\n    info.fromChain,\n    info.toChain,\n    info.fromToken,\n    info.toToken,\n  )\n}\n\nasync function bridgeFromEVM_toStacks(\n  ctx: SDKGlobalContext,\n  info: Omit<\n    BridgeFromEVMInput,\n    \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n  > &\n    KnownRoute_FromEVM_ToStacks,\n): Promise<BridgeFromEVMOutput> {\n  const { bridgeEndpointContractAddress: bridgeEndpointAddress } =\n    (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n  const fromTokenContractInfo = await getEVMTokenContractInfo(\n    ctx,\n    info.fromChain,\n    info.fromToken,\n  )\n  const toTokenContractInfo = await getStacksTokenContractInfo(\n    info.toChain,\n    info.toToken,\n  )\n  if (\n    bridgeEndpointAddress == null ||\n    fromTokenContractInfo == null ||\n    toTokenContractInfo == null ||\n    fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress\n  ) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      info.fromToken,\n      info.toToken,\n    )\n  }\n\n  const message = await encodeFunctionData({\n    abi: sendMessageAbi,\n    functionName: \"transferToStacks\",\n    args: [info.toAddress],\n  })\n\n  const functionData = await encodeFunctionData({\n    abi: BridgeEndpointAbi,\n    functionName: \"sendMessageWithToken\",\n    args: [\n      fromTokenContractInfo.tokenContractAddress,\n      numberToSolidityContractNumber(info.amount),\n      message,\n    ],\n  })\n\n  const fallbackGasLimit = 200_000\n  const estimated = await estimateGas(fromTokenContractInfo.client, {\n    account: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: functionData,\n  })\n    .then(n =>\n      BigNumber.round(\n        { precision: 0 },\n        BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n      ),\n    )\n    .catch(\n      // add a fallback in case estimate failed\n      () => fallbackGasLimit,\n    )\n\n  return await info.sendTransaction({\n    from: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: decodeHex(functionData),\n    recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n  })\n}\n\nasync function bridgeFromEVM_toBitcoin(\n  ctx: SDKGlobalContext,\n  info: Omit<\n    BridgeFromEVMInput,\n    \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n  > &\n    KnownRoute_FromEVM_ToBitcoin,\n): Promise<BridgeFromEVMOutput> {\n  const { bridgeEndpointContractAddress, nativeBridgeEndpointContractAddress } =\n    (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n\n  const fromTokenContractInfo = await getEVMTokenContractInfo(\n    ctx,\n    info.fromChain,\n    info.fromToken,\n  )\n  if (fromTokenContractInfo == null) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      info.fromToken,\n      info.toToken,\n    )\n  }\n\n  if (info.toAddressScriptPubKey == null) {\n    throw new InvalidMethodParametersError(\n      [\"XLinkSDK\", \"bridgeFromEVM (to Bitcoin)\"],\n      [\n        {\n          name: \"toAddressScriptPubKey\",\n          expected: \"Uint8Array\",\n          received: \"undefined\",\n        },\n      ],\n    )\n  }\n\n  const toAddressHex = toHex(info.toAddressScriptPubKey)\n\n  const message = await encodeFunctionData({\n    abi: sendMessageAbi,\n    functionName: \"transferToBTC\",\n    args: [toAddressHex],\n  })\n  let bridgeEndpointAddress: undefined | EVMAddress\n  let functionData: Hex\n  let value: undefined | SDKNumber\n  if (fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress) {\n    functionData = await encodeFunctionData({\n      abi: NativeBridgeEndpointAbi,\n      functionName: \"withdraw\",\n      args: [\n        encodeZeroPrefixedHex(addressToBuffer(info.toChain, info.toAddress)),\n      ],\n    })\n\n    const nativeCurrencyDecimals =\n      fromTokenContractInfo.client.chain?.nativeCurrency.decimals\n    if (nativeCurrencyDecimals == null) {\n      throw new UnsupportedBridgeRouteError(\n        info.fromChain,\n        info.toChain,\n        info.fromToken,\n        info.toToken,\n      )\n    }\n\n    bridgeEndpointAddress = nativeBridgeEndpointContractAddress\n    value = toSDKNumberOrUndefined(\n      BigNumber.rightMoveDecimals(nativeCurrencyDecimals, info.amount),\n    )\n  } else {\n    functionData = await encodeFunctionData({\n      abi: BridgeEndpointAbi,\n      functionName: \"sendMessageWithToken\",\n      args: [\n        fromTokenContractInfo.tokenContractAddress,\n        numberToSolidityContractNumber(info.amount),\n        message,\n      ],\n    })\n\n    bridgeEndpointAddress = bridgeEndpointContractAddress\n  }\n\n  if (bridgeEndpointAddress == null) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      info.fromToken,\n      info.toToken,\n    )\n  }\n\n  const fallbackGasLimit = 200_000\n  const estimated = await estimateGas(fromTokenContractInfo.client, {\n    account: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: functionData,\n  })\n    .then(n =>\n      BigNumber.round(\n        { precision: 0 },\n        BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n      ),\n    )\n    .catch(\n      // add a fallback in case estimate failed\n      () => fallbackGasLimit,\n    )\n\n  return await info.sendTransaction({\n    from: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: decodeHex(functionData),\n    value,\n    recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n  })\n}\n\nasync function bridgeFromEVM_toEVM(\n  ctx: SDKGlobalContext,\n  info: Omit<\n    BridgeFromEVMInput,\n    \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n  > &\n    KnownRoute_FromEVM_ToEVM,\n): Promise<BridgeFromEVMOutput> {\n  const { bridgeEndpointContractAddress: bridgeEndpointAddress } =\n    (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n  const fromTokenContractInfo = await getEVMTokenContractInfo(\n    ctx,\n    info.fromChain,\n    info.fromToken,\n  )\n  const toTokenContractInfo = await getEVMTokenContractInfo(\n    ctx,\n    info.toChain,\n    info.toToken,\n  )\n  if (\n    bridgeEndpointAddress == null ||\n    fromTokenContractInfo == null ||\n    toTokenContractInfo == null ||\n    fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress\n  ) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      info.fromToken,\n      info.toToken,\n    )\n  }\n\n  const message = await encodeFunctionData({\n    abi: sendMessageAbi,\n    functionName: \"transferToEVM\",\n    args: [\n      contractAssignedChainIdFromKnownChain(info.toChain),\n      toTokenContractInfo.tokenContractAddress,\n      info.toAddress as EVMAddress,\n    ],\n  })\n  const functionData = await encodeFunctionData({\n    abi: BridgeEndpointAbi,\n    functionName: \"sendMessageWithToken\",\n    args: [\n      fromTokenContractInfo.tokenContractAddress,\n      numberToSolidityContractNumber(info.amount),\n      message,\n    ],\n  })\n\n  const fallbackGasLimit = 200_000\n  const estimated = await estimateGas(fromTokenContractInfo.client, {\n    account: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: functionData,\n  })\n    .then(n =>\n      BigNumber.round(\n        { precision: 0 },\n        BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n      ),\n    )\n    .catch(\n      // add a fallback in case estimate failed\n      () => fallbackGasLimit,\n    )\n\n  return await info.sendTransaction({\n    from: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: decodeHex(functionData),\n    recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n  })\n}\n\nasync function bridgeFromEVM_toMeta(\n  ctx: SDKGlobalContext,\n  info: Omit<\n    BridgeFromEVMInput,\n    \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n  > &\n    (KnownRoute_FromEVM_ToBRC20 | KnownRoute_FromEVM_ToRunes),\n): Promise<BridgeFromEVMOutput> {\n  const { bridgeEndpointContractAddress: bridgeEndpointAddress } =\n    (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n  const fromTokenContractInfo = await getEVMTokenContractInfo(\n    ctx,\n    info.fromChain,\n    info.fromToken,\n  )\n\n  const toTokenCorrespondingStacksToken =\n    await metaTokenToCorrespondingStacksToken(ctx, {\n      chain: info.toChain as any,\n      token: info.toToken as any,\n    })\n  const toTokenStacksAddress =\n    toTokenCorrespondingStacksToken == null\n      ? undefined\n      : await getStacksTokenContractInfo(\n          KnownChainId.isEVMMainnetChain(info.fromChain)\n            ? KnownChainId.Stacks.Mainnet\n            : KnownChainId.Stacks.Testnet,\n          toTokenCorrespondingStacksToken,\n        )\n\n  if (\n    bridgeEndpointAddress == null ||\n    fromTokenContractInfo == null ||\n    fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress ||\n    toTokenCorrespondingStacksToken == null ||\n    toTokenStacksAddress == null\n  ) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      info.fromToken,\n      info.toToken,\n    )\n  }\n\n  if (info.toAddressScriptPubKey == null) {\n    throw new InvalidMethodParametersError(\n      [\n        \"XLinkSDK\",\n        `bridgeFromEVM (to ${_knownChainIdToErrorMessagePart(info.toChain)})`,\n      ],\n      [\n        {\n          name: \"toAddressScriptPubKey\",\n          expected: \"Uint8Array\",\n          received: \"undefined\",\n        },\n      ],\n    )\n  }\n\n  const toAddressHex = toHex(info.toAddressScriptPubKey)\n\n  const message = await encodeFunctionData({\n    abi: sendMessageAbi,\n    functionName: KnownChainId.isBRC20Chain(info.toChain)\n      ? \"transferToBRC20\"\n      : \"transferToRunes\",\n    args: [\n      toAddressHex,\n      `${toTokenStacksAddress.deployerAddress}.${toTokenStacksAddress.contractName}`,\n    ],\n  })\n  const functionData = await encodeFunctionData({\n    abi: BridgeEndpointAbi,\n    functionName: \"sendMessageWithToken\",\n    args: [\n      fromTokenContractInfo.tokenContractAddress,\n      numberToSolidityContractNumber(info.amount),\n      message,\n    ],\n  })\n\n  const fallbackGasLimit = 200_000\n  const estimated = await estimateGas(fromTokenContractInfo.client, {\n    account: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: functionData,\n  })\n    .then(n =>\n      BigNumber.round(\n        { precision: 0 },\n        BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n      ),\n    )\n    .catch(\n      // add a fallback in case estimate failed\n      () => fallbackGasLimit,\n    )\n\n  return await info.sendTransaction({\n    from: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: decodeHex(functionData),\n    recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n  })\n}\n\nexport async function bridgeFromEVM_toLaunchpad(\n  ctx: SDKGlobalContext,\n  info: {\n    fromChain: KnownChainId.EVMChain\n    fromToken: KnownTokenId.EVMToken\n    fromAddress: EVMAddress\n    receiverChain: KnownChainId.KnownChain\n    receiverAddress: string\n    /**\n     * **Required** when `receiverChain` is one of bitcoin chains\n     */\n    receiverAddressScriptPubKey?: Uint8Array\n    launchId: SDKNumber\n    amount: SDKNumber\n    sendTransaction: (tx: {\n      from: EVMAddress\n      to: EVMAddress\n      data: Uint8Array\n      recommendedGasLimit: SDKNumber\n    }) => Promise<{\n      txHash: string\n    }>\n  },\n): Promise<BridgeFromEVMOutput> {\n  const { bridgeEndpointContractAddress: bridgeEndpointAddress } =\n    (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n  const fromTokenContractInfo = await getEVMTokenContractInfo(\n    ctx,\n    info.fromChain,\n    info.fromToken,\n  )\n  if (\n    bridgeEndpointAddress == null ||\n    fromTokenContractInfo == null ||\n    fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress\n  ) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.receiverChain,\n      info.fromToken,\n    )\n  }\n\n  if (\n    KnownChainId.isBitcoinChain(info.receiverChain) &&\n    info.receiverAddressScriptPubKey == null\n  ) {\n    throw new InvalidMethodParametersError(\n      [\n        \"XLinkSDK\",\n        `bridgeFromEVM_toLaunchpad (to ${_knownChainIdToErrorMessagePart(info.receiverChain)})`,\n      ],\n      [\n        {\n          name: \"toAddressScriptPubKey\",\n          expected: \"Uint8Array\",\n          received: \"undefined\",\n        },\n      ],\n    )\n  }\n\n  const toAddressHex =\n    info.receiverAddressScriptPubKey != null\n      ? toHex(info.receiverAddressScriptPubKey)\n      : toHex(addressToBuffer(info.receiverChain, info.receiverAddress))\n\n  const message = await encodeFunctionData({\n    abi: sendMessageAbi,\n    functionName: \"transferToLaunchpad\",\n    args: [\n      BigNumber.toBigInt({ roundingMode: BigNumber.roundDown }, info.launchId),\n      toAddressHex,\n    ],\n  })\n  const functionData = await encodeFunctionData({\n    abi: BridgeEndpointAbi,\n    functionName: \"sendMessageWithToken\",\n    args: [\n      fromTokenContractInfo.tokenContractAddress,\n      numberToSolidityContractNumber(info.amount),\n      message,\n    ],\n  })\n\n  const fallbackGasLimit = 200_000\n  const estimated = await estimateGas(fromTokenContractInfo.client, {\n    account: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: functionData,\n  })\n    .then(n =>\n      BigNumber.round(\n        { precision: 0 },\n        BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n      ),\n    )\n    .catch(\n      // add a fallback in case estimate failed\n      () => fallbackGasLimit,\n    )\n\n  return await info.sendTransaction({\n    from: info.fromAddress,\n    to: bridgeEndpointAddress,\n    data: decodeHex(functionData),\n    recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n  })\n}\n"],"mappings":"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","names":[]}