# Desplegar un contrato con Foundry o Hardhat

> Source: https://docs.blockvectra.com/es/guides/deploy-contract/

## Seleccionar la red

Siga la guía de integración de la cadena de destino (disponible en [Cadenas admitidas](https://docs.blockvectra.com/es/chains/)) para crear `network.mjs` y exportar `RPC_URL` y `CHAIN_ID`. Las guías de cadenas leen el chain ID y la política de métodos de [GET /v1/chains](https://api.blockvectra.com/v1/chains) y explican el token de gas, si se requiere un RPC independiente para transmitir transacciones y los ajustes de despliegue específicos de cada cadena.

Elija una de las herramientas siguientes. Ambas despliegan el mismo contrato pequeño sin argumentos de constructor.

Proporcione al desplegador fondos en el token de gas nativo de la red seleccionada. Defina `DEPLOYER_PRIVATE_KEY` de forma segura en su entorno local; nunca la incluya en un commit. Los comandos siguientes transmiten una transacción y consumen gas.

Cree `Hello.sol` sin argumentos de constructor:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract Hello {
    event Ping(address indexed sender);
    function ping() external { emit Ping(msg.sender); }
    function hello() external pure returns (string memory) {
        return "hello";
    }
}
```

### Foundry

En un proyecto Foundry inicializado, coloque el contrato en `src/Hello.sol` y use este `foundry.toml`:

```toml
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc_version = "0.8.24"
evm_version = "paris"

[rpc_endpoints]
target = "${RPC_URL}"
```

```bash
: "${RPC_URL:?Set RPC_URL}" "${CHAIN_ID:?Set CHAIN_ID}" "${DEPLOYER_PRIVATE_KEY:?Set deployer key}"
test "$(cast chain-id --rpc-url "$RPC_URL")" = "$CHAIN_ID" || exit 1
forge build
forge create src/Hello.sol:Hello --rpc-url target \
  --chain "$CHAIN_ID" --private-key "$DEPLOYER_PRIVATE_KEY" --broadcast
```

Guarde el hash de la transacción y la dirección desplegada. Use `cast receipt "$TX_HASH" --rpc-url "$RPC_URL"` para comprobar la inclusión y el estado, y después `cast call "$CONTRACT_ADDRESS" "hello()(string)" --rpc-url "$RPC_URL"` para leer el contrato. Defina estas dos variables a partir de la salida del despliegue.

### Hardhat 2 con ethers 6

En un proyecto CommonJS independiente (`npm init -y`), instale `npm install --save-dev hardhat@2 @nomicfoundation/hardhat-ethers@3 ethers@6`. Coloque el mismo contrato en `contracts/Hello.sol`. Guarde lo siguiente como `hardhat.config.cjs`:

```js
require('@nomicfoundation/hardhat-ethers');
const { RPC_URL, CHAIN_ID, DEPLOYER_PRIVATE_KEY } = process.env;
if (!RPC_URL || !/^[1-9][0-9]*$/.test(CHAIN_ID ?? '') || !DEPLOYER_PRIVATE_KEY) {
  throw new Error('Set RPC_URL, CHAIN_ID and DEPLOYER_PRIVATE_KEY');
}
module.exports = {
  solidity: { version: '0.8.24', settings: { evmVersion: 'paris' } },
  networks: {
    target: { url: RPC_URL, chainId: Number(CHAIN_ID), accounts: [DEPLOYER_PRIVATE_KEY] },
  },
};
```

Cree el directorio `scripts` y guarde lo siguiente como `scripts/deploy.cjs`:

```js
const { ethers } = require('hardhat');
async function main() {
  const contract = await ethers.deployContract('Hello');
  console.log(contract.deploymentTransaction().hash);
  await contract.waitForDeployment();
  console.log(await contract.getAddress());
}
main().catch(error => { console.error(error); process.exitCode = 1; });
```

```bash
npx hardhat compile
npx hardhat run scripts/deploy.cjs --network target
```

El `chainId` de la red se comprueba frente al RPC. Consulte los [ajustes de red de Hardhat 2](https://v2.hardhat.org/hardhat-runner/docs/config) y los [ajustes de Foundry](https://www.getfoundry.sh/config/index.html) (consultado el 2026-10-07).

## Leer eventos

Defina `LOG_ADDRESS` con la dirección desplegada. Siga el método de lectura de eventos de la guía de la cadena de destino (suscripción WebSocket o sondeo HTTP por segmentos, según el campo `ws` de la cadena en `/v1/chains`) para leer los eventos `Ping` después de llamar a `ping()`.
