El siguiente script es de un tutorial de Patrick Collins sobre la creación de NFT. la fuente de este código es https://github.com/PatrickAlphaC/all-on-chain-generated-nft/blob/main/deploy/02_Deploy_RandomSVG.js
en los scripts que implementan contratos, el autor usa un patrón similar a este:
let { networkConfig, getNetworkIdFromName } = require('../helper-hardhat-config') const fs = require('fs') module.exports = async ({ getNamedAccounts, deployments, getChainId }) => { const { deploy, get, log } = deployments const { deployer } = await getNamedAccounts() const chainId = await getChainId() ... ... const VRFCoordinatorMock = await deployments.get('VRFCoordinatorMock') ... ...Estoy tratando de entender lo que está pasando debajo del capó con:
{ getNamedAccounts, deployments, getChainId }Parece que algún objeto se está desempaquetando/desconstruyendo (?). No pude encontrar ninguna documentación sobre lo que es, o si lo hice, es demasiado complejo para que lo entienda.
¿Puede alguien decirme a dónde se exporta esta función asíncrona y quién requerirá (es decir, llamará) esta función?
Si las 3 propiedades anteriores se deconstruyeron a partir de algún objeto, ¿cuál es ese objeto? ¿Cómo encaja en la imagen más grande de Hardhat?
Recientemente estuve asistiendo al curso de blockchain de Patrick Collins sobre FCC, y me pregunté lo mismo.
Hardhat es un entorno de desarrollo que le permite ejecutar y crear tareas como la yarn hardhat deploy . Sin embargo, también puede agregar complementos a Hardhat que amplíen su funcionalidad.
En el curso, Patrick usa el complemento hardhat-deploy que agrega los campos para los que está tratando de encontrar documentación. No encontrará ninguna documentación con respecto a estos campos en el sitio web de Hardhat, ya que no está integrada en Hardhat. Aquí hay un enlace a los documentos del complemento :)
hardhat-deploy ejecuta la función asíncrona cuando ejecuta yarn hardhat deploy . El complemento hardhat-deploy ejecutará cualquier script de implementación que esté en /deploy . Cuando se ejecutan estas funciones, Hardhat automáticamente pasará el objeto hre a la función como un parámetro. hardhat-deploy extiende el objeto hre agregando 4 nuevos campos :
La documentación para estos campos se puede encontrar en la documentación que vinculé anteriormente.
Con respecto a lo que se pasa el objeto, este es un resumen en el sitio web de Hardhat: "El entorno de tiempo de ejecución de Hardhat, o HRE para abreviar, es un objeto que contiene toda la funcionalidad que Hardhat expone cuando ejecuta una tarea, prueba o secuencia de comandos. . En realidad, Hardhat es el HRE".
Así que esta parte aquí:
module.exports = async ({ getNamedAccounts, deployments, getChainId }) => {Está exportando una función asíncrona anónima, que toma como parámetro un objeto que tiene esas tres claves.
Ese objeto podría verse así, por ejemplo:
{ getNamedAccounts: async () => { fetch(...) }, deployments: { get: (name) => { ... } }, getChainId: async () => { fetch(...) } } Entonces, digamos que el archivo donde se encuentra esa exportación se llama DeploymentCoordinator.js , una forma en que podría usarlo, digamos que su index.js es:
var coordinator = require('./DeploymentCoordinator.js'); var someResult = await coordinator({ getNamedAccounts: async () => { fetch(...) }, deployments: { get: (name) => { ... } }, getChainId: async () => { fetch(...) } }); Además, si mira aquí https://github.com/PatrickAlphaC/all-on-chain-generated-nft/blob/main/test/RandomSVG_test.js , puede ver que al menos las implementaciones y getChainId parecen provenir simplemente de const { deployments, getChainId } = require('hardhat') en la parte superior.