- TeleSwap SDK Integration
- Initialize SDK
- Estimate output amount
- Create unsigned transaction
- Create and sign transaction
- Examples
TeleSwap enables secure and seamless bridging of Bitcoin assets (BTC, BRC-20 tokens, and RUNEs) across blockchains. The SDK provides core functionalities for bridging Bitcoin assets between Bitcoin and EVM networks.
The SDK provides four main functionalities:
- wrap: Convert BTC to TELEBTC
- wrapAndSwap: Convert BTC to ERC-20
- unwrap: Convert TELEBTC to BTC
- swapAndUnwrap: Convert ERC-20 to BTC
Base networks: You can wrap and unwrap BTC + swap BTC<>ERC-20 on these networks.
- Polygon: USTD, USDC, USDC.e, WBTC, WETH, MATIC, WMATIC, TELEBTC
- BNB: USDT, USDC, ETH, BTCB, BNB, WBNB, TELEBTC
- BSquared: USDT, USDC, BTC, WBTC, TELEBTC
- Bob: USDT, USDC, WETH, WBTC, TELEBTC
Cross-chain networks: You can swap BTC<>ERC-20 on these networks. Cross-chain networks use a base network as an intermediary.
- Ethereum: USDT, USDC, ETH, WETH, WBTC
- Optimism: USDT, USDC, ETH, WETH, WBTC
- Arbitrum: USDT, USDC, ETH, WETH, WBTC
First, create an instance of the SDK class.
- Optional: Set the default base network (e.g. Polygon)
let sdk = new TeleswapSDK()
// set default network
sdk.setDefaultNetwork({
networkName: "polygon",
})
The default Bitcoin connections are MempoolSpace and TeleportDAO for retrieving UTXOs and Bitcoin fee rates.
To interact with EVM networks, add network connection information to the SDK.
// Initialize all networks with TeleportDAO RPC
await sdk.initNetworksConnection()
// Use this method to set custom RPCs for specific networks while keeping the default TeleportDAO RPCs for others.
await sdk.initNetworksConnection([
{
networkName: "ethereum",
web3: {
url: "https://example.com",
},
},
])
// Add your custom RPC
sdk.addNetwork({
networkName: "bsc",
web3: {
url: "https://example.com",
},
})
To sign transactions on Bitcoin or EVM networks using a mnemonic, initialize the account with the mnemonic.
- If you only use EVM or Bitcoin, you can skip initialization for the other.
// Init Bitcoin account
let mnemonic = "..."
let bitcoinAddress = sdk.initBitcoinAccountUsingMnemonic(mnemonic)
// Init Polygon account
let polygonAddress = sdk.initEvmAccountUsingMnemonic(mnemonic)
Get the addresses of Bitcoin and EVM accounts using the following methods (need to initialize SDK first)
let bitcoinAddress = sdk.bitcoinAddress
let bitcoinAddressType = sdk.bitcoinAddressType
let targetNetworkAddress = sdk.evmAddress
To assign third-party ID requests and receive fees accordingly, initialize the SDK with your thirdPartyId.
Note: Please contact us on Discord to obtain your Third Party ID.
const thirdPartyId = 100
sdk.setThirdPartyId(thirdPartyId)
let amountInBTC = 0.001
// for normal wrap networkName should be one of the base networks
let baseNetworkName: = "polygon"
let estimateResponse = await sdk.wrapEstimate(
amountInBTC,
baseNetworkName,
)
Example response
// estimateResponse.fee : teleportdao bridge fee details
// estimateResponse.amount.receivedAmountBTC : received TELEBTC amount on base network
{
message: '',
success: true,
fee: {
networkFeeBTC: '0.00001000',
protocolFeeBTC: '0.00000050',
lockerFeeBTC: '0.00000150',
thirdPartyFeeBTC: '0.00000000',
totalFeeBTC: '0.00001200'
},
amount: {
inputAmountBTC: '0.001',
receivedAmountBTC: '0.00098800'
}
}
let amountInBTC = 0.001
let networkName: = "optimism"
let outputTokenAddress = "token contract address"
let estimateResponse = await sdk.wrapAndSwapEstimate(
amountInBTC,
outputTokenAddress,
networkName,
)
Example response
// estimateResponse.fee : teleportdao bridge fee details
// estimateResponse.amount.receivedAmountBTC : received TELEBTC amount on base network
// estimateResponse.exchange.inputAmount : input TELEBTC amount
// estimateResponse.exchange.outputAmount : exchanged token amount on base network
// estimateResponse.exchange.bridgeFee : cross chain bridge fee
// final received amount = estimateResponse.exchange.outputAmount - bridgeFee
{
message: '',
success: true,
fee: {
networkFeeBTC: '0.00001000',
protocolFeeBTC: '0.00000050',
lockerFeeBTC: '0.00000150',
thirdPartyFeeBTC: '0.00000000',
totalFeeBTC: '0.00001200'
},
amount: {
inputAmountBTC: '0.001',
receivedAmountBTC: '0.00098800'
},
exchange: {
inputAmount: '98800',
outputAmount: '66379561'
},
bridgeFee: '41055'
}
let amountInBTC = 0.001
// for unwrap networkName should be one of the base networks
let baseNetworkName: = "polygon"
let estimateResponse = await sdk.unwrapEstimate(
amountInBTC,
baseNetworkName,
)
Example response
// estimateResponse.fee : teleportdao bridge fee details
// estimateResponse.amount.receivedAmountBTC : received BTC amount on bitcoin network
{
message: '',
success: true,
fee: {
networkFeeBTC: '0.00001500',
protocolFeeBTC: '0.00000050',
lockerFeeBTC: '0.00000148',
thirdPartyFeeBTC: '0.00000000',
totalFeeBTC: '0.00001698'
},
amount: {
inputAmountBTC: '0.001',
receivedAmountBTC: '0.00098302'
}
}
let networkName: = "optimism"
let exchangeInfo = {
inputToken: "Token Contract Address",
inputAmount: 50 * 1e18, // for example (50 WMatic)
}
let estimateResponse = await sdk.swapAndUnwrapEstimate(
exchangeInfo,
networkName,
)
Example response
// estimateResponse.fee : teleportdao bridge fee details
// estimateResponse.exchange.inputAmount : input token amount on evm network
// estimateResponse.exchange.outputAmount : TELEBTC amount on base network
// estimateResponse.amount.receivedAmountBTC : BTC amount on bitcoin network
{
message: '',
success: true,
fee: {
networkFeeBTC: '0.00001500',
protocolFeeBTC: '0.00000009',
lockerFeeBTC: '0.00000025',
thirdPartyFeeBTC: '0.00000000',
totalFeeBTC: '0.00001534'
},
amount: {
inputAmountBTC: '0.00018374',
receivedAmountBTC: '0.00016840'
},
exchange: {
inputAmount: '5000000000000000',
outputAmount: '18374'
},
bridgeFee: '2284954268366'
}
Use the methods below to create unsigned transactions or retrieve the inputs needed for direct contract calls.
This function enables wrapping BTC from Bitcoin to an EVM base network, receiving TELEBTC in return.
let amountInBTC = 0.001
let polygonRecipientAddress = "0x..."
let baseNetworkName: = "polygon"
// You need to provide Bitcoin account details to create an unsigned transaction
const signerInfo: {
addressType: "p2wpkh" | "p2pkh" | "p2sh-p2wpkh"
publicKey: string
address: string
}
let unsignedTxResponse = await sdk.wrapUnsigned(
polygonRecipientAddress,
amountInBTC,
signerInfo,
baseNetworkName,
)
const unsignedPSBT = unsignedTxResponse.unsignedTransaction
// Sign unsignedTx
let signedTx = ...
// Send signed Tx
let bitcoinTxId = await sdk.sendSignedTransaction(signedTx)
This function enables swapping BTC on Bitcoin for tokens on EVM networks.
// You need to provide the relevant exchange information
let amountInBTC = 0.001
let evmAddress = "0x..."
let networkName = "ethereum"
let exchangeTokenAddress = "0x..."
// You need to provide Bitcoin account details to create an unsigned transaction
const signerInfo: {
addressType: "p2wpkh" | "p2pkh" | "p2sh-p2wpkh"
publicKey: string
address: string
}
const unsignedResponse = await sdk.wrapAndSwapUnsigned(
evmAddress,
amountInBTC,
exchangeTokenAddress,
signerInfo,
network,
)
This function enables unwrapping TELEBTC on base networks to receive BTC in return.
Note: You can obtain the inputs for the unwrap function and call the BurnRouter contract directly.
- To interact with the contract directly, you must grant approval to the contract for an amount equal to the input value.
- TODO: how to get contract address and ABI
import { ABI } from "@teleportdao/contracts-helper"
import { teleswap } from "@teleportdao/configs"
// for base network use this abi
const ccBurnABI = ABI.CCBurnRouterABI
// base network contract addresses
const polygonCCBurnAddress = teleswap.contracts.polygon.mainnet.ccBurnAddress
const bscCCBurnAddress = teleswap.contracts.bsc.mainnet.ccBurnAddress
const bobCCBurnAddress = teleswap.contracts.bob.mainnet.ccBurnAddress
const bsquaredCCBurnAddress = teleswap.contracts.bsquared.mainnet.ccBurnAddress
// ---------------
// for cross chain use this abi
const connectorABI = ABI.TeleswapEthConnectorABI
// cross chain connector contract addresses
const ethereumConnectorAddress = teleswap.connectors.ethereum.mainnet.connectorAddress
const arbitrumConnectorAddress = teleswap.connectors.arbitrum.mainnet.connectorAddress
const optimismConnectorAddress = teleswap.connectors.optimism.mainnet.connectorAddress
// if sdk is initialized
let amountInBTC = 0.001
let recipientBitcoinAddress = "..."
let baseNetworkName = "polygon"
// If your account is not initialized, you can obtain the function inputs and interact with the contract directly
const unwrapInputsResponse = await sdk.unwrapInputs(amountInBTC, btcAddress, baseNetworkName)
Example response
// Check contract ABI to see params details
// unwrapInputsResponse.unwrapInputs.params are contract inputs in order. check contract abi to know
{
locker: {
sourceAddress: '3CAQAw7m95axbY761Xq8d9DADhjNaX9b8o',
targetAddress: '0x13ffEe453a15E627Cd2aCbb23A735ab57c7C298f',
lockingScript: '0xa91472df0f82c4bcfe01a274bd521e5d4c66586b7a5b87'
},
inputs: {
params: [
'100000',
'0x7858574ca53954113221037a0f6a667ffa03babc',
3,
'0xa91472df0f82c4bcfe01a274bd521e5d4c66586b7a5b87',
0
],
value: '0'
}
}
This function enables swapping EVM tokens to receive BTC in return.
Note: You can obtain the inputs for the swapAndUnwrap function and call the contract directly:
- To interact with the contract directly, you must grant approval to the contract for an amount equal to the input value.
- If your network is a base network, call the BurnRouter contract.
- If your network is a cross-chain network, call the EthConnector contract.
- TODO: how to get contract address and ABI
let recipientBitcoinAddress = "..."
let exchangeInfo = {
inputToken: "Token Contract Address",
inputAmount: 50 * 1e18, // for example (50 WMatic)
}
let network = "optimism"
// If the received amount is less than minimumExpectedBTCAmount, the transaction will fail
const minimumExpectedBTCAmount = "0"
// If your account is not initialized, you can obtain the function inputs and interact with the contract directly
const unwrapAndSwapInputs = await sdk.swapAndUnwrapInputs(
exchangeInfo,
btcAddress,
network,
minimumExpectedBTCAmount,
)
Example response
{
"locker": {
"sourceAddress": "3CAQAw7m95axbY761Xq8d9DADhjNaX9b8o",
"targetAddress": "0x13ffEe453a15E627Cd2aCbb23A735ab57c7C298f",
"lockingScript": "0xa91472df0f82c4bcfe01a274bd521e5d4c66586b7a5b87"
},
"inputs": {
"params": [
"0x4e3e1807aa17aed8d1FC580dDa552079d9427ece",
[
"5000000000000000",
"0"
],
true,
[
"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6",
"0x3BF668Fe1ec79a84cA8481CEAD5dbb30d61cC685"
],
1730308950,
"0x7858574ca53954113221037a0f6a667ffa03babc",
3,
"0xa91472df0f82c4bcfe01a274bd521e5d4c66586b7a5b87",
0
],
"value": "0"
}
}
For the following functions, you must first initialize the SDK with a mnemonic.
This function enables wrapping BTC from Bitcoin to an EVM base network, receiving TELEBTC in return.
let amountInBTC = 0.001
let polygonRecipientAddress = "0x..."
let baseNetworkName: = "polygon"
let bitcoinTxId = await sdk.wrap(polygonRecipientAddress, amountInBTC,networkName)
This function enables swapping BTC on Bitcoin for tokens on EVM networks.
// You need to provide the relevant exchange information
// The exchange token address is the address of the token on the target chain
let amountInBTC = 0.001
let evmAddress = "0x..."
let networkName = "ethereum"
let exchangeTokenAddress = "0x..."
const response = await sdk.wrapAndSwap(evmAddress, amountInBTC, exchangeTokenAddress, networkName)
This function enables unwrapping TELEBTC on base networks to receive BTC in return.
let amountInBTC = 0.001
let recipientBitcoinAddress = "..."
let baseNetworkName = "polygon"
let response = await sdk.unwrap(amountInBTC, recipientBitcoinAddress, baseNetworkName)
This function enables swapping EVM tokens to receive BTC in return.
let recipientBitcoinAddress = "..."
let exchangeInfo = {
inputToken: "Token Contract Address",
inputAmount: 50 * 1e18, // for example (50 WMatic)
}
let network = "optimism"
const minimumExpectedBTCAmount = "0"
let response = await sdk.swapAndUnwrap(
exchangeInfo,
recipientBitcoinAddress,
network,
minimumExpectedBTCAmount,
)
For more information, please check the example.