solidity实战练习2--ERC20实现

//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 函数授权一个特定的地址可以转移的代币数量,可以帮助减少合约中的风险,因为授权的数量通常是有限的。

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/44342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码:架起产教融合的“立交桥”

随着信息技术的飞速发展&#xff0c;传统的软件开发模式正面临着前所未有的挑战。为了应对这一挑战&#xff0c;低代码平台应运而生&#xff0c;其通过简化开发流程、提高开发效率&#xff0c;成为了推动产业与教育深度融合的重要力量。本文将探讨低代码平台如何架起产教融合的…

C++基础(十八):继承(重点)

各位看官&#xff0c;大家好&#xff01;今天我们将探讨C中的三大特性之一&#xff1a;继承。继承是一种面向对象编程的重要概念&#xff0c;它允许我们通过创建新的类&#xff0c;从而复用和扩展现有类的功能。通过继承&#xff0c;我们不仅能够提高代码的可重用性和可维护性&…

算法刷题笔记 KMP字符串(C++实现,并给出了求next数组的独家简单理解方式)

文章目录 题目描述基本思路实现代码 题目描述 给定一个字符串S&#xff0c;以及一个模式串P&#xff0c;所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串P在字符串S中多次作为子串出现。求出模式串P在字符串S中所有出现的位置的起始下标。 输入格式 第一行输入整数…

docker拉取镜像,报错error pulling image configuration: download failed after attempts=6: dial tcp 157.240.1

error pulling image configuration: download failed after attempts6: dial tcp 157.240.10.32:443: i/o timeout docker compose pull docker pull langgenius/dify-web:0.6.13 重启docker sudo systemctl restart dockerhttps://stackoverflow.com/questions/72353203/do…

9.5 栅格图层符号化多波段彩色渲染

文章目录 前言多波段彩色渲染QGis设置为多波段彩色二次开发代码实现多波段彩色 总结 前言 介绍栅格图层数据渲染之多波段彩色渲染说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 多波段彩色渲染 以“3420C_2010_327_RGB_LATLNG.tif”数据为例&#xff0c…

代码随想录打卡第二十一天

代码随想录–二叉树部分 day 21 二叉树第八天 文章目录 代码随想录--二叉树部分一、力扣669--修建二叉搜索树二、力扣108--将有序数组转换为二叉搜索树三、力扣538--把二叉搜索树转换为累加树 一、力扣669–修建二叉搜索树 代码随想录题目链接&#xff1a;代码随想录 给你二叉…

常见条件控制算法流程图

内容讲解&#xff1a;流程控制[if…else…(if…elif…else…),while,for] 常见条件控制算法流程图高清图

新手教学系列——高效管理MongoDB数据:批量插入与更新的实战技巧

前言 在日常开发中,MongoDB作为一种灵活高效的NoSQL数据库,深受开发者喜爱。然而,如何高效地进行数据的批量插入和更新,却常常让人头疼。今天,我们将一起探讨如何使用MongoDB的bulk_write方法,简化我们的数据管理流程,让代码更加简洁高效。 常规做法:find、insertone…

Unity 之 抖音小游戏集成排行榜功能详解

Unity 之 抖音小游戏集成排行榜功能详解 一,前言1.1 为游戏设计利于传播的元素​2.2 多人竞技、社交传播​二,集成说明2.1 功能介绍2.2 完整代码2.3 效果展示三,发现的问题和迭代计划一,前言 对于 Unity 开发者而言,在开发抖音小游戏时集成排行榜功能是提升游戏社交性和玩…

Java实战中处理高并发的策略

引言 随着互联网的快速发展&#xff0c;高并发成为了许多应用必须面对的挑战。Java作为一门广泛应用于企业级开发的语言&#xff0c;提供了丰富的工具和技术来应对高并发问题。本文将详细探讨Java中处理高并发的几种常见策略和技术。 1. 并发编程基础 1.1 线程与线程池 Jav…

【TVM 教程】使用 TVM 部署框架预量化模型

本文介绍如何将深度学习框架量化的模型加载到 TVM。预量化模型的导入是 TVM 中支持的量化之一。有关 TVM 中量化的更多信息&#xff0c;参阅 此处。 这里演示了如何加载和运行由 PyTorch、MXNet 和 TFLite 量化的模型。加载后&#xff0c;可以在任何 TVM 支持的硬件上运行编译…

【Linux】常见指令收官权限理解

tar指令 上一篇博客已经介绍了zip/unzip指令&#xff0c;接下来我们来看一下另一个关于压缩和解压的指令&#xff1a;tar指令tar指令&#xff1a;打包/解包&#xff0c;不打开它&#xff0c;直接看内容 关于tar的指令有太多了&#xff1a; tar [-cxtzjvf] 文件与目录 ...…

C++运行时类型识别

目录 C运行时类型识别A.What&#xff08;什么是运行时类型识别RTTI&#xff09;B.Why&#xff08;为什么需要RTTI&#xff09;C.dynamic_cast运算符Why&#xff08;dynamic_cast运算符的作用&#xff09;How&#xff08;如何使用dynamic_cast运算符&#xff09; D.typeid运算符…

【Scrapy】 Scrapy 爬虫框架

准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 &#x1f3b5; 陈慧娴《傻女》 Scrapy 是…

各地户外分散视频监控点位,如何实现远程集中实时监看?

公司业务涉及视频监控项目承包搭建&#xff0c;此前某个项目需求是为某林业公司提供视频监控解决方案&#xff0c;需要实现各地视频摄像头的集中实时监看&#xff0c;以防止国家储备林的盗砍、盗伐行为。 公司原计划采用运营商专线连接各个视频监控点位&#xff0c;实现远程视…

跟着李沐学AI:线性回归

引入 买房出价需要对房价进行预测。 假设1&#xff1a;影响房价的关键因素是卧室个数、卫生间个数和居住面积&#xff0c;记为x1、x2、x3。 假设2&#xff1a;成交价是关键因素的加权和 。权重和偏差的实际值在后面决定。 拓展至一般线性模型&#xff1a; 给定n维输入&…

MySQL 9.0 正式发行Innovation创新版已支持向量

从 MySQL 8.1 开始&#xff0c;官方启用了新的版本模型&#xff1a;MySQL 创新版 (Innovation) 和长期支持版 (LTS)。 根据介绍&#xff0c;两者的质量都已达到可用于生产环境级别。区别在于&#xff1a; 如果希望尝试最新的功能和改进&#xff0c;并喜欢与最新技术保持同步&am…

怎样在 C 语言中实现栈?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

动手学深度学习(Pytorch版)代码实践 -循环神经网络-55循环神经网络的从零开始实现和简洁实现

55循环神经网络的实现 1.从零开始实现 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l import matplotlib.pyplot as plt import liliPytorch as lp# 读取H.G.Wells的时光机器数据集 batch_size, num_ste…

开发个人Ollama-Chat--7 服务部署

开发个人Ollama-Chat–7 服务部署 服务部署 go-ChatGPT项目涉及的中间件服务较多&#xff0c;以下部署文件目录&#xff1a; |-- chat-api | |-- etc | | -- config.yaml | -- logs |-- chat-rpc | |-- etc | | -- config.yaml | -- logs |-- docker-compos…