Meetup #04 - Foundry (Fabio Hildebrand)
ERC55 Meetups · 23 Dec 2023 · 2:56:40
A hands-on Foundry workshop, taught in Portuguese, starts a project with forge init and builds a small token contract to show how the toolkit works, pulling dependencies in as Git submodules. Tests are written in Solidity itself, using cheat codes such as prank and expectRevert, then turned into fuzz tests and an invariant test that total supply equals the sum of holder balances, using a mock token that tracks holders. The session continues with trace-based debugging, Solidity scripts that broadcast transactions from a keystore account, and fork tests, which the presenter recommends mainly for contracts that integrate many external systems or for rehearsing governance changes.
Speakers
Topics
From ERC55 Meetups, hosted by ERC55.
Transcript
bom é isso pessoal sentar aqui já no Mas é isso também é o bom primeiro Agradecer o convite aí é muito legal que vocês estão fazendo eh e é muito massa acho que por conta disso que você falou Rob eu o primeiro contato que eu tive com a comunidade do etum foi no meap né Na época ainda não tinha muito dinheiro na verdade não tinham eventos e tal né tinham esses eventos de cripto mais Gerais assim mas não tinha nada focado em etério nem nada eu lembro que foi lá no na sede do Mercado Livre o Henrique Leite organizando e o Esdras falando sobre da sei lá alguma algum assunto sabe foi o primeiro
contato mesmo onde eu conheci algumas pessoas onde eu tive eu vi que tinha mais gente fazendo isso né eu tava muito começando ainda tudo eh lendo do documentação bem iniciante e e a comunidade dá um gás né É muito legal você encontrar os pares Verê que tem gente fazendo a mesma jornada eh aprendendo as mesmas coisas e tudo e era bem legal isso tinha um foco técnico também eu acho que a comunidade técnica né Depois de um tempo o Jeff empurrou uma época né teve a Ju eu ajudava um outro aqui ali a gente acabou perdendo pros grandes eventos aí que tem né e os grandes eventos não tem foco técnico mesmo eles acabaram me deixando até desgostoso aí com o a organização e tudo
e eu parei de ir na verdade né então é muito legal ver um sabe um núcleo técnico surgindo assim desse jeito né da comunidade paraa comunidade assim eu acho que tem que ter e favorece e ajuda quem tá começando hoje então minha motivação na verdade é essa vir aqui conversar com os técnicos sabe sem toda aquela bulshit agem de evento e a gravata e os bizdev maluco lá tô fora né aqui só tem Dev cara um monte de amigo aqui né todo mundo Pô muito legal cara então Eh no que eu puder ajudar aí nesse nesses eventos estão aí assim né o quanto precisar eu acho que precisa né E aí eh bom a minha carreira foi meio
tortuosa aí eu acho que como todo mundo que tá na web 3 há um tempo teve essa experiência né eu trabalhava com segurança de informação eh em empresas antigas né nem o do eu acho que era as primeiras eram corporações mesmo assim né então trabalhei nazul Linhas Aéreas a Volkswagen eram corporações antigas assim e eu sempre fui técnico né e adorava a parte técnica de segurança e tudo mas aí você vai crescendo na carreira você começa a receber missões eh bom sua missão vira cuidar de gente né e não de cuidar da coisa técnica e aí eu sempre ficava infeliz eu tive uma fase mais pro final em que eu trocava muito de tr trabalho né o último foi na
Dafit esse sim o web2 já né e e sempre infeliz na verdade né e na Dafit era uma zona na época era bem Startup então segurança eles meio que cagava coisa e deixaram em pé Então hoje em dia deve tá muito melhor né Deve ter uma cara mais mais Profissa lá mas eh e ia me frustrando sabe você vai subindo de nível você tem que cuidar de gente você entra numa camada política da organização tudo e aí eu resolvi parar tudo conheci o eum assim meio que sem querer E aí esse foi virando meu hobby foi crescendo e eu decidi parar e pular para isso né Isso foi lá em 2017 eu pedi demissão em abril de 2017 é mais ou
menos deve ser a data desse bitap aí o primeiro que eu fui e aí desde então a jornada na web3 foi linda assim que é muito desafio técnico né é muito interessante para quem é técnico eh as coisas são mais diretas as empresas são pequenas é muito menos política e todo mundo trabalhando junto né para levantar as coisas não tem uma cara corp ainda né vamos ver até quando eventualmente vai ter aí no mas por enquanto ainda tem aquela cara né de de velho Oeste e tal de um terrenão para carpia ainda a gente tá descobrindo como fazer as coisas e quebrando várias coisas também né E aí depois que eu comecei na web3 de forma natural quase eu acabei trabalhando com segurança né
Por contto da as credenciais anteriores até minha ideia era C dev na verdade eu não queria trabalhar com segurança mas eu fui meio que levado para isso eu tive mais portas abertas na verdade porque nunca tinha sido um Dev profissional né Eh Era Zero experiência era o cara que tipo se demitiu e tava lá aprendendo então a web3 ainda tem um perfil que eu acho meio ruim né que é todo mundo só quer um cara Senior né Tem poucas empresas que tem um Júnior e tal isso eventualmente muda Tomara que mude antes de virar tudo corp né então não tenho uma formação dentro tudo e eu acabei achando a primeira oportunidade na Solid Fide onde eu fui auditor por por uns dois anos lá e aí lá Foi bem legal na verdade muito legal né Eu tava numa fase
de muita energia e muita disposição e querendo aprender muito então CIC clava de projeto em projeto cada duas três semanas eh na verdade isso que foi me cansando depois um pouco mas mas é no começo é muito legal né coisa nova jeitos novos de de fazer de testar e e aud tei muita coisa desde a época do ico lá né aqueles I muito simples eram depois eh alguns bons frutos dessa época do I na época a gente trabalhava para gnosis teve o wbtc o audit nem era uma auditoria tão interessante porque é um sistema centralizados mas é o maior acho que em valor eh o
do teve o Sand boox que eu acho que tá hoje né e outros aí noods né Muito feliz em em acompanhar o comecinho lá e aí depois de um tempo também comecei a querer migrar PR Dev né Acho que nunca tinha desistido disso E aí em 2020 entrei no time do r no comecinho lá e aí até vou começar a falar já da fala aqui porque isso faz parte da vida eu acho nesse né quando eu entrei no R até lá grande parte dos meus clientes aliás todos usavam truffle né e hard Hat começando assim então o truffle feito pela consens lá atrás era parece um hard Hat de hoje você usava JavaScript basicamente para subir seu ambiente para o npm para testar e eu
sempre sofria como auditor cara chega o repositório você fala vou rodar os testes né aí você dá o npm install aí falta coisa tudo né o deve ir lá ter alguma coisa na máquina dele que é diferente e aí sofria às vezes para rodar teste cara perdia tempo fazendo isso E aí veio o hard Hat que já parecia muito melhor né muito mais legal aí quando eu entrei na reflexer Eu descobri uma ferramenta obscura na época que era o dap Tools né o d Tools foi criado pela turma da Maker lá no começo quando não existiam ferramentas ainda né eles têm vários Superstars lá né naquela época o time brabo eh como não tinha nada se tinha o compilador de solidity mais nada eles criaram o dap Tools que era uma
ferramenta feita em raspel e mais diferente do do Hard Hat ou do truffle você não precisa você não precisava saber rask para usar né você usa o terminal e aí você escrevia os testes em solidity escrevia tudo eh usando o próprio solidity né quando eu entrei lá como fork da Maker a gente estava fazendo fork Na época eu já fui jogado para trabalhar com isso E aí eu falei pro Jeff já hoje isso uma semana depois eu era um DS Max já nunca mais queria ver assim ele é muito muito rápido de trabalhar e né Teve até um amigo lá no Twitter Perguntou mas por que né contra JS nada contra tá JS que não é o meu meu copo de chá aí mas né Tem eh tem gente
que gosta que trabalha e que entende né que o cara que já publica pacote no npm diariamente aquilo lá deve ser muito fácil para mim é complicado e tem uma vantagem que é absurda Na minha opinião isso assim eu acho que é indiscutível que é você não precisar mudar de contexto para testar seu contrato né então se eu não saio do código solidity e vou para JavaScript aí eu volto pro Solid aí fico Nesse bate volta né seria o equivalente eu escrever sei lá um sistema em node e resolver testar ele em Python né com certeza dá para fazer né mas vai dar mais trabalho o cara né você vai sei lá talvez como um exercício mental aí eu não sei mas né E aí eh isso meio que ficou comigo né o dap Tools
meio que virou a minha ferramenta eh depois de um tempo uns dois anos anos atrás sei lá um ano e meio o dap começou a ganhar evidência né por conta de ter un alguns Superstars tipo transmission elev lá começou a usar E aí começou a ter uma pequena comunidade de dap Tools Maxis aí né espalhados ele começou a sair antes era só os filhos da Maker né então era Maker fork da Maker que era o High e os times foram spinoff da Maker tipo a Maple sei lá e outros aí né Eh pouca gente usando aí teve essa Renascença aí que pessas começaram a descobrir mais de fora né Eu acho que a grande diferença porque ninguém sabia né dessa ferramenta duas coisas acho os caras desenvolveram para eles né usarem
então diferente do truffle que desenvolveu uma ferramenta uma empresa né que desenvolve a ferramenta e vai comunicar e vai mostrar pro mundo Eles não queriam saber né o produto era o da então a ferramenta ficou obscura lá tinha umas desvantagens também ela era meio mal documentada assim né Essa uma tinha uma coisa do Boca a Boca sabe então você cont contrava um amigo ele te passava um truque assim você aprendia você já ia aprendi isso aqui e tal e era meio que assim de vez em quando tinha um chat deles que era tipo bem um chat Mesmo que às vezes quando queria fazer alguma coisa que eu não sabia ia lá perguntava e tal e aí o dap tus foi indo assim né só que o dap Tools também tinha o lado contra né Ele é em rascel muito pouca gente mantendo ele né era uma
ferramenta muito robusta e tal mas que evoluía devagar mal documentado assim aí eh o último passo nessa história aí né foi que o o g const da paradigm Ele entrou naquela brisa que alguns devos entram de Recordar tudo Rust né o cara aprendeu Rust ele saiu ele fez uma versão do ethers primeiro né E aí que é uma ethers Rs E aí ele resolveu forcar o dap Tools Eu acho que o time lá do dap Tools né eles auditam hoje é um time de Superstars mesmo são muito competentes acho que eles viram aí uma oportunidade já deprec caro logo de cara e o found ele é completamente compatível Na verdade ele é feito em Rust Mas vocês
vão ver aqui que a gente não vai tocar em Rust nada né Eu por exemplo não sei Rust como todo Devid cripto tá na minha lista lá para aprender certo e aí esse é E aí a segunda motivação né quando Rob chamou falar pra comunidade um eu venho de umas férias meio longas aí não tô acompanhando muitaa tô por fora das novidades e a segunda tenho um amigo que tá na jornada de aprendizado E aí sempre que a gente conversa eu falo pô dá né uso o foundry e ele disse que os cursos tão disponíveis aí são muito em todos focam no hard Hat né Tem pouco curso para iniciante assim em português eu acho que não tem nenhum aí eu vi uma
oportunidade aí né então hoje eu vou tentar medir aqui a gente vai começar do comecinho mesmo basicão vai ser um passo meio rápido para tentar ajustar com o nível dessa turma que não é brincadeira né tô olhando cara você Seleção Brasileira aqui e então e só para dar nome aos né dar a crédito foi o Bob que me reclamou da falta de cursos de found então Bob se você tiver vendo aí cara sen não pela gravação depois aí não aí pessoal found na verdade é esse repositório aqui ó eles estão aqui né é um repositório já o foundry já como foi feito pela parad eles estão mais vendendo ele então um dos defeitos do dap Tools lá primeira coisa legal se você usava adap Tools
você abre o founder roda o teste em 99% dos casos ele vai rodar sem você precisar adaptar nada então se você abrir um repositório das antigas tal que usa dap Tools você já vai direto no founder aqui eles estão comparando a velocidade de teste ó e tem um repositório do meu coração aqui até que eles usaram de exemplo á Ele é muito mais rápido que o dap Tools tá na época a última vez que eu usei o o hard Hat o dap Tools era brutalmente mais rápido que o hard Hat também não sei como tá hoje né mas é isso E aí ele tem aqui toda uma documentação né Eh primeiro lugar que a gente vai é esse installation guide aqui para quem quiser instalar né é esse como é que eu escondo isso
aqui não vai ter jeito né Aí eh o founder Na verdade é um conjunto de ferramentas né eu vou abrir aqui agora ele tem um link para esse foundry book tá esse foundry book acho que isso é uma prática dos rians aí né Ele é meio que a documentação Geral do do foundry aí para instalar Ele é simples tá você roda esse esse scriptz inho aqui deles aqui ó p p p o meu já tava instalado então foi muito rápido aqui aí na verdade ele não instala o foundry tá ele instala um na sua linha de comando esse found up aqui né esse esse up você
vai rodar Sempre que você quiser atualizar então tipo toda vez que eu vou começar um projeto e tal antes eu rodo found up E aí ele vai lá op não foi aqui né Vamos lá pegar aqui [Música] o aí você roda o found que ele faz ele puxa tudo aquilo lá instala meio por aí já coloc os atalos então eu já com todos os novos aqui então ele foi rapidinho aqui né a velocidade vai depender das das das versões que você tem na na sua máquina né E aí a partir daqui a gente já tá pronto para usar né então eu vou
entrar só no meu documentos aqui ó e aí eu vou fazer um o criar um projeto aqui né primeira coisa aqui eh eu vou tentar correr ele mais ou menos como tá o livro aqui aqui tá eh primeiro é melhor dar uma entro falando rapidinho o foundry tem essas aqui ele tem essas quatro peças aqui né o Forge tá é igual o o dap do dap Tools ele serve para você compilar o contrato rodar teste rodar script basicamente Você tá trabalhando com o seu código aí eh esse lembra
bastante o hard Hat tudo você vai dá lá um Forge build ou Forge que é a mesma coisa ele vai rodar né Forge test ele vai rodar seus testes e tal e basicamente é o que a gente mais vai usar no começo aqui quando a gente tiver trabalhando com contrato né o cast é o antigo setf do dap Tools eh ele é uma ferramenta de linha de comando para você interagir por RPC com chain pode ser qualquer chain então você pode fazer um Call pro contrato você pode pegar um Storage slot ele faz conversão sabe de bytes para string você consegue formatar uma chamada sabe então você passa a assinatura ó a interface da função e os dados ele já vai retorna os bytes e tudo
então ele é uma e ele tem aqui a gente vai mexer um pouco com ele hoje para gerir umas Chaves aqui também dá para você criar uma chave com ele usar ela depois para fazer os seus deploys e tal ele deixa um k Store já armazenado na máquina aqui as outras duas a gente vai mexer menos hoje né o anvil é tipo um ganache deles é tipo um né dá para você rodar Estenda Lone se quiser você pode subir um anvil na sua máquina e testar alguma coisa contra ele aqui quando a gente testa assim dá um Forge teste ele sobe sozinho né eles aceita fork de outras redes e tudo eh tem vários cheat codes dá para você mexer na no estado da rede e manipular ele para para você
poder testar alguma coisa e tudo a gente não vai ele Lone mas ele vai est ali vai ser parte dos Testes E aí tem a mais nova que é o tasel aqui que é basicamente como se fosse um node console ou um Python console do de solidity tá Eu nunca usei para falar a verdade assim a gente pode testar hoje sei lá eh você vai digitando sabe ele é meio você coloca lá declara uma variável ele vai guardando esse estado ali e você consegue ir evoluindo com ele né aqui ó na linha de comando pra gente já pular pro vest code né e sair do terminal aqui eu vou criar um projeto e para criar um projeto é o Forge init E aí eu vou colocar aqui acho que eu já tenho Ah não
meetup aqui tá quando eu faço isso o que que ele faz vocês vão ver que ele já colou um monte de coisa já trouxe umas paradas e tá criado ali então eu entro aqui no meap você tiver dentro da pasta tá você dá só Forge init sem nada ele cria o projeto dentro da própria Se ela tiver vazia eu acho que ele exige isso eu já vou abrir o vest code aqui pra gente já pular para um ambiente mais legal aqui para ver a maximizar essa bagaça aí então aqui pessoal a gente tá seesse negócio do zoom fica aqui aqui vamos lá pá ó aqui ele criou o
projetinho tá vendo a gente tá dentro daquela pasta né então Eh primeira coisa que vocês vão notar aqui é que ele já botou um monte de coisa aqui né E esse é o projetinho ele deu basicamente o que Todo projeto tem que ter né é eu tem o ridm aqui que é um padrão deles lá que vem na verdade uma descrição do foundry você editaria isso pro seu repositório né aqui eu vou jogar uns links aí que a gente for usando Talvez para depois quando publicar eles vão junto esse foundry ptel aqui sei lá como pronuncia isso é é um config dele então tudo que você quer configurar pro projeto né você quer por exemplo cvar uma versão do compilador se você quer
optimizar não qu se você quer usar um fork específico uma url você coloca aqui tá ele tem esse link aqui onde ele lista todas as opções lá e aí você pode colocar que ele tem o muito básico né que é o padrão Eh esses arquivos aqui são padrão de Git né esse Git módulos aqui é porque ele tem os submódulos as dependências dele são submódulos do Git Tá então não tem npm nada você vai usar o próprio Git como uma gestão de pacotes eh ele é melhor que o Git Na verdade o Git quando você adiciona um submódulo é fácil para tirar um submódulo é doloroso né tem que um monte de passo e tal ele automatiza tudo aqui você tem então forg instal a gente a primeira coisa que vai
fazer na verdade é isso a hora que a gente começar a mexer e aí as dependências ficam todas nessa Lib Então esse Forge STD aqui é um repositório tá ele na verdade clonou aqui e por que que esse repositório já vem ele vem com as ferramentinhas do do do foundry né as principais são test né que importa várias dessas aqui também o teste ele tem aquelas coisas que a gente vai usar quando tá testando que são tipo as as assertivas né Eu quero isso aqui é igual aquilo tal tem uns console log tipo do Hard Hat você pode logar umas umas paradas se quiser para você ver no O que que tá aparecendo ali e eh e mais né então a gente vai fazer vai
usar o básico dele a ideia a gente vai testar aqui usar a gente não vai testar completamente Claro o contrato mas a gente vai fazer um tipo de cada teste para ver o que ele é capaz na verdade né E esse VM é legal também esse aqui é feito para interagir com o anvil né e ele tem uma um contratinho aqui onde você pode ele tem os os as trapaças aqui né os cheat codes então você pode por exemplo eh mudar o número do bloco enquanto você tá testando adiantar voltar o tempo e aí ele tem mais um monte de coisa tá ele tem inclusive umas coisas no os aqui dá para eu executar um script fora do foundry se quiser e sei lá se eu vou por exemplo a minha árvore
lá do minha árvore de merkle lá eu uso o script do uniswap lá para gerar E aí o meu é diferente eu posso né Chamar esse script gerar uma árvore fora que eu vou usar em produção e usar aqui dentro né Eh pode fazer um monte de coisa né ele tem inclusive eh ISO até inseguro né ele pode rodar script na máquina tem um comando a gente vai chegar nisso aí do próprio foundry onde você descobre eh se tem alguma chamada dessas inseguras Tá mas eu uso muito pouco isso que que usa de sheit code né você finge que é um endereço para transacionar né Então aquela história né tô testando com a Alice e o Bob eu vou falar assim pô agora essa próxima transação é a Alice a
outra é o Bob eh mudar o bloco né tem contrato que depende de time stamp você vai adiantar voltar então esse aqui é o que tem aí tem mais um monte de coisa aqui eu nunca olhei todos a gente no final vai bater nesse script aqui que é basicamente o a função isso já não tinha do d Tools é coisa do foundry aqui eh você escreve script solidity para fazer o Deploy para fazer uma série de transações aí não precisa ser um Deploy né pode ser qualquer conjunto de transações e aí você escolhe o que que ele manda pro Chin o que não e tal e aí isso tudo fica aqui as próximas dependências que a gente pegar vão ficar no Lib também E aí tem essas três pastinhas aqui onde ele já deixa até uns exemplinho script que é onde vão os seus
scripts né o exemplo aqui é o pior Zinho ele tá bem em branco aqui né Tá vendo aqui quando ele chama VM broadcast ele já tá eu já tô chamando um umit code aqui então qualquer transação que eu colocar depois aqui se tiver esse broadcast aqui ele vai tentar mandar pro que eu tô conectado né isso aqui a gente vai ver por último primeiro vamos focar no no básico né E aí aqui claro o src que é oato mesmo né é o código que você tá usando e é o teste né então o Source Claro ele é livre né aqui você não tem é o seu código de produção certo você
não vai importar nenhuma dessas bibliotecas nada você vai trabalhar aqui no que o que que você quer subir né o seu sistema F aqui e aqui a gente tem o testezinho dele né o testezinho bem básico aqui né isso aqui é um contador então dá para você incrementar ou definir um número é tudo público o teste ele tem um jeito meio certo de fazer né como é que o o dap Tools ele percebe que seu contrato é contrato de teste né tem essa convenção de nome aqui que eu acho que ele não usa tá que é o ponto t né então o Counter PT é o teste do Counter aqui e o Counter PS é um script que tem a ver com o Counter Mas você importa você erda o teste aqui então a hora que
você faz isso tá Todas aquelas ferramentas lá estão disponíveis aqui dentro e aí ele já vai executar o teste de uma forma sempre igual que é né esse o estado desse isso isso é o Smart Contract tá então ele tem estado é como se fosse ele vai subir a evm ele vai publicar Você vai testar a partir de um contrato mesmo diferente do Hard Hat onde você empurrava você chama como se fosse de fora do chain né uma transação para cada chamada aqui não aqui eu tenho um contrato que tá fazendo tudo né E esse contrato ele é deplo na rede ele tem um estado como outro contrato qualquer tá então por boa prática os contratos que você vai usar em todos os
testes e tal você declara aqui no estado né E aí ele tem essa função setup essa função setup é como se fosse o before lá do Hard então ele vai rodar esses testes aqui um de cada vez toda vez antes de rodar o teste ele roda o setup né então rodando o setup percebe que ele deplo o Counter novo e ele define como zero né então todo teste que for executado aqui vai comear com mesmo dado né com com eles limpos se eu tirar esse setup aqui funciona e deployar ele aqui funciona só que aí vai ser como se você não tivesse before it lá no no hard Hat né ele vai executar o primeiro teste o segundo
teste que ele executar ele vai pegar aquele estado do primeiro teste né então por boa prática você sempre zera né dá para fazer umas brincadeiras assim a gente vai chegar na parte de fuz tudo que que é é onde pode interessar você manter um estado anterior né você construindo um estado grande assim mas para um teste unitário normal não você faz isso aqui então é sempre setup com U maiúsculo aqui sempre apanha disso aí até hoje E aí aqui tão os seus testes ó aqui no terminal né eu tô na pasta dele o mais básico aqui se você mandar um Forge build ele vai compilar os contratos aqui né ele já detecta a
versão tudo baixo se lío se precisar ele compila inclusive Você pode ter contratos de diferentes versões do compilador aqui dentro ele vai ele compila numa boa Eh aí ó ele baixou pá rodou tá vendo sucesso nos testes aqui ou compilador rodou com sucesso né E aí ele criou essa pasta Cash aqui tá essa pasta Cash é onde ele Guarda tudo aí às vezes quando dá uns pau é bom já vou aprender aqui você manda um Forge Clean ele basicamente apaga o seu cash lá e zera tudo aí você começa com uma em branco aí né Para recompilar Tudo sei lá né Eh o Forge compile faz a mesma coisa que o build é é um Alias ali e aí para testar
simples também certo Forge test aí ele vai rodar esses casos de teste que a gente tá olhando aqui né Eh ele vai rodar os dois já e vai dizer Claro passou ou não passou né aqui para apresent quanto tempo vai a reunião aqui tem Eh vamos ver como você eu fez até à 9 talvez até as 10 Ah boa então vou vamos fazer um né é ó então a gente começa a mexer aqui como se fosse sei lá meu dia a dia fosse começar um projeto novo aqui tá vendo ele rodou os dois aqui ó é bem legal que vocês podem ver que esse aqui ele rodou 256 vezes esse segundo caso de teste de fãs aí né Esso
aqui já é muito melhor do que um teste unitári não que nem esse aqui de cima né aqui basicamente como que eu falo isso né Eh e eu não preciso ter o nome dele aqui tá fãs no nome o o foundry aqui o Forge só Dee ter um parâmetro aqui ele entende que é um caso de teste flexível vamos chamar assim né então você tem o caso de teste unitário aqui mesmo que aquele teste que o mecânico faz quando ele conserta o seu carro ele sai na rua ele acelera freia liga a luz tudo tá beleza entrega o carro o fã aqui não né você começa a jogar uma série de situações para ele então aqui ele vai rodar 256 vezes e aí ele tem um solver aqui dentro que
randomização E aí eh isso aqui seria o equivalente ao mecânico pegar seu carro e sei lá ele pegar uma chuva Neve levar pro deserto sabe fazer um teste mais completo ali eh e aí tem um teste de invariante que não tem aqui no exemplo que mas que a gente vai fazer depois que é um teste diferente também e todos são complementares na verdade né você vai tendo Na verdade acho que um bom conjunto de teste hoje em dia deveria ter os três aí eh Então vamos lá sim eh como boa prática você acha que todo teste unitário poderia ser um test Plus pode esse aqui cara esse exemplo é um bom
aqui né Eh esse incremente aqui a gente podia sabe receber um parâmetro e por exemplo incrementar n vezes e aí testar E aí você transforma esse teste aqui que é um teste unitário né que testa um caso num teste que vai testar está n casos e ele randomização mas ele vai de uma forma de certa forma aleatória ele tem uma certa inteligência também então se você por exemplo coloca um parâmetro endereço aqui ele testa com os endereços dos contratos que você deploiement também então cara quanto
mais você fizer isso eu entendo que é melhor sabe é e é tão simples de fazer né E aí esse 26 vezes aqui cara é o padrão tá dá para você ir lá no settings e botar que você quer que Rode 10.000 e aí ele vai rodar 10.000 de cada teste aí 10.000 situações diferentes quando o caso ficar mais complexo que é alguns a gente vai chegar nisso aí aí você tem que até ver porque ele começa a quebrar né F deixa íntimo dos erros do contrato na verd verdade porque aí ele vai começar a dar overflow ele vai começar a querer mintar um monte de moeda que não dá aí pum quebrou e aí eh o founder tem formas de você colocar até Limites Tá para esses parâmetros aqui então tem um sheit code onde eu
coloco um Bound para ele aqui e falo assim ó não esse parâmetro aqui eu quero que seja até 100 né então ele vai testar de 0 a 100 o x aqui 0 a 1000 ou zero até sei lá não quero que dê muito overflow nos meus testes e tal eh e eh para ele testar vários casos né que não são exceção eu posso dar uma limitada nele e aí Bom vamos lá né para começar aqui então eu vou fazer vou comentar tudo isso aqui opa não op porque eu vou mexer no código lá ele vai começar a quebrar isso que ele tá importando lá aqui né esse é o exemplinho dele muito simples a gente
faz um outro aqui né acho que a primeira coisa que é legal que a gente olhar é herança herança não é é buscar uma Líbia aí né como é que fala é uma dependência aqui aí pessoal como tipo esse acho que eu lembro de cabeça aqui eu sou muito ruim de memória vou ficar abrindo recomendo tá quando tá acordando eu deixo o foundry book aberto do lado já que a documentação é boa então ele além de explicar tem muitos exemplos e tudo e você vai gasta menos tempo Ah outra coisa que é boa nele é isso aqui né ele tem uns ele é muito forte comando aqui então aqui por exemplo ele listou tudo que ele faz tá vendo ó tem o build aqui ó com que a gente já fez né teste tá vendo ó O Clean que eu fiz aqui então se
você quer ver o que tem né ou eu coloco aqui tipo Forge build menos H aí ele me dá a letra aqui de tudo que dá para eu colocar né tem eu posso escolher o tanto de guess verssão dvm e fazer um teste de fork tá tudo aqui e a maioria dessas coisas tá no foundry tudo é assim tem eu posso colocar como parâmetro aqui na linha de comando eu posso colocar configuração no foundry P tel aqui e eu posso colocar numa variável de ambiente também hoje eu apanhei um pouco em casa tava fazendo lá no final já da da sessão eu tinha umas variáveis de ambiente antiga sabe setada que ficava travando eh ele me dava aqui como se eu tivesse
definido uma opção que eu não tinha depois eu cheguei lá mas na prática é isso aqui n aqui ele já fala também e eh tá vendo ó posso colocar evm version otimizar fazer toda essa essas eh um monte de opção E aí qualquer uma delas né você coloca o menos H aí ele vai dar o help né aqui para instalar uma uma uma dependência você faz o Forge instal E aí é sempre o github né eu vou instalar aqui o solmate Mas você vem é transmissions Eleven eu acho que é isso somente aí aqui é sempre o nome né do do fulano da organização e eh o nome do
repositório aí ele deu um errinho aqui já que que é esse erro aqui galera eh quando ele faz isso ele comita tá a mudança só que eu mexi no código né então ou eu tenho que comitar o que eu já fiz vamos fazer isso né ou eu tenho que dar um no comit aqui a ele importa sem comitar é ponto não vamos no no comit né Eu não fiz nada relevante aqui vai não Men menos no Opa no comit aí ó ele vai clonar aqui tá uma vez clonado ele vira uma dependência aqui do tá isso aqui na verdade o Lib fica no Git ignor aqui todo mundo que
instala aqui puxar o seu Rep lá a hora que o cara compilar o foundry vai buscar esses repositórios lá no github eh se você quiser travar numa versão você pode tá tem opção aqui eh se o transmissions lá alguém comentou alguma coisa você dá um Forge update ele atualiza todos Forge update o repositório que você quer ele atualiza só aquele Forge remove eu acho que é V ver aqui Forge Forge remove ou Forge and install você Remove a remove ó então é todos tem um Alias menorzinho aqui também né o Forge RM seria para fazer aquilo lá então aqui tá instalada
né Sem npm mágica né Aí você aqui no seu contrato você já pode eh importar né então esse contrato aqui eu vou mudar eu vou importar lá alguma coisa pra gente fazer uns uns testes lá no o solmate para quem não conhece é tipo um Open Zap lin ele tem vários contratos para você reutilizar são contratos só que diferente do Open zelink que tem aquela herança maluca que você tem que configurar tudo esse aqui é tipo na mão na massa ele te dá os tijolinhos para você montar né E todos são muito foco em eficiência em gás e tal e são muito bons a verdade eu gosto muito é uma mão na roda aqui aí aqui
eh para importar tá o foundry eu podia importar aqui né dar um ponto ponto barra Lib barra né mas o founder ele dá uma ele tem uma ele entende que eu tô importando uma uma dependência Eu só preciso importar na verdade dizer qual que ela é né aqui se eu colocar Import solmate barra e aí ele já entende né Se isso for um repositório de foundry que no caso solmate é eh que eu tô importando da pasta src deles né lá na pasta src tem outras pastas a gente já Olha lá mas se for um repositório simples como esse eu
colocaria aqui solmate pcounter PSOL e ele já vai entender que é lá da né mas no caso do solmate ele tem aqui uma uma quebra né ele tem um monte de coisa hoje no meu ensaio lá eu fiz um token dá pra gente fazer vamos ver se tem mais alguma alguma ideia aí galera tem um acho que tokem é bom né token é bom que todo sabe como o foco não é É né acho que tá menos tempo T aí ó você vai aqui só colocar paz tokens erc20 P
sol aí aqui né Se eu der um Forge build aqui vocês vão ver que ele não vai me dar um um erro aqui né ele vai build tá vendo ele só reclama ou deu uma warning aí porque o contrato de teste tá tudo comentado lá mas ele já comentou aqui então eu posso pegar aqui o Counter is rc20 certo e aí tá importado já dependência aqui eh essas dependências tá apesar de parecer que ele tá muito muito como é que eu falo que ele precisa de um R que é de foundry não dá para usar importar hard Hat importar que
quiser ali tá ele funciona e claro para importar aqui eh Ele vai tentar achar a melhor versão do compilador aqui esse aqui tá pedindo para cima de 13 o outro lá não sei vamos dar uma olhada lá ele vai achar uma que funciona pros dois é provavelmente sei lá aqu Ele usou 817 né Por algum motivo eh aqui galera vamos fazer o seguinte agora Uhum nesse parte que você deu aí o f ele ele é inteligente para não deixar tamanho desse contrato muito grande e só trazer as coisas necessárias Ah sim e não na verdade isso acho que
Solid te faz até quando você importa as coisas ele só importa para dentro do contrato que você precisa né o foundry cara ele deixa você importar o que quiser por exemplo aqui eu importei o arquivo inteiro né Eh acontece Às vezes Sei lá eu tenho contrato aqui tem muito com galera da Maker né que a gente escreve as interfaces tipo eh sei lá join like né aqui aí eu importo um arquivo que tem um contrato lá abstrato join like também então eu posso aqui definir exatamente o que que eu quero importar né Eu sabe eu coloco Import rc20 from a verdade sei lá né fica mais organizado fazer assim mas o tamanho do
contrato mesmo pós compilação aí o Solid só pega o que precisa já ele não vai pegar o que é desnecessário aquela warning né aquela warning a gente vê bastante aqui cara porque o os contratos de teste que nunca vão PR prod né eles ficam grandes que você deplo um monte de coisa e tudo então ele fica dando aquela warning aqui eu nunca fui ver como eu faço para mutar ela sabe eu só olho quando ele dá warning eu vou lá e Olho Vejo se não tem nada que não é teste ali né sabe se for contrato de teste aí né abraço vai na segue a vida é então ST to Deep cara dá bastante também você vai é você fica uma coisa
boa de testar em solidity é que as dores também estão lá só que as dores estão lá cara e você consegue manipular evm de certa forma né alguns limites ele já remove para você no começo tinha uns limites ridículos do tipo meu acabava o Gas no meio do seu test saca hoje em dia não ele já separou ele sabe tipo o seu teste ele não tem que limitar o Gas ele tem meio que carta branca lá para queimar Gas a hora que você faz a chamada pro contrato ele faz um tracking tudo a gente vai mostrar ele tem uns relatorio zinhos tudo né mas eh essas dores por exemplo stc Deep acontece Às vezes também aí você vai ficando faixa preta ind se desviar desses golpes aí que ele que que a vida traz aí aqui pessoal vou dar um nome aí
pro token Não o meu hoje de manhã eu mandei kyber Director vou dar aqui fazer o memin aqui ó aí o o aqui a gente apaga toda essa parada aqui né E aí cara aqui a gente tá com a tela em branco né o solmate tá pessoal ele tem como é que ele funciona né ele é muito legal ó esse rc20 aqui só para dar uma passada ó Que belezinha ele é totalmente otimizado cara ele não é feito para se legir tipo é meio é feito para ser usado cara é uma beleza ó tipo é um contrato cara completo Ó ele tem aí suas sei lá 200
linhas com tudo Burn Mint permit tudo otimizado Gas até o final aqui né Ó tem essas ó se a gente vier só na lógica de token mesmo ó é sem linha sabe então ele é fácil de trabalhar cara tudo aqui no contrato sem herança né aquele Pesadelo do Open Zin onde tem aquelas heranças caminhos malucos então eu recomendo só que ele não é tão automático né ele não é feito acho que pensando no usuário do Open Zap link é tipo um outro outro tipo de cara então aqui ele tem um Construtor que eu vou ter que fazer aqui né ó aí o meu Construtor não vai ter nada certo aí ele vai ter aqui ó rc20 pum aí bora botar o nome aqui ó
cber Director aí vai ser o símbolo é C E aí deci opa não 18 né aí aqui a gente já tá deplo esse contrato né Isso aqui acho que já vai funcionar ele tem [Música] eh opa não aqui eu abro fecho sem nada ali mesmo é só tô chamando o Construtor desse contrato tá a gente vai acabar importando o outro eu acho que isso aqui ia ficar inútil né ele também tem pessoal isso é uma característica ele deixa umas funções internas aqui de m Burn sem visibilidade pública né então se eu deplo esse contrato assim na
prática ninguém nunca conseguir entar nada né ele vai ficar zero para sempre ele espera na verdade que você olha isso aqui e você implemente a sua então para implementar isso aqui vamos compilar isso aqui só ver se eu não tô for né Eh a gente implementa aqui o Mint com only owner sei lá lá para ele poder paraa gente poder mintar né então vamos lá function Mint aí vou copiar né oô meu comand do lado esquerdo quebrou nesse computador Tô apanhando aqui me funciona quando quer ó aqui fal
M vai ser Public aí aqui a gente chama Mint [Música] eh pronto daria para implementar o Burn também aqui qualquer um pode chamar isso aqui eh então só para terminar aqui a parte de Dev né o objetivo não é o solidity né então a gente vai no ele tem um contrato de owner aqui também ó que é tipo o classicão cons como a tecla faz falta na vida do peão né Vamos
lá reducar meu corpo aqui no H Oi aqui tem uma vírgula né aí aqui a gente vai importar o unet do aqui é a certo aí para facilitar a nossa vida aqui a gente coloca aqui esse aqui também vai ter um Construtor eu acho ó aí a gente vem aqui coloca eh msg ah então é vai ser aquele clássico né
ele vai passar pro cara e aí eu importando isso aqui daqui né eu posso colocar um honer aqui no Public aqui aí tá pronto a gente vai começar a testar agora esse esse código né E aí aqui vamos só buildar ele ver se eu não esqueci nada aí pá sim né
Oi Então esse é o nosso mem memecoin tá eh Aí galera vamos começar a testar então ele né para testar a gente abre aquele fechar aqui a Lib só mudar aqui o nome né fazer as melhores práticas enquanto a gente tá no Fiber Director e esse aqui vai ser o Ferd Director pt. tá então aqui eu tinha comentado tudo né a gente vai aproveitar muito
pouco disso aqui vamos né apagar essas paradas aqui a gente começa do zero aqui testar aqui a gente vai tá o kyber director certo kber podia ter instalado o github CoPilot aqui né vai na raça meso aqui né É já tô Acostumado mal acostumado com a rodinha aí aqui ó importei ele lá né vou deployar ele aqui certo kyber Director aí eu vou botar aqui o nome mais fácil como a gente fica pegando né kbd aqui eu vou
botar Director test E aí é isso aí aqui a gente vai ter kbd é igual a new lin Oi linha linha o tem mesmo Pera aí aí aqui bom setup muito simples tá pronto né a gente não tem nenhum caso de teste ainda e vamos começar aqui ao para fazer um primeiro teste pegar uma função que todo mundo conhece também né Fazer o vamos
começar assim então vamos olhar pera aí fazer o seguinte aqui no livro ó tá ele vai passando aqui na verdade ó ele tem aqui ente o que a gente passou aqui né ó layout dependência trabalhando com projeto Parará né E aqui ele já começa os testes né então a gente vai começar aqui pelos testes mais simples né faz a gente faz o unitário já transforma ele num teste de fãs na sequência para fazer mais ou menos o que você falou Rob sabe do sei lá como que transformaria um teste unitário em fã depois a gente pode fazer algum teste de fork aqui né É hoje eu não fiz no meu
Ensaio de manhã eu só na verdade dá pra gente fazer um teste de fork sem usar o estado né dá para eu testar isso aqui é contra bennet tá ele vai testar contra o estado da bennet Claro vai funcionar porque eu não tô usando nada externo né então eu vou deployar meu teste Deploy o contrato lá ele Executa os testes vai passar em qualquer rede isso né Eh mas a gente pode depois sei lá né criar um aí depois por último tá a gente passa pelo teste de invariante que é importante esses guest reports é um minuto aqui para ver a hora que a gente tiver testando debugger é um minuto também e aí a gente vai pros scripts né nos scripts a gente pode fazer um Deploy mais criativo aí a gente sei lá deplo ele e já cria um parn un Swap na hora
sabe para para mostrar um exemplo usando mesmo né o estado da da mainet Oi comentar atividades práticas por exemplo hh geralmente o que que o pessoal costuma fazer tem unitário tem o f tem o for estado gravado da Então cara o fork n eu acho que é uma eh Tem bastante gente usando né mas eu eu sou contra dizer que você tem que usar sabe eh quando que eu acho que ele é bom eh se o seu contrato integra com muita coisa diferente né sabe imagina que eu tô fazendo um contrato aqui que depende
sei lá é um uniswap v4 é um Hook então meu sistema ele funciona junto com o par lá sabe quando tem Swap meu sistema transaciona se eu testar sem fork Cara eu tenho que meio que fazer um Moque aqui do do uniswap né e eu já começo a ficar mais distante da de prod sabe eu tô fazendo mock da minha cabeça né eu posso pegar o código igual e talvez e deployar o caso do uniswap é fácil né se fizer um sistema que interage com a Maker da com o die vai ser um pesadelo aqui para eu subir aquele sistema inteiro no teste eu vou acabar fazendo S né contratinho mais simples e aí eu começo a me distanciar da produção né Então nesse caso cara se o meu sistema vai ser integrado com
outro que tá lá além de facilitar o setup o teste fica muito mais parecido com a vida que ele vai ter em produção né Então nesse caso eu acho que vale é o teste de fork sabe agora se eu tô testando um sistema que é completamente isolado depende só de um oráculo por exemplo e ele ainda não tá em prod eu nem Faria fork test dele né eu cara uso fork test muito para mudanças de sistema também né quando seu sistema tá no ar cara e você vai fazer ou sua mulig é sua governança vai executar o negócio lá e aí é um negócio meio complexo sabe você vai colocar sei lá no caso da Maker é um colateral novo cara os caras vão adicionar você vai lá sabe plugar meia dúzia de contrato novo lá e tudo né Eh definir os parâmetros em vários
contratos né você autoriza Esses contratos em outros aí você vai pegar os parâmetros sei lá governança discutiu e colocar lá qual que é o cat dele tudo então fica uma proposta complexa aí vale a pena você fazer um fork test da sua proposta sabe você finge lá você vem aqui aqui é bom que dá para trapassar sabe então você consegue mexer no estado e tudo então eu entro aqui eu me dou uma cacetada de mkr E aí eu executo eu vou lá e executo na governança né ou eu finjo que eu sou a governança eu já meto direto no pause lá que é o time lock E aí chuta pro gol de lá e vê o que acontece E aí eu posso escrever um teste para aquilo né que vai tudo que vai acontecer em prod Então eu acho que é no caso a caso assim cara mas se o que você
vai fazer Tem um impacto em prode eu acho que é importante sim né E outra salva vidas isso aqui também Car pensa no caso da yne lá né o cara vai fazer um um va lá que velho o bagulho pega na kyber aí ele vai no né k do nosso diretor aqui ele vai no na sei lá na Bound daí ele faz uma alavancagem lá e aí ele vai num outro lugar e supa isso e bota no outro lugar para farmar é tipo quatro cinco sistemas grandes velho para você fazer um ambiente de teste desse é doloroso né É aí compensa mais forcar né A única coisa a gente vai testar aqui com fork né recomendo nó em casa é tipo com o nó na sua casa local você testa
com a mesma velocidade que você Testa o teste sem ser forte você ganha uma agilidade brutal né usando inf fur ou alqu você tem a latência aí e eles começam a colocar um rate limit lá para tentar te fazer pagar né então o teste começa a ficar mais demorado aí depende muito do que você vai fazer também né Eh porque ele só vai buscar lá no estado da mainnet ou da testnet que você tiver usando o estado quando ele precisa então se eu for buscar sei lá só um preço de um oráculo por exemplo uma vez Ah não tem problema uso em fura né agora não se eu tô fazendo um monte de coisa sabe de repente tô interagindo sei lá você vai tocar em 50 contratos diferentes que tem as dependências deles também que vão sabe vão vão vão gerar mudanças de
estados em em vários eh contratos para todo lugar que você tocar o estado ele vai fazer uma chamada lá né diferente então isso começa a acumular Você tem uma latência os testes começam a ficar mais lentos né mas você recomenda ter tipo ar um mês para atrás ou você tem um Archive Cara eu tenho Archive lá que dá para ter mas não precisa o Archive é legal tem um repositório do foundry tem um cara loucão aí que ele ele codou todos os ataques ele fez um script para cada ataque famoso aí você com Archive node você consegue voltar lá um bloco antes do ataque e executar e você vê ele executando vê o Trace inteiro né você vê o passo a passo então se você não quiser
fazer essas coisas históricas né eu não quero voltar lá em 2018 lá e e quebrar sei lá né Fazer o quando foi parity msig deve ter sido por aí antes até né 2017 eh Se você não for olhar para trás você for só for testar prode agora aí o n full dá cara também e o nafu é bem mais fácil eh precisa de menos Storage né que a parte cara da brincadeira é o SSD né então os dois funcionam cara os dois funcionam e e isso aqui eu nunca fiz mas eu acho que para um time daria para fazer uma rede do time também sabe onde você deploie uma testnet sua sabe você coloca as pessoas para usarem e tal tem tem outras outras formas de de de fazer
também mas o É mas o Archive node hoje sei lá você vai sincar C node é é é é doloroso né vai umas semanas aí e acho que vale a pena rodar Archive Bom depende muito né se você não for usar o histórico também não tem sentido nenhum você usav um SSD 4 4 ta e é um SSD cara eu eu montei ele não é SSD tipo aaa já é meu segundo na verdade comprei um crus é o normal aí eu tô nesse segundo aí e e mas vai vai bem cara vai vai rodando erigon cara eu gosto do erigon porque eu não não valido em casa nada e o erigon já tem a camada de de consensos execução
Tudo junto não preciso rodar os dois lá e tal e aí o único a dor é que eles estão acho que um momento de desenvolver rápido sabe para Então as coisas estão quebrando assim quando dá um upgrade de diversão e tudo quando eu acho uma que funciona eu deixo de forma geral aí só quando tem um fork lá que aí eu preciso atualizar porque aí começa a falhar né quando tem um um hard fork aí eu vou lá e atualizo e aí quando eu acho uma versão estável eu meio que deixo esqueço sabe ficando uma máquina lá que só faz isso e no backup de casa e vale muito a pena assim porque cara quando onde em casa você começa a conseguir fazer fãs na mainnet saca você consegue fazer fã no contrato que tá em prod lá E aí maluco que trabalha com segurança né
o Antônio Achei que ia ver aí ele tá na Europa lá né o eu falei com o stepan da solidified essa semana e ele entendeu o cara tava olhando esse que o kyber director aqui mano ele achou aquele bug provavelmente fazendo alguma coisa parecida com isso né porque é um bug cabuloso que é impossível acho que cara não ou foi ou foi uma ia que já tá dominando o mundo não tipo mano o cara é tipo Eles TM uma liquidez concentrada né Igual uniswap V3 sabe e o cara achou um bug lá de arredondamento velho que ele conseguiu empurrar a liquidez para um lado e ele concentrava aí ele aí ele
fazia um Swap que tirava da liquidez e conseguia drenar o [ __ ] é um Ed Case velho filha da [ __ ] e um cara da sur F achou esse um bug parecido reportou Eles pagaram corrigiram e esse cara achou um outro e eles acham que talvez foi porque ele ele viu a correção mas é mas cara cabuloso cabuloso eu não consigo não acho que não pelo menos o Stefano me falou se foi ele sei lá se foi ele foi um milhão Zinho na conta aí mas o Antonio é fuzer né e o e o esse esse bug é muito difícil de achar cara porque é uma aritmética braba daquelas coisas Sabe que e o cara achou um Ed cas lá que tava muito lá no fundo esse que
você tava falando qu amigos cara números gigantescos Uhum você tem um problema ali com número não é cara não e nesse aí o uniop V3 a kyber Eu imagino que é igual não sei na verdade é pior cara porque os números da make quando você olha ele é o número ele tem 45 casa decimal Mas você tá olhando ele no uniswap o preço agora é sempre uma raiz quadrada de não sei o que lá velho então você olha não tem nada a ver você faz um Swap ele subiu às vezes ele sabe não tem relação não é nem linear a relação do que você tá olhando com que você tá fazendo então fodeu a vida né é por isso que é uma delícia de integrar
com ISO A galera gosta não todo todo mundo chora a primeira vez que vai mexer E aí o mas esse aí então tendo um nó em casa você tem essa agilidade né Mas agora vamos voltar aqui pro pro teste tá função para testar aqui agora a gente começa do zero né ela sempre tem teste tá me nome aqui então eu acho que ela tem que ter teste na verdade eu não sei pode testar aqui tem que ter E aí eu acho que é assim que ele identifica né no aqui no test Você pode ter função interna também como tipo uns helpers assim né Eu quero montar um estado específico né no sistema Você pode ter eu posso ter herança Esses contratos
aqui né muita gente faz tem aquele pobg tem um jeito todo dele de testar que ele faz um ele abre uma árvore assim onde ele tem um contrato que deplo é tudo e aí ele tem um contrato com os casos de teste ele tem vários contratos que cada um coloca o sistema num estado específico E aí ele roda todos os testes daquele é legal é legal é interessante é trabalhoso assim é um negócio que eu não sei se é muito a minha praia o cara chama aquela doença que é então tem isso né Outro dia eu vi no Twitter que ele tava 50 pílulas por dia eu falei vai morrer o menino não deve beber pelo menos né nemar maconha né mas cara é muita muito
comprimido velho mas ele né Eh é muito bom né rodando assim ele é a jornada dele é interessante assim quando começou a febre do dap Tools e tal e do foundry ele foi ele era muito fã do Hard Hat né era um Power user assim ele tudo que ele faz ele é um Power user na verdade é isso né e ele ele ele depois do ele se converteu meio que rápido dá para acompanhar na timeline sabe ele falou é não sei que lá tá todo mundo agora criticando e tal todo mundo usava e tudo Acho que alguém foi lá e pilhou mais um pouquinho ele e ele virou Max virou vai lá olhar ele converteu sabler v1 para foundry aí o Saber V2 já é todo foundry
cara já tá já virou um um Tita aí também não e é um cara que velho ele eu não né mas ele conhece todas as ferramentas Imagino que tem por aí e escolhe a melhor né aí o teste aqui vamos fazer o teste transfer né Ó então o teste unitario Zão aqui basicamente ó função pública ele vem aqui né Eh a gente pode comear sei lá vamos criar uns aqui eu eu sou tá ó como eu eu dei o eu dei o a permissão de owner pro message Sender tá a hora que ele roda o teste o owner vira Esse contrato aqui meu de teste tá Então esse cara é o message Sender né dessa transação que tá
deplo aqui para não ficar assim né que eu acho ruim misturar eu vou criar uns atores aqui então address admin é igual a address 0xa aí vai a gente vai ter o o aice x e o Bob que inspirou a Eita que inspirou a a fala aqui do esses endereços aqui que eu tô botando é qualquer coisa tá pessoal para
ficar não tem que seguir nada aí eh aqui eu vou pegar kbd P transfer ownership admin tá então aqui agora eh agora que terminou o setup Qual que é o estado da coisa né a gente tem esse token Deploy o admin é o admin aqui e o token tá vazio né Ninguém tem tokens e só o admin deveria pelo menos se a gente não errou aí conseguir mintar né aqui a hora que eu começo o teste a gente já usa um um tem um tá sempre que eu colocar VM ponto eu tô fazendo usando o sheet code
al então eu tô manipulando a evm aqui né Essa rede onde a gente tá testando isso funciona em fork também tá eu eu vou tô manipulando ela para eu fazer alguma coisa que eu quero fazer que faz sentido pro meu teste né Eh aqui você define tudo tá você põe tipo sei lá eu quero definir o base feed dentro desse teste aqui o base feed do founder vai ter um valor padrão Mas eu posso mudar ele durante o teste se meu contrato depende disso eh o número da rede tudo o VM prank a gente usa bastante por você tá na verdade disfarçando aqui ó então tipo se eu fizer um VM P prank admin a próxima chamada externa aqui dessa função quem vai fazer é o admin não é essa função
aqui esse contrato então ele disfarça na verdade né a gente faz o teste aqui já porque é legal ver uns testes falhando também né aí aqui ó eu vou colocar aqui ó kbd pon Mint Alice 9 certo então aqui a gente tá mentando tokens para Alice agora se eu rodar aqui o Ford test se eu não errei nada ele vai rodar ó a gente já faz um teste eh começar a aprender a debugar também né Isso aqui é uma ciência no e na verdade é muito fácil velho mas eh até enquanto teste tá passando é legal né Eh eh Toda vez que você tá
desenvolvendo é assim agora se se o teste falhar cara vamos fazer aqui né aí você vai ver que ele tipo vai te trazer aqui um negativo né ele vai ficar vermelho aqui tá Quando ele reverte no teste aqui tá eh ele falha tá isso é automático então se ele reverteu ele falha o VM aqui tem um cheet code Onde eu posso falar eu quero que reverta eu falo VM pexpect revert e eu coloco a revert reason ali né ter garantir que ele reverteu onde eu quero que ele reverta né não é qualquer reverte a gente já faz um desses também a gente faz um testar sei lá mintar sem autorização eh eu vou fazer aqui né test Mint vai ser então aqui por que que ele falhou tá
vendo ele já deu uma dica ali no revert né ó unauthorized tá vendo por quê Porque quem chamou foi esse cara aqui né aí mas como é que eu debugar esse caso é muito simples né tá muito fácil de debugar só olhando isso como eu faria na vida real você tá com aquele bug cabuloso lá né você não consegue entender o que aconteceu Às vezes o contrato reverteu dentro lá da Swap no fork test você quer olhar que que você faz aqui né é o clássico Esse é meme do foundry tá menos v v v v v v Tá quanto mais vz melhor não é quanto mais quanto quanto mais V mais coisa ele mostra na verdade então Eh um v é o
normal quando você não põe nada ele mostra aquilo ali nada né com dois vezes ele começa a mostrar o o quando reverte ele só mostra o Trace do caso de teste com três vezes aí ele começa a mostrar o Trace do setup também eu por default mando cinco Já que é tudo cara ele ele cinco ele vai fazer Trace de tudo que passou o que reverteu tudo velho traz tudo aí como que você faz se tiver muitos casos de teste né eu posso fazer aqui ó menos menos MT nesse caso eu só tenho um né teste 20 mas isso aqui é é reex tá então você consegue eh eu posso colocar por exemplo Mint ele vai só executar os casos de teste que tem Mint então eu prefiro pegar o vvvv
em modo metralhadora e aí fechar no teste que eu quero sabe ao invés de mas tudo funciona né Aí eu rodando aqui ó ele vai rodar o teste e aí ele vai mostrar o Trace e o Trace que é uma coisa linda né vamos ver aqui já ó ele falhou E aí ele mostra isso aqui ó isso galera é o que ajuda muito a debugar né então aqui ele vai mostrar chamada a chamada o que foi feito o que foi passado ele mostra quem foi que chamou tá vendo ó os endereços da turma os valores então aqui a gente vai ver que isso aqui é o setup tá vendo ó ele deplo o nosso mem coin aí ele transferiu tá vendo ó emitiu o evento aqui ó ah não esse evento ele
emitiu no no construtor é então ele tá dando ó o o o owner é o nosso teste aí eu chamei ó ciber Director transfer ownership pro nosso admin que é o 0xa E aí ele emitiu o evento aqui aí ele começou o caso de teste né no caso de teste primeira linha ele foi entar e reverteu não autorizado então aqui isso aqui vai virando uma árvore grandona né isso aqui para debugar é é assim 99% dos casos a gente vai chegar num caso muito mais profundo aí bite code o Jeff que curte néos éos vai lá no no na profundezas da evn mas aqui isso aqui
99% dos casos resolve você vai conseguir pensar ali onde ele reverteu né quando você tem um monte de assertivas a gente já vai criar a primeira aqui aí ele ele ele ele também ajuda né às vezes ele fala o teste falhou assertiva falhou E aí você entra lá você vai ver qual que falhou né você posso estar testando sabe será Total Supply ficou torto alguma coisa fora aqui então aqui ó como a gente eventou pra Alice a gente vai fazer o tem umas funções que já são importadas aqui porque a gente herdou do contrato de teste lá lembra vocês quiserem ver ela a função tá escrita lá é até fácil de mexer para quem mexe com
solit ti fazer um p request lá virar eu botar isso aí na minha lista para aparecer lá na foto e aí aqui você vem ó acert eq né esse aqui é o mais simples né E também 99% os casos da mesma forma que ele tem aert q você pode usar para tudo aqui string bites Ele só tem que ser sempre do mesmo tipo os dois eh tem assert larger smaller tem asserts de todo tipo aert true assert false eh tem uma tonelada lá né uma variedade grande aqui que que a gente vai olhar kbd pon balance off certo Alice né Ele é eh é 69 certo que é o número que emitiu
aí para completar esse teste né a gente quer fazer aquela história né Eu quero eh testar tudo que mudou no estado que mais que mudou nessa isso é melhor prática Rob né então assim a gente f a gente testa muito isso né Será que o saldo dela mudou mas o total Supply também o estado mudou dele basicamente são esses dois é o saldo dela e o total Supply então eu venho aqui e faço um hum testo aqui se o total Supply bate com esse número né E aí o teste tá completo né fazendo isso aqui galera é o teste unitário classicão né Aí eu tô testando 20 se foi certo né Mas como testaria seu evento
emiti tem isso cara ele tem isso deixa eu olhar lá eu não Dea eu falar verdade eu não testo muito isso mas dá ó a gente vem aqui no Forge STD você vem aqui em test aí [Música] no não pera aí que eu tô no não test não desculpa src tá E aí Teste aí aqui ó STD console cheats invariant error vamos ver se tá aqui mesmo nessa ó event não eu vou procurar lá no livro mas dá para testar cara eh eu que não não esse arquivo de texto eu tenho
umas aqui ó ah aqui é Pô eu não sei cara se vai ter agora eu vou deixar isso aí preleção de casa aí raz para olhar ó ah tem aqui ó então na prática expect emit da mesma forma a gente vai
olhar o expect revert a gente pode fazer esse aqui né esse aqui agora já na verdade né ele emitiu um evento nesse teste aí a gente pode eu não sei direito como usar aqui mas tem né dá para você especificar o tipo do evento sabe o que que ele faz é igual spect revert também ele tem um Coringão lá que deixa você testar qualquer revert tá valendo Mas você pode especificar sabe revert reason ali e aí ele vai te trazer exatamente o que que o que que falhou aí aqui ó ó a gente já test um desse test emit aí
expect emit né Aí ó agora foi um sucesso apesar disso né eu pedi o Trace lá tá vendo agora aumentou um pouco que ele não reverteu lá né então ele mentou Ó depois ele fez umas consultas aqui na verdade é sente né ó ele emitia um evento de transfer aqui e aí ele ele essas chamadas externas aqui já sou eu testando aqui né Então bora fazer um expect emit aqui que aí eu pulo o revert E aí eu aprendo esse aqui né Vamos fazer expect emite aí cara eu preciso vou olhar o exemplo lá para não travar aqui ó ã
bom é ele tá falando ou expec sem nada ou true true true true né tipo V então eu vou no mais fácil né velho como sempre e eu vou fazer aqui a versão né mais direta vamos ver ó expect emite agora eu queria poder definir aí eu não sei se isso não tem ainda né Eh que ele emitiu um transfer né E que ele emitiu um transfer paraa hélice aí do endereço zero e cara imagina o que dá para fazer né Eh se não der Vale abrir um ISO lá os caras são muito rápidos velho para fazer eu imagino que dá já ó ah é antes do Mint ali
aqui vamos lá bom Eita [ __ ] é que eu perdi meu cont control c aqui vamos de novo então aqui ó ele vai testar se emitiu né o mais legal cara olhando lá esses parâmetros dele eu acho que deve dar para você pensar sabe emitiu uma transferência emitiu né e os parâmetros e tudo vamos lá eu não sei se trocando true ali por por no revert é bem tranquilo porque você mete ó falhou
Ah tá isso aqui foi a ordem tá galera Então o que aconteceu eu dei um prank ali não eu ver aqui ó prank exp Mint o expect emite não ele emite ali né cara eu acho
ó vamos ver aqui ó ele tava depois ó log diferente de log nação ele aceitava o o evento com os parâmetros Ah então é eita abri o brower errado aqui então eu vou ter que fazer isso aí ó teste event tudo PR true que foi aí ou par tá é não sei tem que dar uma pesquisada depois velho isso aqui meu eu vou ter que descobrir agora né você me deu a missão eu volto ó vamos testar com esse too TR aqui mas eu acho que não cara e o
a única a única coisa que eu que eu acho que pode ter talvez seja o prank aqui né você tá querendo é o evento do transferir não evento de de minar né a hora que ele Minta ele emite um transfer E aí eu não sei se é Essa ordem aqui só esse VM prank aqui não é né porque ele não tá revertendo por não autorizado né ele tá revertendo porque não achou o evento eu não sei eu vou comentar isso aqui pap eu vou eu vou olhar cara eu retorno aí UD opa olha aí sim deixa eu ver tá no chat
do zoom abrir aqui ó Ah cara aí sim ó vamos lá é ó Ah cara é isso então é tá explicado tá vendo você tem que definir o evento no contrato de teste aí você põe expect emite aí você emite o evento que tem como fazer puar esse contrato aí é não sei cara não ele tem é o contrato lá já tem
todos os eventos normais eu acho que sim cara não sei se ele colocou isso aqui para fins de exemplo mas deve ser eu teria que emitir ele antes né Ó você vai es exatamente vamos votar aqui ó seu botar aqui então Ó fazer o teste aqui ó pá aí eu teria que fazer isso aqui né ó mais ou menos emit kbd P transfer Eita passar o endereço address Zero Não kbd É é o nosso Tok ele tá instanciado aqui né aí Alice e aí 69 aí galera Talvez vá mesmo no vamos
fazer aqui ó gente eh tem ca queijo de carne C colola de at chegou a Galera É não dá cara não foi estranho eu acho que eu teria que declarar eles os eventos que eu quero testar aqui também é estranho você declarar o evento para testar se bateu o que você já declarou né É mas teste é isso se você for pensar né você escreve para ver se tá funcionando sei lá você pega um erro aí Talvez né mas eu vou eu vou pular esse aqui ó galera vou mas esse vai ficar Cara vou fazer funcionar isso aqui mas depois agora é que virou questão de on aí aqui galera Ó que que a gente faz
a gente pode fazer aqui um function teste Mint né ó certo então Esso aqui eu quero testar uma falha certo já fica diferente do outro né que eu queria testar o negócio que deu certo aí que que a gente vai fazer aqui ó ao invés de eu mintar vamos botar aqui né se eu fizer o mesmo aqui oi ah só emito sem emitido Ah isso aí tem que fazer o bom Bora faz agora ou não Não mas é isso sear interface você
não prisar todos né de novo mas eu não tenho uma interface aqui né eu teria que cortar a bagaça toda Valeu aí aqui ó botando essa aqui eu vou mudar aqui ó pro nosso é vou fazer isso aí agora tem tem que fazer né Não dá para terminar a sessão sem isso depois ó aqui Opa errei aqui né test Mint ó esse teste ele vai falhar na verdade porque ele reverteu né mas a gente quer que ele reverta né então aqui
basicamente vai ser parecido com aquilo ali ó VM deixa eu ver aqui expect revert E aí aqui a gente põe a razão né que a gente já viu aqui no é sem autorização né Então na hora que a gente dá esse sinal aí que que ele faz ele não só não vai reverter mas no próximo Call ele vai garantir que reverteu com essa razão aí né então ele vai no oh foi ó lá Apesar dele reverter tá vendo no Trace aqui ó ele ele ficou
vermelho ali né mas o teste Passou tá vendo ó resultado Ok é ele já foi Eh agora cara eu vou testar isso aí ó vamos fazer o o o rc20 lá do Amigo vou Peg vou copiar e colar né Fazer o ó event transfer aí eu venho aqui no meu super test aqui ó vamos botar aqui ó pá agora aqui acho que que vai dar certo hein pelo menos emitir ele não vai falhar aqui né E aí a gente vem aqui no expect emit e deixa
eu É pode ser melhor né na verdade ele diz lá que tanto faz cara mas é melhor mesmo no dia a dia aí a gente vem aqui ó teste Mint vai rodar lá é isso então você tem que dar ó passou então é isso tem que emitir o evento que você quer ver depois os dados certinhos é E aí ele ele vai uhum acho que na versão nova dá para você puxar o do contrato isc não precisaria
reescrever Pode ser né importar direto dele e mas aí é isso aí agora então para ir pro próximo a gente transforma esse teste aqui num teste mais dinâmico né por exemplinho lá do foundry era isso né daqui do então eu boto um int 256 aqui amount certo aí ao invés de testar aqui com o nosso meme a gente vai testar com a com a Mount dinâmico aqui né então na prática que ele vai fazer aqui por padrão ele vai testar isso aqui 256 vezes Diferentes né é aquela história caso mais complexo pode ter mais né eu podia
sei lá fazer um transfer PR depois fazer o Mint para ela depois ela transfere sei lá pode fazer n coisas né num sistema mais complexo Você vai precisar fazer isso né o cara cria uma posição a ele modifica a posição dele aí ele sai você vai querer cobrir todos os estados então aqui a gente só dinamizou é aquilo lá que você perguntou Rob sabe já fica um teste bem mais robusto sem precisar fazer muita coisa na verdade né foi mais rápido que testar o o [Risadas] evento aí e ó Foi lá é isso e ele e ele tem um sver lá
então ele testa com zero testa com o máximo ele fica tentando achar até ele quebrar hora que ele acha um caminho de execução diferente ele começa a focar meio que ali sabe ele só chama C teste vai que vai é você da sua Forge test ó passar não ele vai que vai aqui dá para você ter uns cheat codes aqui para você limitar isso aí então você consegue de certa forma manipular esse input você consegue fazer um TR para ver um log de C destivo cada número que é to consegue cara quer ver ó você faz um Forge teste menos B menos menos MT e a gente vai no test
min aí eu não sei se ele vai mostrar todos ou só o último mas quando ele falha em algum caso ele te mostra o que falhou e ele te mostra o input que falhou ele te dá lista de is então isso eu acho que ele não mostra uma coisa que eu não sei se ele tá fazendo fazendo já antigamente não fazia cara eh ele ele aleatorização o outro também chama Ah o outro também chama teste min Deixa eu botar isso aqui test min só para ele não rodar os dois ali no aí ó eh ele te mostra onde ele quebrou sabe
normalmente é isso E aí a lista Cara eu não sei como é que faz o que eu acho que ele faz se você quiser entrar no ó tá vendo aqui ele me mostrou ó ele meio que mostra o último caso tá vendo ó aqui ó transfer ele passou sete é E aí quando ele quebra em algum caso aí ele te fala fala ó quebrou com o parâmetro x igual a tal o que você pode eh o que eu acho que ele faz cara eu acho que ele grava aqui ó no no no cash é mas aí tem que achar alguma uma forma de olhar aí eu não sei no tá esse cas Ah é gigante tem tudo é tem tudo tem os os mas eu acho que ó uma coisa que a
gente podia fazer aqui ah aqu ele só só só emiti o último né ele tem uns logs cara vamos fazer isso aqui né Tem uns log de teste aqui velho que é que ele trata diferente no teste e ele te mostra found então você manda um emit log in ele deixa eu dar um nome aqui certo colocar aqui amount e aqui eu coloco amount E aí ISO aqui é tipo console log Mas ele tem um tipo específico né Tem console log também aquele que você pode meter qualquer parada tipo então console log é mais mais
dinâmico né Esse aqui é bom cara porque ele não aparece só no TR ele aparece quer ver vamos testar ele aqui sem o vvvv pra gente ver o que que aparece né ele mostra os eventos como se fosse é um evento do teste sabe ele mostra para você que tá testando ele fala assim ó eu não sei se ele vai mostrar aí que tá os 256 ou se ele vai mostrar o último Essa é a dúvida mas ó lá compilou uué não logou pera aí então vamos botar um menos vv pô não me entrou nada cara filha da [ __ ] lá ele não emitiu a ó aqui o log de
aqui tá vendo ó é nesse caso aqui ó tava um amount bem grande aqui no é não sei mas cara deve ter como ver eu acho todo Fer bom tem a coisa que eu aprendi com com o hoby isso cara Tem uma coisa que você guarda o estado do F anterior para você não repetir o mesmo input sabe então ele vai criando cada vez que você roda ele vai melhorando A variedade então e os caras cara do found são rápidos para desenvolver novos tá saindo toda hora feature nova e tudo né se não tem isso vale abrir uma ISO e tal nunca parei para olhar assim né confio no assim na na no negócio aqui é não
quando cara eu quero testar surdo assim eu boto sei lá até 100.000 vezes e aí eu vou embora uns 10 minutos volto ele testou 10.000 diferentes sabe e Se ele quebrar em algum ele vai te mostrar Acontece muito mais quando você tá fazendo fã na invariante a hora que a gente começar a testar vai ter isso dele quebrar na verdade o contrato começa a te falar pô quebrou aqui e foi uma quebrada normal sabe ele tá sei lá dando um overflow em algum lugar e tal e aí você tem que adaptar o seu teste para evitar essa quebra né evitar ele tentar por exemplo mintar o in masks sabe depois mintar mais alguma coisa se ele fizer isso ele vai reverter mas é um reverte que a gente quer que aconteça né então ou você trata o seu teste e esse
aqui dá para você escolher aquela história do equidna lá né dá para você escolher se um reverte é legítimo né se ele entende que isso é uma coisa normal e ele só falha quando a a assertiva que você escreveu ali falhou ou se você eh ou se reversão é uma falha de teste sabe então se uma reversão é uma falha de teste aí você você tem um parâmetro lá que você diz isso E aí ele vai te dizer então dá para flexibilizar um pouco porque é difícil Às vezes você tratar todos os revert sabe você põe um negócio aqui para sair loucura minando transferindo e tal ele vai reverter cara porque ele vai tentar transferir sem
saldo Ele vai tentar mentar às vezes dando overflow no total Supply lá Ele vai tentar mentar de outros endereços que não Ten o acesso de admin então nessa hora eh Vale esse parâmetro aí salva vidas né você fala não eu quero testar minha invariante aqui tou ali você desconsidera algum rec é isso mas se você quiser testar muito no detalhe pensa alguma coisa muito crítica sei lá né um protocolo inteiro você está naquela fase pré sabe é vale né Se tiver tempo e tal Vale cara entrar nesse nível de detalhe né então aqui agora equipa Corpus é o Corpus que ele guarda lá né Você sabe se tem então não sei na verdade cara não sei eu sei que ele tem
um solver parece muito com o do Kid né cara eu acho que os caras pegam mesmo sabe aquelas eh s s sei lá tem tem uns padrões aí né então ele é muito bom cara em achar sabe os os caminhos de execução e tudo e Achar umas Mas então ele T sabe o mínimo o máximo do tipo que você tá testando quando é endereço ele ele ele ele olha seu teste então ele pega os endereços que você declarou dos contratos dos admins dos eventos emitidos e testa com esse sabe então ele é impressionante como ele acerta por exemplo você coloca ele para testar uma invariável a gente faz esse teste aqui e aí por exemplo ele quando você não fala nada para ele né Aí ele vira um fuzer
mesmo na hora esse aqui é um unit test fado né a gente agora é o próximo passo a gente vai fazer já quando você testa uma invariante ele trata isso aqui que nem o equidna fazia né só que ele tem aqui Um setup meio que natural dele também então que que ele faz ele vai pegar os contratos que tão aqui no no seu setup foram deplo ele define eles como escopo isso dá para você mexer mas por padrão ele define eles como escopo E aí ele começa aquela metralhadora lá ele vai ficar chamando velho todas as funções com um monte de parâmetro até ele conseguir entrar em alguma aqui a gente vai passar por todo esse processo aí desde do teste bunda que não testa nada né ele vai ficar porque ele vai
ficar tentando chamar transfer Mint sem acesso né e não vai conseguir fazer nada e aí a gente vai começar a ajudar o fuzer a entrar nos caminhos né E aí o primeiro caminho a gente ajuda ele a conseguir mentar né É impressionante como ele consegue partir por exemplo de mintar para uma transferência sabe porque aí ele fala assim pô Vou lá fica tentando a hora que ele conseguiu mintar ele fala assim pô esse é um caminho de execução novo né eu saí tava só chamando um monte de coisa que revertia né esse aqui executou então ele ele abre a árvore ele começa a chamar essa e metralhar as outras né eventualmente ele pum ele acha uma transferência que funcionou ali e aí ele vai seguindo né a ideia ou você ajuda o fuzer ou eh tem
duas formas de fazer vamos vamos começar aqui que aí a gente então o que que é isso aqui pessoal lá no livro né ele tá no aqui no no testes avançados aqui aqui aí ele chega nesse teste de invariante aqui né esse aqui cara é muito legal na verdade é tipo que que é uma invariante né um negócio que nunca muda no seu código você não quer que mude Você vai testar aquilo lá né aqui no caso ele tem até um isso aqui a gente pode eh a gente pode brincar com isso eh por exemplo o total Supply é sempre a soma de todos os saldos certo basicamente é isso isso nunca muda cara pode tá E aí ele vai ficar tentando aqui
uma quantidade sei lá aí a quantidade você que define né a quantidade de padrão é 256 que é pouco para esse tipo de caso né a gente começa a entrar naqueles casos que é benéfico você tipo subir esse número para milhares sei lá e deixar ele virar à noite tentando lá porque ele vai aprendendo os caminhos eh tem e uma outra é por exemplo lá o do uniswap sabe tipo x y iG k aqui que ele deu no exemplo Então é se o uniswap lá não tinha eu acho né mas se ele tivesse uma função que retornasse o k por exemplo você poderia testar isso para tudo né você fala assim eu vou ver os dois saldos de token e vou chegar no k e vou testar se tá igual e aí você deixa ele correr e aí você tem que só ajudar
ele né como você tá testando essa invariável nesse seu caso de teste você meio que ajuda ele se você colocar o fuzzer simplesmente para ficar lá ele não tem token ele não tem nada ele vai ficar chamando um par do Unis Swap para sempre e tudo vai rever pena porque ele não tem saldo ele não consegue prover liquidez e tal então você começa a criar um helper ali para ajudar ele que que é ajudar ele você dá um saldo de toqu para ele né você dá uma permissão às vezes para ele tipo mintar para outro sei lá se você quer que o Mint faça parte disso né E aí você deixa ele correr e aí tem duas formas de fazer isso né a gente vai vai pegar aqui na verdade esses testes de invariante tá o que muda nele é isso aqui ó é eu eu é o nome meso é
invariante aí a gente vai lá no ver aqui ó function invariant Total Supply então aqui a gente quer testar ó Public para testar isso aqui é muito parecido com o teste na verdade é igual né aert eq né aí eu vou colocar aqui um kbd total Supply né E aí eu tenho que pegar aqui o qu a soma né a soma de todos os saldos né É
impossível eu saber isso aqui desse ponto né então eu vou ter que criar uma forma também de traquear isso de alguma forma ou eu posso ter uma variável que soma todos os saldos quando minta ou eu posso ter uma coisa onde eu gravo todos os endereços de todo mundo que tem token E aí eu somo eles aqui e bato né E então pode ser de alguma forma aí vamos colocar aqui é total aqui ó sun of veloces aí aqui por enquanto isso aqui obviamente vai falhar já porque o o na verdade a gente vai rodar assim ó eu vou colocar aqui um in suir teste fazer sim consegue você tem que gravar essa lista em algum lugar né
po pode na verdade qual que é essa a sacada disso aqui ele vai começar a chamar o contrato lá então A melhor forma de fazer isso né se eu for fazer um F assim específico grande é eu importar ao invés de eu deployar o meu contrato de token aqui eu crio um mock dele e aí vamos fazer aqui ó que que a gente faz aqui vamos deixar esse teste aqui então Ó que que eu vou fazer né eu vou vou apagar isso aqui da vamos fazer aqui pera aí eu vou copiar aqui por quê ô caceta vamos lá clicando aqui na trazido o mouse aí ó aqui
[Música] cara OK aqui né Ó esse é o nosso teste anterior certo então aqui eu vou deixar isso aqui é teste unitário tá aí aqui isso provavelmente outro arquivo tá galera eu vou meio que fazer aqui para para facilitar a vida aí não né Não aqui tem algumas formas de fazer cara a mais fácil que eu acho tá como esses dados estão lá no token é criar um token Moc Na verdade eu importo eu eu eu erdo sabe o o o token E aí eu crio umas funções que vão criar essas estruturas
de dados que a gente precisa para testar né valeu não pode comer aí galera como come pouco aí ó aqui então o que que a gente vai fazer ó a gente faz aqui ó Contract kbd mber Direct certo então esse contrato aqui pessoal ele já é o o contrato lá né então por exemplo se eu quero ver todo mundo que tem saldo aqui né O que que eu tenho que fazer aqui eu posso criar vou fazer a lista de pessoas vamos fazer aí eu posso criar uma uma Array aqui de de owners certo que tá
vazia aí eu venho aqui ó function Mint address Mint amount certo aí aqui eu vou fazer um super P Mint do amount e aqui eu vou fazer um owners ponto push Então cara ali naquela hora eu posso voltar aqui e ter claro isso aqui tá falho né porque a primeira vez que ele transferir essa nossa quebra então
eu teria que fazer isso pra transferência e para transfer front né para garantir saca que que por exemplo eu vtei para mim eu tô na lista de owners eu transfiro para você você não tá na lista de owners aí nessa hora acertiva vai quebrar Mas isso é bom porque a gente vai ver ela quebrar depois a gente conserta faz o então aqui ó eu vou ter que renomear isso aqui né teste e vou colocar em vá senão ele vai ele vai reclamar aqui porque tá com o mesmo nome né E aí o aqui eu vou apagar esses outros testezinho lá que tinha também e vou focar no nosso né aqui a única diferença
é que na hora de deployar ele ao invés de eu deployar aquele contrato lá eu vou deployar o nosso contrato de o nosso mock aqui né dá para fazer dois s Como assim fazer um depois já fazer setar os dois só Ah não eu só vou usar o o mok na verdade é o token tá vendo ó Ele herdou o token então tipo mok já tem tudo que o token tem mais isso aqui né aqui ele vai me dar um problema só que já tô esperando de tipo tá sem modifier aqui né Vamos deixar aqui ó Public only owner e vai dar aquele probleminha do override né Vamos botar aqui
já antes não tinha isso porque era uma época boa né os campos eram mais verdes né você podia né Hoje é tudo explícito cara aí ó é ei Cacer né aí aqui que que eu vou fazer eu só quero testar isso aqui agora né então eu vou vamos dar um build aqui para ver se Opa for aí tem outra forma de fazer isso também tá eh você pode eh Num caso complexo né na documentação aqui tem
isso você cria primeiro né aqui eu tô no automático Total ele entendeu aqui que o kbd Moc É o Meu Alvo do fuz então ele vai ficar lá pi quando você sobe dois contratos ele não sabe o que que é mais importante para você então ele divide 50 50 isso tudo dá para você começar parametrizar para você incluir contratos que não estão aqui excluir tudo e aí tem uma negócio que é mais avançado ainda que você começa a definir atores isso é legal então eu podia definir um contrato que é o admin por exemplo o contrato que é um usuário né E aí o admin Minta né E aí eu começo a criar sabe as chamadas para Esses contratos podem ter assertivas sabe então eu posso
garantir Por exemplo quando uma ário vai entar ele não consegue só o admin consegue né E e aí você consegue definir n atores também posso pegar esses usuários sabe e abrir escolher o número e tal e aí a coisa vai ficando bem mais complexa mas vai ficando bem mais robusta também né você vai definindo tipo eh e aí fazendo aquela coisa do POG lá dá para você também testar ou o fã quando fazia fã pro profissionalmente cara eh eu às vezes fazia uns fã un uns fãs que que eram ele na verdade cobrir o o ciclo de vida do contrato sabe que é
fácil de fazer para um contrato pequeno mas é difícil para uma coisa mais complexa né mas então Eh tem coisa que não tem fim né mas no caso sei lá põ aí um par do uniop V2 ele cria o par E aí ele deixa a galera começar a bombardear sabe então assim que que você garante lá você dá saldo de Token para qualquer pessoa que chamar então você deixa todo mundo começar sabe vai ser uma loucura todo mundo provendo liquidez e suap né e milhões rolando ali e aí a invariante entre cada chamada dessas ele testa então ele vai pegar vai começar vai testar né o contrato vai mudar de estado n vezes e toda vez ele tá testando então assim vale a pena também eu ao que
fazer negócio mais direcionado é bom também se você tenta fazer tudo começa a ficar um negócio muito cabeludo sabe principalmente para sistemas que T várias fases assim né então você tem lá sei lá o mercado é criado aí o negócio é negociado aí ele fecha aí ele é rolado paraa frente sei lá né Talvez seja melhor eu fazer um fã de criação fã de negociação fã sabe e aí aquela coisa do Paul Berg entra bem que você joga o sistema no estado e aí você roda o teste né dentro daquele estado lá e aí eu você vai rodar na verdade a mesma coisa de uma forma compartimentalizada ali tem dá para você fazer isso aqui
fazendo fork test isso aqui é a único Porém isso aqui se a gente fizer fork test a gente pode fazer desse aqui já esse aqui como eu não tô usando nenhum estado de outra rede só o meu aqui se eu rodar um fork test com esse ele vai ser tão rápido quanto um teste normal ele ele vai simplesmente distanciar a rede puxar alguma coisa simples lá sabe ele pega oir bloco time stemp e tal e traz E aí ele vai rodar meu teste só que dentro do meu teste eu não tô usando nada agora num f assim se eu tô toda vez buscando preço no oráculo fazendo aí ele vai começar a ficar bem mais lento né ele vai começar porque ele fica é um loop aqui cara né ele vai ficar tipo é uma transação aleatória uma assertiva transação aleatória e aqui eu posso
escrever várias invariantes também então ele vai você aproveita na verdade a mesma campanha essas mesmas aleatoriedades que ele vai fazendo aí ao invés dele testar uma invariante entre cada chamada ele vai testar todas que estão ali né agora bora rodar esse aqui né que a gente começa a ver já o isso aqui ó Opa porque aí qual que é o horário mesmo vou rápido tem uma hora Ah então d na boa ó vamos lá aqui ó Cord test menos menos MT p em Variant Total Aí ele vai rodar ele aqui né ó Ué como não ó lá falhou já tá vendo por que que ele falhou essa
assertiva na real falha na primeira vez né que tiver Qualquer mudança aí ele mas dá pra gente ver o caminho aqui o caminho foi longo tá vendo ó é por que que ele falhou Cara essa variável aqui é sempre zero né então se ele conseguir mentar para qualquer pessoa cara ele vai falhar certo e o nosso Mint aqui Apesar dele est com H owner aqui eu acho que ele ele ele tá eh como fala ele tá vamos ver se tem o mok aqui né então aqui O legal é que quando ele falha ele mostra aqui toda a sequência que ele fez até falhar né então eu vou abrir aqui o o a bagaça ó e ele vem aqui então
pessoal isso aqui na prática ó ó é tá vendo ó cabd Moc pã ó ele chamou um transfer aqui tá vendo aí a segunda chamada ele chamou um permite aqui nos parâmetros ele foi chamando então na hora de debugar isso você vem na última já você fala assim meu o que que quebrou porque é de forma geral entre cada uma dessas chamadas aqui a a invariante meio que se segurou né A única coisa que pode acontecer no nosso caso aqui é muito simples a primeira hora que ele entou bum quebrou Total Supply é diferente de zero e num caso normal aí às vezes ele dependendo da complexidade ele vai ter que fazer uma série de chamadas para
chegar no caso de falha né então a gente a gente vai chegar aqui nisso aí também a hora que a gente ajustar esse problema lá da assertiva o Mint vai ficar Redondo nunca vai falhar Mas se tiver um Mint um transfer na sequência ele vai falhar E aí ele vai te mostrar essa sequência aqui né então o último aqui ó se a gente olhar Aqui ó pode ver que essa função aqui que é a falha ele chamou um Mint ó tá vendo ele chamou o Mint usando o endereço do admin foi pilantra entendeu o admin chamou o mint e aí ele pum bugou né Eu acho vamos ver se ele é esperto se eu rodar de novo ele vai falar mais rápido vamos ver ele vai tentar Talvez o minte direto pô passou né ó fiquei com o
cara de bunda ele ele ele não foi esperto isso aqui tá pessoal eh tem um problema até foi legal ele achar o erro ali antes o por padrão ele tá rodando 256 tentativas Só isso é muito pouco né para numa vida real você manda aqui um ó não sei se esse aqui é igual no outro lá é fuz runs E aí você manda 1000 aqui ó aí com 1000 eu acho muito difícil ele não chamar esse min aí do admin né Mas respondendo a pergunta [ __ ] passou só ah não só rodou Ah então o parâmetro é diferente F runs é para aqueles outros lá tem que achar aqui qual que é o parâmetro tal
mas é legal esse teste de variante não tem sentido fazer o outro lado unitário o fã simples é de boa o do 256 vezes é muito na verdade né o teste simples lá você testou com num teste desse aqui eh vale a pena você rodar uma campanha grande né botar sei lá 10.000 100.000 E aí deixa ele né ele rodar e obviamente aqui como ele tá passando aqui ele não achou o histórico não do das rodadas anteriores passou de novo vamos lá até falhar [ __ ] não vai mais mas foi bom que ele falhou na primeira né ele tem o Modo
modo apresentação aa aía aí aqui ó eh então o que que a gente vai fazer para corrigir isso aqui aquilo lá que você falou né como a gente a gente tem aqui vamos ver se tá pública lá ó a gente só tem que mudar isso aqui para público né ó e aí o kbd m é o nosso kbd lá né então eu vou pegar aqui ó fazer umzinho aqui for e e menor do que e eu não posso chamar o lan né só runs deixa eu ver aqui pera aí que eu vou conectar aqui é deve ter alguma coisinha cara ó só
runs não não foi ó deixa eu ver aqui ó não aqui é o bom disso aí cara dá pra gente fazer o seguinte aqui ó tá cadê Chrome aqui ó conditional Parará tá legal ó ó aqui ele já tá falando sabe dá para você definir lá tem um monte de excluir incluir contrato tá vendo eh escolher só umas umas algumas funções para ele não ficar chamando tudo né Umas que não tem nada a ver e tal mas o padrãozinho mais complexa tem que
começar a entrar nessas agora eu queria deixa eu ver aqui ó ml ah lá lá tem a Então bora botar lá quer veru ó como é que é aqui assim iG
aqui Run igual a 1000 Vamos botar E aí é a profundidade na verdade para cada Run ele roda o número de chamadas aí ele zera tudo e começa de novo então a profundidade pro nosso caso aqui não faz sentido uma alta profundidade né Porque tipo ele vai mentar transferir só mas você tem uns casos que ele precisa transacionar muito até chegar aí Vale aumentar né Vale rodar uma campanha Menor Sei lá 500 mas Dobra o tamanho da profundidade então para cada tentativa ele vai rodar os aí vamos testar aqui flavão ó P Epa Será que foi os 1000 Ah foi tá
demorando né não tava compilando aía essa máquina aqui é 2017 passou com aí [ __ ] velho filha da [ __ ] é só porque tá na apresentação né E aí caras e ele vai era para ele falhar aqui olha lá existe uma chance dele saber que já te avisou não eu acho que não não se ele soubesse ele tinha que falhar toda vez ele achou né O um caso eu não sei o que tá ó se a gente quiser apagar tudo lá vamos dar um Forge aqui e vamos começar de novo ó e pô engraçado é que ele foi na primeira né é isso é o apresentação é isso deu certo já segue travar aía ó aí aqui
Eh ó ele compilou tudo tá vendo Demorou porque ele foi compilar tudo que já tava compilado lá mas passou Nossa Vamos botar 20.000 não 100.000 1 milhão des não eu acho que 1 milhão não demora não 1000 ele foi o qu aí vamos ver essa máquina é devagar também né aí vale a pena ter Ó lá tá sem 100000 não mas ainda assim ele tem que
pegar primeiro ele pegou em 256 cara né foi Mita sorte né E aí aqui ó vamos começar a mexer aqui ajustar porque esse aí acho que demora né então o o token lá aqui a gente tem que ter uma no o Chic acha Ignora isso vante eu não sei na verdade cara os intern aí como é que funciona Ele utiliza Ué então só Será que ele não tava pode ser isso mesmo então né você que falou que que bom ele
quebrou uma vez ele parou de quebrar ali tá tentando quebrar diferente né porque Pô na primeira ele acertou né É agora tem ele avisa sem ele não vão avisar mais é e agora a gente tá fazendo aquela tentativa ruim né porque primeiro eu botei 100000 casos e segundo eu limpei o Cash então dos dois talvez funcione e a gente nunca vai saber qual foi mas mas faz parte né qu quiser depois entr Oi não eu acho que eu limpei o Cash aí depois eu ou não foi eu acho foi ah foi antes é rodei for Clean é então é esse aí é isso mesmo aí aqui Opa Returns
então aqui ó você vai ter o eu só fiz uma função inha aqui para retornar o Lane lá pra gente conseguir lupar né nessa espaço é para ficar na na mão aí aqui ó vai ser kbd ponto como é que era o nome owners l e mais mais certo aí a gente pega aqui ó su of balances mais igual a kbd balance aí a gente tem um amigo lá como é que é
owners owners na verdade tem que ser kbd né aí foi ó chave não se for uma linha só não precisa não sol tem que abrir chave se eu fosse escrever uma de baixo aqui aí precisa assim ele vai rodar só o ó agora F podia ter um Counter ali né só pra gente não parar uma campanha no 999 aí né Vamos dar um minuto aía aí a gente rodando Isso aqui ó vai resolver esse
problema do Mint né e Pô queria chegar no problema de novo senão vai ser uma bosta né a gente não sabe se eu tô resolvendo ou não mas tem outros problemas Cara isso aqui é parcial né o owners lá só registra alguém quando minta para ele se outro cara que recebeu o token eita vai acabar aqui pera aí se outro cara que recebeu o token e transferir um terceiro aí que não tá ele vai falhar Então a gente vai tentar chegar nessa falha também aí para ver as duas falhas acontecendo aí e aí e a gente arrumando ela na verdade tanto o tanto
o o transfer quanto transfer from a gente vai ter que adaptar aí para quem tá recebendo token né entrar lá é outro problema né se el mentar duas vezes com cara vai falhar isso aqui também tem a gente vai ter que olhar talvez se o cara tem um algo não sei é mas aí aí Vocês entenderam né ô ô Aí depois desse aqui a última etapa é a gente vai rodar os scripts né Isso é novo do F E é muito massa para deoi alguma coisa para executar alguma coisa no não precisa ser necessariamente deplo pode ser eh executar Qualquer
mudança uma sequência de transações e tudo e aí que que ele faz nessa hora rolando ainda arrependi do 100.000 Eh vamos deixar mais um minuto aí aí eu paro se ele não eh a bateria tá fritando aqui né ele tá no que Oi Ufa E aí o o que que o script faz né você escreve um contrato na verdade uma série de transações Esse contrato pode ter um estado tudo variável de memória e pode ter o que for um contrato normal né de solidity Mas ele tem aquele sheit code Onde você
coloca broadcast quando você coloca broadcast antes de uma chamada externa ele entende que ele tem que mandar pro chain essa chamada então eu posso por exemplo fazer um Deploy do sistema e pegar um estado do unop pegar outra coisa e fazer o Deploy já usando essas variáveis de memória que eu coloquei e ele vai fazer isso aí dá para eu fazer uma sequência também grande colocar start broadcast eu acho que end broadcast ou Stop broadcast no final e que que é massa nisso né ele já ele ele esse script Na verdade ele roda local então ele simula todas as transações aqui vai empacotando elas as que são chamadas externas no arquivo E
aí ele manda pro chain todas juntas então se você tá mandando cinco provavelmente todas caem no mesmo bloco sabe todas vão executar juntas ali Acho que de 100 em 100 passou de 100 ele para espera as outras minerar né E aí tem opção isso dá para você escolher a moda antiga também sabe Manda uma espera né minou deu certo manda segunda espera né você diz ele já vai tipo aluma não Tipo ele já ele já não imagina o seguinte se você rodar sem o broadcast no comando lá que que ele faz ele ele ele passa esse script todo e ele encod todas as transações num Jon ele sabe qual que é a sua carteira
você pode dizer para ele inclusive ele assina se você plugar Ledger aqui e tudo e aí ele vai colocar todas as transações lá juntas e não vai mandar pro chain entendeu se você mandar ele mandar pro chain que que ele vai fazer exatamente isso mas aí no final ele vai mandar 50 transações de uma vez pro M já você resolvido Já tudo não tudo perfeito e aí que que acontece você começa a entrar nos blocos não vai entrar uma transação só depende do tamanho né você vai ocupar o Gas inteiro lá também depende do custo de gas do Da Da Da hora do mas eh ele vai executar ele vai começar a executar né todas vão cair no m Pool
elas só podem ser executadas na ordem do nce né então os validadores vão começar a pegar elas incluindo os blocos O legal é que acontece bastante em testnet acontece direto a gente testando aqui numa numa testnet como testnet o bloco tá vazio de forma geral né a gente manda sei lá 30 transações simples aqui que não gastam muito C as 30 no mesmo bloco sabe como executa tudo ao mesmo tempo e aí lógico na mainnet é diferente né aí já já é o bloco tá cheio normalmente né turma lá tá vidando mas mesmo assim eh tá bem né o único como ele simulou tudo contra o estado da mainet
Teoricamente é impossível falhar salvo se né numa dessas transações intermediárias aí ele usar um estado que outra pessoa aí pode mudar né então sei lá né de repente reverteu no sabe no num contrato que não tá relacionado com o script né A gente já vai simular isso aí esse aqui acho que eu vou parar galera V parar né Porque tá demorando demais é o como é que foi a bateria inteira nesse fun aqui e não [ __ ] bicho não tô nem conseguindo parar agora par é d aqui ó pá matou então aqui quer ver deixa eu só
diminuir aquele número lá né Vamos botar 10.000 10.000 é um número razoável certo eh e aí aqui ó agora a gente tem essa esse for Zinho aqui né esse for aqui vai funcionar bem enquanto ele não mintar duas vezes para alguém que já foi minado né e ele não transferir Então vamos rodar ele aqui para ver o que acontece né então cita tem um faz ver aqui no mo
ó então aqui na verdade ele tem que dar um erro pra gente ué Ah é á isso eu tinha feito não tinha então ele tem que quebrar a hora que ele quebrar a gente vai lá entender o que que aconteceu tem que quebrar quando ele conseguir lar e ltar duas vezes pra mesma pessoa é ou mintar para duas pessoas na verdade ó se ele mintar para alguém e essa pessoa transferir vai quebrar se Elimar duas vezes pra mesma pessoa aí o nosso teste aqui vai quebrar né a gente vai contar duas vezes o saldo do cara e aí a gente teria que fazer uma
forma ou de cuidar disso aqui ou um mapping para cuidar disso ou uma forma melhor né do que lupar esse loop aqui ele é de certa forma é meio ruim Porque conforme essa lista vai crescendo e a tendência ela crescer né Eh ele roda isso aqui entre cada chamada né então era era melhor talvez não era melhor é a gente cuidar da soma lá no e retornar a soma lá do nosso mock de token a invés de ficar lup aqui né mas cara funciona também como é arquivo de teste né eu não ten muita naquele texto lá depois quem quiser tipo olhar mais a fundo a coisa de [ __ ]
velho é eu acho que deve ter algum uma esse invariante essa função invariante tá dentro do pilho não do m tá dentro do filho é essa era a intenção dele é essa era a intenção o Na verdade eu acho melhor até a gente fazer o ter uma soma lá sabe traquear uma soma lá porque aí a transferência não quebra mais certo quando o cara transfere de forma é não sei o que eu tô fazendo aqui velho estamos no ó ah tá dentro dasado aí Ah tá certo é mas que eu vou fazer
aqui ao invés de fazer isso né eu vou fazer aqui mais fácil ó o int Public Sum of não é não sei se é tão bom também de testar bom vamos ver né Teoricamente você podia teria ter um Burn aqui sei lá e aí aqui ó a gente põe aqui ó 52 al hy Direct a não Sim era isso que tava quebrando era isso aí ó agora aqui vamos lá dar um mais igual é Mount
certo então agora aqui a gente tem um um totalizador aí né que é público esse aqui tinha que ser sim velho é por isso que falhou eh Tinha que ser o kbd Moc ó sei nem como ele deixou eu fazer isso né porque ó kbd igual no kbd Moc aqui tava não mas é isso aí aí aqui ó o su of balances a gente já tem lá né Vamos lá agora tá 10 Vamos botar menos né na primeira depois eu tá 1000
que depois nas outras a gente eh ah foi Vamos ver aí né Tem um artigo recente do Antônio que é muito legal né ele passou pelos tipos e tal e pelo tá passou de novo ah não passar né É para passar se C do caso que ele Vita duas vezes para ele não agora agora passa também agora quando transfere não muda o total é agora é para passar então é acabamos pô que ruim cara cara devia
ter ensaiado mais né a improvisação É isso aí galera mas é o o o tem um caso velho dá pra gente fazer a gente habilita o burn aí ele vai quebrar Vamos fazer ele quebrar eu quero ver essa parada quebrar velho vou ficar ó vamos lá function aí eu só vou botar no mock lá para não ficar aqui ó se a gente botar o Burn aqui eu vou tirar esse On leoner aqui
também deixar parada queimar né Vamos fazer um aí o na hora que ele Chamar esse burne aí ele vai quebrar a assertiva certo lá do Então vamos lá de novo agora vamos ver se com 1000 ele vai não ter não gastar recursos naturais aí fazendo [ __ ] velho é brincadeira ó p o burne tá público velho lá 10.000
10.000 você sabe que o Antônio ele fez o É eu sei máquina é esse deve ser legal cara é a máquina faz muita diferença para isso aqui né que ele tá fazendo um Loop Infinito aqui né tentando achar casos aí então tipo Ram forte processamento faz muita diferença não ele deve usar uns negócios cabuloso ele faz umas campanhas de fã absurd sim do equidna com com qual que é o outro é o é o do found mesmo parece a quem vai lançar
o Ah é bom velho ess sou Kid n na verdade tipo Eu ainda acho que se você for simplesmente fazer F sabe vou testar fazer um teste ainda é mais ferramenta assim para fazer uma campanha aquela coisa do Corpus que você falou né que ele guarda o estado das campanhas anteriores e não vai ficar repetindo né Eu acho que ainda é melhor mas para todo o resto né é o o foundry já tá na máquina né cara vai no o equid não dá trabalho para fazer né o setup tudo é chato ia ser um meup inteiro ia demorar mais para chegar no na do que esse aqui né sempre dá pa dá cara e ele é ruim de
debugar também né fica tipo não eu acho que meu para pra Dev que não tá tipo fazendo fãs né para PR testar mesmo achar que ele é de cas Eu acho que o o o found resolve Putz 90% das vezes Aí talvez mais né [ __ ] passou velho filha da [ __ ] é [ __ ] velho não tá pegando aqui o cara ó mínimo 1 milhão aí galera máquina grande é pegar uma máquina braba que que você ia falar Rob e você pesse comentar um pouco de teste de cenário um
poucoo fala lá de quero criar uma quero setar o quero que o teste comece a partir de um céo cenário Inicial sim e aí de lá eu começo a fazer as coisas é geralmente você faz o Como que você cria isso você cria tipo um arquivo por cenário ou uma função zona que representa um cenário não então que eu o que eu prefiro fazer cara porque isso aqui ó da mesma ele é um contrato né então eu posso ter herança disso aqui sabe então normalmente o que que eu faço cara eu começo com um cenário base né você vai começar com teste unitário mesmo Enquanto tá desenvolvendo né Aí ele fica com essa cara aqui ó né Ele tá um teste com
cenário base eu comecei com o estado vazio dele basicamente e eu fiz um teste unitário de cada coisa aí você começa a expandir que que eu posso fazer aqui né por exemplo ó esse aqui é o kyber director test né eu posso pegar esse aqui ó fazer um Contract e kyber Director Test no owner vamos supor né que no owner seria um aqui não faz tanta diferença né mas vamos supor que fosse um cenário aí sabe o mercado fechou sei lá está num específico aí aqui eu vou colocar is Opa no owner test V manter a melhor
prática kyber Director test então aqui basicamente agora Ele é igual ao outro certo aí cara eu faço isso aqui eu venho eu faço eu faço um override da função setup né E aí nessa função aqui ó [Música] setup Public override E aí aqui cara eu posso chamar tanto faz né eu posso chamar por exemplo super psup E aí ele vai fazer aquele setup todo lá para não ter que refazer tudo redepi a parada né então Ó eu fiz aqui e aí aqui ó eu coloco aqui ó tweak né sei
lá eh colocar o contrato em outro estado né E aí ou se eu quiser eu nem chamo super P setup por exemplo mas se eu quisesse fazer sem owner eu não ia poder chamar né ele transfere o owner lá do setup né então eu simplesmente eh refaço isso aqui lá eu posso só refazer isso aqui lá e aqui eu ponho address zer então então só com isso aqui cara ele vai testar todos
aqueles casos de teste agora com o owner zero né aqui no caso de um sistema que tem vários estados né que ele vai passando você faria um para cada um sabe então antes de abrir Ah o cara não consegue dar liquidez o cara não consegue abrir uma posição né abriu Ah sim agora o cara consegue abrir uma posição sei lá pode mexer na posição ou não nesse estado você testa entendeu aí você vai vai pro próximo E aí eu posso ter testes específicos dessa fase aqui também né eu posso ter testes sei lá variante tudo vale E aí a diferença do sistema lá do PG é mais ou menos isso que ele faz só que ele faz estruturado sabe ele importa
dá para você importar de outro contrato né sabe por exemplo eu crio um contrato que só tem um setup lá que faz um estado x eu crio outro aí eu posso chamar um posso chamar outro eu posso o que você falou também a galera faz eu posso ter uma função interna aqui empurra o sistema para um Estado específico né então isso é importante às vezes nem para tanto pensa que sei lá eu tenho uma Sei lá eu quero testar um Pool lá e eu preciso de cinco posições abertas eu posso ter uma função interna aqui helper que abre cinco sabe E aí para dar uma pimentada eu faço ela recebendo os parâmetros aí então as posições vão ser sempre Diferentes né E aí dentro dessa função interna eu posso mexer numa
variável de estado que grava lá uma soma de Tod e tal para poder testar uma invariante sabe e aí tudo isso vai se completando assim né por isso que legal é É conhecer né É tudo ferramenta E aí na fala fala Ah tem biblioteca de teste coisas testes já prontos pessal importa então não tem o teste é meio que padrão para né o que tem aqui que é legal olhar cara é o Forge Standard aqui né se você olhar esse arquivo de teste ele tem tudo que você pode usar no teste outra coisa que tem por aí para coisa base tipo eu sei que tem um que que a galera fez na tem comunidade fez Depois eu acho que é para rc20 E aí você pega lá os auditor lá recebe rc20 todo o sistema
vem o rc20 junto velho Aí o cara pega lá ele já tem um conjuntinho de teste padrão E aí eles tentaram fazer um bem robusto sabe que pega aqueles casos de que não reverte que não retorna true sabe eh tem esse problema né os ess2 meio diferente e aí ele pega é tudo isso já faz né mas pouco cara para coisa muito padrão assim só não vai ter um teste sei lá para né para qualquer outra coisa é difícil Talvez para nft e tal né mas é o aqui é legal olhar Porque pô ele importa um monte de coisa não tem nada aqui mas eh olhando esses aqui que ele importa cara você tem tudo que ele te dá de ferramenta durante o teste sabe então
e os cheat codes estão no VM aqui isso é como que você manipula o ambiente né onde ele tá rodando e o resto tem aqui eu nem sei tudo que tem ser sincero com você m 99% é acert igual né quando tu quer dar aquela lambujem um acert maior dependendo aert menor né aert LT aert GT tem assert true aert false e o resto mas ele tem de tudo eh inclusive ele tem umas ferramentas dificuldade que tinha no dap Tools né quando você vai eh é para alguns tipos de por exemplo testar a função permit do Token aqui né o cara tem que assinar uma transação
offline né ele assina uma transação não ele assina lá Unos dados e essa assinatura vai pro chain né então isso é simples de fazer no hard Hat da vida você faz lá npm install a biblioteca com ethers da vida você faz isso e você provê de parâmetro lá no dapt não tinha cara então a gente fazia umas mooc meio feio até né Então é eu fazia uma chave do cara sabe aí eu offline eu fazia os testes eu hard cava as assinaturas no meu caso de teste tudo hoje o o o foundry já tem então você consegue assinar a transação do fulano assinar o que você quiser né Não só transação assinar sei lá por exemplo o o permite ali testar dá para fazer um monte de
coisa e dá para você se não tiver nele dá para você fazer aquele negócio chama o script no seu sistema que vai pegar o dado que você precisa tal e retorna pro teste né então tem isso aí também cara ser sincero nunca usei essa negócio aí mas tem o exemplo deles é bem legal eles fizeram uma é uma mer tri implementada em sol e aí ele pega o arquivo de uma dessas famosas aí sabe para fazer mer distribution de de airdrop sabe acho que é o do Unis Swap sei lá e aí ele teste que é vamos falar desse teste aí que é o último tá esse aí no a gente falou de
invariante agora né O último é o diferencial que tá aqui na lista né o teste diferencial na verdade é uma técnica não é tanto uma ferramenta do negócio aqui do ele foca muito nesse ffi que é isso ele chamando um script na sua máquina mas isso aqui Teoricamente podia ser usado para testar contrato sabe no nosso caso aqui sei lá eu faço um transfer faço um transfer from e basicamente o resultado tem que ser parecido ali né Eh pelo menos a mudança do sal daqui para lá tem que acontecer igual aqui teste de de diferencial é basicamente isso é você pegar duas versões do do de alguma coisa e aí você roda o teste com um gasil de parâmetros
e você compara o output dele né se em algum momento tiver um smatch ele vai te avisar e aí você tem que olhar uma das duas implementações errou né Tem algum desalinhamento das duas aqui no caso ele acaba focando nisso tá vendo ele vai ele vai ele roda um script em JS na máquina pega o resultado E aí ele gera uma raiz no ch aqui com a com a implementação dele e aí ele compara as duas então isso aqui é muito mais uma técnica mas com fãs daria para fazer sei lá se tem duas somas tem duas ou você pega aquela função legal né
exponenciação lá do optimizer lá cara tem exponenciação mágica meu não gasta Gas aí você abre fala não vou ler que o cara fez né aí tá aquele assembly lá tudo [ __ ] velho você fala [ __ ] e agora né Será que é boa será que eu consigo né Entrar ou você vai lá no opcode opcode vai tentar entender o que ele fez ou uma forma de testar isso é isso né você pega uma exponenciação mais padrão que gasta Gas mesmo você vai usar no ambiente de teste e aí você roda as duas e compara o resultado E aí você roda uma tonelada de caso né para tentar achar mmet aí na verdade aí Isso aqui tem um grande cara
Fundação etherum roda um desse da rodava antes não sei se roda deve rodar ainda cara O Martin swend lá sabe ele roda e era a evm do parity e do gef E aí também era isso fica rodando 24 horas por dia roda b o mesmo input nas duas vê o que saiu compara quando não bate acho que pinga um e meil pros dois times sabe harmoniza aí galera quem errou E aí agora tem um monte de cliente né Eu não sei se tem alguém ou se ele ainda faz isso né mas é é uma forma interessante de testar principalmente lógico se você tiver várias
implementações né Eh tem que ter PR Então galera Vamos pro último tópico aí que é o script né só um segundo no dia a dia você usa a parte de de Ah cara G bom você falar isso aí tem um tem um teste aqui cara ó é então esse aí é muito simples cara se você mandar se eu mandar um for test aqui né ele vai testar os tudo que eu codei lá naquele arquivo né ah cacet ah tá é o meu exemplo último lá pera aí ó então eu vou apagar isso aqui então isso aí cara
se você rodar o teste aqui ó vamos lá agora tem que rodar né ele vai rodar todos os testes que a gente colocou lá eh lógico a gente tem um dois aqui vai ter a invariante agora invariante tá com 10.000 deixa eu refazer isso aqui sai novo Terminal Novo terminal vida noa vamos aqui deixar 100 aí ó aqui no no agora se eu rodar o for teste ele vai fazer a o teste padrãozinho ele ó tá vendo ele separou
por função aqui que foi chamada Aqui tem várias permit tudo que ele tentou chamar na invariante lá né então é por isso que tem mais funções aqui tá vendo no mock do que no normal que no normal ele só chamou o que a gente colocou no outro ele tá disparando lá né E aí ele te dá aqui uma média a mediana e o máximo que gastou né então sempre vai ser diferente aqui né normalmente o máximo É a primeira vez que ele deu um saldo para alguém Sei lá o aquela o o o slot de Storage tava frio né tava com zero custa mais caro para ele te dar um saldo na segunda vez já custa menos né pro mesmo endereço mas se for pro endereço mesmo custa mais e aí ele vai comparar E aí conforme você vai testando cara ele vai
esse relatório vai crescendo né sim é bem legal mas você se preocupa com isso ah eu não né não sou eu que vou pagar velho brincadeira Eu preocupo sim velho não cara isso é importante né Depende muito cara eu acho tem é eu sou contra essa mania atual acho que tá passando isso de tipo Ultra otimização porque aí que que vale se otimizar um código e gastar 100 Gu a menos se ninguém consegue ler aquela parada entendeu É tudo assem é então tipo isso eu acho ruim mas eu acho que as coisas que todo mundo usa cara por exemplo o rc20 o nft né Eu acho que devia ter uma implementação canônica aí
em Duff sei lá ou em assembly mesmo que todo mundo faz todo mundo audita e tal e aí todo mundo usa porque são umas coisas cara você olha lá no uniswap por exemplo né hoje em dia o unop é tão otimizado que o que gasta mais Gas é a transferência cara não adianta nada o cara otimiza para [ __ ] aquilo lá e vê um token daqueles de governança da compound sabe que quando você transfere o cara troca delegação tudo e aí a maioria do guas gastou na transferência Então eu acho que esses bloquinhos os Legos que todo mundo usa valia a pena né como um esforço Só que essa história velho essas coisas de baixo nível é difícil de ler é difícil de alguém no e Scan lá conseguir bater o olho e falar tá legal Vai levar tempo por mais eh por
melhor que o cara seja cara sim né você vai ter que testar aliás tem uma outra coisa que eu não olhei aqui que a gente vai fazer agora que é o Forge debug vamos ver se eu acerto aqui ó ah não vou acertar V vamos olhar aqui na na cola né no livro lá o o forge tem um debugger velho para esses caras aí os Gas optimizers aí então se você tá indo nesse nível cara e você tá tipo realmente preocupado sabe se o compilador não tá fazendo merda ali não tá queimando Gas você ou é de repente sei lá bug do compilador ou é um código emend mesmo você quer testar né ou é um código que tá na mainet não tá verificado sabe você só tem o b code
você não tem nada você vai ter que você tem o debug aqui que eu vou Cadê o debugger aí ó debugger o debugger tá vendo ó você manda ó Forge test debug tá vendo test something vamos fazer o teste lá Opa então ó pegar aqui ó de invariante eu não vou testar porque ele vai eh nem sei se dá vamos pegar um normal né ó Foi lá então Forge test eu vou botar aqui ó um debug eu acho que assim funciona cara par acho teste ah não tem o teste ah ó
lá não tá com esse nome lá vamos aqui ó vai ter que ter aspas é a vida do isso aqui cara ele te deixa fazer um Step by Step quando ele tem o fonte aqui deixa eu colar aqui né Vamos aqui ó debug ó lá tá errado isso foi que eu fiz hoje antes aí é forte teste debug menos menos debug né Vamos lá Test
a aí [ __ ] velho vamos lá aquib Forge test traço traço debug né ó é isso aqui né ó teste ó a minha tentativa de hoje testação tá tá né Ele tá assim né aí esse aqui é teste Mint mas eu acho que o que
funcionou a documentação tá meio ó vamos ver u qu e dele O Ed é Ed qual Ed ah então tá explicado né aí o o pô Aquela Velha História né não funciona na pera aí deixa eu copiar ali às vezes eu errei no nome da vamos ver
tem que passar esse ah pode ser que eu tenha que passar né então vou testar esse aqui ó que não tem não tem parâmetro né pode ser isso mesmo aí Isso aqui galera dá para chamar a função eh não precisa ser necessariamente no seu também dá para fazer um Forex Sabe chamar uma função no contrato da mnet a hora que ele entra aqui ó como esse contrato tá no projeto tá vendo aí eu vou abrir a tela aqui né porque fica mais legalzão ó tá vendo ele mostra o fonte aqui e aqui dá para eu ir aqui com ó J é isso não kj aqui ó eu consigo ir passando né op code por
opcode tá vendo ó a hora que eu tô passando aqui ó ele tá mostrando a stack o tamanho da stack aqui né ele tá mostrando a memória e ali embaixo quando ele descobre onde é ele mostra onde tá a linha né aqui no código então isso aqui é aquela história você começa a ir lá no eh você consegue linha a linha né e debugar no no nível tipo deixa eu mandar um end aqui qual que é o é o shift G aí ele vai bom você vai debugar velho op code por op code a execução né então aqui é essa história tipo é horrível
aqui né Vamos ser sinceros mas é o é o é uma forma de testar sabe se o compilador tá fazendo negócio estranho sei lá você fala pô tinha que ser assim né Será que não é um bug né seg Oi carber Director carber Director cara carber Director aí é você vai indo cara mas é bom é tem o ele coloca tudo numa vi só né Você vai no [Risadas] é isso aqui é é o optimizer lá sabe aluma
coisa O quê do o o kyber director Nossa velho esse cara é não sei como ele achou aquele bug é um caso que o cara é Black Hat né Se fosse o White Hat ele ainda ia escrever né falar pô eu fico curioso velho como que o cara acha um bug desse né não foi lendo código velho não foi olhando ali Como faz né ele fez alguma velha Provavelmente o negócio o map para mim pode ser pode ser que tipo hug parecido sei lá e o cara falou vamos ver se não tem mais né vamos aí aqui o script pessoal rapidamente aqui eu vou fazer o seguinte né vou renomear ã [ __ ] apaguei el
vamos lá no File Cadê Deixa eu deixa eu dar um control Z aqui aí aqui ó eh Director aí o script que que é velho É parece um teste na verdade né ele importa esse arquivo script como outro lá importa o arquivo Test e ele tem que herdar esse script aqui né então o aqui né nesse caso aqui eh ele não tem nada né esse setup também é a mesma
coisa que o teste lá ele vai rodar sempre Antes aqui do Run o Run eh ele meio que sei lá vou preparar um ambiente tudo né isso aqui na verdade é novo não vinha antes no template e aqui você tem esse VM Broadcast né Qualquer coisa que eu colocar depois aqui a chave que tiver executando isso né a chave eu defino na hora que eu rodo o script né a gente não sabe qual que é a chave aqui é importante pegar uma chave que tem hather tudo e aqui caras ele vai pegar eh Bom basicamente fazer o que você colocar aqui eu vou fazer o script de Deploy que eu acho que é o mais natural né para esse nosso caso aqui então eu posso colocar aqui tipo
Import aqui ó barra src Opa aí o então aqui ó com o Opa com o o arquivo importado eu posso colocar deplo ele primeiro ND acho que ele não tinha nada no
Construtor né então Ó eu fazendo isso eu basicamente tô falando para ele Ó deplo esse contrato n só que eu guardei o kbd na memória por ver se o seguinte né kbd ponto é aí quem é o mess o message Sender aqui é a chave que você definir na hora que você rodar o script Então por enquanto tipo a gente nem sabe quem é aqui a hora que você tá escrevendo né E isso aqui cara se o script for cabuloso aí 50 linhas tudo mais né sei lá você vai ter um monte de transação você pode fazer escrever teste
pro script e testar que o script inteiro roda e acontece o que você quer antes de rodar ele né mas aqui na verdade se ele reverter durante a execução do script em qualquer momento found também tira o pé e fala ó reverteu ele não deixa ele não vai mandar três transações para reverter na quarta né isso pode acontecer eventualmente sei lá se por exemplo você depende do contrato aí terceiro sabe o estado dele mudou e causou uma uma transação revertendo o caminho aí ele também vai te avisar que reverteu E aí até tem eu acho como você retomar um script que parou no momento agora ou é aquela coisa né se o cliente tiver pagando Gas você começa de
zero e ou você escreve um caso ali né uma exceção ali dentro que não vai deixar sei lá ele reverter nesse lugar um caso de teste para evitar né mas aqui a gente podia fazer por exemplo ó vamos lá é é mem coin certo então a gente vai deployar ela aí eu podia fazer um Mint né Aí eu dou um endereço aqui vamos dar um endereço fictício aqui da vsig aí da turma 1 2 3 aí vai ser 10 se pintou 10 mil aí pro Aí a gente faz um kbd transfer
ownership Adre zero certo a gente faz a antir rug antir rug pode botar na homepage aí que tem anug a aí aqui ó que que ele vai fazer aqui tá com esse script a gente já roda isso aqui e ele vai fazer tipo bem essa função aqui tem um erro só que o broadcast aqui ele só tá antes dessa Fiber Director aqui né do Deploy Então essas duas funções ele não vai fazer broadcast pro se você quiser que ele faça broadcast tudo né start broadcast aqui e aí eu acho que eu tenho que
terminar aqui com Stop broadcast isso aí e aí eu posso parar aqui continuar isso aqui só chamada externa tá então se eu tiver uma chada para uma interna aqui ou eu tô tipo fazendo uma conta ele não vai fazer broadcast a hora que eu faço uma chamada externa ele entende e como isso aqui Obviamente você roda num estado de fork né como se rodasse um fork test não tem sentido eu deployar um script numa rede que não existe né então eu posso ter também funções aqui que tão né fazendo leitura sabe do
Estado de outros contratos aí para tomar ações depois essas leituras não vão custar nada ele não vai fazer broadcast como né uma uma vi lá normal no chain e aí o resto ele ele então Ó nós vamos só compilar isso aqui vamos dar um Forge build aí ele compila esse também tá Forge build compila tudo a parada inteira aí foi tá aqui uma vez que ele tá compilado agora a gente não tem muito o que fazer né tem que rodar essa bagaça aí Eh vamos rodar eh vou tentar rodar ele sem definir uma rede eu acho que vai dar
PMA mas se eu rodar sem para ver a simulação dele porque aí como é que ele funciona é basicamente isso ele vai simular essa execução e aí se não reverteu No caminho ele vai empacotar as transações se eu não marcar com broadcast ali então gig se você não nem definir uma chave nem colocar nada ele vai gerar um Jon com todos os os dados lá você pode mandar na mão ou desenvolver um script seu por exemplo que sai atirando essas transações né se você colocar broadcast aí você tem que formar uma chave para ele basicamente aí rapidinho também porque já tá chegando a hora aí né também
do aqui ó tem o C ó o c cara ele tem toda aquela monte de né você consegue fazer várias coisas uma delas ele tem esse cast Wallet o cast Wallet que que ele tem né ele tem uma série de de deers aqui inclusive criar aqui né dá para você criar você usa todo dia isso aqui tal né dá por exemplo quando eu rodo um script acoplar o meu leder aqui e aí aprovando na LED script tem 100 leder eu já testei cara mas vezes que eu usei isso aqui da script era tipo mais de 100 transação E aí eu achei que
ia quebrar a Ledger velho a provando 100 transações ali no botão aí o que eu faço na prática cara eu crio um k Store aqui usando foundry mesmo e aí ele te pede ele criptografa com uma senha sua né E aí eu jogo quando você quando você roda o script sem executar ele sem sem pedir o broadcast ele olha o preço de gas na rede que você vai rodar e ele te dá o quanto você vai gastar mais ou menos de E aí eu transfiro o ether para essa conta e rodo cara que senão você vai ficar maluco cara com lá sabe não e aí mas funciona mas eu já testei e funciona e o setup às vezes não é tão tipo intuitivo né porque o Ledger tem
aquela Como é que chama a derivação é diferente e tal você tem que achar que você usa lá e tudo mas cara uma vez que tá setado funciona bem e se for para duas três transações assim o melhor é fazer assim né É não ficar com chave privada na máquina Apesar de que o k Store é menos forma menos pior de você ter um uma chave privada na máquina ela fica criptografada sempre você só põe a senha quando vai usar né mas é tipo mais risco então tipo põe troco de gas ali põ o que você vai usar um pouquinho mais no final você consegue com o próprio CET fazer uma transferência de volta do restante para você a minha na prática ela ficou para isso já então sempre tem um troco lá e já vai indo mas é um troco que tipo se me roubar eu não vou chorar
e tal né vou ficar tranquilo Se você puder mostrar rapidinho Como faz esse negócio dear tudo para vamos fazer ó aqui só para mostrar o ó o o cast o cast Wallet é w aqui você pode pôr um list ó eu já tenho eu fiz uma umas Chaves aí hoje né essa chave meup Inclusive tem guas eu já abasteci ela né então eu vou usar esse account meetup aí no para rodar o script E aí para rodar o script como a gente tá sem tempo eu vou colar de novo aqui vou fazer aquele ó Isso aqui foi o meu script de hoje cedo tá ó então aqui só passando
rapidinho pelos arquivos né isso aqui ó no nosso chama kyber Director com typo ali né ó tá ó kber dor com i maiúsculo né me meu aqui E aí o script meu tá chamado Como é que chama cbd script então isso aqui podia chamar Deploy né na verdade ele é um Deploy né Vamos deixar Deploy aqui eu mudo no arquivo aqui ó Então você fala para ele assim o arquivo e o o nome do contrato dentro do arquivo que é basicamente o script que ele vai rodar né Aí você passa o RPC que você quer chamar certo eu tô usando inf fura aqui aí ele começa a brincadeira aqui né
ele tem esse broadcast tá que você marca Se quiser mandar eu vou tirar ele aqui Rob para ele não mandar na primeira aí o verify cara é para ele verificar no etsan o contrato já então tipo os contratos que ele Deploy ele meio que já sabe E aí ele vai no ET Scan e já só que para fazer isso você tem que definir uma variável de ambiente ou colocar aqui dá para você passar menos menos ET Scan api aqui e passar a chave isso aqui eu vou até tirar daqui porque cara é menos um negócio para dar pau aqui e aí o account cara é a conta que você quer account aqui vai ser só porque
eu já tenho uma conta aqui no me k Store né então isso aqui é um parâmetro lá no help lá no no nobook vai ter é aqui que você escolhe eu posso colocar menos menos Private aqui e colar uma ch privada aqui ele vai que vai você pode eh é ficar alugado é então fica alugado no no no no histórico aí no e você pode é tem n formas de fazer é Ledger trasor Eu sei que dá também E aí aqui basicamente é o meu Sender né que eu coloquei no preferia que ele nem pedisse isso já fosse direto né aqui a hora que eu rodar Ah isso aqui cara isso aqui é uma coisa interessante esse meu computador é
bem velho eu não não tenho ele mais mas eu tenho até gravei na minha cola isso aí eh eu tenho as variáveis de ambiente aí que eu não sei onde eu você tem velho e aí aquela melhor prática né então aqui não tá aqui nada tá aqui que que aconteceu cara esse k Store aí eu comecei a rodar isso no ensaio lá e falei mano que [ __ ] é essa eu não defini K Store né mas o foundry Sempre é assim cara você pode ter a opção definida no comando aqui ou no foundry toml lá ou no ambiente e a minha provavelmente tá no ambiente cara então eu tenho que apagar elas aqui né porque até porque o me k Store lá eram do gef Ó
é coisa muito antiga cara E aí eu não tenho mais esses negócios aí tá bugando aqui para quem não tem para quem tem um computador aí que tá mais limpo não vai ter não vai ter problema agora se eu agora com carin se eu então cara que tem best profile tem os outros best não tem tem tem uns três lugares o best profile eu fui lá e apaguei aí eu falei [ __ ] não apagou velho a falei não tem problema passo vergonha lá mas aí os cara fic sabendo de mais uma merda que pode acontecer no dia a dia né aí aqui ó você roda o agora agora ele vai rodar E aí aqui eu deixei sem ou menos menos broadcast então ele vai simular só na prática né só que ele vai
simular isso contra o estado da cepo aqui que é onde eu tô rodando né Ó lá script rodou com sucesso então pelo menos não tem nenhum erro aí no E aí ó ele fala aqui tá vendo ó ó ele falou aqui o chain ID ó 1 não sabia que era esse lá o preço de gas atual ele pegou do chain isso né o total de gas usado por script e a quantidade de ether aqui que eu preciso para rodar isso agora né então cuidado que ele super estima isso aqui cara na mnet dá para dar uma aportado e dá para você definir também então tipo se eu falo meu [ __ ] né Eu quero economizar é o meu guest que eu tô gastando aqui eu não tô com pressa você
pode fazer aquela tática lá o Jeff conhece bem né você meu chega no começo do fim de semana dá uma chipada lá no guas e manda velho e aí ele vai ficar no Main Pool lá velho eventualmente alguém pega essa transação Cara eu acho que eles TM uma fila da é não porque tem Dizem que o nó faz isso né ele ele primeiro tem o bid de gas depois tem a fila da vergonha que ele pega os mais antigos Então você entra na fila E aí você vai ficar lá né se demorar muito aí não né os Men começam a te expurgar lá porque sua transação Tem um limite de transação no meul né dá para cada um definir o seu E aí se começa sei lá dar um pico de gas
um monte de gente entra sua transação vai sumir na prática aí aqui ó ele ele fez a simulação completou ele passou tudo aqui né E aí ele manda ele criou essa pasta broadcast aqui tá vendo ó e ele tem um Jon aqui ó Por enquanto só tem um Run né ele dá um Run aqui com dat or ó aí aqui ele tem transação por transação tá vendo ó se eu quiser ir lá na unha agora abrir lá o metamask advancer Raw bite Coach eu não sei se dá para fazer isso ainda você vai lá Cola essas paradas manda e vai vai dar certo aqui ele sempre tem esse latest também onde ele deixa a última rodada né que é a aí vamos fazer o BR cast lá para para matar isso aqui né porque o broadcast é
legal que a gente vai ver ele fazendo isso ele vai mandar as TX tudo de uma vez as TX é bom né as E aí o ele vai ele ele na verdade manda as três e ele fica esperando a resposta lá da do recibo né da da rede ó lá rodou com sucesso aí ele vai fazer a única parte do processo é isso aqui ó tá vendo agora como eu pedi para ele fazer o broadcast Ele me pediu a senha do meu Store lá que eu criei hoje mais cedo aí eu vou botar aqui essa chave Será que eu errei aqui vou errar né mais uma vez aqui
não errei Ah então vamos pegar essa aqui né cara vamos na qu Martel agora aqui 10 da noite né pessoal vai no ó aqui ó aí eh ele eu ter anotado isso devia ter olhado não anotei o endereço do amigo lá ó aí aqui ele vai mandar se você botar menos menos verify passar uma chave docan aí ele já pega e verifica os contratos para você também na na
sequência né A única diferença aqui que a gente não tá fazendo aqui nessa rodada ó ó lá pum tá vendo ó mandou as três aí agora ele tá esperando o recibo aí como a rede lá não tem ninguém cara fatalmente Acho que o próximo bloco aí as três entram E aí ele já ele só Verifica tudo se tá certo e aí se tá lá a opção verificar confirmada ele vai o decan é mais chatinho Cara eu já de uns pau às vezes que estranho api não sei se é a api deles lá eh ó lá executou tá vendo ó aí aqui ele até põe aqui ó que ó as três transações o endereço do nosso contrato aqui né esse
é o nosso token lá e aí se você colocar menos menos verify ele só vai tentar lá ele começa na verdade ele manda para api do atcan sabe aí ele fica tentando fica pingando lá se você tiver n contratos ele vai fazer isso n vezes e então o que eu recomendo com isso aqui se for testar cara se for fazer na verdade na mainnet faça antes da test net para garantir que você não não vai gastar dinheiro às vezes ele deplo tudo certo mas aí não verifica nenhum sabe aí você vai ele tem uma função aqui que é o Forge verify dá para verificar também só que aí tipo se acontecer isso é não mexe mais nada porque aí dá diferença tudo né você otimizou antes compilou mudou
versão e tal mas ele até que é bom e vai na boa né ou vai no a última né Eh mãozão mesmo né ele tem um Forge flatting aí ele vai te dar aquele contratando das antigas você vai lá no manual vai capture negó também é ú Acho que até usa mais do test usa mais do é Ah é verdade o vvvvv também se aplica aqui é você pode ir na e você usa p o teste mais controlado mesmo tá rodando É verdade pode ser alguma coisa que mudou e script tem isso né
dependendo do que você for fazer sei lá eh ontem funcionava hoje não funciona mais a rede mudou né não é o seu script E aí você dá um Trace desse você chega lá né no lugar sabe pô reverteu aqui por que que reverteu aqui né isso aqui tá diferente e aí trata no no Script aí galera eu acho que a gente cobriu quase tudo aí eu queria ter feito mais né se desse tempo essa chave aí sabe eu queria criar um Store tal fazer mas aí ia demorar um pouco mais mas isso aí é fácil de fazer também é o Forge Wallet New ele já gera uma chave privada tem lá olha lá no livro vai não por exemplo dá um out é o cast tem
muita coisa tem muita coisa mas o cast é você usar o o básico ele é muita coisa mas é muita coisa igual né Ele converte de tudo para tudo a gente chamou o hque par só do cast só do cast Nossa faz tud de comand de AZ não e os caras antigamente na Maker cara tinha não tinha o script né que nem a gente fez agora então eles eles de novo então ele eles é