• solidity实战练习2--ERC20实现


    1. //SPDX-License-Identifier:MTT
    2. pragma solidity ^0.8.24;
    3. interface erc20{
    4. function name()external view returns (string memory);//查看代币的名称
    5. function symbol() external view returns(string memory);//查看代币简称
    6. function totalSupply()external view returns(uint);//查看代币的总供应量
    7. function decimal()external view returns(uint8);//查看代币的精度
    8. function balanceOf(address account)external view returns(uint);//查看某账户的余额
    9. function transfer(address recipient ,uint amount) external payable returns(bool);//合约的调用者向某地址发送代币
    10. function approve(address spender ,uint amount) external returns(bool);//合约调用者向某一地址指定代币数量
    11. function allowance(address owner,address spender) external view returns(uint);//查看转账授权的金额
    12. function transferDirect(address _form,address _to,uint amount) external returns(bool);//直接执行转账操作
    13. function transferByApproves(address _to,uint amount) external returns(bool);//通过approve执行转账操作
    14. }
    15. contract erc20tokens{//定义需要的状态变量
    16. string public _name;
    17. string public _symbol;
    18. uint public _totalSupply;
    19. uint8 public _decimal;
    20. mapping(address=>uint)public balances;
    21. mapping(address=>mapping(address=>uint)) public approves;
    22. constructor(//给状态变量进行赋值操作,在构造函数里面赋值时候仅仅会进行一次
    23. string memory _name_,
    24. string memory _symbol_,
    25. uint _totalSupply_,
    26. uint8 _decimal_
    27. ) {
    28. _name=_name_;
    29. _symbol=_symbol_;
    30. _totalSupply =_totalSupply_;
    31. _decimal=_decimal_;
    32. }
    33. event Transfer(address _from,address _to,uint amount);//定义事件,记录转账操作
    34. event Approves(address _from,address _to,uint amount);//定义事件,记录授权操作,以及授权的余额
    35. //实现interface接口的函数
    36. function name()external view returns (string memory)//查看代币的名称
    37. {
    38. return _name;
    39. }
    40. function symbol() external view returns(string memory)//查看代币简称
    41. {
    42. return _symbol;
    43. }
    44. function totalSupply()external view returns(uint)//查看代币的总供应量
    45. {
    46. return _totalSupply;
    47. }
    48. function decimal()external view returns(uint8)//查看代币的精度
    49. {
    50. return _decimal;
    51. }
    52. function balanceOf(address account)external view returns(uint)//查看某账户的余额
    53. {
    54. return balances[account];
    55. }
    56. function transfer(address recipient ,uint amount) external returns(bool)//合约的调用者向某地址发送代币
    57. {
    58. require (balances[msg.sender]<=amount,"Sorry,you have no enough amount to send");
    59. return _transfer(msg.sender,recipient,amount);
    60. }
    61. function approve(address spender ,uint amount) external returns(bool)//合约调用者向某一地址授权指定数量代币
    62. {
    63. require(approves[msg.sender][spender]==0,"reapproved");
    64. approves[msg.sender][spender]=amount;
    65. return true;
    66. }
    67. function allowance(address owner,address spender) external view returns(uint)//查看转账授权的金额
    68. {
    69. return approves[owner][spender];
    70. }
    71. function transferByApproves(address _to,uint amount) internal returns(bool)
    72. {
    73. address _from=msg.sender;
    74. require(approves[_from][_to]>=amount,"You hava no right to send too much");
    75. emit Approves(_from,_to,amount);
    76. approves[_from][_to]-=amount;
    77. return _transfer(_from,_to,amount);
    78. }
    79. function transferDirect(address _from,address _to,uint amount) external returns(bool)//执行转账操作
    80. {
    81. require(balances[_from]>=amount,"You have no enough monay");
    82. return _transfer(_from,_to,amount);
    83. }
    84. function _transfer(address _from,address _to,uint amount) internal returns (bool)//转账操作集成于_transfer函数,通过其他需要用到转账的函数只需要通过调用_transfer函数就可以
    85. {
    86. require(balances[_from]>=amount,"Sorry, the amount is too low");//只要调用_transfer 函数就会触发事件
    87. balances[_from]-=amount;
    88. balances[_to]+=amount;
    89. emit Transfer(_from,_to,amount);
    90. return true;
    91. }
    92. }

    ps:
    授权转账的主要用途包括:

    • 代理转账:允许另一个地址代表你进行转账操作,这在复杂的合约交互中特别有用。例如,允许某个合约在你的代币余额中进行交易,而无需事先将代币转移到合约地址。

    • 限制额度:通过 approve 函数授权一个特定的地址可以转移的代币数量,可以帮助减少合约中的风险,因为授权的数量通常是有限的。

    • 灵活性:授权机制允许你动态地管理你的资金,可以随时修改授权的地址和数量,这为复杂的合约逻辑提供了更大的灵活性和安全性。

     

  • 相关阅读:
    Unity的OnOpenAsset:深入解析与实用案例
    Linux Tcp 连接 状态 检测 处理
    Ubuntu-Ports更新源 ARM64更新源
    【数据分享】成渝城市群规划范围数据(市县两级/shp格式)
    【CVE】CVE-2019-9193:PostgreSQL 任意命令执行漏洞
    第01章 第01章 数据结构基础和算法简介
    开源量子开发框架 Cirq
    怎样优雅地增删查改(七):按用户查询
    GBase项目管理实践总结——项目进度计划调整方法
    【Android Framework系列】第15章 Fragment+ViewPager与Viewpager2相关原理
  • 原文地址:https://blog.csdn.net/2303_79193185/article/details/140372833