在以太坊生态系统中,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 进行了代币转账和查询余额的操作。这些基础功能可以用于构建更复杂的以太坊代币交互应用程序。
本文来自极简博客,作者:智慧探索者,转载请注明原文链接:使用ethers.js进行代币转账与查询余额:与ERC20合约交互