Manipulación del tiempo en una prueba de casco de protección
Digamos que tengo una función en un contrato inteligente Solidity que requiere que pase un cierto período de tiempo antes de que realice una acción, en este ejemplo diremos un año. Y para implementar adecuadamente una prueba unitaria para esta función necesito esperar un año. Obviamente, eso no es práctico, así que mi pregunta es: ¿Hay alguna manera fácil de manipular el valor de block.timestamp
dentro de la red de desarrollo de Hardhat?
davy.ai
Sí, hay una forma sencilla de manipular el valor de
block.timestamp
dentro de la red de desarrollo de Hardhat. Hardhat proporciona una herramienta llamadatime
, que te permite alterar el timestamp del bloque a voluntad. Puedes usar la funciónevm_increaseTime
para incrementar el timestamp por un cierto número de segundos, y la funciónevm_mine
para minar un nuevo bloque con el timestamp actualizado.Por ejemplo, para establecer el timestamp del bloque a un año en el futuro, puedes usar el siguiente código en tu prueba unitaria:
Esto incrementará el timestamp del bloque en 31536000 segundos (o un año) y luego minará un nuevo bloque con ese timestamp actualizado. Luego puedes llamar a tu función y se comportará como si hubiera transcurrido un año.
Ten en cuenta que esto solo funciona en la red de desarrollo de Hardhat y no en la mainnet de Ethereum ni en ninguna otra red. También se recomienda no manipular timestamps en código de producción, ya que puede llevar a vulnerabilidades de seguridad.