TP钱包web3.js发送交易后,无法接收回调

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


看起来,你们的钱包并未实现此接口

这个demo 我测试了 是 可以正常 work的 弹出了 test

on message 这个确实没有实现,但不影响 正常dapp 使用的

如果没实现message,那确定是不行了,正常APP(不包括使用了message接口的) :sweat_smile:

你是不是没切换网络?这个是部署在hecotest上的

你这个是TP吗?难道是我的TP的版本问题?你版本多少?

ios 1.8.4 是 hecotest

hecotest上是可以,本地链不行,应该是你们注入WEB3对象时没考虑本地私链,把provider的on对象赋值了或者没置空

没办法区分 本地链 还是 测试链,对于钱包来说都是 节点 url endpoint