智能合约报错: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
相关产品推荐
相关产品推荐

