使用ethers.js进行代币转账与查询余额:与ERC20合约交互

智慧探索者 2019-06-13 ⋅ 147 阅读

在以太坊生态系统中,ERC20 代币是最常见的一种代币标准。ERC20 代币基于智能合约构建,可以在以太坊网络上进行转账和查询余额。

在本文中,我们将使用 ethers.js 库实现与 ERC20 合约进行交互的功能,包括转账代币和查询余额等操作。

准备工作

在开始编写代码之前,我们需要确保已经安装了 Node.js 环境,并创建一个新的项目目录。

在项目目录中,通过以下命令初始化一个新的 Node.js 项目:

npm init -y

接下来,我们安装 ethers.js、dotenv 和 chalk 三个依赖库:

npm install ethers dotenv chalk

创建一个新的文件 index.js,并添加如下代码:

const { ethers } = require("ethers");
const dotenv = require("dotenv");
const chalk = require("chalk");

dotenv.config();

const main = async () => {
  // 在此处编写代码
};

main().catch((error) => console.error(chalk.red.bold("Error: "), error));

设置环境变量

在与以太坊网络进行交互时,我们需要使用一些环境变量来连接到以太坊节点。为了安全起见,我们将这些敏感信息保存在 .env 文件中,并通过 dotenv 库加载到环境变量中。

在项目目录中创建一个新的文件 .env,并填入以下内容:

INFURA_API_KEY=<YOUR_INFURA_API_KEY>
PRIVATE_KEY=<YOUR_PRIVATE_KEY>
TOKEN_ADDRESS=<TOKEN_ADDRESS>

其中:

  • <YOUR_INFURA_API_KEY> 是你在 Infura 上创建的项目的 API Key;
  • <YOUR_PRIVATE_KEY> 是用于发送代币交易的以太坊账户的私钥;
  • <TOKEN_ADDRESS> 是你要交互的 ERC20 代币的合约地址。

连接到以太坊网络

首先,在 main 函数中添加以下代码来连接到以太坊网络:

const provider = new ethers.providers.InfuraProvider(
  "mainnet",
  process.env.INFURA_API_KEY
);

const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

console.log(chalk.bold("Connected to Ethereum network!"));

上述代码使用 InfuraProvider 连接到以太坊主网,并使用 .env 文件中的 INFURA_API_KEY 设置 API Key。然后,使用 .env 文件中的 PRIVATE_KEY 创建一个以太坊钱包。

加载 ERC20 合约

我们要与 ERC20 代币进行交互,首先需要加载 ERC20 合约的 ABI 和地址。ABI(Application Binary Interface)是以太坊智能合约的接口定义,用于描述智能合约中可调用的方法和事件。

main 函数中添加以下代码来加载 ERC20 合约:

const tokenAddress = process.env.TOKEN_ADDRESS;

const tokenAbi = [
  // 在这里添加 ERC20 合约的 ABI
];

const tokenContract = new ethers.Contract(tokenAddress, tokenAbi, wallet);

console.log(
  chalk.bold(`Loaded ERC20 contract at address ${tokenContract.address}`)
);

上述代码使用 .env 文件中的 TOKEN_ADDRESS 创建了一个新的 ethers.Contract 对象,以及一个指向 ERC20 合约的引用。

tokenAbi 变量中,你需要根据你要交互的 ERC20 代币的具体 ABI 来填入相应的内容。

查询代币余额

接下来,我们将编写一个函数来查询指定以太坊地址的 ERC20 代币余额。在 main 函数中添加以下代码:

const getAddressBalance = async (address) => {
  const balance = await tokenContract.balanceOf(address);
  const decimals = await tokenContract.decimals();

  return balance.div(ethers.BigNumber.from(10).pow(decimals)).toString();
};

const address = "<ADDRESS_TO_QUERY>"; // 要查询余额的以太坊地址

const balance = await getAddressBalance(address);

console.log(chalk.green.bold(`Current token balance: ${balance}`));

在上述代码中,getAddressBalance 函数接收一个以太坊地址作为参数,并使用 balanceOf 方法来查询 ERC20 代币余额。然后,使用 decimals 方法获取代币的小数位数,并利用这些信息将余额调整为人类可读的格式。

你需要将 <ADDRESS_TO_QUERY> 替换为你要查询余额的以太坊地址。

转账代币

最后,我们将编写一个函数来转账 ERC20 代币给指定的以太坊地址。在 main 函数中添加以下代码:

const transferToken = async (toAddress, amount) => {
  const tx = await tokenContract.transfer(toAddress, amount);

  console.log(
    chalk.green.bold(
      `Transfer of ${amount} tokens to ${toAddress} successful! Transaction hash: ${tx.hash}`
    )
  );
};

const toAddress = "<ADDRESS_TO_TRANSFER>"; // 要转账代币的以太坊地址
const amount = ethers.utils.parseUnits("<AMOUNT>", "<DECIMALS>"); // 要转账的代币数量

await transferToken(toAddress, amount);

在上述代码中,transferToken 函数接收一个以太坊地址和一个代币数量作为参数,并使用 transfer 方法来发送代币交易。

你需要将 <ADDRESS_TO_TRANSFER> 替换为你要转账代币的以太坊地址,并使用 <AMOUNT><DECIMALS> 替换为你要转账的代币数量和代币的小数位数。

运行代码

你可以使用以下命令运行代码:

node index.js

如果一切顺利,你应该能在控制台上看到查询余额和转账代币的结果。

恭喜!你已经成功地使用 ethers.js 进行了代币转账和查询余额的操作。这些基础功能可以用于构建更复杂的以太坊代币交互应用程序。


全部评论: 0

    我有话说: