//SPDX-License-Identifier:MTT
pragma solidity ^0.8.24;interface erc20{function name()external view returns (string memory);//查看代幣的名稱function symbol() external view returns(string memory);//查看代幣簡稱function totalSupply()external view returns(uint);//查看代幣的總供應量function decimal()external view returns(uint8);//查看代幣的精度function balanceOf(address account)external view returns(uint);//查看某賬戶的余額function transfer(address recipient ,uint amount) external payable returns(bool);//合約的調用者向某地址發送代幣function approve(address spender ,uint amount) external returns(bool);//合約調用者向某一地址指定代幣數量function allowance(address owner,address spender) external view returns(uint);//查看轉賬授權的金額function transferDirect(address _form,address _to,uint amount) external returns(bool);//直接執行轉賬操作function transferByApproves(address _to,uint amount) external returns(bool);//通過approve執行轉賬操作
}contract erc20tokens{//定義需要的狀態變量string public _name;string public _symbol;uint public _totalSupply;uint8 public _decimal;mapping(address=>uint)public balances;mapping(address=>mapping(address=>uint)) public approves;constructor(//給狀態變量進行賦值操作,在構造函數里面賦值時候僅僅會進行一次string memory _name_,string memory _symbol_,uint _totalSupply_,uint8 _decimal_) {_name=_name_;_symbol=_symbol_;_totalSupply =_totalSupply_;_decimal=_decimal_;}event Transfer(address _from,address _to,uint amount);//定義事件,記錄轉賬操作event Approves(address _from,address _to,uint amount);//定義事件,記錄授權操作,以及授權的余額//實現interface接口的函數function name()external view returns (string memory)//查看代幣的名稱{return _name;}function symbol() external view returns(string memory)//查看代幣簡稱{return _symbol;}function totalSupply()external view returns(uint)//查看代幣的總供應量{return _totalSupply;}function decimal()external view returns(uint8)//查看代幣的精度{return _decimal;}function balanceOf(address account)external view returns(uint)//查看某賬戶的余額{return balances[account];}function transfer(address recipient ,uint amount) external returns(bool)//合約的調用者向某地址發送代幣{require (balances[msg.sender]<=amount,"Sorry,you have no enough amount to send");return _transfer(msg.sender,recipient,amount);}function approve(address spender ,uint amount) external returns(bool)//合約調用者向某一地址授權指定數量代幣{require(approves[msg.sender][spender]==0,"reapproved");approves[msg.sender][spender]=amount;return true;}function allowance(address owner,address spender) external view returns(uint)//查看轉賬授權的金額{return approves[owner][spender];}function transferByApproves(address _to,uint amount) internal returns(bool){address _from=msg.sender;require(approves[_from][_to]>=amount,"You hava no right to send too much");emit Approves(_from,_to,amount);approves[_from][_to]-=amount;return _transfer(_from,_to,amount);}function transferDirect(address _from,address _to,uint amount) external returns(bool)//執行轉賬操作{require(balances[_from]>=amount,"You have no enough monay");return _transfer(_from,_to,amount);}function _transfer(address _from,address _to,uint amount) internal returns (bool)//轉賬操作集成于_transfer函數,通過其他需要用到轉賬的函數只需要通過調用_transfer函數就可以{require(balances[_from]>=amount,"Sorry, the amount is too low");//只要調用_transfer 函數就會觸發事件balances[_from]-=amount;balances[_to]+=amount;emit Transfer(_from,_to,amount);return true;}
}
ps:
授權轉賬的主要用途包括:
-
代理轉賬:允許另一個地址代表你進行轉賬操作,這在復雜的合約交互中特別有用。例如,允許某個合約在你的代幣余額中進行交易,而無需事先將代幣轉移到合約地址。
-
限制額度:通過
approve
函數授權一個特定的地址可以轉移的代幣數量,可以幫助減少合約中的風險,因為授權的數量通常是有限的。 -
靈活性:授權機制允許你動態地管理你的資金,可以隨時修改授權的地址和數量,這為復雜的合約邏輯提供了更大的靈活性和安全性。
?