Allowance
意味着我们可以批准另一个合同或地址,以便能够转移我们的 ERC20 代币。这种要求在分布式应用程序中很常见,例如托管、游戏、拍卖等。因此,我们需要一种方法来批准其他地址来使用我们的代币。假设您有tether
合同,并且您想要 DEX 或任何其他实体从tether
合同中转移硬币。因此,您可以在映射中跟踪哪个实体可以从 Tether 合约转移多少。
// my address is allowing your address for this much token
mapping(address=>mapping(address=>uint)) public allowance;
在 ERC20 标准中,我们有一个全局变量“允许”,我们在其中保存从所有者地址到批准的支出者地址的映射,然后再到代币数量。调用approve() 函数可以为其所需的_spender 和_value 添加一个批准。此处不检查代币数量,将在 transfer() 中检查。
一旦获得批准,被批准的支出者可以使用 transferFrom() 转移代币。_from 是所有者地址,_to 是接收者的地址,_value 是需要发送的令牌数量。首先,我们检查所有者是否真的拥有所需数量的代币。
假设您想将一些以太币存入 DEFI 平台。与 DEFI 平台交互实际上是与该平台的智能合约交互。在你存钱之前,你首先approve
进行交易。你说这个合约地址可以从我的账户里拿一些钱。然后你调用deposit
DEFI 智能合约的函数并存入钱。这是按顺序进行传输的方式:
1- 在 Defi 内部,defi 合约必须deposit
从tether
function depositTokens(uint _amount) public{
require(_amount>0,'amount cannot be zero');
// transfer tether to this contract address for staking
tether.transferFrom(msg.sender,address(this), _amount);
// update the state inside Defi, like staked tokens, amount etc
}
2-在里面tether
我们有transferFrom
mapping(address=>mapping(address=>uint)) public allowance;
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){
// check the allowance
require(_value <=allowance[_from][msg.sender]);
balanceOf[_to]+=_value;
balanceOf[_from]-=_value;
allowance[_from][msg.sender]-=_value;
emit Transfer(_from,_to,_value);
return true;
}
第一个要求是检查津贴。mapping(address=>mapping(address=>uint)) public allowance
. 所以实际上在调用它之前,tether
合约必须更新它的allowance
映射,这样它transferFrom
才能顺利运行
3- 更新津贴approve
:
function approve(address _spender, uint _value)public returns (bool success){
allowance[msg.sender][_spender]=_value;
// This event must trigger when a successful call is made to the approve function.
emit Approval(msg.sender,_spender,_value);
return true;
}