From 2384c112b1bdebaf6024f81e80fc6bc247fc72a0 Mon Sep 17 00:00:00 2001 From: c4605 Date: Mon, 25 Nov 2024 16:25:19 +0100 Subject: [PATCH] feat: add cbBTC support --- src/evmUtils/peggingHelpers.ts | 13 +++++++-- src/evmUtils/xlinkContractHelpers.ts | 7 ++++- src/stacksUtils/stxContractAddresses.ts | 22 ++++++++++++++ src/utils/types/knownIds.ts | 2 ++ src/xlinkSdkUtils/bridgeFromEVM.ts | 38 ++++++++++++++++++------- src/xlinkSdkUtils/bridgeFromStacks.ts | 6 ++-- 6 files changed, 73 insertions(+), 15 deletions(-) diff --git a/src/evmUtils/peggingHelpers.ts b/src/evmUtils/peggingHelpers.ts index 649d836..02c8358 100644 --- a/src/evmUtils/peggingHelpers.ts +++ b/src/evmUtils/peggingHelpers.ts @@ -274,11 +274,12 @@ export async function fromCorrespondingStacksToken( assertExclude(restEVMTokenPossibilities, EVMToken.sUSDT) if (stacksToken === StacksToken.aBTC) { - return [EVMToken.WBTC, EVMToken.BTCB, EVMToken.aBTC] + return [EVMToken.aBTC, EVMToken.WBTC, EVMToken.BTCB, EVMToken.cbBTC] } assertExclude(restEVMTokenPossibilities, EVMToken.aBTC) assertExclude(restEVMTokenPossibilities, EVMToken.WBTC) assertExclude(restEVMTokenPossibilities, EVMToken.BTCB) + assertExclude(restEVMTokenPossibilities, EVMToken.cbBTC) if (stacksToken === StacksToken.uBTC) { return [EVMToken.uBTC, EVMToken.wuBTC] @@ -320,9 +321,10 @@ export async function toCorrespondingStacksToken( case EVMToken.USDT: case EVMToken.sUSDT: return StacksToken.sUSDT + case EVMToken.aBTC: case EVMToken.BTCB: case EVMToken.WBTC: - case EVMToken.aBTC: + case EVMToken.cbBTC: return StacksToken.aBTC case EVMToken.uBTC: case EVMToken.wuBTC: @@ -369,6 +371,8 @@ export const isSupportedEVMRoute: IsSupportedFn = async (ctx, route) => { if (fromTokenInfo == null) return false if (KnownChainId.isStacksChain(toChain)) { + if (!KnownTokenId.isStacksToken(toToken)) return false + const stacksToken = await toCorrespondingStacksToken(fromToken) if (stacksToken == null) return false @@ -396,11 +400,14 @@ export const isSupportedEVMRoute: IsSupportedFn = async (ctx, route) => { } if (KnownChainId.isBitcoinChain(toChain)) { + if (!KnownTokenId.isBitcoinToken(toToken)) return false const stacksToken = await toCorrespondingStacksToken(fromToken) return stacksToken === KnownTokenId.Stacks.aBTC } if (KnownChainId.isRunesChain(toChain)) { + if (!KnownTokenId.isRunesToken(toToken)) return false + const transitStacksToken = await toCorrespondingStacksToken(fromToken) if (transitStacksToken == null) return false @@ -409,6 +416,8 @@ export const isSupportedEVMRoute: IsSupportedFn = async (ctx, route) => { } if (KnownChainId.isBRC20Chain(toChain)) { + if (!KnownTokenId.isBRC20Token(toToken)) return false + const transitStacksToken = await toCorrespondingStacksToken(fromToken) if (transitStacksToken == null) return false diff --git a/src/evmUtils/xlinkContractHelpers.ts b/src/evmUtils/xlinkContractHelpers.ts index d27bcb7..00f6c3d 100644 --- a/src/evmUtils/xlinkContractHelpers.ts +++ b/src/evmUtils/xlinkContractHelpers.ts @@ -231,7 +231,12 @@ const _getOnChainConfigsImpl = async ( [EVMToken.vLiALEX]: maybeAddress(configs[5]), [EVMToken.vLiSTX]: maybeAddress(configs[6]), [EVMToken.USDT]: maybeAddress(configs[7]), - [chain === KnownChainId.EVM.BSC ? EVMToken.BTCB : EVMToken.WBTC]: + // prettier-ignore + [ + chain === KnownChainId.EVM.BSC ? EVMToken.BTCB : + chain === KnownChainId.EVM.Base ? EVMToken.cbBTC : + EVMToken.WBTC + ]: maybeAddress(configs[8]), [EVMToken.LUNR]: maybeAddress(configs[9]), [EVMToken.SKO]: maybeAddress(configs[10]), diff --git a/src/stacksUtils/stxContractAddresses.ts b/src/stacksUtils/stxContractAddresses.ts index 84ec251..0deb8f0 100644 --- a/src/stacksUtils/stxContractAddresses.ts +++ b/src/stacksUtils/stxContractAddresses.ts @@ -46,6 +46,16 @@ const stxAlternativeTokenContractAddresses = { contractName: "token-btcb", }, }, + cbBTC: { + [KnownChainId.Stacks.Mainnet]: { + deployerAddress: xlinkContractsMultisigMainnet, + contractName: "token-wbtc", + }, + [KnownChainId.Stacks.Testnet]: { + deployerAddress: xlinkContractsDeployerTestnet, + contractName: "token-wbtc", + }, + }, usdt: { [KnownChainId.Stacks.Mainnet]: { deployerAddress: xlinkContractsMultisigMainnet, @@ -71,6 +81,9 @@ export const getTerminatingStacksTokenContractAddress = ( if (toToken === KnownTokenId.EVM.BTCB) { return stxAlternativeTokenContractAddresses.btcb[route.fromChain] } + if (toToken === KnownTokenId.EVM.cbBTC) { + return stxAlternativeTokenContractAddresses.cbBTC[route.fromChain] + } } if (fromToken === KnownTokenId.Stacks.sUSDT) { if (toToken === KnownTokenId.EVM.USDT) { @@ -102,6 +115,15 @@ export const getTokenIdFromTerminatingStacksTokenContractAddress = (route: { return KnownTokenId.EVM.BTCB } + if ( + isStacksContractAddressEqual( + route.toTokenAddress, + stxAlternativeTokenContractAddresses.cbBTC[route.toChain], + ) + ) { + return KnownTokenId.EVM.cbBTC + } + if ( isStacksContractAddressEqual( route.toTokenAddress, diff --git a/src/utils/types/knownIds.ts b/src/utils/types/knownIds.ts index 9a8dfa3..5aec91b 100644 --- a/src/utils/types/knownIds.ts +++ b/src/utils/types/knownIds.ts @@ -57,6 +57,8 @@ export namespace KnownTokenId { export const WBTC = tokenId("evm-wbtc") /** Represents the BTCB token ID on EVM-compatible blockchains. */ export const BTCB = tokenId("evm-btcb") + /** Represents the cbBTC token ID on EVM-compatible blockchains. */ + export const cbBTC = tokenId("evm-cbbtc") // wrapped tokens /** Represents the aBTC token ID on EVM-compatible blockchains. */ diff --git a/src/xlinkSdkUtils/bridgeFromEVM.ts b/src/xlinkSdkUtils/bridgeFromEVM.ts index 32af876..f1cd2d6 100644 --- a/src/xlinkSdkUtils/bridgeFromEVM.ts +++ b/src/xlinkSdkUtils/bridgeFromEVM.ts @@ -47,9 +47,10 @@ export const supportedRoutes = buildSupportedRoutes( // to Bitcoin [[..._allKnownEVMMainnetChains], [KnownChainId.Bitcoin.Mainnet]], [ + [KnownTokenId.EVM.aBTC, KnownTokenId.Bitcoin.BTC], [KnownTokenId.EVM.WBTC, KnownTokenId.Bitcoin.BTC], [KnownTokenId.EVM.BTCB, KnownTokenId.Bitcoin.BTC], - [KnownTokenId.EVM.aBTC, KnownTokenId.Bitcoin.BTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.Bitcoin.BTC], ], ), ...defineRoute( @@ -57,9 +58,10 @@ export const supportedRoutes = buildSupportedRoutes( [[..._allKnownEVMMainnetChains], [KnownChainId.Stacks.Mainnet]], [ // BTCs + [KnownTokenId.EVM.aBTC, KnownTokenId.Stacks.aBTC], [KnownTokenId.EVM.WBTC, KnownTokenId.Stacks.aBTC], [KnownTokenId.EVM.BTCB, KnownTokenId.Stacks.aBTC], - [KnownTokenId.EVM.aBTC, KnownTokenId.Stacks.aBTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.Stacks.aBTC], // USDTs [KnownTokenId.EVM.USDT, KnownTokenId.Stacks.sUSDT], [KnownTokenId.EVM.sUSDT, KnownTokenId.Stacks.sUSDT], @@ -79,18 +81,25 @@ export const supportedRoutes = buildSupportedRoutes( [[..._allKnownEVMMainnetChains], [..._allKnownEVMMainnetChains]], [ // BTCs - [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.BTCB], - [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.WBTC], - [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.aBTC], [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.WBTC], + [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.BTCB], + [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.WBTC], + [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.cbBTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.WBTC], [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.aBTC], [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.BTCB], + [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.cbBTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.BTCB], + + [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.aBTC], + [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.cbBTC], [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.WBTC], [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.BTCB], [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.aBTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.cbBTC], // USDTs [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.USDT], @@ -120,9 +129,10 @@ export const supportedRoutes = buildSupportedRoutes( // to Bitcoin [[..._allKnownEVMTestnetChains], [KnownChainId.Bitcoin.Testnet]], [ + [KnownTokenId.EVM.aBTC, KnownTokenId.Bitcoin.BTC], [KnownTokenId.EVM.WBTC, KnownTokenId.Bitcoin.BTC], [KnownTokenId.EVM.BTCB, KnownTokenId.Bitcoin.BTC], - [KnownTokenId.EVM.aBTC, KnownTokenId.Bitcoin.BTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.Bitcoin.BTC], ], ), ...defineRoute( @@ -130,9 +140,10 @@ export const supportedRoutes = buildSupportedRoutes( [[..._allKnownEVMTestnetChains], [KnownChainId.Stacks.Testnet]], [ // BTCs + [KnownTokenId.EVM.aBTC, KnownTokenId.Stacks.aBTC], [KnownTokenId.EVM.WBTC, KnownTokenId.Stacks.aBTC], [KnownTokenId.EVM.BTCB, KnownTokenId.Stacks.aBTC], - [KnownTokenId.EVM.aBTC, KnownTokenId.Stacks.aBTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.Stacks.aBTC], // USDTs [KnownTokenId.EVM.USDT, KnownTokenId.Stacks.sUSDT], [KnownTokenId.EVM.sUSDT, KnownTokenId.Stacks.sUSDT], @@ -152,18 +163,25 @@ export const supportedRoutes = buildSupportedRoutes( [[..._allKnownEVMTestnetChains], [..._allKnownEVMTestnetChains]], [ // BTCs - [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.BTCB], - [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.WBTC], - [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.aBTC], [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.WBTC], + [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.BTCB], + [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.WBTC], + [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.cbBTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.WBTC], [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.aBTC], [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.BTCB], + [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.cbBTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.BTCB], + + [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.aBTC], + [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.cbBTC], [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.WBTC], [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.BTCB], [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.aBTC], + [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.cbBTC], // USDTs [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.USDT], diff --git a/src/xlinkSdkUtils/bridgeFromStacks.ts b/src/xlinkSdkUtils/bridgeFromStacks.ts index 7cf3d5a..e76180e 100644 --- a/src/xlinkSdkUtils/bridgeFromStacks.ts +++ b/src/xlinkSdkUtils/bridgeFromStacks.ts @@ -43,9 +43,10 @@ export const supportedRoutes = buildSupportedRoutes( [[KnownChainId.Stacks.Mainnet], [..._allKnownEVMMainnetChains]], [ // BTCs + [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.aBTC], [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.WBTC], [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.BTCB], - [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.aBTC], + [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.cbBTC], // USDTs [KnownTokenId.Stacks.sUSDT, KnownTokenId.EVM.USDT], [KnownTokenId.Stacks.sUSDT, KnownTokenId.EVM.sUSDT], @@ -72,9 +73,10 @@ export const supportedRoutes = buildSupportedRoutes( [[KnownChainId.Stacks.Testnet], [..._allKnownEVMTestnetChains]], [ // BTCs + [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.aBTC], [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.WBTC], [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.BTCB], - [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.aBTC], + [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.cbBTC], // USDTs [KnownTokenId.Stacks.sUSDT, KnownTokenId.EVM.USDT], [KnownTokenId.Stacks.sUSDT, KnownTokenId.EVM.sUSDT],