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

智能合约报错:Sender与receiver需不同,stake_token函数调用疑问

问题原因及解决思路

这个错误的核心是你调用ft_transfer_call时,发送方和接收方被设成了同一个账户,大概率是下面两种情况之一:

1. 合约内部调用ft_transfer_call的逻辑错误

如果你的stake_token是合约的方法,当签名者调用这个方法时,合约去调用FT合约的ft_transfer_call,此时ft_transfer_call的发送方是你的合约账户,而非签名者。要是你把接收方也设成合约账户,自然就触发了“Sender and receiver should be different”的校验。

举个错误写法的例子:

#[near_bindgen]
impl Contract {
    pub fn stake_token(&mut self, amount: U128) {
        // 错误:调用ft_transfer_call的是合约,sender为合约账户
        ft_transfer_call(
            receiver_id: env::contract_id(), // 接收方也是合约
            amount: amount,
            msg: "stake".to_string(),
        );
    }
}

这种写法完全错误——合约不是代币持有者,且转给自己毫无意义。正确的做法是让签名者直接调用FT合约的ft_transfer_call,把接收方设为你的合约,同时在msg里带上质押相关指令,你的合约再通过ft_on_transfer回调处理质押逻辑。

2. 函数参数传错了

检查你stake_token函数里的ft_transfer_call参数,是不是误把receiver_id设成了签名者账户(signer_id),而非当前合约账户(env::contract_id())。比如写成这样:

ft_transfer_call(
    receiver_id: env::signer_id(), // 错误:接收方应该是合约
    amount: amount,
    msg: "...",
);

这种情况下,发送方和接收方都是签名者,直接触发错误。

快速排查步骤

  • 确认ft_transfer_call的receiver_id是env::contract_id();
  • 检查调用ft_transfer_call的主体:必须由代币持有者(签名者)直接调用FT合约的ft_transfer_call,而非合约代调用;
  • 核对脚本调用时的参数,有没有把接收方误填成签名者地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:50:35