我已将我的ERC721合同部署到Rinkeby TestNet。合同已成功部署。我无法使用MetaMask调用事务。整天都在寻找解决此问题的方法。找到了一些答案,说明存在本地文件或web3.js不适用于MetaMask的问题。
<script>
if (typeof web3 != 'undefined') {
web3 = new Web3(web3.currentProvider) // what Metamask injected
console.log("existing web3: provider " + typeof web3);
} else {
// Instantiate and set Ganache as your provider
web3 = new Web3(new Web3.providers.HttpProvider("https://rinkeby.infura.io/v3/api-key"));
console.log("new provider " + web3);
web3.eth.defaultAccount = web3.eth.accounts[0]
}
// The interface definition for your smart contract (the ABI)
var StarNotary = web3.eth.contract(
[contract-abi]
)
const starNotary = StarNotary.at('0x7cfAD6E80D992599d989166aABf536b21215544C')
function claimStar() {
web3.eth.getAccounts(function(error, accounts) {
if (error) {
hotsnackbar(false, error);
return
}
未捕获的错误:地址无效 在你(web3.min.js:1) 在inputTransactionFormatter(web3.min.js:1) 在web3.min.js:1 在Array.map() 在i.formatInput(web3.min.js:1) 在i.toPayload(web3.min.js:1) 在_.e [作为sendTransaction](web3.min.js:1) 在c.sendTransaction(web3.min.js:1) 在index.html:589 在web3.min.js:1
答案 0 :(得分:1)
这是一个完整的演示,其中包括介绍步骤,例如授权MetaMask合同等。
https://fulldecent.github.io/spend-ERC20-create-ERC721/
以下是我想您会感兴趣的特定代码:
https://github.com/fulldecent/spend-ERC20-create-ERC721/blob/master/docs/index.html#L102-L114
if (window.ethereum) {
window.web3 = new Web3(ethereum);
$('#need-metamask').hide();
} else {
console.log('Non-Ethereum browser detected. Install MetaMask.');
return;
}
window.web3.version.getNetwork((err, netId) => {
if (netId == "3") {
$('#need-ropsten').hide();
}
});
https://github.com/fulldecent/spend-ERC20-create-ERC721/blob/master/docs/index.html#L121-L127
try {
await ethereum.enable();
$('#need-enable').hide();
} catch (error) {
console.log("ERROR: Enable account access and reload.");
return;
}
答案 1 :(得分:1)
在使用带有Metamask的Rinkeby testnet的DApp时,我也遇到了同样的问题。
当我的web3.js
文件如下时
import Web3 from 'web3';
let web3;
if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') {
// We are in the browser and metamask is running.
web3 = new Web3(window.web3.currentProvider);
} else {
// We are on the server *OR* the user is not running metamask
const provider = new Web3.providers.HttpProvider(
'Infura API key'
);
web3 = new Web3(provider);
//window.web3.currentProvider.enable();
}
export default web3;
当我跑步时
npm start
或npm run dev
(取决于您的启动脚本)
浏览器抛出错误,提示“未捕获的错误:未指定'发件人'地址”
当我打开浏览器控制台并执行 web.currentProvider
时,它抛出了相同的错误。
因此,一件事很清楚,Metamask没有与浏览器建立联系。
我所做的是
我保持登录状态不变并保持浏览器处于打开状态。 并将web3.js更改为服务器在命令提示符下运行时的状态,并保存了文件。
import Web3 from 'web3';
let web3;
if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') {
// We are in the browser and metamask is running.
//Note: change to window.web3.currentProvider.enable()
web3 = new Web3(window.web3.currentProvider.enable());
} else {
// We are on the server *OR* the user is not running metamask
const provider = new Web3.providers.HttpProvider(
'Infura API'
);
web3 = new Web3(provider);
//window.web3.currentProvider.enable();
}
export default web3;
保存文件后 Metamask会提示您说要从您的帐户建立连接。
单击是。
并从上述代码中删除.enable()并保存您的代码。
这可能是临时解决方案,但是可以!
答案 2 :(得分:1)
web3.js 文件
li $t0, 0x7f800000
mtc1 $t0, $f0
li $t1, 1
mtc1 $t1, $f1
add.s $f0, $f0, $f1
请勿在if块本身中放置新的Web3()。托管(本地或在服务器上)后,打开metamask设置->连接,然后添加您的站点以访问metamask。 花了几天时间屏蔽Metamask和Web3错误后,对我来说工作非常完美!