@xlink-network/xlink-sdk
Version:
651 lines (619 loc) • 28.3 kB
text/typescript
import { Client } from "viem"
import { getBTCPegInAddress } from "./bitcoinUtils/btcAddresses"
import { nativeCurrencyAddress } from "./evmUtils/addressHelpers"
import { defaultEvmClients } from "./evmUtils/evmClients"
import {
getEVMContractCallInfo,
getEVMToken,
getEVMTokenContractInfo,
} from "./evmUtils/xlinkContractHelpers"
import {
getBRC20SupportedRoutes,
getRunesSupportedRoutes,
} from "./metaUtils/xlinkContractHelpers"
import {
getStacksToken,
getStacksTokenContractInfo,
} from "./stacksUtils/xlinkContractHelpers"
import { TooManyRequestsError } from "./utils/apiHelpers"
import {
DefinedRoute,
GetSupportedRoutesFn_Conditions,
KnownRoute,
} from "./utils/buildSupportedRoutes"
import { TooFrequentlyError } from "./utils/errors"
import { KnownChainId, KnownTokenId } from "./utils/types/knownIds"
import {
BridgeFromBitcoinInput,
BridgeFromBitcoinOutput,
bridgeFromBitcoin,
supportedRoutes as supportedRoutesFromBitcoin,
} from "./xlinkSdkUtils/bridgeFromBitcoin"
import {
BridgeFromEVMInput,
BridgeFromEVMOutput,
bridgeFromEVM,
supportedRoutes as supportedRoutesFromEVM,
} from "./xlinkSdkUtils/bridgeFromEVM"
import {
BridgeFromStacksInput,
BridgeFromStacksOutput,
bridgeFromStacks,
supportedRoutes as supportedRoutesFromStacks,
} from "./xlinkSdkUtils/bridgeFromStacks"
import {
BridgeInfoFromBitcoinInput,
BridgeInfoFromBitcoinOutput,
bridgeInfoFromBitcoin,
} from "./xlinkSdkUtils/bridgeInfoFromBitcoin"
import {
BridgeInfoFromEVMInput,
BridgeInfoFromEVMOutput,
bridgeInfoFromEVM,
} from "./xlinkSdkUtils/bridgeInfoFromEVM"
import {
BridgeInfoFromStacksInput,
BridgeInfoFromStacksOutput,
bridgeInfoFromStacks,
} from "./xlinkSdkUtils/bridgeInfoFromStacks"
import {
EstimateBridgeTransactionFromBitcoinInput,
EstimateBridgeTransactionFromBitcoinOutput,
estimateBridgeTransactionFromBitcoin,
} from "./xlinkSdkUtils/estimateBridgeTransactionFromBitcoin"
import {
ClaimTimeLockedAssetsInput,
ClaimTimeLockedAssetsOutput,
GetTimeLockedAssetsInput,
GetTimeLockedAssetsOutput,
claimTimeLockedAssetsFromEVM,
getTimeLockedAssetsFromEVM,
} from "./xlinkSdkUtils/timelockFromEVM"
import {
ChainId,
EVMAddress,
EVMNativeCurrencyAddress,
PublicEVMContractType,
StacksContractAddress,
evmNativeCurrencyAddress,
} from "./xlinkSdkUtils/types"
import { SDKGlobalContext } from "./xlinkSdkUtils/types.internal"
export {
GetSupportedRoutesFn_Conditions,
KnownRoute,
} from "./utils/buildSupportedRoutes"
export {
BridgeFromBitcoinInput,
BridgeFromBitcoinInput_signPsbtFn,
BridgeFromBitcoinOutput,
} from "./xlinkSdkUtils/bridgeFromBitcoin"
export {
BridgeFromEVMInput,
BridgeFromEVMOutput,
} from "./xlinkSdkUtils/bridgeFromEVM"
export {
BridgeFromStacksInput,
BridgeFromStacksOutput,
} from "./xlinkSdkUtils/bridgeFromStacks"
export {
BridgeInfoFromBitcoinInput,
BridgeInfoFromBitcoinOutput,
} from "./xlinkSdkUtils/bridgeInfoFromBitcoin"
export {
BridgeInfoFromEVMInput,
BridgeInfoFromEVMOutput,
} from "./xlinkSdkUtils/bridgeInfoFromEVM"
export {
BridgeInfoFromStacksInput,
BridgeInfoFromStacksOutput,
} from "./xlinkSdkUtils/bridgeInfoFromStacks"
export {
EstimateBridgeTransactionFromBitcoinInput,
EstimateBridgeTransactionFromBitcoinOutput,
} from "./xlinkSdkUtils/estimateBridgeTransactionFromBitcoin"
export {
ClaimTimeLockedAssetsInput,
ClaimTimeLockedAssetsOutput,
GetTimeLockedAssetsInput,
GetTimeLockedAssetsOutput,
} from "./xlinkSdkUtils/timelockFromEVM"
export interface XLinkSDKOptions {
__experimental?: {
backendAPI?: {
runtimeEnv?: "prod" | "dev"
}
}
evm?: {
/**
* @default true
*/
cacheOnChainConfig?: boolean
/**
* @default undefined
*/
viemClients?: Record<KnownChainId.EVMChain, Client>
}
}
let defaultConfig: XLinkSDKOptions = {
evm: {
cacheOnChainConfig: true,
},
}
export class XLinkSDK {
static defaultConfig(options: XLinkSDKOptions): void {
defaultConfig = options
}
private sdkContext: SDKGlobalContext
constructor(options: XLinkSDKOptions = {}) {
const cacheEVMOnChainConfig =
options.evm?.cacheOnChainConfig ?? defaultConfig.evm?.cacheOnChainConfig
this.sdkContext = {
backendAPI: {
...options.__experimental?.backendAPI,
runtimeEnv: options.__experimental?.backendAPI?.runtimeEnv ?? "prod",
},
brc20: {
routesConfigCache: new Map(),
},
runes: {
routesConfigCache: new Map(),
},
evm: {
onChainConfigCache: cacheEVMOnChainConfig ? new Map() : undefined,
viemClients: {
...defaultEvmClients,
...options.evm?.viemClients,
},
},
}
}
/**
* This function retrieves the list of supported routes for token transfers between blockchain
* networks, filtered based on optional conditions. It aggregates the results from different
* blockchain networks (Stacks, EVM, Bitcoin) to return a list of possible routes.
* @param conditions - An optional object containing the conditions for filtering the supported routes:
* - `fromChain?: ChainId` - The ID of the source blockchain (optional).
* - `toChain?: ChainId` - The ID of the destination blockchain (optional).
* - `fromToken?: TokenId` - The ID of the token being transferred from the source blockchain (optional).
* - `toToken?: TokenId` - The ID of the token expected on the destination blockchain (optional).
*
* @returns A promise that resolves with an array of `KnownRoute` objects, each representing a
* possible route for the token transfer.
*/
async getSupportedRoutes(
conditions?: GetSupportedRoutesFn_Conditions,
): Promise<KnownRoute[]> {
const promises = [
supportedRoutesFromStacks,
supportedRoutesFromEVM,
supportedRoutesFromBitcoin,
].map(async rules => rules.getSupportedRoutes(this.sdkContext, conditions))
return (await Promise.all(promises)).flat()
}
async isSupportedRoute(route: DefinedRoute): Promise<boolean> {
const checkingResult = await Promise.all(
[
supportedRoutesFromStacks,
supportedRoutesFromEVM,
supportedRoutesFromBitcoin,
].map(rule =>
rule
.checkRouteValid(this.sdkContext, route)
.then(() => true)
.catch(() => false),
),
)
return checkingResult.some(r => r)
}
stacksAddressFromStacksToken = stacksAddressFromStacksToken
stacksAddressToStacksToken = stacksAddressToStacksToken
/**
* This function provides detailed information about token transfers from the Stacks network to other supported
* blockchain networks, including Bitcoin and EVM-compatible chains. It verifies the validity of the transfer
* route and retrieves bridge information based on the destination chain and tokens.
* @param input - An object containing the input parameters required for retrieving bridge information:
* - `fromChain: ChainId` - The ID of the source blockchain (Stacks in this case).
* - `toChain: ChainId` - The ID of the destination blockchain (Bitcoin, EVM-compatible chains, etc.).
* - `fromToken: TokenId` - The token being transferred from the Stacks network.
* - `toToken: TokenId` - The token expected on the destination chain.
* - `amount: SDKNumber` - The amount of tokens involved in the transfer.
*
* @returns A promise that resolves with an object containing detailed information about the token transfer, including:
* - `fromChain: KnownChainId.KnownChain` - The source blockchain.
* - `fromToken: KnownTokenId.KnownToken` - The token being transferred from the Stacks network.
* - `toChain: KnownChainId.KnownChain` - The destination blockchain.
* - `toToken: KnownTokenId.KnownToken` - The token expected on the destination chain.
* - `fromAmount: SDKNumber` - The amount of tokens being transferred.
* - `toAmount: SDKNumber` - The amount of tokens expected on the destination chain after the transfer.
* - `feeAmount: SDKNumber` - The fee amount deducted during the transfer.
* @throws UnsupportedBridgeRouteError - If the provided route between the source and destination
* chains or tokens is unsupported.
*/
bridgeInfoFromStacks(
input: BridgeInfoFromStacksInput,
): Promise<BridgeInfoFromStacksOutput> {
return bridgeInfoFromStacks(this.sdkContext, input)
}
/**
* This function facilitates the transfer of tokens from the Stacks network to other supported blockchain
* networks, including Bitcoin and EVM-compatible chains. It validates the route and calls the appropriate
* bridging function based on the destination chain and tokens involved.
* @param input - An object containing the input parameters required for the bridging operation:
* - `fromChain: ChainId` - The ID of the source blockchain.
* - `toChain: ChainId` - The ID of the destination blockchain (Bitcoin, EVM, etc.).
* - `fromToken: TokenId` - The token being transferred from the source chain.
* - `toToken: TokenId` - The token expected on the destination chain.
* - `fromAddress: string` - The sender's address on the source chain.
* - `toAddress: string` - The recipient's address on the destination blockchain.
* - `amount: SDKNumber` - The amount of tokens to transfer.
* - `sendTransaction` - // Implementation for sending transaction from Stacks mainnet.
*
* @returns A promise that resolves with the transaction ID (`txid`) of the bridging operation.
* @throws UnsupportedBridgeRouteError - If the provided route between the source and destination
* chains or tokens is unsupported.
*/
bridgeFromStacks(
input: BridgeFromStacksInput,
): Promise<BridgeFromStacksOutput> {
return bridgeFromStacks(this.sdkContext, input)
}
/**
* This function retrieves the contract address of a specific type of contract
* (e.g., a bridge endpoint) on a given EVM-compatible blockchain.
* @param chain - The ID of the EVM-compatible blockchain where the contract is deployed.
* @param contractType - The type of contract (e.g., `PublicEVMContractType.BridgeEndpoint`)
* for which the address is to be retrieved.
*
* @returns A promise that resolves with the contract address of the specified type, or
* `undefined` if the chain is not EVM-compatible or if the address cannot be retrieved.
*/
async getEVMContractAddress(
chain: ChainId,
contractType: PublicEVMContractType,
): Promise<undefined | EVMAddress> {
if (!KnownChainId.isEVMChain(chain)) return
const info = await getEVMContractCallInfo(this.sdkContext, chain)
if (contractType === PublicEVMContractType.BridgeEndpoint) {
return info?.bridgeEndpointContractAddress
}
return
}
/**
* This function retrieves the contract address of a specific token on a given EVM-compatible blockchain.
* @param chain - The ID of the EVM-compatible blockchain where the token contract is deployed.
* @param token - The specific token ID for which the contract address is to be retrieved.
*
* @returns A promise that resolves with the contract address of the token, or `undefined` if the
* chain is not EVM-compatible or if the contract address cannot be retrieved.
*/
async evmAddressFromEVMToken(
chain: ChainId,
token: KnownTokenId.EVMToken,
): Promise<undefined | EVMAddress | EVMNativeCurrencyAddress> {
if (!KnownChainId.isEVMChain(chain)) return
const info = await getEVMTokenContractInfo(this.sdkContext, chain, token)
const addr = info?.tokenContractAddress
if (addr === nativeCurrencyAddress) {
return evmNativeCurrencyAddress
}
return addr
}
/**
* This function maps a given contract address on an EVM-compatible blockchain to its corresponding known token ID.
* @param chain - The ID of the EVM-compatible blockchain where the contract is deployed.
* @param address - The contract address on the EVM-compatible blockchain.
*
* @returns A promise that resolves with the known token ID corresponding to the provided contract
* address, or `undefined` if the token ID cannot be found or if the chain is not EVM-compatible.
*/
async evmAddressToEVMToken(
chain: ChainId,
address: EVMAddress | EVMNativeCurrencyAddress,
): Promise<undefined | KnownTokenId.EVMToken> {
if (!KnownChainId.isEVMChain(chain)) return
if (address === evmNativeCurrencyAddress) {
address = nativeCurrencyAddress
}
return getEVMToken(this.sdkContext, chain, address)
}
/**
* This function provides detailed information about token transfers from an EVM-compatible blockchain to other supported
* blockchain networks, including Stacks, Bitcoin, and other EVM-compatible chains. It verifies the validity of the transfer
* route and retrieves bridge information based on the destination chain and tokens.
* @param input - An object containing the input parameters required for retrieving bridge information:
* - `fromChain: ChainId` - The ID of the source blockchain (Stacks in this case).
* - `toChain: ChainId` - The ID of the destination blockchain (Bitcoin, EVM-compatible chains, etc.).
* - `fromToken: TokenId` - The token being transferred from the Stacks network.
* - `toToken: TokenId` - The token expected on the destination chain.
* - `amount: SDKNumber` - The amount of tokens involved in the transfer.
*
* @returns A promise that resolves with an object containing detailed information about the token transfer, including:
* - `fromChain: KnownChainId.KnownChain` - The source blockchain.
* - `fromToken: KnownTokenId.KnownToken` - The token being transferred from the Stacks network.
* - `toChain: KnownChainId.KnownChain` - The destination blockchain.
* - `toToken: KnownTokenId.KnownToken` - The token expected on the destination chain.
* - `fromAmount: SDKNumber` - The amount of tokens being transferred.
* - `toAmount: SDKNumber` - The amount of tokens expected on the destination chain after the transfer.
* - `feeAmount: SDKNumber` - The fee amount deducted during the transfer.
* @throws UnsupportedBridgeRouteError - If the provided route between the source and destination
* chains or tokens is unsupported.
*/
bridgeInfoFromEVM(
input: BridgeInfoFromEVMInput,
): Promise<BridgeInfoFromEVMOutput> {
return bridgeInfoFromEVM(this.sdkContext, input)
}
/**
* This function facilitates the transfer of tokens from an EVM-compatible blockchain to other supported
* blockchain networks, including Stacks, Bitcoin, and other EVM-compatible chains. It validates the
* route and calls the appropriate bridging function based on the destination chain and tokens involved.
* @param input - An object containing the input parameters required for the bridging operation:
* - `fromChain: ChainId` - The ID of the source blockchain (an EVM-compatible chain in this case).
* - `toChain: ChainId` - The ID of the destination blockchain (Stacks, Bitcoin, or another EVM-compatible chain).
* - `fromToken: TokenId` - The token being transferred from the EVM-compatible blockchain.
* - `toToken: TokenId` - The token expected on the destination chain.
* - `fromAddress: string` - The sender's address on the source chain.
* - `toAddress: string` - The recipient's address on the destination blockchain.
* - `toAddressScriptPubKey?: Uint8Array` - The script public key for the `toAddress`, required when the destination is a Bitcoin chain.
* - `amount: SDKNumber` - The amount of tokens to transfer.
* - `sendTransaction` - // Implementation for sending transaction from EVM chain.
*
* @returns A promise that resolves with the transaction hash (`txHash`) of the bridging operation.
* @throws UnsupportedBridgeRouteError - If the provided route between the source and destination
* chains or tokens is unsupported.
*/
bridgeFromEVM(input: BridgeFromEVMInput): Promise<BridgeFromEVMOutput> {
return bridgeFromEVM(this.sdkContext, input)
}
/**
* This function retrieves a list of time-locked assets for a given wallet address across multiple EVM-compatible
* blockchain networks. It queries smart contracts to find and return information about the assets that are
* currently locked in time-based agreements.
* @param input - An object containing the input parameters required for retrieving time-locked assets:
* - `walletAddress: EVMAddress` - The address of the wallet for which to retrieve the time-locked assets.
* - `chains: KnownChainId.EVMChain[]` - An array of EVM-compatible blockchains to query for locked assets.
*
* @returns A promise that resolves with an object containing a list of time-locked assets:
* - `assets: TimeLockedAsset[]` - An array of objects, each representing a time-locked asset, including:
* - `id: string` - The unique identifier of the time-locked agreement.
* - `chain: KnownChainId.EVMChain` - The blockchain where the asset is locked.
* - `token: KnownTokenId.EVMToken` - The token that is locked.
* - `amount: SDKNumber` - The amount of the token that is locked.
* - `releaseTime: Date` - The time when the asset is scheduled to be released.
*
* @throws UnsupportedChainError - If any of the provided EVM chains is unsupported or invalid.
*/
getTimeLockedAssetsFromEVM(
input: GetTimeLockedAssetsInput,
): Promise<GetTimeLockedAssetsOutput> {
return getTimeLockedAssetsFromEVM(this.sdkContext, input)
}
/**
* This function facilitates the claiming of time-locked assets on EVM-compatible chains. It uses smart
* contract functions to execute the release of locked assets based on predefined conditions.
* @param input - An object containing the input parameters required for claiming time-locked assets:
* - `chain: KnownChainId.EVMChain` - The ID of the EVM-compatible blockchain where the assets are locked.
* - `lockedAssetIds: string[]` - An array of IDs representing the locked assets to be claimed.
* - `sendTransaction` - // Implementation for sending transaction from EVM chain.
*
* @returns A promise that resolves with the transaction hash (`txHash`) of the claiming operation, or `undefined` if the operation fails.
* @throws UnsupportedChainError - If the provided EVM chain is unsupported or invalid.
*/
claimTimeLockedAssetsFromEVM(
input: ClaimTimeLockedAssetsInput,
): Promise<undefined | ClaimTimeLockedAssetsOutput> {
return claimTimeLockedAssetsFromEVM(this.sdkContext, input)
}
async bitcoinReceiverAddress(
fromChain: ChainId,
toChain: ChainId,
): Promise<undefined | { address: string; scriptPubKey: Uint8Array }> {
if (!KnownChainId.isBitcoinChain(fromChain)) return
if (!KnownChainId.isKnownChain(toChain)) return
return getBTCPegInAddress(fromChain, toChain)
}
/**
* This function provides detailed information about token transfers from the Bitcoin network to other supported
* blockchain networks, including Stacks and EVM-compatible chains. It verifies the validity of the transfer route
* and retrieves bridge information based on the destination chain.
* @param info - An object containing the input parameters required for retrieving bridge information:
* - `fromChain: ChainId` - The ID of the source blockchain.
* - `toChain: ChainId` - The ID of the destination blockchain (Stacks, EVM, etc.).
* - `amount: SDKNumber` - The amount of tokens involved in the transfer.
*
* @returns A promise that resolves with an object containing detailed information about the token transfer, including:
* - `fromChain: KnownChainId.KnownChain` - The source blockchain.
* - `fromToken: KnownTokenId.KnownToken` - The token being transferred from the Bitcoin network.
* - `toChain: KnownChainId.KnownChain` - The destination blockchain.
* - `toToken: KnownTokenId.KnownToken` - The token expected on the destination chain.
* - `fromAmount: SDKNumber` - The amount of tokens being transferred.
* - `toAmount: SDKNumber` - The amount of tokens expected on the destination chain after the transfer.
* - `feeAmount: SDKNumber` - The fee amount deducted during the transfer.
* @throws UnsupportedBridgeRouteError - If the provided route between the source and destination
* chains is unsupported.
*/
bridgeInfoFromBitcoin(
input: BridgeInfoFromBitcoinInput,
): Promise<BridgeInfoFromBitcoinOutput> {
return bridgeInfoFromBitcoin(this.sdkContext, input).catch(err => {
if (err instanceof TooManyRequestsError) {
throw new TooFrequentlyError(
["bridgeInfoFromBitcoin"],
err.retryAfter,
{
cause: err,
},
)
}
throw err
})
}
/**
* This function estimates the transaction fee and vSize for move or swap tokens from the Bitcoin network
* to other supported blockchain networks, including Stacks and EVM-compatible chains.
* @param input - An object containing the input parameters required for estimating the transaction:
* - `fromChain: ChainId` - The ID of the source blockchain (Bitcoin in this case).
* - `toChain: ChainId` - The ID of the destination blockchain (Stacks, EVM-compatible chains, etc.).
* - `fromToken: TokenId` - The token being transferred from the Bitcoin network.
* - `toToken: TokenId` - The token expected on the destination chain.
* - `fromAddress: string` - The source address on the Bitcoin network.
* - `fromAddressScriptPubKey: Uint8Array` - The script public key of the source address.
* - `toAddress: string` - The destination address on the target blockchain.
* - `amount: SDKNumber` - The amount of tokens to be transferred.
* - `networkFeeRate: bigint` - The fee rate for the Bitcoin network.
* - `reselectSpendableUTXOs` - // Implementation for reselect UTXOs.
*
* @returns A promise that resolves with an object containing the estimated transaction details:
* - `fee: SDKNumber` - The estimated transaction fee.
* - `estimatedVSize: SDKNumber` - The estimated vSize of the transaction.
* @throws UnsupportedBridgeRouteError - If the provided route between the source and destination
* chains or tokens is unsupported.
*/
estimateBridgeTransactionFromBitcoin(
input: EstimateBridgeTransactionFromBitcoinInput,
): Promise<EstimateBridgeTransactionFromBitcoinOutput> {
return estimateBridgeTransactionFromBitcoin(this.sdkContext, input).catch(
err => {
if (err instanceof TooManyRequestsError) {
throw new TooFrequentlyError(
["estimateBridgeTransactionFromBitcoin"],
err.retryAfter,
{
cause: err,
},
)
}
throw err
},
)
}
/**
* This function facilitates the transfer of tokens from the Bitcoin network to other supported
* blockchain networks. It checks the validity of the route and then calls the appropriate
* bridging function based on the destination chain.
* @param input - An object containing the input parameters required for the bridging operation:
* - `fromChain: ChainId` - The ID of the source blockchain.
* - `toChain: ChainId` - The ID of the destination blockchain (Stacks, EVM, etc.).
* - `fromToken: TokenId` - The token being transferred from the Bitcoin network.
* - `toToken: TokenId` - The token expected on the destination chain.
* - `fromAddress: string` - The source address on the Bitcoin network.
* - `fromAddressScriptPubKey: Uint8Array` - The script public key corresponding to the `fromAddress`.
* - `toAddress: string` - The recipient's address on the destination blockchain.
* - `amount: SDKNumber` - The amount of tokens to transfer.
* - `networkFeeRate: bigint` - The network fee rate to be used for the transaction.
* - `reselectSpendableUTXOs: ReselectSpendableUTXOsFn`.
* - `signPsbt: BridgeFromBitcoinInput_signPsbtFn`.
*
* @returns A promise that resolves with the transaction ID (`tx`) of the bridging operation.
* @throws UnsupportedBridgeRouteError - If the provided route between the source and destination
* chains or tokens is unsupported.
*/
bridgeFromBitcoin(
input: BridgeFromBitcoinInput,
): Promise<BridgeFromBitcoinOutput> {
return bridgeFromBitcoin(this.sdkContext, input).catch(err => {
if (err instanceof TooManyRequestsError) {
throw new TooFrequentlyError(["bridgeFromBitcoin"], err.retryAfter, {
cause: err,
})
}
throw err
})
}
brc20TickFromBRC20Token(
chain: ChainId,
token: KnownTokenId.BRC20Token,
): Promise<undefined | string> {
return brc20TickFromBRC20Token(this.sdkContext, chain, token)
}
brc20TickToBRC20Token(
chain: ChainId,
tick: string,
): Promise<undefined | KnownTokenId.BRC20Token> {
return brc20TickToBRC20Token(this.sdkContext, chain, tick)
}
runesIdFromRunesToken(
chain: ChainId,
token: KnownTokenId.RunesToken,
): Promise<undefined | `${number}:${number}`> {
return runesIdFromRunesToken(this.sdkContext, chain, token)
}
runesIdToRunesToken(
chain: ChainId,
id: `${number}:${number}`,
): Promise<undefined | KnownTokenId.RunesToken> {
return runesIdToRunesToken(this.sdkContext, chain, id)
}
}
/**
* This function retrieves the contract address associated with a specific token on the Stacks blockchain.
* @param chain - The ID of the Stacks blockchain.
* @param token - The specific token ID for which the contract address is to be retrieved.
*
* @returns A promise that resolves with the contract address associated with the specified token,
* or `undefined` if the chain is not a Stacks chain or if the contract address cannot be retrieved.
*/
async function stacksAddressFromStacksToken(
chain: ChainId,
token: KnownTokenId.StacksToken,
): Promise<undefined | StacksContractAddress> {
if (!KnownChainId.isStacksChain(chain)) return
const info = await getStacksTokenContractInfo(chain, token)
if (info == null) return
return {
deployerAddress: info.deployerAddress,
contractName: info.contractName,
}
}
/**
* This function maps a given Stacks contract address to its corresponding known token ID.
* @param chain - The ID of the Stacks blockchain.
* @param address - The contract address on the Stacks blockchain.
*
* @returns A promise that resolves with the known token ID corresponding to the provided
* contract address, or `undefined` if the chain is not a Stacks chain or if the token ID
* cannot be found.
*/
async function stacksAddressToStacksToken(
chain: ChainId,
address: StacksContractAddress,
): Promise<undefined | KnownTokenId.StacksToken> {
if (!KnownChainId.isStacksChain(chain)) return
return getStacksToken(chain, address)
}
async function brc20TickFromBRC20Token(
sdkContext: SDKGlobalContext,
chain: ChainId,
token: KnownTokenId.BRC20Token,
): Promise<undefined | string> {
if (!KnownChainId.isBRC20Chain(chain)) return
const routes = await getBRC20SupportedRoutes(sdkContext, chain)
return routes.find(r => r.brc20Token === token)?.brc20Tick
}
async function brc20TickToBRC20Token(
sdkContext: SDKGlobalContext,
chain: ChainId,
tick: string,
): Promise<undefined | KnownTokenId.BRC20Token> {
if (!KnownChainId.isBRC20Chain(chain)) return
const routes = await getBRC20SupportedRoutes(sdkContext, chain)
return routes.find(r => r.brc20Tick === tick)?.brc20Token
}
async function runesIdFromRunesToken(
sdkContext: SDKGlobalContext,
chain: ChainId,
token: KnownTokenId.RunesToken,
): Promise<undefined | `${number}:${number}`> {
if (!KnownChainId.isRunesChain(chain)) return
const routes = await getRunesSupportedRoutes(sdkContext, chain)
return routes.find(r => r.runesToken === token)?.runesId
}
async function runesIdToRunesToken(
sdkContext: SDKGlobalContext,
chain: ChainId,
runesId: `${number}:${number}`,
): Promise<undefined | KnownTokenId.RunesToken> {
if (!KnownChainId.isRunesChain(chain)) return
const routes = await getRunesSupportedRoutes(sdkContext, chain)
return routes.find(r => r.runesId === runesId)?.runesToken
}