Lock.sol
Este es un ejemplo de un contrato de bloqueo (Lock.sol
) utilizando el framework HardHat. A lo largo de este tutorial, construiremos este contrato paso a paso, explicando cada componente clave.
Declaración del contrato
Primero, declaramos nuestro contrato utilizando la palabra reservada contract
. Este es el bloque base de cualquier contrato en Solidity.
Licencia SPDX
Antes de comenzar con el contrato, es buena práctica agregar un comentario con el identificador de licencia SPDX
, lo cual es obligatorio en Solidity para especificar la licencia del código fuente.
Versión de Solidity
Para que el compilador sepa qué versión de Solidity utilizar, debemos especificar la versión del compilador con la declaración pragma solidity
. En este caso, permitimos cualquier versión igual o superior a 0.8.24
, pero inferior a 0.9.0
.
Variables de estado
Añadimos una variable de estado llamada unlockTime
. Las variables de estado son aquellas que se almacenan en la blockchain y persisten entre las llamadas de función. En este caso, unlockTime
almacenará el tiempo específico en el cual se podrá desbloquear el contrato.
Constructor del contrato
Añadimos un constructor
, que es una función especial que se ejecuta solo una vez cuando se despliega el contrato. Aquí, permitimos que se pase un parámetro _unlockTime
para establecer el valor de unlockTime
al momento de la creación del contrato.
Propietario del contrato
Añadimos una variable de estado llamada owner
para almacenar la dirección del propietario del contrato. Asignamos esta dirección en el constructor, utilizando msg.sender
, que es la dirección que despliega el contrato.
Función de retiro
Añadimos una función withdraw()
que permitirá al propietario retirar los fondos del contrato. En esta etapa, la función no tiene restricciones adicionales.
Validación de unlockTime
Agregamos la primera validación en el constructor. Utilizamos require
para asegurarnos de que el tiempo de desbloqueo esté en el futuro. Si esta condición no se cumple, la transacción se revertirá.
Evento de retiro
Añadimos un evento llamado Withdrawal
para registrar información sobre cada retiro realizado desde el contrato. Emitimos este evento dentro de la función withdraw()
para que los registros sean accesibles fuera del contrato.
Restricción de tiempo en retiro
Añadimos otra validación en la función withdraw()
. Utilizamos require
para asegurarnos de que los fondos solo se puedan retirar después de que se haya alcanzado unlockTime
.
Restricción de propietario en retiro
Finalmente, añadimos una validación adicional para asegurarnos de que solo el propietario del contrato pueda realizar el retiro.
contract Lock {}
Lock.sol
Hemos completado el contrato Lock.sol
. Este contrato es un ejemplo sencillo pero efectivo de cómo bloquear fondos en un contrato inteligente hasta un tiempo específico. Hemos cubierto las partes fundamentales de un contrato en Solidity, desde la declaración de variables y constructores hasta la implementación de funciones y eventos. Este ejemplo es una buena base para entender conceptos más avanzados en el desarrollo de contratos inteligentes.