Web端如何通过MetaMask API发送自定义代币及USDT?
实现ERC20代币(含USDT)发送的实现步骤
你贴的原始代码是原生ETH转账的逻辑,自定义代币/USDT属于ERC20标准代币,转账不需要转ETH,而是调用对应代币合约的transfer方法,所以核心要修改交易参数里的to、value、data三个字段,具体实现流程如下:
第一步:提前准备必要参数
- 要发送的代币的合约地址:比如以太坊主网USDT的合约地址是
0xdAC17F958D2ee523a2206206994597C13D831ec7,测试网要使用对应链的测试ERC20合约地址 - 接收方的钱包地址:比如
0x开头的接收方地址字符串 - 转账金额:要注意乘以代币的小数位,比如USDT是6位小数,转1个USDT的话实际数值是
1 * 10^6 = 1000000,最后要转成十六进制格式 - 如果不知道代币的小数位,可以去对应链的区块浏览器搜代币合约地址,详情页会展示
decimals参数
第二步:实现代码修改参考
// 1. 先配置自定义参数 const ERC20_TRANSFER_METHOD_ID = "0xa9059cbb"; // ERC20 transfer方法的固定函数选择器,不用改 const TOKEN_CONTRACT_ADDRESS = "0xdAC17F958D2ee523a2206206994597C13D831ec7"; // 替换成你要发送的代币合约地址 const RECEIVER_ADDRESS = "0x替换成接收方的钱包地址"; const TRANSFER_AMOUNT = 1 * 10 ** 6; // 转账金额,USDT是6位小数所以这里1代表1USDT,其他代币替换成对应小数位计算结果 // 自动编码转账参数,不用手动修改逻辑 const amountHex = TRANSFER_AMOUNT.toString(16).padStart(64, '0'); const receiverHex = RECEIVER_ADDRESS.slice(2).padStart(64, '0'); const transferData = ERC20_TRANSFER_METHOD_ID + receiverHex + amountHex; // 2. 构造交易参数 const transactionParameters = { gasPrice: '0x09184e72a000', // 也可以留空让MetaMask自动计算实时Gas价格 gas: '0x186A0', // ERC20转账建议设为100000(对应十六进制0x186A0),或者留空让MetaMask估算 to: TOKEN_CONTRACT_ADDRESS, // 注意:这里填代币合约地址,不是接收方地址 from: ethereum.selectedAddress, value: '0x00', // 转ERC20代币时value字段固定为0,不需要转ETH data: transferData, // 拼接好的transfer方法调用数据 chainId: '0x1', // 以太坊主网是0x1,测试网要改成对应链的ID,和代币所在链保持一致 }; // 3. 发起交易逻辑和原始代码一致 try { const txHash = await ethereum.request({ method: 'eth_sendTransaction', params: [transactionParameters], }); console.log("交易发起成功,交易哈希:", txHash) } catch (err) { console.error("交易发起失败:", err.message) }
注意事项
- 必须确保当前MetaMask连接的链和你代币所在的链一致,不然交易会直接失败
- 测试阶段建议先用测试网的测试代币调试,不要直接在主网操作避免资产损失
- 如果发起交易提示Gas不足,把
gas参数调大即可
内容的提问来源于stack exchange,提问作者Laravel dev
相关产品推荐
相关产品推荐

