npm i @kanalabs/aggregator
yarn add @kanalabs/aggregator
kanalabs aggregator SDK type doc - click to redirect
swapQuotes = async (params: SameChainSwapParams)
SameChainSwapParams | Description |
---|---|
inputToken | The input token for the swap operation. |
outputToken | The output token to receive after the swap. |
amountIn | The amount of input tokens to be swapped. |
slippage | The allowed slippage percentage for the swap. |
network | The network ID for the swap operation. |
options | (Optional) Additional options for the swap. |
executeSwapInstruction = async (params: SameChainInstructionParams)
executeSwapInstruction | Description |
---|---|
quote | A CommonRouteInterface representing the quote response format. |
address | The address related to the instruction. |
options | (Optional) An object containing additional options. |
options.provider | (Optional) The connection provider to use. |
options.integrator | (Optional) A string identifying the integrator. |
const aptosProvider = new AptosClient('RPC ENDPOINT');
const aptosSigner = AptosAccount.fromAptosAccountObject({
address: process.env.APTOS_ADDRESS || '',
publicKeyHex: process.env.APTOS_PUBLICKEY || '',
privateKeyHex: process.env.APTOS_PRIVATEKEY || '',
});
const swap = new SwapAggregator(Environment.production, {
providers: {
aptos: aptosProvider,
},
signers: {
aptos: aptosSigner,
},
});
NOTE : SIGNER CAN BE A APTOS ACCOUNT INSTANCE DERIVED FROM PRIVATE KEY OR A SIGN AND SUBMIT FUNCTION FROM APTOS WALLET ADAPTER
const quote = await swap.swapQuotes({
apiKey: APIKEY,
inputToken: '0x1::aptos_coin::AptosCoin',
outputToken: '0x6f986d146e4a90b828d8c12c14b6f4e003fdff11a8eecceceb63744363eaac01::mod_coin::MOD',
amountIn: '100000',
slippage: 0.5,
network: NetworkId.aptos,
});
const optimalQuote = quote.data[0];
const executeSwap = await swap.executeSwapInstruction({
quote: optimalQuote,
address: swap.signer?.aptos?.address().toString(),
});
const suiProvider = new JsonRpcProvider(new SuiConnection({ fullnode: 'SUI RPC NODE ' }));
const suiSigner = new RawSigner(Ed25519Keypair.deriveKeypair(process.env.SUIMNEMONICS || ''), suiProvider);
const swap = new SwapAggregator(Environment.production, {
providers: {
sui: suiProvider,
},
signers: {
sui: suiSigner,
},
});
const quote = await swap.swapQuotes({
apiKey: APIKEY,
inputToken: '0x2::sui::SUI',
outputToken: '0xf0fe2210b4f0c4e3aff7ed147f14980cf14f1114c6ad8fd531ab748ccf33373b::bswt::BSWT',
amountIn: '10000',
slippage: 1,
network: NetworkId.sui,
});
const optimalQuote = quote.data[0];
const executeSwap = await swap.executeSwapInstruction({
quote: optimalQuote,
address: await swap.signer?.sui?.getAddress(),
});
const solanaProvider = new Connection(clusterApiUrl('mainnet-beta'));
const solanaSigner = Keypair.fromSecretKey(bs58.decode(process.env.SOLANAPAYER || ''));
const swap = new SwapAggregator(Environment.production, {
providers: {
solana: solanaProvider,
},
signers: {
solana: solanaSigner,
},
});
const quote = await swap.swapQuotes({
apiKey: APIKEY,
inputToken: 'So11111111111111111111111111111111111111112',
outputToken: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
amountIn: '1000',
slippage: 1,
network: NetworkId.solana,
});
const optimalQuote = quote.data[0];
const executeSwap = await swap.executeSwapInstruction({
quote: optimalQuote,
address: swap.signer?.solana?.publicKey.toString(),
});
const polygonRpc = process.env.ETH_NODE_URI_POLYGON as string;
const polygonProvider = ethers.getDefaultProvider(polygonRpc);
const polygonSigner = new ethers.Wallet(privateKey, polygonProvider);
const swap = new SwapAggregator(Environment.production, {
providers: {
polygon: polygonProvider,
},
signers: {
polygon: polygonSigner,
},
});
const quote = await swap.swapQuotes({
apiKey: APIKEY,
inputToken: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
outputToken: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',
amountIn: utils.parseEther('0.05').toString(),
slippage: 1,
network: NetworkId.polygon,
});
const optimalQuote = quote.data[0];
const executeSwap = await swap.executeSwapInstruction({
quote: optimalQuote,
address: await swap.signer?.polygon?.getAddress(),
});
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. |
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. |
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
- 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."
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);
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];
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
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,
});
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,
});
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);
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];
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
const claim = await crossChainAggregator.executeClaim({
txHash: transfer.txHash,
sourceProvider: aptosProvider,
targetProvider: suiProvider,
targetSigner: suiSigner,
quote: optimalRoute,
sourceAddress: aptosSigner.address().toString(),
targetAddress: await suiSigner.getAddress(),
});
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,
});
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);
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];
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
const claim = await crossChainAggregator.executeClaim({
txHash: transfer.txHash,
sourceProvider: solanaProvider,
targetProvider: aptosProvider,
targetSigner: aptosSigner,
quote: optimalRoute,
sourceAddress: solanaSigner.publicKey.toString(),
targetAddress: aptosSigner.address().toString(),
});
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,
});
Generated using TypeDoc