Saltar al contenido

Revoke Snap: Revocar aprobaciones pendientes en contratos de tokens ERC20

Un Snap del ETHWarsaw Hackathon que permite a los usuarios revocar aprobaciones de contratos sobrantes.

7 min de lectura
Revoke Snap: Revocar aprobaciones pendientes en contratos de tokens ERC20

MetaMask Snaps es la hoja de ruta para convertir a MetaMask en la wallet más extensible del mundo. Como desarrollador, puedes integrar tus funcionalidades y APIs en MetaMask de formas completamente nuevas. Los desarrolladores de Web3 son el núcleo de este crecimiento, y esta serie tiene como objetivo destacar los innovadores MetaMask Snaps que se están construyendo hoy en día.

Revoke Snap con Swix Jedi y Adrian

Conversamos con el desarrollador Web3 Swix Jedi y Adrian, quienes construyeron el Revoke Snap en el ETHWarsaw Hackathon.

Repositorio del Snap: https://github.com/SwixJedi/revokesnap

¿Por qué lo construyeron?

Para garantizar la seguridad en el uso de tokens por parte de actores externos, los estándares de tokens ERC20 implementan una allowance (permiso de gasto), mediante la cual el propietario del token debe aprobar que un actor (por ejemplo, un smart contract de un DEX) pueda utilizar sus tokens hasta un límite elegido.

Con el fin de mejorar la experiencia de usuario en DeFi, que puede resultar algo engorrosa, muchos protocolos DeFi utilizan el valor máximo de 256 unidades para las aprobaciones, de modo que el usuario no tenga que aprobar tokens ni gastar dinero en gas fees innecesarias cada vez que desee interactuar con sus contratos.

Esto es especialmente relevante para los usuarios activos de DeFi, quienes pueden crear fácilmente una situación en la que, tras utilizar dichos protocolos, queden algunas aprobaciones residuales, lo que representa una potencial amenaza de seguridad.

Si bien existen soluciones para ayudar a los usuarios a gestionar las allowances residuales, solo algunas ofrecen la posibilidad de revocarlas directamente desde la interfaz de usuario. El proceso es lento, ya que cada aprobación debe gestionarse de forma individual y confirmarse manualmente. Aunque este enfoque es seguro, requiere una interacción manual constante por parte del usuario.

Esto fue lo que nos llevó a identificar un nicho sin cubrir donde podíamos aprovechar las capacidades de MetaMask Snaps para mejorar la situación.

¿Pueden explicarnos la implementación técnica?

Decidimos aprovechar las siguientes ventajas de MetaMask Snaps:

  • Acceso a todas las cuentas en MetaMask

  • Capacidad para realizar operaciones complejas con una única aprobación del usuario

Para proponer una solución a este problema que, en el futuro, permita:

  • Mostrar solo un prompt al usuario para obtener acceso a todas las cuentas actuales y futuras (con la excepción notable de las hardware wallets)

  • Revocar todas las aprobaciones de todas las cuentas actuales en lote, sin necesidad de confirmaciones separadas ni cambios de cuenta

  • Monitorear activamente todas las cuentas del usuario (incluidas las de hardware wallets) en busca de nuevas aprobaciones y mostrar una notificación al usuario cuando se detecten.

Al instalar el Revoke Snap a través de la interfaz web, MetaMask solicitará los permisos necesarios.

Todos los permisos se especifican en un archivo snap.manifest.json:

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

Dos permisos que vale la pena destacar son:

1. Controlar tus cuentas y activos de "Ethereum". Esto significa que, para funcionar, nuestro snap requiere la clave maestra (clave secreta) del usuario en MetaMask, con el fin de poder generar cuentas y firmar transacciones en nombre del usuario.

2. Ejecutarse indefinidamente. Si bien el Revoke Snap no está diseñado para ejecutarse continuamente en segundo plano, la liquidación de transacciones en la blockchain lleva tiempo y MetaMask Snaps tiene un kill-switch integrado que se activa tras 60 segundos, lo cual puede no ser suficiente para finalizar las transacciones. Este permiso permite que RevokeSnap evite esa medida de seguridad.

Tras recibir los permisos necesarios, RevokeSnap generará un número de cuentas a partir de la clave privada del usuario:


// 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

Luego realizará una verificación de las aprobaciones residuales y, una vez completada la búsqueda, mostrará un botón para revocar todas las aprobaciones identificadas.

Al hacer clic en el botón "Revoke All", el Snap emitirá una serie de transacciones correspondientes a las aprobaciones residuales para llevarlas a cero una por una. Como el Snap ya tiene en su poder las claves privadas de las wallets generadas, esto no requiere ninguna confirmación adicional por parte del usuario, más allá de la inicial.

¿Cuáles serían los próximos pasos si implementaran esto?

Dado que durante el hackathon el tiempo disponible era limitado para crear las soluciones más óptimas, utilizamos varias implementaciones funcionales que tienen margen de mejora.

Para empezar, actualmente el número de cuentas generadas en el snap se pasa como parámetro de función y está codificado de forma fija como 3. Una mejor opción sería que el snap utilice una API externa (o un backend dedicado) para verificar el nonce de la siguiente transacción en cada cuenta para una cadena o cadenas elegidas, y solo tener en cuenta las direcciones con un número de nonce mayor que 0.

Además, para las aprobaciones utilizamos una lista reducida de direcciones conocidas de tokens y actores para demostrar la funcionalidad, pero de manera óptima la verificación de aprobaciones debería realizarse de forma más global. Esto podría hacerse, por ejemplo, utilizando una API de un proveedor RPC (como Infura) para encontrar todas las transacciones de aprobación y procesarlas para mostrarlas en el sitio web.

¿Pueden contarnos un poco sobre ustedes y su equipo?

Soy Jedi, trabajo como Lead Developer en Swix. Llevo en el mundo cripto desde 2017, y desde 2019 caí en el rabbit hole y comencé a trabajar con protocolos DeFi, principalmente en el lado de los Smart Contracts. En Swix actualmente estoy trabajando en llevar los rendimientos del sector inmobiliario a la blockchain y en incorporar nuevos usuarios al espacio cripto.

Soy Adrian, he trabajado como desarrollador de software y arquitecto para startups pequeñas y grandes empresas. Blockchain ha sido mi principal área de interés durante muchos años, en particular el ecosistema de Ethereum.

Durante el desarrollo del Revoke Snap dividimos el trabajo de modo que Jedi se enfocó en entender el funcionamiento de MetaMask Snaps y en establecer las bases necesarias para las interacciones con Smart Contracts requeridas dentro de nuestro Snap, mientras que Adrian se encargó de la interfaz web y del bundling de las transacciones.

¿Cuándo conocieron MetaMask Snaps por primera vez y cómo fue esa experiencia?

Conocimos MetaMask Snaps por primera vez durante la presentación de ETHWarsaw, que fue bastante técnica y abarcó el funcionamiento interno más detallado del protocolo. Esto nos motivó a investigar más sobre el tema y, bueno, aquí estamos.

¿Qué diferencia a MetaMask Snaps de otras wallets?

La idea en sí misma. MetaMask Snaps rompe con el estándar aceptado en el ecosistema de extensiones de browser wallets no custodiales, que establece que cada transacción al interactuar con aplicaciones web3 debe ser aprobada individualmente por el usuario. Además, la funcionalidad de las wallets está limitada a lo que el equipo detrás de ellas decide implementar.

Lo que MetaMask Snaps pone sobre la mesa es una plataforma que permite la creación bottom-up de integraciones nativas de wallet para interacciones arbitrarias con blockchain, lo cual tiene un gran parecido con las tiendas de aplicaciones móviles.

¿Qué oportunidades ven con MetaMask Snaps y las posibilidades que abre para el espacio Web3? ¿Qué significa MetaMask Snaps para ustedes?

Uno de los mayores valores añadidos para el espacio cripto que provienen de MetaMask Snaps es la mejora de la UX en los protocolos cripto y DeFi. Ya sea habilitando el bundling de transacciones, la aprobación con un solo clic para todas las transacciones realizadas dentro de una dApp, permitiendo interacciones directas con contratos al ejecutar compras de cripto con tarjeta de crédito, u alguna otra solución aún más creativa, solo el tiempo lo dirá.

Creemos firmemente que, especialmente para los nuevos usuarios de cripto, abstraer la complejidad y la dificultad de las interacciones con blockchain puede ser un game changer.

Cuéntennos cómo es para ustedes y su equipo construir con MetaMask Snaps.

Un gran motivador al construir el Revoke Snap fue que MetaMask Snaps aún está en desarrollo y, por lo tanto, la experimentación que hacemos ahora puede tener un impacto tangible en el rumbo que tomarán MetaMask, MetaMask Snaps y, a través de ellos en cierta medida, el espacio cripto. Fue una buena experiencia poder aportar nuestro granito de arena al futuro de web3.

¿Algún consejo que quieran compartir con los desarrolladores interesados en probar MetaMask Snaps?

Para cualquier desarrollador que quiera probar MetaMask Snaps: ¡adelante! MetaMask Snaps es bastante sencillo para comenzar gracias al repositorio de plantillas disponible en GitHub, y el equipo de MetaMask también es muy colaborativo. El concepto en sí tiene un gran potencial y todavía no se ha hecho tanto con él, por lo que es fácil aportar valor.

Construyendo con MetaMask Snaps

Para comenzar con MetaMask Snaps:

  1. Consulta la documentación para desarrolladores

  2. Instala MetaMask Flask

  3. Revisa una guía de MetaMask Snaps

  4. Mantente conectado con nosotros en Twitter, GitHub discussions y Discord

¡Estén atentos a nuestro equipo en el próximo hackathon cerca de ustedes! ¡Feliz BUIDLing! ⚒️

Aviso legal: MetaMask Snaps son generalmente desarrollados por terceros distintos a Consensys Software. El uso de MetaMask Snaps desarrollados por terceros se realiza a tu propia discreción y riesgo, y con el acuerdo de que serás el único responsable de cualquier pérdida o daño que resulte de dichas actividades. Consensys no otorga ninguna garantía expresa o implícita, ya sea oral o escrita, con respecto a los MetaMask Snaps desarrollados por terceros, y renuncia a toda responsabilidad por los MetaMask Snaps desarrollados por terceros. El uso de software relacionado con blockchain conlleva riesgos, y tú los asumes en su totalidad al utilizar MetaMask Snaps.

Traducido por IA. Puede contener errores. Por favor, verifique siempre la información.

Califica la traducción

Este artículo fue escrito por:

  • MetaMask

    MetaMask, anteriormente Consensys Software Inc, es la plataforma financiera self-custodial más grande del mundo, que ofrece a las personas un único lugar para guardar, gastar, ahorrar y hacer crecer su dinero tanto en criptoactivos como en activos tradicionales. La compañía está construyendo la plataforma de consumo donde esto ocurre, reuniendo pagos, ahorros, inversiones y activos digitales en una experiencia fluida y unificada. Habiendo crecido a partir de la wallet self-custodial más utilizada del mundo, MetaMask otorga a los usuarios control directo sobre su dinero y activos, con presencia en aproximadamente 190 países. MetaMask ha desempeñado un papel fundamental en el crecimiento de Ethereum desde 2016. Hoy, MetaMask se sitúa en el centro de la economía blockchain, construyendo el sistema operativo para el Open Money y poniendo a las personas en pleno control de su vida financiera.

    Leer todos los artículos