Como criar um token ERC20 em Solidity

Cripto

Como criar um token ERC20 em Solidity

Luiz Duarte
Escrito por Luiz Duarte em 22/11/2022
Junte-se a mais de 34 mil devs

Entre para minha lista e receba conteúdos exclusivos e com prioridade

Atire a primeira pedra quem nunca pensou em criar a sua própria criptomoeda. Seja por curiosidade ou de fato pelo interesse genuíno de criar uma cripto para usar na economia de seu jogo ou sistema, esta habilidade é extremamente importante para todos programadores que desejam trabalhar com blockchain e dapps web3. Isso porque compreender o processo de construção de moedas ajuda a entender todo o funcionamento do ecossistema de tokens da plataforma Ethereum e demais redes compatíveis.

Assim, neste tutorial vamos construir, em Solidity puro e usando a ferramenta Remix, um novo token usando o padrão ERC-20, usado por milhares de programadores para criar moedas compatíveis com Ethereum. Outras redes podem possuir padrões diferentes, mas no geral são muito similares como o padrão BEP-20 da BNB Smart Chain (a rede da Binance), então aprendendo a criar tokens para ERC-20 automaticamente te prepara 90-99% para criar tokens para outras redes.

Além disso, caso julgue que o Remix é uma ferramenta muito básica e gostaria de aprender este mesmo conteúdo com HardHat ou Truffle, não se preocupe. A ideia aqui é criar o token “puro”, apenas em Solidity. Depois podemos transportar facilmente este conhecimento para os toolkits citados, bastando copiar e colar o contrato e escrever os scripts de teste e deploy, o que podemos fazer juntos aqui no blog em outra oportunidade.

Mas sem mais enrolação, vamos ao conteúdo!

#1 – Criptomoeda ou Token?

A primeira coisa que você pode estar pensando é porque vamos criar um token e não uma criptomoeda? Caso já saiba a diferença, pule esta seção, mas caso contrário é importante entender a diferença.

Uma criptomoeda é uma moeda digital protegida por criptografia em uma blockchain e lastreada via algum algoritmo de livro-razão, a exemplo do que acontece com o Bitcoin. Via de regra toda blockchain possui uma única criptomoeda que é utilizada em todas suas transações e não tenho certeza se alguém já teve a ideia de querer mudar isso e/ou se deu certo, mas o fato é esse hoje. A blockchain do Bitcoin possui o próprio BTC, a blockchain do Ethereum possui o Ether (ETH), a blockchain da Binance possui o BNB e por aí vai.

Mas e aqueles milhares de outras moedas que a gente sabe que existem, cada uma possui uma blockchain separada?

Não. Na verdade aqueles milhares de outras moedas, não são moedas, mas sim tokens.

Tokens são moedas existentes em contratos inteligentes dentro de outra blockchain. Ou seja, são criptomoedas no sentido prático, de usar em pagamentos no dia a dia, mas não no literal já que tecnicamente elas até podem estar registradas criptograficamente em uma blockchain, mas sempre dentro de transações da moeda original da blockchain (BTC, ETH, etc) e portanto envolvendo pagamento de taxas nesta moeda original.

Assim, além da vantagem óbvia de podermos ter novas moedas sem a necessidade de termos novas blockchains, a flexibilidade dos tokens permite criar facilmente variações de moedas existentes, moedas atreladas a outras moedas (stablecoins), moedas com características completamente únicas (fornecimento total, casas decimais, etc) e por aí vai.

E tudo isso começou com o Ethereum, a blockchain que nasceu como plataforma, permitindo não apenas uma economia digital peer-to-peer como o BTC já fazia, mas toda uma miríade de novos serviços e sistemas rodando sobre a blockchain de maneira descentralizada e ainda segura. No entanto, para não virar uma bagunça existem os padrões da rede, que chamamos de padrões ERC.

Curso Node.js e MongoDB

#2 – Solidity e ERC-20

Este não é um tutorial para quem nunca escreveu uma linha de Solidity na vida. Se esse for o seu caso, comece por esse aqui.

A linguagem Solidity foi proposta junto da EVM, a Ethereum Virtual Machine, e é a linguagem de programação número 1 para Smart Contracts já que é usada na rede Ethereum e compatíveis. Ela permite a você escrever algoritmos que interagem com a blockchain em todos seus aspectos e com isso criar muitas aplicações diferentes e que nem tenham a ver com finanças descentralizadas (defi) se não for essa a sua intenção, embora estes sejam os cenários mais comuns.

No entanto, sempre que temos possibilidades infinitas é comum que tenhamos também problemas que tendem ao infinito. Se qualquer pessoa pode subir seus códigos para a blockchain, como fazer com que eles de fato consigam se comunicar com a mesma e entre si? Note que este é o mesmo desafio que foi enfrentado pela Internet no seu surgimento. Se cada servidor operasse em protocolos e padrões próprios, ou seja, sem padrão, a Internet nem mesmo seria possível. Aí que entram os ERCs.

O ERC é uma sigla para Ethereum Release for Comments e são artigos descrevendo padrões de desenvolvimento de contratos para a rede Ethereum. Assim, temos padrões para criação de tokens, criação de NFTs e por aí vai. Seguir ou não esses padrões não impede o funcionamento do seu algoritmo em Solidity per se, mas sim garantem a interoperabilidade entre os contratos, a facilidade de outros desenvolvedores conseguirem se comunicar com eles, etc.

Se você criar um novo token seguindo o padrão ERC-20, por exemplo, qualquer software de carteira que suporte este padrão (como a MetaMask) vai conseguir interagir com ele. Além disso, conseguirá fazer deploy do seu contrato em redes compatíveis, aumentando o alcance do seu projeto e fazendo-o parte de fato do ecossistema Ethereum que é gigantesco. E esses são apenas alguns dos benefícios de seguir os padrões ERC.

Dito isso, ao longo deste e dos próximos posts vamos explorar em detalhes o padrão ERC-20 ao longo da construção de um token com este padrão.

#3 – Resumo do Padrão

O padrão ERC-20 define seis interfaces de funções, dois eventos e três funções de informação que todos os tokens devem possuir. Pode ser que seu token tenha mais elementos, mas nunca menos ou ele não será compatível com todas as funcionalidades da blockchain e das aplicações que conversam com ela e seguem seus padrões.

Antes de sairmos escrevendo código em Solidity vamos dar uma rápida olhada nestes elementos a fim de criarmos um entendimento geral, o que ajudará e muito durante a construção de fato.

As seis interfaces de funções definidas no padrão são: totalSupply(), balanceOf(), transfer(), transferFrom(), approve(), e allowance(). Vou resumir cada uma abaixo e a clareza total de como cada uma funciona nós teremos apenas após a implementação.

totalSupply()
A função totalSupply é executada somente uma vez no momento do deploy. Ela decide a quantidade total de tokens em circulação daquele tipo na rede Ethereum.

balanceOf()
A função balanceOf() retorna o saldo de tokens de uma conta.

transfer()
A função transfer executa transferência de tokens de uma conta para outra e somente é feita com o consentimento do dono dos fundos.

transferFrom()
A função transferFrom permite que smart contracts executem transferências em nome de outros usuários da rede, com o seu consentimento prévio. Isso é usado por exemplo em corretoras onde você troca tokens com outros usuários mas sem você sequer saber o endereço da carteira delas, apenas autorizando a exchange em fazer a negociação em seu nome.

approve()
Esta função justamente serve para aprovar previamente que determinada conta (como o smart contract de uma corretora, por exemplo) possa transferir uma determinada quantidade de tokens da sua carteira usando a função transferFrom.

allowance()
Esta função permite saber quantos tokens uma conta possui autorização para transferir em nome de outra conta especificada.

A maioria das funções acima você deve ter notado que são bem autoexplicativas, sendo que a parte mais complexa é entender que existem dois tipos de transferências: A transferindo para B, que é o jeito mais comum, ou de C transferindo de A para B, que é o jeito delegado de transferência e que requer que A aprove C previamente a fazer esta movimentação.

Agora os eventos são apenas dois e eles servem para avisar outras aplicações que estejam esperando por algumas ações específicas, saibam que elas aconteceram: evento Transfer e evento Approval, respectivamente para notificar sobre transferências e aprovações realizadas em uma conta.

E por último, as três funções de informação que todo token ERC-20 deve possuir são: name(), symbol() e decimals,() ou seja, funções que retornem, respectivamente, o nome do token, sua sigla e o número de casas decimais que ele vai ter.

Com isso finalizamos o entendimento básico do padrão e em nosso próximo tutorial vamos começar a escrever o código Solidity que atende a este padrão e portanto criar nosso token.

Acesse a parte 2 aqui.

Olá, tudo bem?

O que você achou deste conteúdo? Conte nos comentários.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *