Pular para o conteúdo

Revoke Snap: Revogando Aprovações Restantes em Contratos de Token ERC20

Um Snap do ETHWarsaw Hackathon que permite aos usuários revogar aprovações de contratos restantes.

7 min de leitura
Revoke Snap: Revogando Aprovações Restantes em Contratos de Token ERC20

MetaMask Snaps é o roteiro para tornar a MetaMask a carteira mais extensível do mundo. Como desenvolvedor, você pode trazer seus recursos e APIs para a MetaMask de formas totalmente novas. Os desenvolvedores Web3 são o núcleo desse crescimento, e esta série tem como objetivo destacar os novos MetaMask Snaps sendo construídos hoje.

Revoke Snap com Swix Jedi e Adrian

Conversamos com o desenvolvedor Web3 Swix Jedi e Adrian, que construíram o Revoke Snap no ETHWarsaw Hackathon.

Repositório do Snap: https://github.com/SwixJedi/revokesnap

Por que vocês o construíram?

Para garantir a segurança do uso de tokens por agentes externos, os padrões de token ERC20 implementam uma allowance (permissão), na qual o proprietário do token precisa aprovar um agente (por exemplo, um smart contract de DEX) para poder utilizar seus tokens até um limite escolhido.

Para melhorar a experiência de usuário um tanto quanto complicada do DeFi, muitos protocolos DeFi utilizam o valor máximo de unit 256 para aprovações, evitando que o usuário precise aprovar tokens e gastar dinheiro em gas fees desnecessárias toda vez que quiser interagir com seus contratos.

Especialmente para usuários ativos de DeFi, é fácil criar uma situação em que, após usar determinados protocolos, sobram algumas aprovações pendentes, o que representa uma potencial ameaça à segurança.

Embora existam soluções para ajudar os usuários a lidar com as allowances restantes, apenas algumas delas oferecem aprovações diretamente pela interface do usuário. O processo é demorado, pois cada aprovação precisa ser tratada individualmente e confirmada manualmente. Embora essa abordagem seja segura, ela exige muita interação manual e contínua do usuário.

Foi isso que nos direcionou para um nicho ainda não explorado, onde poderíamos aproveitar as capacidades do MetaMask Snaps para melhorar as coisas.

Você pode nos explicar a implementação técnica?

Decidimos aproveitar os seguintes benefícios do MetaMask Snaps:

  • Acesso a todas as contas na MetaMask

  • Capacidade de realizar operações complexas com uma única aprovação do usuário

Para propor uma solução para esse problema, que no futuro deve tornar possível:

  • Apresentar apenas um prompt ao usuário para obter acesso a todas as contas atuais e futuras (com exceção notável das hardware wallets)

  • Revogar todas as aprovações de todas as contas atuais em lote, sem necessidade de confirmações separadas e troca de contas

  • Monitorar ativamente todas as contas do usuário (incluindo as em hardware wallets) em busca de novas aprovações e exibir uma notificação ao usuário quando detectadas.

Ao instalar o Revoke Snap pela interface web, a MetaMask solicitará as permissões necessárias.

Todas as permissões são especificadas em um arquivo snap.manifest.json:

"initialPermissions": {
    "snap_confirm": {},
    "snap_getBip44Entropy_60": {},
    "snap_notify": {},
    "endowment:long-running": {}
  },
Copiar

Duas permissões que merecem destaque são:

1. Controlar suas contas e ativos "Ethereum". Isso significa que, para funcionar, nosso snap requer a chave mestra (chave secreta) do usuário na MetaMask, a fim de poder gerar contas e assinar transações em nome do usuário.

2. Executar indefinidamente. Embora o Revoke Snap não seja uma implementação destinada a rodar continuamente em segundo plano, a liquidação de transações na blockchain leva tempo e o MetaMask Snaps possui um kill-switch integrado após 60s, o que pode não ser suficiente para finalizar as transações. Essa permissão permite que o RevokeSnap contorne essa medida de segurança.

Após receber as permissões necessárias, o RevokeSnap gerará um número de contas a partir da chave privada do usuário:


// Get chosen amount of wallets (signers) from provider (in this case Metamask)
export async function getSigners(provider: ethers.providers.Provider, amount: number): Promise<Wallet[]> {
    let wallets: Wallet[] = [];

    for (let i=0; i<amount; i++) {
        wallets.push(await getSigner(provider, i));
    }

    return wallets;
}

// Exctract addresses out of wallets
export function getAddresses(wallets: Wallet[]): string[] {
    let addresses: string[] = [];

    for (let i=0; i<wallets.length; i++) {
        addresses.push(wallets[i].address);
    }

    return addresses;
}
Copiar

// Fetch parent key from Metamask and generate a wallet from it, base on the input index
export async function getSigner(provider: ethers.providers.Provider, index: number): Promise<Wallet> {
    // Metamask uses default HD derivation path
    // https://support.metamask.io/managing-my-wallet/secret-recovery-phrase-and-private-keys/importing-a-seed-phrase-from-another-wallet-software-derivation-path/
    const ethereumNode = (await wallet.request({
      method: 'snap_getBip44Entropy_60',
    })) as unknown as BIP44CoinTypeNode;
    const deriveEthereumAccount = await getBIP44AddressKeyDeriver(ethereumNode);
    // A bug:
    // The current public version of @metamask/key-tree's derive function returns the private key and chain code in a single buffer
    // Ether.js also accepts a 64 byte buffer without errors and returns wrong keys
    // Related issue: https://github.com/ethers-io/ethers.js/issues/2926
    // TODO(ritave): Update to newest key-tree when available and use deriveEthereumAccount(0).privateKey
    const mainAccountKey = (await deriveEthereumAccount(index)).privateKey;
    return new Wallet(mainAccountKey, provider);
  }
Copiar

Em seguida, realizará uma verificação das aprovações restantes e, assim que a busca for concluída, exibirá um botão para revogar todas as aprovações identificadas.

Ao clicar no botão "Revoke All", o Snap emitirá uma série de transações correspondentes às aprovações restantes para zerá-las uma a uma. Como o Snap já possui as chaves privadas das carteiras geradas, isso não requer nenhuma confirmação adicional do usuário, além da confirmação inicial.

Quais são os próximos passos se vocês implementassem isso?

Como durante o hackathon havia apenas um tempo limitado para criar as soluções mais otimizadas, utilizamos diversas implementações funcionais que têm espaço para melhorias.

Para começar, atualmente o número de contas geradas no snap é passado como parâmetro de função e está codificado como 3. Uma opção melhor seria o snap usar uma API externa (ou um backend dedicado) para verificar o próximo nonce de transação em cada conta para uma determinada chain (ou chains) escolhida e considerar apenas os endereços com número de nonce maior que 0.

Além disso, para as aprovações, utilizamos uma lista reduzida de endereços conhecidos de tokens e agentes para demonstrar a funcionalidade, mas idealmente a verificação de aprovações deveria ser feita de forma mais abrangente. Isso poderia ser feito, por exemplo, usando uma API de provedor RPC (como a Infura) para encontrar todas as transações de aprovação e analisá-las para exibição no site.

Pode nos contar um pouco sobre você e sua equipe?

Sou o Jedi, trabalho como Lead Developer na Swix. Estou no mundo cripto desde 2017 e, a partir de 2019, mergulhei fundo e comecei a trabalhar com protocolos DeFi, principalmente no lado de Smart Contracts. Na Swix, atualmente trabalho conectando rendimentos do mercado imobiliário on-chain e trazendo novos usuários para o espaço cripto.

Sou o Adrian, trabalhei como desenvolvedor de software e arquiteto para startups pequenas e grandes empresas. Blockchain tem sido minha principal área de interesse por muitos anos, especialmente o ecossistema Ethereum.

Durante o desenvolvimento do Revoke Snap, dividimos o trabalho de forma que o Jedi focou em entender como o MetaMask Snaps funciona e em configurar os fundamentos necessários para as interações com Smart Contracts exigidas pelo nosso Snap, enquanto Adrian cuidou da interface web e do agrupamento das transações.

Quando vocês foram apresentados ao MetaMask Snaps pela primeira vez e como foi essa experiência?

Fomos apresentados ao MetaMask Snaps durante a apresentação do ETHWarsaw, que foi bastante técnica e abordou o funcionamento mais aprofundado do protocolo. Isso nos motivou a pesquisar mais sobre o assunto e, bem, aqui estamos.

O que diferencia o MetaMask Snaps de outras carteiras?

Bom… a ideia em si. O MetaMask Snaps rompe com o padrão aceito no ecossistema de extensões de carteiras browser não custodiais, que é o de que cada transação, ao interagir com aplicações web3, precisa ser aprovada individualmente pelo usuário. Além disso, a funcionalidade das carteiras fica limitada ao que a equipe por trás delas decide implementar.

O que o MetaMask Snaps traz é uma plataforma que permite a criação bottom-up de integrações nativas de carteiras para interações arbitrárias com blockchain, o que tem muita semelhança com as lojas de aplicativos mobile.

Que oportunidades vocês enxergam com o MetaMask Snaps e as possibilidades que ele abre para o espaço Web3? O que o MetaMask Snaps significa para vocês?

Um dos maiores valores agregados para o espaço cripto provenientes do MetaMask Snaps é a melhoria da UX nos protocolos cripto e DeFi. Seja habilitando o agrupamento de transações, aprovação com 1 clique para todas as transações realizadas dentro de um dApp, permitindo interações diretas com contratos ao executar compras de cartão de crédito para cripto, ou alguma outra solução ainda mais criativa — só o tempo dirá.

Acreditamos firmemente que, especialmente para os novos usuários de cripto, abstrair a complexidade e a dificuldade das interações com blockchain pode ser um divisor de águas.

Conte-nos como é construir com o MetaMask Snaps para você e sua equipe?

Um grande motivador durante a construção do Revoke Snap foi o fato de que o MetaMask Snaps ainda está em desenvolvimento e, portanto, a experimentação que fazemos agora pode ter um impacto concreto no rumo que a MetaMask, o MetaMask Snaps e, por extensão, o espaço cripto irão tomar. Foi uma boa experiência poder adicionar nossa contribuição ao futuro do web3.

Algum conselho que gostaria de compartilhar com desenvolvedores interessados em experimentar o MetaMask Snaps?

Para qualquer dev que queira experimentar o MetaMask Snaps — vá em frente. O MetaMask Snaps é bastante simples de começar usando o repositório de template disponível no GitHub, e a equipe da MetaMask também é muito prestativa. O conceito em si tem um grande potencial e ainda não há tanto que tenha sido feito com ele, então é fácil agregar valor.

Construindo com MetaMask Snaps

Para começar com o MetaMask Snaps:

  1. Confira a documentação para desenvolvedores

  2. Instale o MetaMask Flask

  3. Confira um guia do MetaMask Snaps

  4. Fique conectado conosco no Twitter, nas discussões do GitHub e no Discord

Fique de olho em nossa equipe no próximo hackathon perto de você! Bom BUIDLing ⚒️

Aviso legal: Os MetaMask Snaps são geralmente desenvolvidos por terceiros que não a Consensys Software. O uso de MetaMask Snaps desenvolvidos por terceiros é feito a seu próprio critério e risco, e com o entendimento de que você será o único responsável por qualquer perda ou dano resultante de tais atividades. A Consensys não oferece nenhuma garantia expressa ou implícita, seja verbal ou escrita, em relação a qualquer MetaMask Snap desenvolvido por terceiros, e se isenta de toda responsabilidade por MetaMask Snaps desenvolvidos por terceiros. O uso de softwares relacionados a blockchain envolve riscos, e você os assume integralmente ao usar o MetaMask Snaps.

Traduzido por IA. Pode conter erros. Por favor, verifique sempre as informações.

Avalie a tradução

Este artigo foi escrito por:

  • MetaMask

    A MetaMask, anteriormente Consensys Software Inc, é a maior plataforma financeira self-custodial do mundo, oferecendo às pessoas um único lugar para guardar, gastar, economizar e fazer seu dinheiro crescer em ativos cripto e tradicionais. A empresa está construindo a plataforma de consumo onde isso acontece, reunindo pagamentos, poupança, investimentos e ativos digitais em uma experiência integrada e fluida. Tendo crescido a partir da carteira self-custodial mais amplamente utilizada do mundo, a MetaMask oferece aos usuários controle direto sobre seu dinheiro e ativos, com alcance em aproximadamente 190 países. A MetaMask desempenhou um papel fundamental no crescimento do Ethereum desde 2016. Hoje, a MetaMask está no centro da economia blockchain, construindo o sistema operacional para o Open Money e colocando as pessoas em total controle de suas vidas financeiras.

    Ler todos os artigos