title: 41. WETH tags: solidity application ERC20 fallback WTF Solidity极简入门: 41. WETH 我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。 推特:@0xAAScience|@WTFAcademy 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity 这一讲,我们将学习 --带包装的 。 什么是 ? WETH (Wrapped ETH)是 的带包装版本。我们常见的 , , ,都是带包装的原生代币。
title: 41. WETH tags: - solidity - application - ERC20 - fallback
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将学习WETH--带包装的ETH。
WETH?
WETH (Wrapped ETH)是ETH的带包装版本。我们常见的WETH,WBTC,WBNB,都是带包装的原生代币。那么我们为什么要包装它们?
在2015年,ERC20标准出现,该代币标准旨在为以太坊上的代币制定一套标准化的规则,从而简化了新代币的发布,并使区块链上的所有代币相互可比。不幸的是,以太币本身并不符合ERC20标准。WETH的开发是为了提高区块链之间的互操作性 ,并使ETH可用于去中心化应用程序(dApps)。它就像是给原生代币穿了一件智能合约做的衣服:穿上衣服的时候,就变成了WETH,符合ERC20同质化代币标准,可以跨链,可以用于dApp;脱下衣服,它可1:1兑换ETH。
WETH合约目前在用的主网WETH合约写于2015年,非常老,那时候solidity是0.4版本。我们用0.8版本重新写一个WETH。
WETH符合ERC20标准,它比普通的ERC20多了两个功能:
存款:包装,用户将ETH存入WETH合约,并获得等量的WETH。
取款:拆包装,用户销毁WETH,并获得等量的ETH。
// 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个事件:
Deposit:存款事件,在存款的时候释放。Withdraw:取款事件,在取款的时候释放。除了ERC20标准的函数外,WETH合约有5个函数:
WETH的名字和代号。fallback()和receive(),当用户往WETH合约转ETH的时候,会自动触发deposit()存款函数,获得等量的WETH。deposit():存款函数,当用户存入ETH时,给他铸造等量的WETH。withdraw():取款函数,让用户销毁WETH,并归还等量的ETH。Remix演示WETH合约
deposit,存入1 ETH,并查看WETH余额
此时WETH余额为1 WETH。

WETH合约转入1 ETH,并查看WETH余额
此时WETH余额为2 WETH。

withdraw,取出1.5 ETH,并查看WETH余额
此时WETH余额为0.5 WETH。

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