You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

波场链智能合约处理WTRX代币存取款触发REVERT报错如何解决

问题根因

  • 你的测试合约没有实现接收TRX的 payable 回调函数:WTRX合约的withdraw方法执行时,会给调用者(也就是你的TestTransfer合约地址)转账TRX,而波场链上的合约如果没有定义receive()或fallback() payable函数,是无法接收普通TRX转账的,所以WTRX内部的transfer调用直接触发回滚,这就是你遇到REVERT报错的核心原因。
  • 额外优化点:Solidity中address.transfer()自带2300gas限制,在波场链部分场景下可能不足以完成转账逻辑,建议改用call方式进行TRX转账,避免不必要的回滚。

修复后的合约代码

// 补充WTRX接口定义,避免合约编译报错
interface WTRX {
    function deposit() external payable;
    function withdraw(uint wad) external;
    function transfer(address to, uint wad) external returns (bool);
    function transferFrom(address from, address to, uint wad) external returns (bool);
}

contract TestTransfer {
    // 新增接收TRX的payable回调函数,允许合约接收WTRX转账过来的TRX
    receive() external payable {}

    function deposit(address payable wtrxAddr) public payable{
        WTRX wtrx = WTRX(wtrxAddr);
        // TRX兑换为WTRX
        wtrx.deposit.value(msg.value)();
        // 将WTRX转给调用者
        wtrx.transfer(msg.sender, msg.value);
    }

    function withdraw(address payable wtrxAddr, uint sad) public{
        WTRX wtrx = WTRX(wtrxAddr);
        // 将用户的WTRX转到当前合约
        wtrx.transferFrom(msg.sender, address(this), sad);
        // WTRX兑换为TRX,此时合约可正常接收WTRX转来的TRX
        wtrx.withdraw(sad);
        // 改用call方式转TRX给调用者,规避gas限制问题
        payable(msg.sender).call{value: sad}("");
    }

    function both(address payable wtrxAddr) public payable{
        WTRX wtrx = WTRX(wtrxAddr);
        // TRX兑换为WTRX
        wtrx.deposit.value(msg.value)();
        // WTRX兑换为TRX
        wtrx.withdraw(msg.value);
        // 转TRX给调用者
        payable(msg.sender).call{value: msg.value}("");
    }
}

注意事项

  • 调用withdraw前需要确认用户已经给你的合约地址授权了对应额度的WTRX,授权操作需要用户侧主动发起,不能由合约代执行。
  • 建议先在波场测试网验证逻辑,确认无误后再部署到主网。

内容的提问来源于stack exchange,提问作者Mecanicul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:18:01