Autor: Sun
Tradução: Helen
Comunidade Discord
Este artigo é publicado na XREX e na WTF Academy
Os dados on-chain podem incluir transferências simples únicas, interações com um contrato DeFi ou vários contratos DeFi, arbitragem de empréstimo flash, propostas de governança, transações entre cadeias e muito mais. Nesta seção, vamos começar com um começo simples. Vou apresentar no BlockChain Explorer - Etherscan o que nos interessa e, em seguida, usar Phalcon para comparar as diferenças entre essas chamadas de função de transação: transferência de ativos, troca na UniSWAP, aumento de liquidez no Curve 3pool, propostas do Compound, Flashswap do Uniswap.
- O primeiro passo é instalar o Foundry no ambiente. Siga as instruções de instalação.
- Forge é uma ferramenta de teste importante na plataforma Foundry. Se for a primeira vez que você usa o Foundry, você pode consultar o livro do Foundry, Foundry @EthCC, WTF Solidity - Foundry.
- Cada cadeia tem seu próprio explorador de blockchain. Nesta seção, usaremos a rede blockchain Ethereum como estudo de caso.
- As informações típicas às quais geralmente me refiro incluem:
- Ação da transação: como a transferência de tokens ERC-20 complexos pode ser difícil de discernir, a Ação da Transação pode fornecer o comportamento chave da transferência. No entanto, nem todas as transações incluem essas informações.
- De: msg.sender, o endereço da carteira de origem que executa esta transação.
- Interagiu com (Para): Com qual contrato interagir
- Transferência de Token ERC-20: Processo de Transferência de Token
- Dados de Entrada: Os dados brutos de entrada da transação. Você pode ver qual função foi chamada e qual valor foi trazido.
- Se você não sabe quais ferramentas são comumente usadas, você pode ver as ferramentas de análise de transações na primeira lição.
O seguinte pode ser derivado do exemplo do Etherscan acima:
- De: Endereço da carteira EOA de origem desta transação
- Interagiu com (Para): Contrato Tether USD (USDT)
- Tokens ERC-20 Transferidos: Transferência de 651,13 USDT da carteira do usuário A para o usuário B
- Dados de Entrada: Chamada da função de transferência
De acordo com o Phalcon "Fluxo de Invocação":
- Há apenas uma ''Chamada USDT.transfer''. No entanto, você deve prestar atenção ao "Valor". Como a Máquina Virtual Ethereum (EVM) não suporta operações de ponto flutuante, é usada uma representação decimal.
- Cada token tem sua própria precisão, o número de casas decimais usadas para representar o valor do token. Nos tokens ERC-20, as casas decimais geralmente têm 18 dígitos, enquanto o USDT tem 6 dígitos. Se a precisão do token não for tratada corretamente, problemas surgirão.
- Você pode consultar isso no contrato de token do Etherscan token contract.
O seguinte pode ser derivado do exemplo do Etherscan acima:
- Ação da Transação: Um usuário realiza uma troca na Uniswap V2, trocando 12.716 USDT por 7.118 UNDEAD.
- De: Endereço da carteira de origem desta transação
- Interagiu com (Para): Um contrato de Bot MEV chamado contrato Uniswap para troca.
- Tokens ERC-20 Transferidos: Processo de troca de tokens
De acordo com o Phalcon "Fluxo de Invocação":
- O Bot MEV chama o contrato de par de negociação Uniswap V2 USDT/UNDEAD para chamar a função de troca para realizar a troca de tokens.
Usamos o Foundry para simular a operação de trocar 1BTC por DAI na Uniswap.
- Referência de código de exemplo, execute o seguinte comando:
forge test --contracts ./src/test/Uniswapv2.sol -vvvv
- De acordo com a figura - trocamos 1 BTC por 16.788 DAI chamando a função swapExactTokensForTokens do Uniswap_v2_router.
O seguinte pode ser derivado do exemplo do Etherscan acima:
- O objetivo desta transação é adicionar liquidez às três pools do Curve.
- De: Endereço da carteira de origem desta transação
- Interagiu com (Para): Curve.fi: Pool DAI/USDC/USDT
- Tokens ERC-20 Transferidos: O usuário A transferiu 3.524.968,44 USDT para as três pools do Curve, e então o Curve emitiu 3.447.897,54 tokens 3Crv para o usuário A.
De acordo com o Phalcon "Fluxo de Invocação":
- Com base na sequência de chamadas, foram executadas três etapas:
- add_liquidity 2. transferFrom 3. mint.
O seguinte pode ser derivado do exemplo do Etherscan acima:
- O usuário enviou uma proposta no Compound. O conteúdo da proposta pode ser visualizado clicando em "Decode Input Data" no Etherscan.
De acordo com o Phalcon "Fluxo de Invocação":
- Enviar uma proposta através da função propose resulta na proposta número 44.
Aqui usamos o Foundry para simular operações - como usar empréstimos flash na Uniswap. Introdução oficial ao Flash swap
- Código de exemplo de referência, execute o seguinte comando:
forge test --contracts ./src/test/Uniswapv2_flashswap.sol -vv
- Neste exemplo, um empréstimo flash de 100 WETH é tomado emprestado através da troca Uniswap UNI/WETH. Observe que uma taxa de 0,3% deve ser paga nas devoluções.
- De acordo com a figura - fluxo de chamadas, o flashswap chama swap e depois paga chamando de volta uniswapV2Call.
-
Mais Introdução ao Flashloan e Flashswap:
-
A. Pontos comuns: Ambos podem emprestar Tokens sem garantir ativos, e eles precisam ser devolvidos no mesmo bloco, caso contrário a transação falha.
-
B. A diferença: Se o token0 for emprestado através do flashloan token0/token1, o token0 deve ser devolvido. O flashswap empresta o token0, e você pode devolver o token0 ou o token1, o que é mais flexível.
-
Para mais operações básicas de DeFi, consulte DeFiLab.
Os cheatcodes do Foundry são essenciais para realizar análises de cadeia. Aqui, vou apresentar algumas funções comumente usadas. Mais informações podem ser encontradas no Cheatcodes Reference.
- createSelectFork: Especifica uma rede e uma altura de bloco para copiar para testes. Deve incluir o RPC para cada cadeia em foundry.toml.
- deal: Define o saldo de uma carteira de teste.
- Definir saldo de ETH:
deal(address(this), 3 ether);
- Definir saldo de Token:
deal(address(USDC), address(this), 1 * 1e18);
- Definir saldo de ETH:
- prank: Simula a identidade de uma carteira especificada. É eficaz apenas para a próxima chamada e definirá o msg.sender para o endereço da carteira especificada. Por exemplo, simular uma transferência de uma carteira de baleia.
- startPrank: Simula a identidade de uma carteira especificada. Definirá o msg.sender para o endereço da carteira especificada para todas as chamadas até que
stopPrank()
seja executado. - label: Rotula um endereço de carteira para melhorar a legibilidade ao usar o debug do Foundry.
- roll: Ajusta a altura do bloco.
- warp: Ajusta o timestamp do bloco.
Obrigado por acompanhar! Hora de avançar para a próxima lição.