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.pswp.cn/web/44342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44342.shtml
英文地址,請注明出處:http://en.pswp.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…