Ethers.js技术问询:如何在BSC链发送BEP-20代币交易
用Ethers.js在BSC链发送BEP-20代币
BEP-20代币和以太坊ERC-20标准兼容,发送逻辑和ERC-20代币一致,核心是调用代币合约的transfer方法,具体实现如下:
核心步骤
- 准备目标BEP-20代币的合约地址和简化ABI(至少包含
transfer方法) - 通过Ethers.js创建关联签名者的代币合约实例
- 调用合约
transfer方法发起转账
完整代码示例
以BSC链上的USDT(合约地址:0x55d398326f99059ff775485246999027b3197955,decimals为6)为例:
// 初始化Provider和Signer,和你之前的代码一致 const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); // 1. 定义BEP-20代币的合约地址和简化ABI const tokenAddress = "0x55d398326f99059ff775485246999027b3197955"; const tokenAbi = [ "function transfer(address to, uint256 amount) public returns (bool)" ]; // 2. 创建代币合约实例,关联签名者 const tokenContract = new ethers.Contract(tokenAddress, tokenAbi, signer); // 3. 计算转账金额:匹配代币的decimals(USDT为6位) const amountToSend = ethers.utils.parseUnits("100", 6); // 对应100 USDT // 4. 发起转账并等待上链确认 const tx = await tokenContract.transfer("0xc705.......1f", amountToSend); await tx.wait(); console.log(`转账完成,交易哈希:${tx.hash}`);
关键注意事项
- Decimals匹配:不同BEP-20代币的decimals可能不同(比如BNB是18位,USDT是6位),必须用对应代币的decimals解析金额,否则会转错数量。不确定的话可调用合约方法获取:
const decimals = await tokenContract.decimals(); const amountToSend = ethers.utils.parseUnits("100", decimals); - 合约地址验证:务必确认代币在BSC链上的官方合约地址,避免转入假合约。
- Gas参数调整:若交易失败,可手动指定gasLimit或gasPrice:
const tx = await tokenContract.transfer("0xc705.......1f", amountToSend, { gasLimit: 100000, gasPrice: ethers.utils.parseUnits("5", "gwei") });
内容的提问来源于stack exchange,提问作者Jalil
相关产品推荐
相关产品推荐

