5 solidity合约返回值问题, view,call,请教大佬

我正在使用solidity编写一个和交易所交互的程序

遇到了问题, 作为都看了3天solidity文档的我一头雾水,

众所周知web3中使用合约.函数.call() 可以在本地执行交易,获取返回结果, 而在solidity中没有发现这种东西,目测只能转成view可以获取返回结果, 我将交易所合约接口加上一个view,然后我在合约中调用的时候,会出错,原接口代码 ↓

interface pancackswap_interface {

// 交易所合约原接口
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external returns (uint[] memory amounts);
}

我在external 后面加了个view

现在遇到的问题就是原接口调用就是正常发送交易了, 获取不到返回值, 而加上view会报错,也能连接到交易所合约

"message": "execution reverted: TransferHelper: TRANSFER_FROM_FAILED"报这个错误 查了官方文档, 说是因为金额不足什么的, 但是我觉得跟那个没关系

因为我用web3调用原接口的时候, 使用call(), 可以正常获取返回值

我现在需求就是在solidity里不发生链上交易就可以获取返回值, 就跟web3的call()一样, 有这样的方法吗?

下面是我的出错代码:

interface pancackswap_interface {

    // 交易所合约接口 view是我后加的
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external view returns (uint[] memory amounts); 
}

contract my_contract {
    // 交易所路由合约地址
    address pancack_swap_contract = 0x10ED43C718714eb63d5aA57B78B54704E256024E;

    // 创建交易所合约对象
    pancackswap_interface use_pancake = pancackswap_interface(pancack_swap_contract);

        // 出错函数
    function view_token_for_eth_swap(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) public view returns(uint[] memory amounts) {
            return use_pancake.swapExactTokensForETH(amountIn, amountOutMin, path, to, deadline);
    }
}
请先 登录 后评论

最佳答案 2021-11-25 09:04

你这个方式根本行不通,view 关键字修饰的方法里面只能调用其它 view 方法,swapExactTokensForETH 明显没有 view 吧。

我估计你是想获取计算结果看看能换取到多少个代币,建议你看看 swapExactTokensForETH 里面是怎么计算的,然后通过 web3.contract.call获取到pancake 合约里面需要参与计算的变量的值,直接在本地进行计算。

请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 0 收藏,3571 浏览
  • shangtian123 提出于 2021-11-24 18:03