【从0学习Solidity】41. WETH

news/2025/2/26 3:28:39

【从0学习Solidity】41. WETH

在这里插入图片描述

  • 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。
  • 关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!
  • 本文收录于 不写代码没饭吃 的学习汇报系列,大家有兴趣的可以看一看。
  • 欢迎访问我们的微信公众号:不写代码没饭吃,获取更多精彩内容、实用技巧、行业资讯等。您关注的是我们前进的动力!

这一讲,我们将学习WETH–带包装的ETH

什么是WETH

41-1.gif

WETH (Wrapped ETH)是ETH的带包装版本。我们常见的WETHWBTCWBNB,都是带包装的原生代币。那么我们为什么要包装它们?

在2015年,ERC20标准出现,该代币标准旨在为以太坊上的代币制定一套标准化的规则,从而简化了新代币的发布,并使区块链上的所有代币相互可比。不幸的是,以太币本身并不符合ERC20标准。WETH的开发是为了提高区块链之间的互操作性 ,并使ETH可用于去中心化应用程序(dApps)。它就像是给原生代币穿了一件智能合约做的衣服:穿上衣服的时候,就变成了WETH,符合ERC20同质化代币标准,可以跨链,可以用于dApp;脱下衣服,它可1:1兑换ETH

WETH合约

目前在用的主网WETH合约写于2015年,非常老,那时候solidity是0.4版本。我们用0.8版本重新写一个WETH

WETH符合ERC20标准,它比普通的ERC20多了两个功能:

  1. 存款:包装,用户将ETH存入WETH合约,并获得等量的WETH

  2. 取款:拆包装,用户销毁WETH,并获得等量的ETH

solidity">// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract WETH is ERC20{
    // 事件:存款和取款
    event  Deposit(address indexed dst, uint wad);
    event  Withdrawal(address indexed src, uint wad);

    // 构造函数,初始化ERC20的名字和代号
    constructor() ERC20("WETH", "WETH"){
    }

    // 回调函数,当用户往WETH合约转ETH时,会触发deposit()函数
    fallback() external payable {
        deposit();
    }
    // 回调函数,当用户往WETH合约转ETH时,会触发deposit()函数
    receive() external payable {
        deposit();
    }

    // 存款函数,当用户存入ETH时,给他铸造等量的WETH
    function deposit() public payable {
        _mint(msg.sender, msg.value);
        emit Deposit(msg.sender, msg.value);
    }

    // 提款函数,用户销毁WETH,取回等量的ETH
    function withdraw(uint amount) public {
        require(balanceOf(msg.sender) >= amount);
        _burn(msg.sender, amount);
        payable(msg.sender).transfer(amount);
        emit Withdrawal(msg.sender, amount);
    }
}

继承

WETH符合ERC20代币标准,因此WETH合约继承了ERC20合约。

事件

WETH合约共有2个事件:

  1. Deposit:存款事件,在存款的时候释放。
  2. Withdraw:取款事件,在取款的时候释放。

函数

除了ERC20标准的函数外,WETH合约有5个函数:

  • 构造函数:初始化WETH的名字和代号。
  • 回调函数:fallback()receive(),当用户往WETH合约转ETH的时候,会自动触发deposit()存款函数,获得等量的WETH
  • deposit():存款函数,当用户存入ETH时,给他铸造等量的WETH
  • withdraw():取款函数,让用户销毁WETH,并归还等量的ETH

Remix演示

1. 部署WETH合约

41-2.jpg

2. 调用deposit,存入1 ETH,并查看WETH余额

41-3.jpg

此时WETH余额为1 WETH

41-4.jpg

3. 直接向WETH合约转入1 ETH,并查看WETH余额

41-5.jpg

此时WETH余额为2 WETH

41-6.jpg

4. 调用withdraw,取出1.5 ETH,并查看WETH余额

41-7.jpg

此时WETH余额为0.5 WETH

41-8.jpg

总结

这一讲,我们介绍了WETH并实现了WETH合约。它就像是给原生ETH穿了一件智能合约做的衣服:穿上衣服的时候,就变成了WETH,符合ERC20同质化代币标准,可以跨链,可以用于dApp;脱下衣服,它可以1:1兑换ETH

在这里插入图片描述

如果这份博客对大家有帮助,希望各位给作者一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给作者的意见,欢迎评论区留言。


http://www.niftyadmin.cn/n/5049634.html

相关文章

基于win32实现TB登陆滑动验证

这里写目录标题 滑动验证触发条件:失败条件:解决方法:清除cooKie 滑动验证方式一:win32 api获取窗口句柄,选择固定位置 成功率高方式二: 原自动化滑动,成功率中 案例 先谈理论,淘宝 taobao.com …

基于微信小程的流浪动物救助宠物领养平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪)

整理逻辑思路: //【业务逻辑】这个脚本用来1.控制物体移动旋转(WASD)、 2.发射子弹(空格键) //【程序逻辑2】 首先检测用户没有按下空格键 2.如果按下呢执行发射子弹函数 3.克隆子弹 4.让克隆的子弹往前跑 搭…

如何搭建VUE项目开发环境?

搭建Vue.js项目的开发环境通常包括以下主要步骤: 1、安装Node.js和npm: Vue.js项目需要Node.js和npm(Node Package Manager)作为基础环境。你可以从Node.js官网下载并安装它们:Node.js官网 安装完成后,你…

CompletableFuture-通用异步编程

演示Completable接口完全可以代替Future接口: CompletableFuture减少阻塞和轮询,可以传入回调对象,当异步任务完成或者发生异常时,自动 调用回调对象的回调方法。 package com.nanjing.gulimall.zhouyimo.test;import java.util…

UniAccess Agent卸载

异常场景: UniAccess Agent导致系统中的好多设置打不开 例如:ipv4的协议,注册表,host等等 需要进行删除,亲测有效,及多家答案平凑的 借鉴了这位大神及他里面引用的大神的内容 https://blog.csdn.net/weixin_44476410/article/details/121605455 问题描述 这个进…

JDK21更新内容:SequenceCollection

“ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址 文章更新计划 文章更新计划 “ | 431: | Sequenced Collections | ” Sequenced Collections 1. 什么是Sequenced Collections&a…

LLM基础

LLM: AGI 通用人工智能 计算不可约性原理 监督微调、奖励建模 饶毅关于gpt https://mp.weixin.qq.com/s/Govj_KD_afL_nK9T16nE0w gpt2 windows :https://matters.town/tianci/63096-%E6%95%99%E4%BD%A0%E5%A6%82%E4%BD%95%E5%9C%A8%E8%87%AA%E5%B7%B1%E7%9A%84%E7%94%B5%E8%84%…