<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edu</title>
    <description>The latest articles on DEV Community by Edu (@eduprogrammer).</description>
    <link>https://dev.to/eduprogrammer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4019739%2F9018db59-9169-4ec9-8e6c-1cb664d05141.png</url>
      <title>DEV Community: Edu</title>
      <link>https://dev.to/eduprogrammer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eduprogrammer"/>
    <language>en</language>
    <item>
      <title>Solidity vs. Rust: o que aprendi construindo nos dois, não lendo sobre os dois</title>
      <dc:creator>Edu</dc:creator>
      <pubDate>Sun, 19 Jul 2026 23:43:09 +0000</pubDate>
      <link>https://dev.to/eduprogrammer/solidity-vs-rust-o-que-aprendi-construindo-nos-dois-nao-lendo-sobre-os-dois-31d1</link>
      <guid>https://dev.to/eduprogrammer/solidity-vs-rust-o-que-aprendi-construindo-nos-dois-nao-lendo-sobre-os-dois-31d1</guid>
      <description>&lt;p&gt;Todo conteúdo sobre “qual linguagem escolher pra Web3” que eu encontro é escrito por quem nunca fez deploy de nada. Compara sintaxe, compara popularidade no GitHub, compara vaga no LinkedIn. Útil até certo ponto, mas é comparação de fora.&lt;/p&gt;

&lt;p&gt;Eu tive a oportunidade (ou o azar, dependendo do dia) de construir contratos reais nas duas: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CryptoMarket&lt;/strong&gt;, um marketplace de NFTs em Solidity, e Stellar &lt;strong&gt;Charge EV&lt;/strong&gt;, um protocolo de pagamento pra recarga de veículos elétricos em Rust, sobre Soroban (Stellar), feito pro hackathon Stellar 37° · NearX.&lt;/p&gt;

&lt;p&gt;Este artigo é o que aprendi tendo as mãos sujas nas duas, não lendo comparação de blog.&lt;/p&gt;

&lt;p&gt;O ponto de partida: dois problemas diferentes:&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;CryptoMarket&lt;/strong&gt; nasceu de um exercício que chamei de** “Cliente Imaginário”**: simular um pedido real de negócio e resolver com o rigor que teria num projeto de verdade. O pedido: “preciso conseguir pausar meu contrato em caso de bug, sem precisar fazer novo deploy”. &lt;/p&gt;

&lt;p&gt;Solidity, com Foundry, resolveu isso rápido, com um padrão de projeto que qualquer dev que já mexeu com Ethereum reconhece de cara.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Stellar Charge EV&lt;/strong&gt; nasceu de um problema mais amplo: um protocolo completo de pagamento por sessão de recarga, integrando smart contract com um simulador OCPP 1.6J (o protocolo real que carregadores elétricos usam), backend, frontend, tudo em produção, sob prazo de hackathon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rust&lt;/strong&gt; entrou porque Soroban, a plataforma de contratos da Stellar, usa Rust como linguagem nativa.&lt;/p&gt;

&lt;p&gt;Dois problemas de tamanho e natureza diferentes, o que já é a primeira lição: a pergunta &lt;strong&gt;“qual linguagem é melhor”&lt;/strong&gt; está incompleta. &lt;/p&gt;

&lt;p&gt;A pergunta certa é “qual problema, em qual rede”.&lt;br&gt;
&lt;strong&gt;Solidity&lt;/strong&gt;: produtivo rápido, e isso tem preço&lt;br&gt;
Escrever o contrato de manutenção em Solidity foi direto.&lt;/p&gt;

&lt;p&gt;A sintaxe lembra JavaScript o suficiente pra não assustar quem já programa web, e o ecossistema em volta (Foundry pros testes, OpenZeppelin pros padrões prontos de segurança) resolve boa parte do trabalho pesado antes de você escrever a primeira linha de lógica de negócio.&lt;/p&gt;

&lt;p&gt;O preço dessa produtividade aparece depois: &lt;strong&gt;Solidity&lt;/strong&gt; dá liberdade demais em pontos onde liberdade demais é perigosa. Nada no compilador te impede, por padrão, de escrever um contrato vulnerável a reentrância, por exemplo, a não ser que você conheça o padrão de proteção e aplique manualmente (ou use a biblioteca certa pra isso). A linguagem confia no desenvolvedor. &lt;/p&gt;

&lt;p&gt;Em contratos que guardam dinheiro de verdade, essa confiança tem custado caro pro setor inteiro, e não é conversa hipotética, é histórico documentado de exploits.&lt;br&gt;
Rust: o compilador briga com você antes do mundo brigar&lt;br&gt;
Construir o &lt;strong&gt;Stellar Charge EV&lt;/strong&gt; foi outra experiência inteiramente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rust&lt;/strong&gt; tem uma característica que, de início, é frustrante: o compilador não deixa o código rodar se tiver determinadas classes inteiras de erro, principalmente em torno de como a memória é gerenciada (o famoso borrow checker). Isso trava muita gente que vem de linguagem mais permissiva.&lt;/p&gt;

&lt;p&gt;Mas depois de algumas semanas brigando com o compilador (literalmente: passei por incompatibilidade de toolchain, ajuste de otimização de wasm pra rodar na testnet, entre outros perrengues documentados no repositório do projeto), percebi o que estava acontecendo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rust&lt;/strong&gt; me forçava a resolver, em tempo de compilação, problemas que em Solidity eu só descobriria em produção, ou pior, só descobriria quando alguém explorasse a falha. É desconfortável no dia, é proteção no longo prazo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A resposta que eu daria hoje pra “qual escolher”&lt;/strong&gt;&lt;br&gt;
Não existe resposta universal, mas existe pergunta que ajuda a decidir:&lt;/p&gt;

&lt;p&gt;Vai construir em &lt;strong&gt;Ethereum&lt;/strong&gt; ou rede compatível com EVM? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solidity&lt;/strong&gt; não é opção, é requisito. O ecossistema, as ferramentas, a documentação, tudo gira em torno dele ali.&lt;/p&gt;

&lt;p&gt;Vai construir em Solana, Stellar, Near? &lt;strong&gt;Rust&lt;/strong&gt; entra em cena, e a dificuldade inicial compensa em segurança e em portabilidade, já que Rust serve pra muito mais coisa fora de Web3 também.&lt;br&gt;
Prioridade é velocidade de lançamento, mercado maior de referência? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solidity&lt;/strong&gt; ainda ganha em volume de tutorial, biblioteca pronta e gente pra tirar dúvida.&lt;br&gt;
Prioridade é diferenciação num mercado menos disputado, e você tem paciência pra curva de aprendizado mais dura? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rust&lt;/strong&gt; filtra concorrência só pela dificuldade de entrada, o que, ironicamente, vira vantagem pra quem persiste.&lt;/p&gt;

&lt;p&gt;Links dos dois projetos, pra quem quiser ver o código&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CryptoMarket&lt;/strong&gt; (Solidity): &lt;a href="https://dev.tourl"&gt;github.com/Eduprogrammer/solidity-maintenance-mode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stellar Charge EV&lt;/strong&gt; (Rust/Soroban): &lt;a href="https://dev.tourl"&gt;github.com/Eduprogrammer/Stellar-Charge-EV&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se esse tipo de comparação prática te interessa&lt;br&gt;
Estou escrevendo sobre isso com mais profundidade em formato de livro. Já saíram dois títulos, Entenda a Web3 (os fundamentos da tecnologia, sem jargão) &lt;/p&gt;

&lt;p&gt;(&lt;a href="https://www.amazon.com/author/entendaweb3)" rel="noopener noreferrer"&gt;https://www.amazon.com/author/entendaweb3)&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;e Migre para a Web3 (o mapa prático de carreira pra quem quer entrar no setor), ambos na Amazon.&lt;/p&gt;

&lt;p&gt;Um terceiro, mais técnico, sobre construir de fato (linguagem, ambiente, primeiro contrato do zero), está a caminho, e vai usar esses dois projetos como estudo de caso real, não exemplo inventado.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>solidity</category>
      <category>rust</category>
    </item>
    <item>
      <title>Da Série Cliente Imaginário #1: Como resolvi o pedido "preciso pausar meu contrato sem novo deploy" usando Solidity + Foundry</title>
      <dc:creator>Edu</dc:creator>
      <pubDate>Tue, 07 Jul 2026 14:59:23 +0000</pubDate>
      <link>https://dev.to/eduprogrammer/da-serie-cliente-imaginario-1-como-resolvi-o-pedido-preciso-pausar-meu-contrato-sem-novo-deploy-13jc</link>
      <guid>https://dev.to/eduprogrammer/da-serie-cliente-imaginario-1-como-resolvi-o-pedido-preciso-pausar-meu-contrato-sem-novo-deploy-13jc</guid>
      <description>&lt;p&gt;Modo Manutenção em Solidity com Foundry&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ainda não tenho clientes reais em Web3. Mas ao invés de só fazer tutoriais soltos, decidi simular pedidos reais de clientes e resolvê-los como se fossem projetos de verdade do entendimento da dor até o deploy funcionando. Esse é o primeiro caso da série.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O pedido do Cliente (imaginário)
&lt;/h2&gt;

&lt;p&gt;Imagine o seguinte cenário: &lt;strong&gt;CryptoMarket&lt;/strong&gt;, um marketplace de NFTs, já está em produção com usuários reais. O dono me procura com uma dor bem específica:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Se um bug aparecer no meio da noite, eu preciso conseguir travar as transações imediatamente, sem depender de ninguém, sem precisar rodar um novo deploy. E quando eu resolver, preciso poder destravar do mesmo jeito."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Duas alternativas ruins que ele tinha antes de me procurar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deixar o contrato ativo mesmo sabendo do risco&lt;/li&gt;
&lt;li&gt;Fazer um novo deploy do zero (caro, quebra o endereço já divulgado, perde histórico)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  O que eu vou construir
&lt;/h2&gt;

&lt;p&gt;Um &lt;strong&gt;mecanismo de Modo Manutenção&lt;/strong&gt;: um interruptor on-chain que só o dono do contrato pode ligar ou desligar, bloqueando funções críticas enquanto estiver ativo e permitindo que qualquer pessoa consulte o status a qualquer momento (transparência).&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquitetura antes do código
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Função&lt;/th&gt;
&lt;th&gt;Quem pode chamar&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;toggleMaintenance()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Só o owner&lt;/td&gt;
&lt;td&gt;Liga/desliga o modo manutenção&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;isUnderMaintenance()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Qualquer um&lt;/td&gt;
&lt;td&gt;Consulta o status atual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;buyNFT()&lt;/code&gt; (exemplo)&lt;/td&gt;
&lt;td&gt;Usuários&lt;/td&gt;
&lt;td&gt;Só executa se &lt;strong&gt;não&lt;/strong&gt; estiver em manutenção&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  O contrato
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract CryptoMarket {

    address public owner;
    bool public maintenanceMode;

    event MaintenanceToggled(bool novoStatus);

    constructor() {
        owner = msg.sender;
        maintenanceMode = false;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Apenas o owner pode fazer isso");
        _;
    }

    modifier notInMaintenance() {
        require(!maintenanceMode, "Contrato em manutencao no momento");
        _;
    }

    function toggleMaintenance() public onlyOwner {
        maintenanceMode = !maintenanceMode;
        emit MaintenanceToggled(maintenanceMode);
    }

    function isUnderMaintenance() public view returns (bool) {
        return maintenanceMode;
    }

    function buyNFT() public notInMaintenance {
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testando com Foundry
&lt;/h2&gt;

&lt;p&gt;Escrevi 8 testes cobrindo os cenários principais: deploy correto, estado inicial, toggle nos dois sentidos, bloqueio de acesso pra quem não é owner, bloqueio do &lt;code&gt;buyNFT()&lt;/code&gt; durante manutenção, e emissão do evento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;forge &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-vvv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3byq0n4jvddf9ixezt5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3byq0n4jvddf9ixezt5g.png" alt=" " width="799" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todos os 8 testes passaram (&lt;code&gt;8 passed; 0 failed; 0 skipped&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy local com Anvil
&lt;/h2&gt;

&lt;p&gt;Subi uma blockchain local simulada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;anvil
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fome4q1uicts8zr9tnouz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fome4q1uicts8zr9tnouz.png" alt=" " width="800" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E fiz o deploy do contrato usando a primeira conta pré-financiada como owner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;forge create src/CryptoMarket.sol:CryptoMarket &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; http://127.0.0.1:8545 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--private-key&lt;/span&gt; &amp;lt;CHAVE_PRIVADA&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--broadcast&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftbac5x7ms61dn9iq23vw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftbac5x7ms61dn9iq23vw.png" alt=" " width="800" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy feito com sucesso 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployer (owner):&lt;/strong&gt; &lt;code&gt;0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endereço do contrato:&lt;/strong&gt; &lt;code&gt;0x5FbDB2315678afecb367f032d93F642f64180aa3&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Interagindo com o contrato via Cast
&lt;/h2&gt;

&lt;p&gt;Com o contrato no ar, testei o fluxo completo na prática não só nos testes, mas em uma blockchain local de verdade.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Consultar o status (leitura, sem gastar gas)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast call 0x5FbDB2315678afecb367f032d93F642f64180aa3 &lt;span class="s2"&gt;"isUnderMaintenance()(bool)"&lt;/span&gt; &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; http://127.0.0.1:8545
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhe12x9nidev61a183pzx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhe12x9nidev61a183pzx.png" alt=" " width="799" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Retornou &lt;code&gt;false&lt;/code&gt; — o contrato nasce operacional, como esperado.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Ativar o modo manutenção (escrita, precisa da chave do owner)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast send 0x5FbDB2315678afecb367f032d93F642f64180aa3 &lt;span class="s2"&gt;"toggleMaintenance()"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; http://127.0.0.1:8545 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--private-key&lt;/span&gt; &amp;lt;CHAVE_PRIVADA_DO_OWNER&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funsdh3v93zxatmg0cmlz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funsdh3v93zxatmg0cmlz.png" alt=" " width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Transação minerada com &lt;code&gt;status: 1 (success)&lt;/code&gt;. Repare no campo &lt;code&gt;logs&lt;/code&gt;: ali está o evento &lt;code&gt;MaintenanceToggled&lt;/code&gt; sendo emitido on-chain — prova de auditoria, gravada permanentemente na blockchain.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Confirmar que mudou
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast call 0x5FbDB2315678afecb367f032d93F642f64180aa3 &lt;span class="s2"&gt;"isUnderMaintenance()(bool)"&lt;/span&gt; &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; http://127.0.0.1:8545
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmnvb21gb9zofep88evgq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmnvb21gb9zofep88evgq.png" alt=" " width="800" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora retorna &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Testar o bloqueio
&lt;/h3&gt;

&lt;p&gt;Tentei chamar &lt;code&gt;buyNFT()&lt;/code&gt; enquanto o contrato está em manutenção:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast send 0x5FbDB2315678afecb367f032d93F642f64180aa3 &lt;span class="s2"&gt;"buyNFT()"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; http://127.0.0.1:8545 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--private-key&lt;/span&gt; &amp;lt;CHAVE_PRIVADA_DO_OWNER&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgpkdmyi3ec0be2x33m7m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgpkdmyi3ec0be2x33m7m.png" alt=" " width="800" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Error: execution reverted: Contrato em manutencao no momento&lt;/p&gt;

&lt;p&gt;Exatamente o comportamento esperado: o &lt;code&gt;modifier notInMaintenance&lt;/code&gt; bloqueou a função de negócio.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Voltar o status para operacional (false)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast send 0x5FbDB2315678afecb367f032d93F642f64180aa3 &lt;span class="s2"&gt;"toggleMaintenance()"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; http://127.0.0.1:8545 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--private-key&lt;/span&gt; &amp;lt;CHAVE_PRIVADA_DO_OWNER&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fke6dwpzrf280vkepkzhn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fke6dwpzrf280vkepkzhn.png" alt=" " width="799" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Confirmar que voltou
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast call 0x5FbDB2315678afecb367f032d93F642f64180aa3 &lt;span class="s2"&gt;"isUnderMaintenance()(bool)"&lt;/span&gt; &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; http://127.0.0.1:8545
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe2okz2hyfgyud0uqzpjk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe2okz2hyfgyud0uqzpjk.png" alt=" " width="800" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Retornou &lt;code&gt;false&lt;/code&gt; novamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Testar buyNFT() com o contrato liberado
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast send 0x5FbDB2315678afecb367f032d93F642f64180aa3 &lt;span class="s2"&gt;"buyNFT()"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; http://127.0.0.1:8545 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--private-key&lt;/span&gt; &amp;lt;CHAVE_PRIVADA_DO_OWNER&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi0iiwxwt88tnabgzo4ah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi0iiwxwt88tnabgzo4ah.png" alt=" " width="799" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;status: 1 (success)&lt;/code&gt; sem nenhum erro. O contrato voltou a funcionar normalmente assim que a manutenção foi desativada.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que essa simulação prova
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Estado&lt;/th&gt;
&lt;th&gt;&lt;code&gt;buyNFT()&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Em manutenção (&lt;code&gt;true&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;❌ Reverte com "Contrato em manutencao no momento"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operacional (&lt;code&gt;false&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✅ Executa normalmente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O ciclo completo — construção, teste, deploy e interação real — funcionou do início ao fim, exatamente como o cliente (imaginário) precisava.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que documentar assim
&lt;/h2&gt;

&lt;p&gt;Não tenho clientes reais em Web3 ainda. Mas resolver problemas simulados com o mesmo rigor que teria com um cliente de verdade entender a dor antes de codar, testar com cobertura real, validar em ambiente local antes de qualquer coisa em produção é como estou construindo prática e portfólio ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Código completo no GitHub: &lt;a href="https://github.com/Eduprogrammer/solidity-maintenance-mode" rel="noopener noreferrer"&gt;https://github.com/Eduprogrammer/solidity-maintenance-mode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meu Linkedin: &lt;a href="https://www.linkedin.com/in/educarlos29/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/educarlos29/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você é dev e tem uma dor parecida com essa (ou outra ideia de "cliente imaginário" pra próxima simulação), comenta aí 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;#solidity #foundry #web3 #blockchain #smartcontracts #developer&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
