如果我的农场合同有一个权益功能,我需要在调用transferFrom之前调用approve吗?
样本函数:
StakeToken stakingToken;
...
function depositTokens(uint256 amount) public {
require(amount > 0, "Must be more than 0");
//Do I need to call stakingToken.approve(...) here?
stakingToken.transferFrom(msg.sender, address(this), amount);
这是因为农场合同必须经过批准才能进行msg的转移吗?发送方的代表吗?
approve()
是需要的,但是您不能从您的合同中调用它。用户需要从他们的地址直接调用它。
因此,从用户处转移令牌实际上需要两次交易。第一个到token.approve()
,第二个到yourContract.depositTokens()
。
推理:令牌合约批准将msg.sender
的令牌花费到approve()
函数第一个参数中指定的地址。话虽如此,当您从合约中调用token.approve()
时,approve()
函数中的msg.sender
是您的合约,而不是用户。因此,在这种情况下,您将批准将代币从您的合同中花费到作为参数传递的任何地址。