Cross Chain Swap

1. CrossChainQuote

crossChainQuote = async (params: CrossChainSwapParams)

CrossChainSwapParams

Description

sourceToken

The source token to be swapped.

targetToken

The target token to receive after the swap.

sourceChain

The source network ID or chain for the swap.

targetChain

The target network ID or chain for the swap.

amountIn

The amount of source tokens to be swapped.

sourceSlippage

The allowed slippage percentage on the source chain.

targetSlippage

The allowed slippage percentage on the target chain.

options

(Optional) An object containing additional options.

2. Execute Cross Chain Transfer

executeTransfer = async (params: ExecuteCrossChainTransferParams)

CrossChainTransferParams

Description

sourceProvider

RPC Provider for source chain

sourceSigner

Source chain signer

quote

selected cross chain swap quote

sourceAddress

source chain user address

targetAddress

Target chain user address

targetSigner

target chain signer.

targetProvider

Rpc provider for target chain.

3. Execute Cross Chain Claim

executeClaim = async (params: ExecuteCrossChainClaimParams)

CrossChainSwapParams

Description

txHash

Transaction hash of the tranfer transaction in source chain

sourceProvider

RPC Provider for source chain

targetProvider

Rpc provider for target chain.

targetSigner

target chain signer.

quote

selected cross chain swap quote

sourceAddress

source chain user address

targetAddress

Target chain user address

A CrossChain swap consists of three steps

  1. Getting Swap Quotes: This step involves obtaining quotes for the selected chains and tokens.

  1. Executing Transfer Instruction: In this phase, tokens are transferred across chains using a bridge to reach the selected destination chain.

  1. Executing Claim Instruction: After the tokens have been successfully bridged to the destination chain, this step allows users to claim their tokens. It's worth noting that bridges utilizing a relayer may not require this specific claim step.

What if the claim fails ?

In the event of a failure, users can redeem their tokens that were transferred via the bridge. Kanalabs exclusively transfers native stable coins / wrapped stable coins via the bridge. Therefore, users have the option to redeem their tokens and manually initiate the swap on the destination chain."

1 . POLYGON TO BSC

1.1 . Initialising SDK

const polygonRpc = process.env.ETH_NODE_URI_POLYGON as string;
const polygonProvider = ethers.getDefaultProvider(polygonRpc);
const polygonSigner = new ethers.Wallet(privateKey, polygonProvider);

const bscRpc = process.env.ETH_NODE_URI_BSC as string;
const bscProvider = ethers.getDefaultProvider(bscRpc);
const bscSigner = new ethers.Wallet(privateKey, bscProvider);

const crossChainAggregator = new SwapAggregator(Environment.production);

1.2 . Getting Cross Chain Swap Quote

const quotes = await crossChainAggregator.crossChainQuote({
  sourceToken: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
  targetToken: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
  sourceChain: NetworkId.polygon,
  targetChain: NetworkId.bsc,
  amountIn: utils.parseUnits('0.01', 18).toString(),
  sourceSlippage: 0.1,
  targetSlippage: 0.1,
});

const optimalQuote = quotes.data[0];

1.3 . Executing Transfer Instruction

const transfer = await crossChainAggregator.executeTransfer({
  quote: optimalQuote,
  sourceAddress: polygonSigner.getAddress() as string,
  targetAddress: bscSigner.getAddress() as string,
  sourceProvider: polygonProvider as providers.BaseProvider,
  sourceSigner: polygonSigner as EvmSignerType,
});

For Bridges using relayers there is no need to execute claim Instruction

1.4 . Execute Claim Instruction

const claim = await crossChainAggregator.executeClaim({
  txHash: transfer.txHash,
  sourceProvider: polygonProvider as providers.BaseProvider,
  targetProvider: bscProvider as providers.BaseProvider,
  targetSigner: bscSigner as EvmSignerType,
  quote: optimalQuote,
  sourceAddress: polygonSigner.getAddress() as string,
  targetAddress: bscSigner.getAddress() as string,
});

1.5 . Redeeming tokens in case of failure

const redeem = await crossChainAggregator.redeem({
  sourceChain: NetworkId.polygon,
  targetChain: NetworkId.bsc,
  sourceProvider: polygonProvider as providers.BaseProvider,
  targetProvider: bscProvider as providers.BaseProvider,
  targetSigner: bscSigner as EvmSignerType,
  SourceHash: transfer.txHash,
  targetAddress: bscSigner.getAddress() as string,
  BridgeId: BridgeId.wormhole,
});

2 . APTOS TO SUI

2.1 . Initialising SDK

const suiProvider = new JsonRpcProvider(new SuiConnection({ fullnode: 'SUI RPC NODE' }));
const aptosProvider = new AptosClient('APTOS RPC NODE');

const suiSigner = new RawSigner(Ed25519Keypair.deriveKeypair(process.env.SUIMNEMONICS || ''), suiProvider);
const aptosSigner = AptosAccount.fromAptosAccountObject({
  address: process.env.APTOS_ADDRESS || '',
  publicKeyHex: process.env.APTOS_PUBLICKEY || '',
  privateKeyHex: process.env.APTOS_PRIVATEKEY || '',
});

const crossChainAggregator = new SwapAggregator(Environment.production);

2.2 . Getting Cross Chain Swap Quote

const crossChainQuotes = await crossChainAggregator.crossChainQuote({
  sourceToken,
  targetToken,
  sourceChain: NetworkId.aptos,
  targetChain: NetworkId.sui,
  amountIn: '100000',
  sourceSlippage: 0.1,
  targetSlippage: 0.1,
});
const optimalRoute = crossChainQuotes.data[0];

2.3 . Executing Transfer Instruction

const transfer = await crossChainAggregator.executeTransfer({
  sourceProvider: aptosProvider,
  sourceAddress: aptosSigner.address().toString(),
  sourceSigner: aptosSigner,
  quote: optimalRoute,
  targetAddress: await suiSigner.getAddress(),
});

For Bridges using relayers there is no need to execute claim Instruction

2.4 . Execute Claim Instruction

const claim = await crossChainAggregator.executeClaim({
  txHash: transfer.txHash,
  sourceProvider: aptosProvider,
  targetProvider: suiProvider,
  targetSigner: suiSigner,
  quote: optimalRoute,
  sourceAddress: aptosSigner.address().toString(),
  targetAddress: await suiSigner.getAddress(),
});

2.5 . Redeeming tokens in case of failure

const redeem = await crossChainAggregator.redeem({
  sourceChain: NetworkId.aptos,
  targetChain: NetworkId.sui,
  sourceProvider: aptosProvider,
  targetProvider: suiProvider,
  targetSigner: suiSigner,
  SourceHash: transfer.txHash,
  targetAddress: await suiSigner.getAddress(),
  BridgeId: BridgeId.wormhole,
});

3 . SOLANA TO APTOS

3.1 . Initialising SDK

const solanaProvider = new Connection('SOLANA RPC NODE);
const solanaSigner = Keypair.fromSecretKey(bs58.decode(process.env.SOLANAPAYER || ''));
const aptosProvider = new AptosClient('APTOS RPC NODE');

const aptosSigner = AptosAccount.fromAptosAccountObject({
  address: process.env.APTOS_ADDRESS || '',
  publicKeyHex: process.env.APTOS_PUBLICKEY || '',
  privateKeyHex: process.env.APTOS_PRIVATEKEY || '',
});

const crossChainAggregator = new SwapAggregator(Environment.production);

3.2 . Getting Cross Chain Swap Quote

const crossChainQuotes = await crossChainAggregator.crossChainQuote({
  'So11111111111111111111111111111111111111112',
  '0x1::aptos_coin::AptosCoin',
  sourceChain: NetworkId.solana,
  targetChain: NetworkId.aptos,
  amountIn: '100000',
  sourceSlippage: 0.5,
  targetSlippage: 0.1,
});
const optimalRoute = crossChainQuotes.data[0];

3.3 . Executing Transfer Instruction

const transfer = await crossChainAggregator.executeTransfer({
  sourceProvider: solanaProvider,
  sourceAddress: solanaSigner.publicKey.toString(),
  sourceSigner: solanaSigner,
  quote: optimalRoute,
  targetAddress: aptosSigner.address().toString(),
});

For Bridges using relayers there is no need to execute claim Instruction

3.4 . Execute Claim Instruction

const claim = await crossChainAggregator.executeClaim({
  txHash: transfer.txHash,
  sourceProvider: solanaProvider,
  targetProvider: aptosProvider,
  targetSigner: aptosSigner,
  quote: optimalRoute,
  sourceAddress: solanaSigner.publicKey.toString(),
  targetAddress: aptosSigner.address().toString(),
});

3.5 . Redeeming tokens in case of failure

const redeem = await crossChainAggregator.redeem({
  sourceChain: NetworkId.solana,
  targetChain: NetworkId.aptos,
  sourceProvider: solanaProvider,
  targetProvider: aptosProvider,
  targetSigner: aptosSigner,
  SourceHash: transfer.txHash,
  targetAddress: aptosSigner.address().toString(),
  BridgeId: BridgeId.wormhole,
});

Last updated