Eu recentemente revisitei o Solidity para consolidar os detalhes e estou escrevendo um "WTF Introdução super simplificada ao Solidity" para iniciantes (os mestres da programação podem encontrar outros tutoriais), atualizado semanalmente com 1-3 palestras.
Twitter: @0xAA_Science
Discord: WTF Academy
Todo o código e tutoriais estão disponíveis no GitHub: github.com/AmazingAng/WTF-Solidity
Nesta palestra, vamos aprender sobre o WETH - Ethereum encapsulado.
WETH (Wrapped ETH) é a versão encapsulada do ETH. WETH, WBTC, WBNB que estamos acostumados são todos tokens nativos encapsulados. Mas por que precisamos encapsulá-los?
Em 2015, o padrão ERC20 foi introduzido com o objetivo de padronizar as regras para tokens na Ethereum, simplificando o lançamento de novos tokens e permitindo a comparação entre todos os tokens na blockchain. Infelizmente, o próprio Ether não está em conformidade com o padrão ERC20. O desenvolvimento do WETH tem o objetivo de aumentar a interoperabilidade entre blockchains e permitir que o ETH seja usado em aplicativos descentralizados (dApps). É como se estivéssemos vestindo um contrato inteligente sobre o token nativo: ao colocar a roupa, ele se torna WETH, conforme o padrão de tokens homogêneos ERC20, permitindo interoperabilidade entre blockchains e uso em dApps; ao remover a roupa, ele pode ser trocado de volta a uma taxa de 1:1 para ETH.
Atualmente, o contrato WETH na mainnet foi escrito em 2015, é bastante antigo e foi desenvolvido com a versão 0.4 do Solidity. Vamos reescrever um contrato do WETH usando a versão 0.8.
O WETH segue o padrão ERC20 e possui duas funcionalidades adicionais:
- Depósito: encapsulamento, onde os usuários depositam
ETHno contratoWETHe recebem a quantidade equivalente deWETH. - Saque: desencapsulamento, onde os usuários destroem
WETHe recuperam a quantidade equivalente deETH.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract WETH is ERC20 {
// Eventos: depósito e saque
event Deposit(address indexed dst, uint wad);
event Withdrawal(address indexed src, uint wad);
// Construtor, inicializa o nome e o símbolo do ERC20
constructor() ERC20("WETH", "WETH"){
}
// Função de fallback, quando os usuários transferem ETH para o contrato WETH, acionará a função deposit()
fallback() external payable {
deposit();
}
// Função de fallback, quando os usuários transferem ETH para o contrato WETH, acionará a função deposit()
receive() external payable {
deposit();
}
// Função de depósito, para quando os usuários depositam ETH, recebem a quantidade equivalente de WETH
function deposit() public payable {
_mint(msg.sender, msg.value);
emit Deposit(msg.sender, msg.value);
}
// Função de saque, para quando os usuários destroem WETH e recuperam a quantidade equivalente de 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);
}
}O WETH segue o padrão ERC20 para tokens, então o contrato WETH herda o contrato ERC20.
O contrato WETH possui 2 eventos:
Deposit: evento de depósito, acionado durante o depósito.Withdraw: evento de saque, acionado durante o saque.
Além das funções padrão do ERC20, o contrato WETH possui 5 funções:
- Construtor: inicializa o nome e o símbolo do
WETH. - Funções de fallback:
fallback()ereceive(), acionadas quando os usuários transferemETHpara o contratoWETH, elas automaticamente acionam a função de depósito (deposit()). deposit(): função de depósito, onde os usuários depositamETHe recebem a quantidade equivalente de WETH.withdraw(): função de saque, onde os usuários destroemWETHe recebem a quantidade equivalente deETH.
Neste momento, o saldo de WETH é de 1 WETH.
Neste momento, o saldo de WETH é de 2 WETH.
Neste momento, o saldo de WETH é de 0.5 WETH.
Nesta palestra, apresentamos o WETH e implementamos o contrato do WETH. Ele funciona como uma camada adicional ao Ether nativo: quando vestido, torna-se WETH, de acordo com o padrão ERC20, permitindo interoperabilidade entre blockchains e uso em dApps; ao remover a camada, ele pode ser trocado de volta por ETH na proporção de 1:1.







