Saltar al contenido principal

Tu contrato y su despliegue

Una vez tienes el entorno listo y la red local corriendo, el siguiente paso depende de la modalidad que hayas elegido para tu caso de uso.

Si todavía no has elegido modalidad, consulta primero Modalidades de despliegue.


Modalidad 1: Proxy Diamond con librería ISBE

La ruta recomendada para la mayoría de casos. Tu contrato se despliega como un facet del Diamond de Gobernanza de ISBE, heredando automáticamente los mecanismos de pausa, RBAC y conformidad de la red.

Adapta el template a tu caso de uso

El repositorio template incluye contracts/project-contracts/ como punto de partida. Debes adaptarlo siguiendo el patrón de 4 ficheros:

IProject.sol          → IMyUseCase.sol        (interfaz pública: tipos, eventos, errores, firmas)
ProjectInternal.sol → MyUseCaseInternal.sol (storage Diamond + funciones internas _)
Project.sol → MyUseCase.sol (capa externa: guards whenNotPaused + onlyRole)
ProjectFacet.sol → MyUseCaseFacet.sol (facet desplegable: IEIP2535Introspection)

Los requisitos concretos de cada capa están en la documentación de Modalidad 1.

Pasos de adaptación:

  1. Renombra los ficheros y actualiza todas las referencias internas.
  2. Define tus constantes en contracts/constants/constants.sol con el patrón isbe.customers.{cliente}.{casoDeUso}.{cosa}.
  3. Implementa tu lógica — storage en Internal, funciones externas con guards en el contrato principal.
  4. Rellena selectorsIntrospection() en el Facet con todas las funciones external. Si falta alguna, esa función no será enrutable a través del proxy.
  5. Compila y verifica: npx hardhat compile

Despliega con el script incluido

Para Modalidad 1 el despliegue no es un deploy estándar de Hardhat — el contrato se registra en el Diamond mediante 3 transacciones específicas. El template incluye un script que gestiona este proceso automáticamente.

Actualiza scripts/project/deployContracts.ts con los hashes de tus constantes:

// Calcula los valores con Node.js:
// node -e "const { ethers } = require('ethers'); console.log(ethers.id('isbe.customers.acme.invoicing.resolver.key'))"

const PROJECT_RESOLVER_KEY = '0x...' // keccak256 de tu resolver key
const PROJECT_CONFIG_ID = '0x...' // keccak256 de tu config ID

Y actualiza el nombre del facet:

const projectArtifact = await artifacts.readArtifact('MyUseCaseFacet')

Luego ejecuta:

npx hardhat run scripts/project/deployContracts.ts --network isbe

El script realiza los 3 pasos automáticamente:

  1. deploy — registra el bytecode de tu facet en el Diamond con el resolver key
  2. setConfiguration — asocia el resolver key con el config ID
  3. deployUseCase — despliega el proxy que enruta las llamadas al facet

Al finalizar muestra la dirección del proxy. Esa es la dirección con la que interactúan tus clientes.


Modalidad 2: Contrato propio homologado

Para casos donde la lógica de negocio no encaja en la librería ISBE. Antes del despliegue, el equipo de ISBE revisa el contrato.

Cumple los requisitos

Tu contrato debe exponer obligatoriamente:

  • hasRole(bytes32 role, address account) external view returns (bool) — control de acceso compatible con IAccessControl
  • pause() y unpause() — implementación de IPause
  • PAUSER_ROLE asignado a la dirección de gobernanza de ISBE

Los requisitos completos y el proceso de homologación están en Modalidad 2: Contrato homologado.

Despliega de manera estándar

Una vez el contrato cumple los requisitos, el despliegue se hace de la forma habitual en Hardhat — sin los 3 pasos del Diamond. Puedes usar un script de deploy estándar:

import { ethers } from 'hardhat'

async function main() {
const factory = await ethers.getContractFactory('MyContract')
const contract = await factory.deploy(/* constructor args */)
await contract.waitForDeployment()
console.log('Deployed at:', await contract.getAddress())
}

main().catch(console.error)
npx hardhat run scripts/deploy.ts --network isbe

Entrega el contrato desplegado y la documentación de entregables al equipo de ISBE para que completen el proceso de homologación.


Modalidad 3: Despliegue directo

Para PoCs, entornos de prueba o casos sin requisitos de conformidad institucional.

No hay requisitos de arquitectura

Desarrolla tu contrato libremente con cualquier stack (Hardhat, Foundry, Remix). No necesitas seguir el patrón Diamond ni implementar IPause o IAccessControl.

Despliega de manera estándar

El despliegue es el mismo que en Modalidad 2 — un script de Hardhat estándar o cualquier otro mecanismo habitual.

Ten en cuenta las implicaciones de control que esto conlleva: consulta Modalidad 3: Despliegue directo.