如何在dapp开发中调用MetaMask实现BUSD转账功能
实现Metamask调起BUSD转账的完整方案
BNB是BSC链的原生代币,你之前用到的原生转账接口仅支持转原生币种,BUSD属于BEP20(符合ERC20标准)代币,可通过以下两种方案实现指定BUSD转账:
方案1:使用Metamask专属wallet_sendAsset方法(推荐,实现最简单)
这个方法可以直接唤起Metamask的指定代币转账弹窗,自动识别代币信息,无需手动编码合约调用:
// 先确认当前链对应的BUSD官方合约地址,以下为BSC主网BUSD示例 const BUSD_CONTRACT = "0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56"; const BUSD_DECIMALS = 18; async function sendBUSD(toAddress, amount) { try { await window.ethereum.request({ method: 'wallet_sendAsset', params: [{ type: 'ERC20', options: { address: BUSD_CONTRACT, symbol: 'BUSD', decimals: BUSD_DECIMALS, // 可选填写BUSD的官方logo地址 image: 'https://bscscan.com/token/images/binanceusd_32.png' }, to: toAddress, // 金额需要乘以对应精度,比如转1个BUSD就是1*10^18,转成十六进制字符串传入 amount: (amount * 10 ** BUSD_DECIMALS).toString(16) }] }); console.log("转账发起成功"); } catch (error) { console.error("转账失败", error); } }
调用该方法后,Metamask会直接弹出BUSD的转账确认窗口,不需要用户手动切换币种。
方案2:通用ERC20合约调用方式(兼容所有支持EIP-1193标准的钱包)
如果需要兼容Metamask之外的其他钱包,可以构造ERC20的transfer方法调用,通过eth_sendTransaction发起请求:
import { ethers } from 'ethers'; // 需要引入ethers.js库做合约方法编码 const BUSD_CONTRACT = "0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56"; // 只需要用到transfer方法,所以ABI可以只写这一个接口 const BUSD_ABI = ["function transfer(address to, uint256 amount) public returns (bool)"]; async function sendBUSD(toAddress, amount) { const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); const busdContract = new ethers.Contract(BUSD_CONTRACT, BUSD_ABI, signer); // 金额转成对应精度的单位 const parsedAmount = ethers.utils.parseUnits(amount.toString(), 18); const tx = await busdContract.transfer(toAddress, parsedAmount); await tx.wait(); console.log("转账确认成功", tx.hash); }
可选前置操作:给用户钱包添加BUSD资产
如果用户钱包内还没有添加BUSD代币,可以先调用以下方法让用户一键添加,避免转账时识别不到币种:
async function addBUSDToWallet() { await window.ethereum.request({ method: 'wallet_watchAsset', params: { type: 'ERC20', options: { address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56', symbol: 'BUSD', decimals: 18, image: 'https://bscscan.com/token/images/binanceusd_32.png', }, }, }); }
效果说明
你当前的原生BNB转账弹窗效果如下:
按照以上方案实现后,即可得到你期望的BUSD转账弹窗效果:
内容的提问来源于stack exchange,提问作者Surrender Oz
相关产品推荐
相关产品推荐

