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) oudeposit()
(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:
-
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:
-
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:
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çõeslendOnAave
ewithdrawFromAave
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 mapeamentoshareHolders
, adicionando o resultado da funçãodeposit
, que é parte do contratoERC4626
. -
_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çãoredeem
, também parte do contratoERC4626
, e atualiza as participações do usuário no mapeamentoshareHolders
, 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.
- Ela aprova a transferência de
-
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.
-
Clone/faça o fork do ERC4626:
git clone https://github.com/BuildBearLabs/ERC4626.git
-
Instale as dependências
cd ERC4626 npm install
-
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
Vamos detalhar cada parte do script de implantação e explicar seu propósito:
- Implantando o Contrato
TokenVault
: - É utilizado o método
ethers.getContractFactory
para criar uma fábrica de contratos para o contratoTokenVault
. - O método
tokenVault.deploy
é chamado para implantar uma nova instância do contratoTokenVault
, 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”).
- Endereço do token ERC20 (por exemplo, WETH) a ser gerenciado pelo
- Conversão de Participações para Ativo:
- A taxa de conversão de participações para o ativo gerenciado pelo contrato
TokenVault
é calculada e registrada. - Cunhando e Aprovando Tokens WETH:
- O script cunha 1000 tokens WETH chamando o método
deposit
no contrato WETH, especificando o valor como 1000 ETH (em wei). - O contrato
TokenVault
é aprovado para gastar 1000 tokens WETH em nome do implementador, chamando o métodoapprove
no contrato WETH. - Depositando Tokens WETH no
TokenVault
: - É feito o depósito de 1000 tokens WETH no contrato
TokenVault
chamando a função_deposit
no contratoTokenVault
. - Emprestando Tokens WETH na Aave:
- A função
lendOnAave
é chamada no contratoTokenVault
para emprestar 1000 tokens WETH para um pool Aave, especificando o endereço do pool Aave. - Avançando o Tempo:
- 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. - Retirando Tokens WETH da Aave:
- A função
withdrawFromAave
é chamada no contratoTokenVault
para retirar tokens WETH do pool Aave, especificando o endereço do pool Aave. - Recalculando a Taxa de Conversão:
- A taxa de conversão de participações para o ativo após interagir com a Aave é recalculada e registrada.
npx hardhat run scripts/deploy-TokenVault.js
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)