Extensões do ERC20
O ERC20 é um dos padrões mais conhecidos no ecossistema Ethereum. Ele fornece funcionalidade básica para criar e transferir os tokens fungíveis. Mas aqui eu não quero me concentrar nos detalhes do padrão ERC20 nem em uma forma de implementá-lo, porque na Internet existe uma grande quantidade desse tipo de informação. Gostaria de focar na extensão que podemos acrescentar ao padrão clássico (vanilla) ERC20 para torná-lo mais adequado aos vários casos de uso diferentes.
Extensões
Todas as extensões que descreverei aqui provêm do github do OpenZeppelin.
ERC20Burnable
A implementação do ERC20 padrão tem apenas uma função interna, a _burn
, que não é utilizada em nenhuma função implementada. Essa extensão nos dá duas novas funções públicas: burn
e burnFrom
. Ambas concedem aos detentores de tokens seus próprios tokens e os tokens para os quais eles têm uma permissão. Se o detentor de tokens queimar tokens por uma destas funções, será emitido o evento Transfer
, que será reconhecido off-chain.
ERC20Capped
Esta extensão nos dá uma pequena função adicional - ela estabelece o limite superior da quantidade de tokens cunhados. Simples, não é? Aaa, eu mencionei que este limite é imutável? Então, se você uma vez definiu o valor, não há nenhuma chance de mudá-lo.
ERC20FlashMint
Este aqui é muito interessante. É a implementação da extensão FlashLoan ERC3156. Graças ao fato de que nosso contrato cria tokens, também é capaz de dar flashLoan, o que com a adição de taxa que não seja zero do empréstimo, faz nossa deflação do token. Mas, por padrão, a taxa é fixada em zero.
Vamos verificar como isso funciona passo a passo. Quando alguém quer pegar emprestado os tokens de nosso contrato, há a necessidade de usar uma função flashLoan
. Os argumentos dessa função são:
- o endereço do contrato para onde os tokens devem ser transferidos
- o endereço do token que ele quer emprestar
- a quantidade, quantos deles ele quer
- dados adicionais, que serão enviados para o contrato do destinatário
Quando a quantidade não é maior que a quantidade máxima de tokens disponíveis para empréstimo, o contrato cunhará tantos tokens quanto alguém quiser pedir emprestado. Então o contrato chama a função onFlashLoan
do contrato do destinatário. É o espaço no qual o tomador do empréstimo usa o dinheiro emprestado. No final, a função onFlashLoan
tem que retornar bytes32 de valor igual a keccak256("ERC3156FlashBorrower.onFlashLoan")
. Quando tudo der certo, o contrato, no final, queimará todos os tokens cunhados anteriormente.
ERC20Pausable
Esta extensão implementa para o contrato ERC20 padrão o mecanismo de parada de emergência, que poderia ser disparado pelo endereço autorizado. É feito pela adição de dois novos modificadores: whenNotPaused
, whenPaused
e pela modificação da função _beforTokenTransfer
do ERC20. Esta modificação pausa o trabalho da _transfer
, _mint
e _burn
.
Esta extensão é útil no cenário quando gostaríamos de interromper todas as transferências de tokens durante o processo de avaliação ou quando é encontrado um bug crítico no código. É apenas um grande botão vermelho de emergência, que faz uma pausa em tudo.
ERC20Snapshot
Dar acesso ao armazenamento eficiente dos saldos dos tokens passados e do fornecimento total. Ao utilizar esta extensão, somos capazes de criar um mecanismo seguro com base na quantidade de tokens ou criar um sistema de forking ERC20 eficiente.
Como funciona? Da mesma forma que o ERC20Pausable, a função _beforTokenTransfer
é alterada. Aqui sempre antes da transação, a função de chamada do contrato _updateAccountSnapshot
que salva nossa quantidade atual de tokens e também esta função é alterada para salvar o saldo atual do endereço para onde enviamos os tokens. Se nós cunharmos ou queimarmos tokens, a função para atualizar a quantidade total de suprimento é disparada. Todos os snapshots têm seu próprio número de identificação que podemos usar para encontrar o que estamos procurando.
ERC20Permit
Esta é provavelmente uma extensão muito interessante do padrão ERC20. A principal razão pela qual ela existe é permitir que os detentores de tokens transfiram seus próprios tokens ERC20 sem ter Ether. Isto poderia melhorar significativamente a experiência do usuário em usar os tokens.
Como evitar a obrigatoriedade do pagamento em Ether? A resposta é a assinatura da transação de aprovação on-chain. O que eu quero dizer com isso? Esta extensão acrescenta uma nova função permit
. Esta função permite aos usuários modificar o mapeamento de permissões, usando uma mensagem assinada por eles, em vez de usar msg.sender
como sempre fazemos. Como resultado, somos capazes de fazer isso off-chain e evitar a obrigatoriedade de pagar em Ether. Parece ótimo, não é mesmo?
ERC20Votes e ERC20VotesComp
Aqui temos duas extensões similares. Ambas permitem o uso do ERC20 como um token para votar. Eles rastreiam os votos e permitem a delegação de votos. O mecanismo de votação proposto por estas extensões é simples, o poder de voto de cada conta está ligado à posse deste token. Além disso, para evitar a dupla votação, ambos usam algo semelhante à extensão de snapshot descrita anteriormente. As extensões rastreiam os saldos históricos de cada conta, de modo que há a possibilidade de recuperar o poder de voto do passado. O pequeno inconveniente dessas extensões é a necessidade de fazer no mínimo uma transferência para registrar o saldo da conta no snapshot e para obter o poder de voto.
Então, onde está a diferença entre essas extensões? A diferença está no limite do fornecimento de tokens. A ERC20Votes suporta fornecimento maior que 2⁹⁶, que é o limite superior da ERC20VotesComp e, ainda bem, é mais flexível. Por que existe um limite superior na ERC20VotesComp? Esta extensão se encaixa na interface do token COMP utilizado pela GovernorAlpha e pela GovernorBravo.
ERC20Wrappper
É uma simples extensão que permite mudar um token ERC20 para outro (tokens empacotados). Podemos definir quantos tokens do primeiro tipo são iguais a um token do segundo tipo. Normalmente, este número é igual a 1. Nesta extensão, o remetente envia uma quantidade de tokens que é depositada no contrato inteligente, e um número correspondente dos tokens empacotados é enviado para o remetente. Quando ele deseja recuperar seus tokens, ele simplesmente tem que depositar tokens empacotados para este contrato. Isto é útil em conjunto com outros módulos, como a votação.
ERC4626
É um padrão tokenizado de vault (cofre), mas o que é vault? Vault é o contrato inteligente onde você pode depositar seu token, e então o vault faz algo com este token para fornecer as recompensas do token. É um contrato multiassinaturas que pode administrar e armazenar criptomoeda. Cada vault sempre tem o token que é gerado como retorno. Estes tokens gerados podem ser trocados por tokens depositados, portanto, pelos tokens que foram trancados no vault. Os vaults são mais seguros que as carteiras e, portanto, muitos projetos de DeFi os utilizam para depositar seus fundos. Esta norma é compatível com o ERC20, por isso a escrevi aqui como uma extensão.
O ERC4626 é importante, especialmente para a DeFi, porque antes deste padrão eram usadas muitas abordagens diferentes para armazenar e gerenciar ativos. E por estas razões, era muito problemático conectar diferentes projetos entre si. Era demorado e com um grande risco de falha de segurança. Além disso, a solução que se ajustava a um par de projetos DeFi não precisava se ajustar ao outro par. Graças ao ERC4626 o trabalho é mais rápido e mais seguro.
ERC20 utils
Na biblioteca do OpenZeppelin, dentro do catálogo dedicado ao ERC20 também há um catálogo chamado ER20 utils. Quando o abrirmos, encontraremos dois contratos que não são as extensões do ERC20, mas que dão uma característica adicional.
SafeERC20
Nem todos os desenvolvedores usam o token padrão ERC20, mas eles usam uma versão personalizada da implementação da interface ERC20 que às vezes não devolve o valor de retorno booleano. Quando queremos criar um contrato inteligente que funcione com este tipo de token, pode haver alguns problemas, bugs, etc. Para evitar isso, podemos usar a função SafeERC20 (é uma biblioteca) para gerenciar todos os tokens. Além disso, a SafeERC20 fornece auxiliares para aumentar e diminuir a permissão, a fim de reduzir uma possível invasão com o vanilla approve
.
TokenTimelock
Acho que é um dos contratos mais simples aqui descritos. É um contrato para o detentor de token que não permitirá que o beneficiário obtenha dinheiro antes do prazo de liberação estabelecido. Quando o tempo definido passar, o beneficiário poderá usar a função para lhe enviar todos os tokens. E é tudo, este contrato não faz mais.
Resumo
Como vimos, o ERC20 tem muitas extensões diferentes, que dão a possibilidade de adequar este padrão de token aos nossos propósitos. Votação, flashLoan, vault, etc.
Espero que você ache este post útil. Se você tem alguma idéia de como eu possa melhorar minhas mensagens, me informe. Eu estou sempre pronto para aprender. Você pode se conectar comigo pelo LinkedIn e Telegram.
Se você quiser falar comigo sobre este ou qualquer outro tópico que escrevi, sinta-se à vontade. Estou aberto à conversa.
Feliz aprendizagem!
Esse artigo foi escrito por Eszymi e traduzido por Fátima Lima. Seu original pode ser lido aqui.
Latest comments (0)