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

调用智能合约转移HTS代币时遇SPENDER_DOES_NOT_HAVE_ALLOWANCE错误求助

问题定位与解决方案

错误根源分析

你调用的HederaTokenService.transferToken(token, msg.sender, to, amount)是让合约作为执行主体,从msg.sender账户转移代币到to地址。根据HTS代币规则,这种跨账户转移操作要求msg.sender必须预先给合约地址设置代币授权(allowance),否则会返回SPENDER_DOES_NOT_HAVE_ALLOWANCE错误;而合约里的require条件会因响应码非SUCCESS触发回滚,最终返回CONTRACT_REVERT_EXECUTED。

当前代码的核心问题

函数缺少授权前置逻辑校验,也没有引导用户完成授权操作,直接执行转移必然失败。

修复方案

  • 先完成代币授权:在调用myTransferToken前,用户需通过钱包(如HashPack)调用HTS代币的approve方法,给合约地址授权足够数量的代币;也可以在合约中新增授权函数方便用户操作:
    function approveToken(address token, int64 amount) external {
        int responseCode = HederaTokenService.approve(token, address(this), amount);
        require(responseCode == HederaResponseCodes.SUCCESS, "Approve failed");
    }
    
  • 优化错误调试信息:修改require的错误提示,带上具体响应码,便于快速定位问题:
    require(
        responseCode == HederaResponseCodes.SUCCESS,
        string(abi.encodePacked("Transfer failed: code ", responseCode))
    );
    
  • 可选:语义更明确的transferFrom:如果场景适配,也可以替换为transferFrom方法(本质仍需授权,但语义更清晰):
    int responseCode = HederaTokenService.transferFrom(token, msg.sender, to, amount);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:32:18