@nekoproject/swap
Version:
Cross-chain Swap Token
125 lines (117 loc) • 3.74 kB
text/typescript
/* eslint-disable @typescript-eslint/no-explicit-any */
import { BSCNetwork } from '@nekoproject/networks';
import { ETHWallet } from '@nekoproject/wallets';
import { ethers } from 'ethers';
import axios from 'axios';
//
import { Swap } from '../Swap';
import { CreateOrder, BSCSwapOrderRequest, SetApiParams } from '../types';
export class BSCSwap extends Swap {
private _createOrderApi: string;
private _buildTransApi: string;
constructor(network: BSCNetwork, endpoint: string) {
let fmt_endpoint: string;
if (endpoint.endsWith('/')) {
fmt_endpoint = endpoint.slice(0, endpoint.length - 1);
} else {
fmt_endpoint = endpoint;
}
super(network, fmt_endpoint);
this._createOrderApi = this._endpoint + '/v2/swaps/create-order';
this._buildTransApi = this._endpoint + '/v2/swaps/build-transaction';
}
set endpoint(endpoint: string) {
this._endpoint = endpoint;
}
get endpoint() {
return this._endpoint;
}
set api(params: SetApiParams) {
this._createOrderApi = this._endpoint + params.createOrder;
this._buildTransApi = this._endpoint + params.buildTransaction;
}
/**
*
* @param swapRequest
* @returns
*/
async createSwapOrder(
swapRequest: CreateOrder
): Promise<BSCSwapOrderRequest | any> {
try {
const unitAmount = ethers.utils.parseUnits(
swapRequest.srcAmount,
swapRequest.srcToken.tokenInfo.decimals
);
const data = {
wallet_address: swapRequest.wallet_address,
slippage: swapRequest.slippage,
network: 'BSC',
destDecimals: swapRequest.destToken.tokenInfo.decimals,
srcDecimals: swapRequest.srcToken.tokenInfo.decimals,
srcAmount: unitAmount.toString(),
destToken: swapRequest.destToken.tokenInfo.mintAddress,
srcToken: swapRequest.srcToken.tokenInfo.mintAddress,
};
const orderResquest = await axios.post(this._createOrderApi, data);
if (orderResquest.data.swap_order) {
return orderResquest.data.swap_order;
} else {
throw new Error(
`Error create order: ${orderResquest.data?.error?.message}`
);
}
} catch (error) {
throw new Error(`Error swap token: ${error}`);
}
}
/**
*
* @param swapRequest
* @param wallet
* @returns
*/
async swapToken(
swapRequest: BSCSwapOrderRequest,
wallet: ETHWallet
): Promise<string> {
try {
const buildTransactionOrder = {
slippage: swapRequest.slippage,
wallet_address: wallet.address,
network: 'BSC',
swap_order_id: swapRequest.id.toString(),
};
const buildResponse = await axios.post(
this._buildTransApi,
buildTransactionOrder
);
if (buildResponse.data.transaction) {
const orderRequest = {
from: buildResponse.data.transaction.from,
to: buildResponse.data.transaction.to,
value: ethers.utils.formatEther(buildResponse.data.transaction.value),
data: buildResponse.data.transaction.data,
gasPrice: buildResponse.data.transaction.gasPrice,
gasLimit: buildResponse.data.transaction.gas,
chainId: buildResponse.data.transaction.chainId,
};
const transactionRequest = await this.network.createTransactionOrder(
orderRequest,
wallet
);
const hash = await this.network.sendTransaction(
transactionRequest,
wallet
);
return hash;
} else {
throw new Error(
`Build transaction Error: ${buildResponse.data?.error?.message}`
);
}
} catch (error) {
throw new Error(`Error swap token: ${error}`);
}
}
}