如何使用动态变量创建 web3 合约方法调用

问题描述 投票:0回答:1

您好,我正在尝试创建一个函数,允许我根据传递给父“blockchainCall”函数的动态变量传递合约函数名称和 send()/call() 等变量。

到目前为止,我所发现的似乎只是使用字符串调用函数,但如果您看到原始示例,那不是我想要做的。在 await 调用中链接了多个元素,所以我不确定在这里采用什么方法。有什么想法吗?

async function blockchainCall(contract, action, method, val) {
        let Method = method(val);
        let Action = action();

        await contract.methods.Method.Action.then((value) => {              
            return value;           
        })          
            .catch((error) => {             
            return error;           
        });


        /* original example */
        await contract.methods.ownerOf(val).call( {from: account[0], value: price} ).then((value) => {              
            return value;           
        })          
            .catch((error) => {             
            return error;           
        });
    }
javascript function async-await web3js web3
1个回答
0
投票

您可以访问带有字符串签名的方法作为 JS

contract
实例的关联数组项。

blockchainCall()
函数可以返回解析为返回值的承诺。

pragma solidity ^0.8;

contract MyContract {
    function foo() external {}

    function ownerof(uint256 tokenId) external pure returns (address) {
        return address(0x123);
    }
}
function blockchainCall(contract, action, method, val) {
    return new Promise((resolve, reject) => {
        contract.methods[method](val)[action]().then((value) => {
            resolve(value);
        }).catch((error) => {
            reject(error);
        });
    });
}
const owner = await blockchainCall2(contract, "call", "ownerof(uint256)", 1);
console.log(owner);
© www.soinside.com 2019 - 2024. All rights reserved.