Mejores prácticas capturando pagos en Smart Contracts

Alberto Lasa - Blockchain/Crypto
3 min readAug 14, 2024

--

Eficacia y seguridad en la venta de tokens

Cuando programamos contratos inteligentes para la creación y venta de tokens ERC-20, ERC-721, ERC-1155, u otros. Nos surge el problema de la gestión de los pagos de los usuarios, ya sea minteando el activo en el momento o traspasándolo normalmente desde el mismo contrato.

En este artículo os dejo unas buenas prácticas para realizar esto sin peligro y con flexibilidad.

Nunca traspases el pago del usuario al beneficiario en la misma transacción.

Esto es seguro, pero quitas la posibilidad de poder bloquear los pagos en el contrato, e incluso incluir más lógicas de negocio.

En la siguiente captura, falta la implementación del chequeo del importe pagado, lo veremos en el siguiente punto más abajo.

Las funciones de withdraw las puede llamar cualquiera porque No tienen un onlyOwner(). El destinatario siempre será el owner, y al mismo tiempo posibilitas llamadas desde servicios externos automatizados.

Comprueba siempre que el importe entregado por el usuario es el correcto en base al precio y el número de tokens comprados.

Pagando con ETH u otra criptomoneda nativa compatible con EVM, realiza siempre un require comprobando que el value coincide con la multiplicación. También podrías optar por una comprobación de tipo >= y retornar el cambio, yo prefiero una coincidencia exacta.

Si el usuario paga con un token ERC-20, al llamar a la función transferFrom acuérdate de hacer la multiplicación y encapsular la llamada en un require.

Si los usuarios pueden pagar con tokens ERC-20 como las stablecoins, debes implementar la retirada de cualquier token.

Esta practica te evitará posibles bloqueos de pagos para siempre en el contrato. Hardcodear la address sin pasarla como parámetro te dará opción solo a un token. Esto adquiere aún más importancia si existen royalties (ERC-2981) ya que ese estándar no establece el token de pago. Los marketplaces puede tener pagos con sus propias lógicas y marcar los precios con sus listas de monedas (tokens).

Igualmente deberías implementar las funciones de withdraw vistas en el punto uno para la retirada de criptomoneda nativa.

Como medida general, dentro de la función, SIEMPRE ejecuta las comprobaciones y los pagos antes de mintear, transferir tokens, o realizar cualquier otra acción. Esta práctica evita ataques para drenar o mintear indefinidamente sin coste.

Sígueme también en:

--

--

Alberto Lasa - Blockchain/Crypto

Programación de Smart Contracts y Dapps sobre Ethereum: Solidity, Truffle, Web3.js, Node.js, Angular, React, JavaScript, TypeScript, Google Cloud, etc..