Web3 JS实现Metamask BSC BEP20捐赠按钮无法识别BMON代币问题求助
问题核心原因
你调用eth_sendTransaction发起BEP20转账时,to字段配置错误:
- BEP20/ERC20代币转账本质是调用代币合约的transfer方法,因此交易的
to字段必须填代币合约地址,你的收款地址已经封装在编码后的ABI data里,不需要放在to字段 - 你当前错误将
to字段填为个人收款地址,导致Metamask无法识别这是BMON代币合约的交易,仅会识别为普通合约调用,所以显示通用TKN标识
修正后的代码片段
if (typeof window.ethereum !== 'undefined') { ethereum.request({ method: 'eth_requestAccounts' }); } else { alert('Please install metamask') } const web3 = new Web3('https://bsc-dataseed1.binance.org:443'); const contractAddress = '0x08ba0619b1e7a582e0bce5bbe9843322c954c340'; // BMON合约地址 const reciever = '0x6B5e6761A9fa07573aD01aeEBc0B724bD3a2980a'; // 你的收款地址 const sendEthButton = document.querySelector('.sendEthButton'); sendEthButton.addEventListener('click', () => { (async ()=>{ const contract = new web3.eth.Contract(ABI, contractAddress); // 注意:BMON小数位为18,你当前写的10是最小单位,要转10枚BMON的话需要做单位转换 const transfer = await contract.methods.transfer(reciever, web3.utils.toWei('10', 'ether')); const encodedABI = await transfer.encodeABI(); if(window.ethereum.chainId == '0x38'){ ethereum .request({ method: 'eth_sendTransaction', params: [ { from: ethereum.selectedAddress, to: contractAddress, // 核心修正点:此处填代币合约地址而非个人收款地址 gasPrice: '', gas: '', data: encodedABI }, ], }) .then((txHash) => console.log(txHash)) .catch((error) => console.error); } else { ethereum.request({ method: 'wallet_switchEthereumChain', params:[{chainId: '0x38'}]}) } })() });
补充说明
之前你复制bscscan的交易data还是报错,就是因为你没有同步修改to字段为合约地址,只要替换to字段的取值就能解决识别问题。
内容的提问来源于stack exchange,提问作者Mayga Fatmawati
相关产品推荐
相关产品推荐

