WEB3DEV

Cover image for Guia Detalhado sobre Cofres Tokenizados ERC-4626
Paulo Gio
Paulo Gio

Posted on

Guia Detalhado sobre Cofres Tokenizados ERC-4626

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*wZHr-40pdLz7ZvdJRIsfFg.png

Este artigo foi originalmente publicado nos Tutoriais da BuildBear.

ERC-4626 é um padrão de cofre tokenizado que utiliza tokens ERC20 para representar participações de propriedade em outro ativo.

A motivação por trás da criação do ERC-4626

Atualmente, os Cofres Tokenizados carecem de padronização, resultando em uma ampla gama de abordagens de implementação. Essas implementações podem abranger áreas como mercados de empréstimos, agregadores e tokens com juros embutidos. A ausência de uma abordagem padronizada torna desafiador integrar esses Cofres Tokenizados no nível de agregador ou plugin.

Estabelecer um padrão para Cofres Tokenizados simplificaria o processo de integração para cofres que geram rendimentos.

Como os Cofres ERC-4626 Operam:

1. Depósito de Ativos:

  • Os usuários iniciam o processo depositando seus ativos em um cofre de contrato inteligente.
  • O cofre agrega todos os ativos tokenizados e, em troca, emite tokens ERC-20 para os usuários. Estes tokens ERC-20 representam a participação de propriedade do usuário nos tokens agrupados.

2. Estratégias de Geração de Rendimento:

  • Cada cofre é equipado com estratégias pré-definidas projetadas para maximizar os rendimentos dos tokens depositados.
  • Estas estratégias são configuradas para garantir que as recompensas das participações tokenizadas sejam otimizadas para os usuários.

3. Alocação de Tokens e Reservas:

  • Os cofres alocam tokens com base em condições programadas.
  • Uma certa porcentagem de tokens é retida nas reservas do cofre.
  • Quando um usuário inicia um saque, os tokens das reservas são distribuídos primeiro antes de acessar tokens das fontes alocadas.

4. Crescimento do Saldo de Ativos:

  • Nos casos em que o saldo do ativo tokenizado no cofre cresce a uma taxa mais rápida do que a produção de participações tokenizadas, os usuários receberão uma quantidade maior do ativo tokenizado no saque em comparação com o seu depósito inicial.

Projetos Construídos com ERC-4626:

  • Yearn Finance: Yearn Finance utiliza ERC-4626 para seus cofres, permitindo transferências contínuas de depósitos para outros cofres ERC-4626.
  • Balancer: Balancer emprega ERC-4626 em seus Pools Lineares, a base dos Pools Impulsionados. Isso facilita a negociação entre dois tokens a uma taxa de câmbio fixa usando matemática linear.
  • Frax Finance: sfrxETH representa um cofre compatível com ERC-4626. Para obter sfrxETH, os usuários primeiro aprovam o contrato sfrxETH como um gastador de frxETH, e então executam a função mint() (para cunhar uma quantidade específica de sfrxETH) ou deposit() (para depositar uma quantidade específica de frxETH).
  • Maple Finance: Maple incorpora ERC-4626 em seu contrato xMPL e RevenueDistributionToken. Esses componentes são utilizados para distribuir a receita do protocolo para usuários com tokens em stake e com direito a vesting.

As Funções de Execução

Depósitos de Ativos

Depósitos de ativos podem ser realizados usando duas funções:

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*vPNplWW6MoigGaHQ7KNlUw.png

  • deposit(): Esta função permite especificar a quantidade de ativos que você deseja contribuir, e calcula automaticamente o número correspondente de participações a serem alocadas para você.
  • mint(): Com esta função, você especifica o número desejado de participações que deseja obter, e ela calcula a quantidade de ativos ERC20 a serem transferidos da sua conta.

Resgate de Ativos

O resgate de ativos pode ser realizado utilizando duas funções:

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*SqoRA9iV1Vud081lfWRV7A.png

  • withdraw(): Com esta função, você pode indicar a quantidade de ativos que deseja retirar do contrato, e o contrato determinará o número de participações a serem queimadas.
  • redeem(): Usando "redeem", você especifica o número de participações que deseja queimar, e o contrato calcula a quantidade de ativos a serem devolvidos para você.

Exemplo de Implementação

E aqui está uma versão um pouco mais fácil de entender para fins educacionais:

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*-486ZpDNRLv8xtJI6Ux59A.png

Vamos detalhar:

O contrato importa três contratos diferentes:

  • ERC4626.sol: Este contrato do OpenZeppelin implementa o padrão ERC-4626.
  • Ownable.sol: Este contrato fornece controle básico de acesso, permitindo restringir as funções lendOnAave e withdrawFromAave ao proprietário do contrato.
  • IPool.sol: Esta interface auxilia na interação com o contrato de Pool da Aave para fornecer e retirar tokens dos Pools.

A maior parte do trabalho pesado é realizada pelo contrato ERC-4626 do OpenZeppelin.

  • _deposit(uint _assets) public: Esta função permite que os usuários depositem ativos e recebam tokens de participação do cofre em troca. Atualiza as participações do usuário no mapeamento shareHolders, adicionando o resultado da função deposit, que é parte do contrato ERC4626.
  • _withdraw(uint _shares, address _receiver) public: Esta função permite que os usuários retirem seus depósitos, incluindo quaisquer juros acumulados, na forma de um token de ativo. Chama a função redeem, também parte do contrato ERC4626, e atualiza as participações do usuário no mapeamento shareHolders, subtraindo as participações retiradas.
  • _decimalsOffset() internal pure override returns (uint8): Esta função interna é usada para determinar o número de casas decimais do ativo sendo manuseado pelo contrato. Nesta implementação, definimos 1 ativo como equivalente a 1000 participações.
  • lendOnAave(address aaveV3, uint256 asset_amount) public onlyOwner: Esta função permite que o proprietário do contrato forneça ativos ao protocolo de empréstimo Aave.
    • Ela aprova a transferência de asset_amount do token de ativo para o pool de empréstimos Aave.
    • Em seguida, chama a função supply no pool de empréstimos Aave para fornecer a quantidade especificada de ativos.
  • withdrawFromAave(address aaveV3) public onlyOwner:
    • Esta função concede ao proprietário do contrato a capacidade de retirar ativos do pool de empréstimos Aave.
    • Chama a função withdraw no pool de empréstimos Aave para retirar ativos. O segundo argumento, type(uint).max, indica que a quantidade máxima possível deve ser retirada, e os ativos retirados são enviados para o endereço do contrato.

Para ajudá-lo a começar rapidamente, configuramos tudo no ERC-4626 da BuildBear Labs.

  1. Clone/faça o fork do ERC4626:

    git clone https://github.com/BuildBearLabs/ERC4626.git
    
  2. Instale as dependências

    cd ERC4626
    npm install
    
  3. Crie sua própria testnet privada (fork da mainnet Ethereum). Estamos fazendo um fork da Ethereum porque usaremos o Protocolo Aave V3.

    npm run createTestnet
    

Uma vez que a Testnet estiver ativa, seus detalhes de RPC, Explorador e Torneira serão adicionados ao arquivo testnet.json.

Implantar o contrato inteligente TokenVault.sol

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*cwbYwaDVMS-pTrUP3xJ5Mg.png

Vamos detalhar cada parte do script de implantação e explicar seu propósito:

  1. Implantando o Contrato TokenVault:
  2. É utilizado o método ethers.getContractFactory para criar uma fábrica de contratos para o contrato TokenVault.
  3. O método tokenVault.deploy é chamado para implantar uma nova instância do contrato TokenVault, fornecendo os seguintes parâmetros do construtor:
    • Endereço do token ERC20 (por exemplo, WETH) a ser gerenciado pelo TokenVault.
    • Nome do contrato TokenVault (“BuildBear”).
    • Símbolo do contrato TokenVault (“BB”).
  4. Conversão de Participações para Ativo:
  5. A taxa de conversão de participações para o ativo gerenciado pelo contrato TokenVault é calculada e registrada.
  6. Cunhando e Aprovando Tokens WETH:
  7. O script cunha 1000 tokens WETH chamando o método deposit no contrato WETH, especificando o valor como 1000 ETH (em wei).
  8. O contrato TokenVault é aprovado para gastar 1000 tokens WETH em nome do implementador, chamando o método approve no contrato WETH.
  9. Depositando Tokens WETH no TokenVault:
  10. É feito o depósito de 1000 tokens WETH no contrato TokenVault chamando a função _deposit no contrato TokenVault.
  11. Emprestando Tokens WETH na Aave:
  12. A função lendOnAave é chamada no contrato TokenVault para emprestar 1000 tokens WETH para um pool Aave, especificando o endereço do pool Aave.
  13. Avançando o Tempo:
  14. O tempo é avançado chamando o método específico do Hardhat hardhat_mine para simular a passagem do tempo minerando um novo bloco. Isso é feito para acionar o acúmulo de juros no pool Aave.
  15. Retirando Tokens WETH da Aave:
  16. A função withdrawFromAave é chamada no contrato TokenVault para retirar tokens WETH do pool Aave, especificando o endereço do pool Aave.
  17. Recalculando a Taxa de Conversão:
  18. A taxa de conversão de participações para o ativo após interagir com a Aave é recalculada e registrada.

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*P-pVjTF9GE1K2apMCyoLXw.png

npx hardhat run scripts/deploy-TokenVault.js
Enter fullscreen mode Exit fullscreen mode

Em resumo, este script de implantação realiza o seguinte:

  • Implanta o contrato TokenVault.
  • Interage com o contrato implantado para depositar e retirar tokens WETH.
  • Observa as mudanças na taxa de conversão entre participações e o ativo após interagir com a Aave.

Inicialmente, 1000 participações são iguais a 1 ativo. No entanto, após depositar fundos na Aave, avançar o tempo e retirar, descobrimos que 1000 participações agora são equivalentes a aproximadamente 1,068 ativos. Adquirimos mais tokens de ativo através dessas interações.

Sobre a BuildBear

A BuildBear é uma plataforma adaptada para o desenvolvimento e teste de DApps. Desenvolvedores têm a liberdade de construir um sandbox de Testnet Privada personalizado em uma variedade de redes blockchain. A liberdade de cunhar tokens Nativos e ERC20 ilimitados, juntamente com tempos de transação rápidos na BuildBear (menos de 3 segundos!), aprimora o ciclo de vida do desenvolvimento de DApps de forma significativa. A plataforma vem equipada com ferramentas projetadas para testes e depuração em tempo real, garantindo que os desenvolvedores possam monitorar transações complexas de blockchain com facilidade incomparável.

Conecte-se conosco no Twitter | LinkedIn | Telegram | GitHub.

Artigo original publicado por BuildBear Team. Traduzido por Paulinho Giovannini.

Latest comments (0)