Skip to main content

Cross-Chain Swap

Butter cross-chain swap allows you to swap any token from any blockchain.

Request

export type SwapRequestParam = {
fromAddress: string;
fromToken: BaseCurrency;
toAddress: string;
toToken: BaseCurrency;
amountIn: string; // in minimal uint
swapRouteStr: string; // cross-chain swap route, in string format.
slippage?: number; // in bps, e.g. 100 = 1%
options: ButterTransactionOption;
};

swapRouteStr: optimal cross-chain swap route based on token and amount provided. Please see how to get the best route

ButterTransactionOption contains all the necessary information required to complete a transaction:

export type ButterTransactionOption = {
signerOrProvider?: Signer | Provider | Eth; // When source chain is EVM provide Ethers.js Signer/Provider or Web3.js Eth info
nearProvider?: NearProviderType; // mandatory when src chain is near
gas?: string;
gasPrice?: string;
};

// when send transaction from Near Protocol
type NearProviderType = NearNetworkConfig | WalletConnection;

signerOrProvider: Butter supports both ethers.js and web3.js. If you are using ethers.js, provider the Signer object. If your application choose to use web3.js, please provide Eth object in order to send a transaction.

nearProvider: Whenever send a transaction from Near Protocol, you have to provide NearNetworkConfig with keystore provided or WalletConnection object

Response

Please refer to response type.

Gas estimation

Estimate the gas cost of swap transaction

async function gasEstimateSwap({
fromAddress,
fromToken,
toAddress,
toToken,
amountIn,
swapRouteStr,
slippage,
options
}: SwapRequestParam): Promise<string>; // estimated gas in string

Execute Swap

async function omnichainSwap({
fromAddress,
fromToken,
toAddress,
toToken,
amountIn, // amount of 'fromToken' to swap
swapRouteStr,
slippage, // in bps
options
}: SwapRequestParam): Promise<ButterTransactionResponse>;

Example 1: Swap 1 BNB for Matic using web3.js

import {ButterTransactionResponse} from "./responseTypes";
import {PromiEvent} from "web3-core";

// create a Butter swap instance.
const butterSwap: ButterSwap = new ButterSwap();

// assemble swap request parameters
const swapRequest: SwapRequestParam = {
fromAddress: '0x...',
fromToken: BNB_NATIVE,
toAddress: '0x...',
toToken: MATIC_NATIVE,
amountIn: ethers.utils.parseEther('1'),
swapRouteStr: '{}', // too long will omit here for readability
slippage: 100, // 1% splippage
options: {
signerOrProvider: web3.eth, // here we use web3.js as example
}
};

const response: ButterTransactionResponse = await butterSwap.omnichainSwap(
swapRequest
);

const promiReceipt: PromiEvent<TransactionReceipt> = response.promiReceipt!;

await promiReceipt
.on('transactionHash', function (hash: string) {
console.log('hash', hash);
})
.on('receipt', function (receipt: any) {
console.log('receipt', receipt);
});

Output:
hash 0x..... // transaction hash
receipt { // web3.js TransactionReceipt
status: boolean;
transactionHash: string;
transactionIndex: number;
blockHash: string;
blockNumber: number;
from: string;
to: string;
contractAddress?: string;
cumulativeGasUsed: number;
gasUsed: number;
effectiveGasPrice: number;
logs: Log[]..;
logsBloom: string;
events?: {
[eventName: string]: EventLog;
};
}

Example 2: Swap 1 BNB for Matic using ethers.js

import {ButterTransactionReceipt, ButterTransactionResponse} from "./responseTypes";
import {PromiEvent} from "web3-core";

const butterSwap: ButterSwap = new ButterSwap();

// assemble swap request parameters
const swapRequest: SwapRequestParam = {
fromAddress: '0x...',
fromToken: BNB_NATIVE,
toAddress: '0x...',
toToken: MATIC_NATIVE,
amountIn: ethers.utils.parseEther('1'),
swapRouteStr: '{}', // too long will omit here for readability
slippage: 150, // 1.5% splippage
options: {
signerOrProvider: ethers.signer, // here we use web3.js as example
},
};

const response: ButterTransactionResponse = await butterSwap.omnichainSwap(
swapRequest
);
console.log("transaction hash", response.hash!)

const receipt: ButterTransactionReceipt = await response.wait!();
console.log('receipt', receipt)

Output:
transaction hash 0x..... 
receipt {
to: string;
from: string;
gasUsed: string;
transactionHash: string;
blockHash?: string;
logs?: Log[];
blockNumber?: number;
success?: boolean; // 1 success, 0 failed
}