let instance = await App.contracts.WeiboRegistry.deployed();
instance.setValue(1,{from:App.addr[0]}).then(
()=> alert(“setvalue”)
);
无法弹出测试日志,相同代码已经在METAMUSK手机端与PC端测试通过,TP钱包无法通过测试
再附加一点,状态已经正常写入成功了,此时去读取状态setValue已经被更改。
运行环境:$ truffle version
Truffle v5.5.13 (core: 5.5.13)
Ganache v^7.1.0
Solidity - 0.8.12 (solc-js)
Node v16.15.0
Web3.js v1.5.3
有没有测试连接? 我们 是用 E2E Test Dapp 这个测试的 合约部署 和 调用。 你可以在系统设置里 打开开发者模式 看到 vconsole 控制台
App = {
web3Provider: null,
contracts: {},
weiboRegistryAddress: “”,
cuurentWeiboAddress: null,
web3Provider: null,
defaultGas: 4700000,
init: async function () {
return await App.initWeb3();
},
initWeb3: async function () {
if (window.ethereum) {
App.web3Provider = window.ethereum;
try {
// Request account access
App.addr = await window.ethereum.request({ method: "eth_requestAccounts" });;
} catch (error) {
// User denied account access...
console.error("User denied account access")
}
}
// Legacy dapp browsers...
else if (window.web3) {
App.web3Provider = window.web3.currentProvider;
}
// If no injected web3 instance is detected, fall back to Ganache
else {
App.web3Provider = new Web3.providers.HttpProvider('http://localhost:8545');
}
//App.web3Provider = new Web3.providers.HttpProvider('http://localhost:8545');
App.web3 = new Web3(App.web3Provider);
await App.initContract();
},
initContract: async function () {
await $.getJSON('test.json', function (data) {
let AdoptionArtifact = data;
App.contracts.WeiboRegistry = TruffleContract(AdoptionArtifact);
App.contracts.WeiboRegistry.setProvider(App.web3Provider);
});
let instance = await App.contracts.WeiboRegistry.deployed().then();
instance.setValue(1,{from:App.addr[0]}).then(
()=> alert("setvalue")
);
},
}
$(function () {
$(window).load(function () {
App.init();
});
});
但如果是truffle的问题,可是在metamask手机端是一切正常的,PC端也是完全正常
是否和truffel有关?我使用的是truffle的包装合约类,我又做了几个测试,访问合约的view函数,then回调都可以正常被回调,如果要写状态则then无法被正常回调,此时状态已经被正常写入,不使用then回调,使用await 时,await也无法正常返回。
不确定是不是 truffle 的问题,建议改用 web3.js 来 调用合约
我定位到是truffle向钱包provider注册 message事件,但钱包provider并未回调此事件回调函数。在truffle-contract.js文件第,325700行,
this.provider.on(‘message’, function (payload) {
if (payload && payload.type === 'eth_subscription' && payload.data) {
const data = payload.data;
if (data.subscription && _this.subscriptions.has(data.subscription)) {
console.log("setProvider5")
_this.subscriptions.get(data.subscription).callback(null, data.result);
}
}
});
此事件从未被成功通知,进行回调
做了个测试站,http://198.74.107.62/test.html
美国渣渣服务器,网速慢,耐心等一会。你上去试一下,其中的js,我为了你方便查看源码都用的源代码。无论是不是truffle的问题,metamask正常而TP不行,这个问题你们就要重视起来了。
合约部署在heco测试网,https://http-testnet.hecochain.com
如果没实现message,那确定是不行了,正常APP(不包括使用了message接口的)
你是不是没切换网络?这个是部署在hecotest上的
你这个是TP吗?难道是我的TP的版本问题?你版本多少?
ios 1.8.4 是 hecotest
hecotest上是可以,本地链不行,应该是你们注入WEB3对象时没考虑本地私链,把provider的on对象赋值了或者没置空
没办法区分 本地链 还是 测试链,对于钱包来说都是 节点 url endpoint