DEX API
在 EVM 链上构建兑换应用

在 EVM 链上构建兑换应用#

在本指南中,我们将通过欧易 DEX 提供一个用例来进行代币交换,使用 Ethereum 链上的 ETH 购买 USDT。这个过程包括:

  • 设置你的环境
  • 获取 DEX 路由列表和交易信息
  • 检查授权额度
  • 发送兑换交易
  • 获取授权并发送兑换交易

1. 设置你的环境#

导入必要的 Node.js 库并设置你的环境变量以及定义辅助函数和组装参数 Node.js 环境设置

2.获取交换信息和构建交易数据#

2.1 定义你的交换参数#

接下来,定义你想要执行的交换的参数。

const swapParams = {
  chainId,
  fromTokenAddress,
  toTokenAddress,
  amount: '1000000000000000',
  slippage: '0.03',
  userWalletAddress,
  referrerAddress: '', // Optional
  feePercent: '', // Optional
};

2.2 定义辅助函数#

定义一个辅助函数,用于与 DEX 交换 API 进行交互。

const getSwapData = async () => {
  const apiRequestUrl = getRequestUrl(apiBaseUrl, '/swap', swapParams);
  return fetch(apiRequestUrl, {
    method: 'get',
    headers: headersParams,
  })
    .then((res) => res.json())
    .then((res) => {
      return res;
    });
};

2.3 构建交易数据#

已组装的交易参数可用于发起交易。

const { data } = await getSwapData();
const transaction = data[0]?.tx;
const nonce = await web3.eth.getTransactionCount(userWalletAddress, 'latest');
// You can obtain the latest nonce and process the hexadecimal numbers starting with 0x according to your needs
let signTransactionParams = {
  data: transaction.data,
  gasPrice: transaction.gasPrice,
  gas: transaction.gas,
  to: transaction.to,
  value: transaction.value,
  nonce,
};

3. 检查授权额度#

3.1 请参考查询授权额度教程#

查询授权额度

  • 下文的 allowanceAmount 代表真实的链上授权额度

3.2 获取授权数量#

获取数量。如果 allowanceAmount !== '0',请查看步骤 4。如果 allowanceAmount === '0',请查看步骤 5。

const { data: allowanceData } = await getAllowanceData();
const allowanceAmount = allowanceData?.[0]?.allowanceAmount;

4. 发送兑换交易#

提示
如果 allowanceAmount 大于零,则表示已执行批准操作,可以直接发送交易。
if (allowanceAmount !== '0') {
  const { rawTransaction } = await web3.eth.accounts.signTransaction(
    signTransactionParams,
    privateKey
  );
  const chainTxInfo = await web3.eth.sendSignedTransaction(rawTransaction);
  console.log('chainTxInfo', chainTxInfo);
}

5. 获取授权并发送兑换交易#

提示
如果allowanceAmount === '0',这表示尚未授权,需要进行授权操作。

5.1 定义你的授权交易参数#

接下来,定义你要执行的授权交易的参数。

const getApproveTransactionParams = {
  chainId,
  tokenContractAddress: fromTokenAddress,
  userWalletAddress,
  approveAmount: '...',
};

5.2 定义辅助函数#

定义一个辅助函数,用于与 DEX 批准交易 API 进行交互。

const approveTransaction = async () => {
  const apiRequestUrl = getRequestUrl(
    apiBaseUrl,
    '/approve-transaction',
    getApproveTransactionParams
  );

  return fetch(apiRequestUrl, {
    method: 'get',
    headers: headersParams,
  })
    .then((res) => res.json())
    .then((res) => {
      return res;
    });
};

5.3 获取授权交易的交易信息#

在获得批准之后获取交易信息。

const { data } = await approveTransaction();

5.4 合并授权交易事务#

将交易更新为已批准的交易。

signTransactionParams = {
  ...signTransactionParams,
  ...{ data: data[0].data },
};

5.5 发送兑换交易#

获取签名交易信息并发送交易

if (allowanceAmount === '0') {
  const { rawTransaction } = await web3.eth.accounts.signTransaction(
    signTransactionParams,
    privateKey
  );
  const chainTxInfo = await web3.eth.sendSignedTransaction(rawTransaction);
  console.log('chainTxInfo', chainTxInfo);
}