1. CrossChainQuote
Copy crossChainQuote = async (params : CrossChainSwapParams )
The source token to be swapped.
The target token to receive after the swap.
The source network ID or chain for the swap.
The target network ID or chain for the swap.
The amount of source tokens to be swapped.
The allowed slippage percentage on the source chain.
The allowed slippage percentage on the target chain.
(Optional) An object containing additional options.
2. Execute Cross Chain Transfer
Copy executeTransfer = async (params : ExecuteCrossChainTransferParams )
RPC Provider for source chain
selected cross chain swap quote
source chain user address
Target chain user address
Rpc provider for target chain.
3. Execute Cross Chain Claim
Copy executeClaim = async (params : ExecuteCrossChainClaimParams )
Transaction hash of the tranfer transaction in source chain
RPC Provider for source chain
Rpc provider for target chain.
selected cross chain swap quote
source chain user address
Target chain user address
A CrossChain swap consists of three steps
Getting Swap Quotes: This step involves obtaining quotes for the selected chains and tokens.
Executing Transfer Instruction: In this phase, tokens are transferred across chains using a bridge to reach the selected destination chain.
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
Copy 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
Copy const quotes = await crossChainAggregator .crossChainQuote ({
apiKey : APIKEY ,
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
Copy const transfer = await crossChainAggregator .executeTransfer ({
apiKey : APIKEY ,
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
Copy const claim = await crossChainAggregator .executeClaim ({
apiKey : APIKEY ,
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
Copy const redeem = await crossChainAggregator .redeem ({
apiKey : APIKEY ,
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
Copy const suiProvider = new JsonRpcProvider ( new SuiConnection ({ fullnode : 'SUI RPC
const aptosConfig = new AptosConfig ({ network : Network . MAINNET });
const aptosProvider = new Aptos (aptosConfig)
const suiSigner = new RawSigner ( Ed25519Keypair .deriveKeypair ( process . env . SUIMNEMONICS || '' ) , suiProvider);
const aptosSigner = Account .fromPrivateKey ({
privateKey : new Ed25519PrivateKey ( process . env . APTOS_PRIVATEKEY || '' ) ,
address : AccountAddress .from ( process . env . APTOS_ADDRESS || '' ) ,
legacy : true ,
});
const crossChainAggregator = new SwapAggregator ( Environment .production);
2.2 . Getting Cross Chain Swap Quote
Copy const crossChainQuotes = await crossChainAggregator .crossChainQuote ({
apiKey : APIKEY ,
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
Copy const transfer = await crossChainAggregator .executeTransfer ({
apiKey : APIKEY ,
sourceProvider : aptosProvider ,
sourceAddress : aptosSigner . accountAddress .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
Copy const claim = await crossChainAggregator .executeClaim ({
apiKey : APIKEY ,
txHash : transfer .txHash ,
sourceProvider : aptosProvider ,
targetProvider : suiProvider ,
targetSigner : suiSigner ,
quote : optimalRoute ,
sourceAddress : aptosSigner . accountAddress .toString () ,
targetAddress : await suiSigner .getAddress () ,
});
2.5 . Redeeming tokens in case of failure
Copy const redeem = await crossChainAggregator .redeem ({
apiKey : APIKEY ,
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
Copy const solanaProvider = new Connection ( 'SOLANA RPC NODE);
const solanaSigner = Keypair .fromSecretKey ( bs58 .decode ( process . env . SOLANAPAYER || '' ));
const aptosConfig = new AptosConfig ({ network : Network . MAINNET });
const aptosProvider = new Aptos (aptosConfig)
const aptosSigner = Account .fromPrivateKey ({
privateKey : new Ed25519PrivateKey ( process . env . APTOS_PRIVATEKEY || '' ) ,
address : AccountAddress .from ( process . env . APTOS_ADDRESS || '' ) ,
legacy : true ,
});
const crossChainAggregator = new SwapAggregator ( Environment .production);
3.2 . Getting Cross Chain Swap Quote
Copy const crossChainQuotes = await crossChainAggregator .crossChainQuote ({
apiKey : APIKEY ,
'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
Copy const transfer = await crossChainAggregator .executeTransfer ({
apiKey : APIKEY ,
sourceProvider : solanaProvider ,
sourceAddress : solanaSigner . publicKey .toString () ,
sourceSigner : solanaSigner ,
quote : optimalRoute ,
targetAddress : aptosSigner . accountAddress .toString () ,
});
For Bridges using relayers there is no need to execute claim Instruction
3.4 . Execute Claim Instruction
Copy const claim = await crossChainAggregator .executeClaim ({
apiKey : APIKEY ,
txHash : transfer .txHash ,
sourceProvider : solanaProvider ,
targetProvider : aptosProvider ,
targetSigner : aptosSigner ,
quote : optimalRoute ,
sourceAddress : solanaSigner . publicKey .toString () ,
targetAddress : aptosSigner . accountAddress .toString () ,
});
3.5 . Redeeming tokens in case of failure
Copy const redeem = await crossChainAggregator .redeem ({
apiKey : APIKEY ,
sourceChain : NetworkId .solana ,
targetChain : NetworkId .aptos ,
sourceProvider : solanaProvider ,
targetProvider : aptosProvider ,
targetSigner : aptosSigner ,
SourceHash : transfer .txHash ,
targetAddress : aptosSigner . accountAddress .toString () ,
BridgeId : BridgeId .wormhole ,
});
Last updated 5 months ago