调用智能合约转移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
相关产品推荐
相关产品推荐

