{"version":3,"file":"index.node.cjs","names":["CWD: string","MINER_PUBLIC_KEY: string","DEVNET_PUBLIC_PORT: number","MINING_CLIENT_IMAGE: string","CHAINWEB_NODE_IMAGE: string","MINING_TRIGGER_IMAGE: string","DEVNET_CONFIGS_DIR: string","MINIMAL_NETWORK_NAME: string","MINIMAL_CLUSTER_ID: string","SERVICES_CONFIG_FILE: string","NODE_SERVICE_PORT: number","P2P_PORT: number","MINING_CLIENT_PORT: number","MINING_TRIGGER_PORT: number","networkConfig: NetworkConfig","certPath: string","keyPath: string","error: any","certFilePath: string","keyFilePath: string","checkPrivateRedeclaration","_classPrivateMethodInitSpec","_typeof","o","_typeof","toPrimitive","toPropertyKey","_defineProperty","_classPrivateFieldInitSpec","_assertClassBrand","assertClassBrand","networkConfig: DevNetworkConfig","options: LocalDevNetNetworkOptions","ContainerOrchestrator","options?: ToolboxNetworkStartOptions","serviceConfigs: DockerServiceConfig[]","p: string","config: PactServerConfig","format: \"yaml\" | \"json\"","id: string","networkConfig: PactServerNetworkConfig","client: PactToolboxClient","options?: ToolboxNetworkStartOptions","toolboxConfig: PactToolboxConfigObj","startOptions: StartLocalNetworkOptions","defaultLogger","PactToolboxClient","options?: ToolboxNetworkStartOptions","config: PactToolboxConfigObj","options: StartLocalNetworkOptions","LogLevels","logger"],"sources":["../src/config/constants.ts","../src/config/fileTemplates.ts","../src/presets/minimal.ts","../src/config/certificate.ts","../src/utils.ts","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/checkPrivateRedeclaration.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/classPrivateMethodInitSpec.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/classPrivateFieldInitSpec.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/assertClassBrand.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/classPrivateFieldSet2.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/classPrivateFieldGet2.js","../src/networks/devnet.ts","../src/networks/pactServer.ts","../src/network.ts"],"sourcesContent":["import path from \"path\";\n\nexport const CWD: string = process.cwd();\nexport const MINER_PUBLIC_KEY: string =\n  process.env.MINER_PUBLIC_KEY || \"f89ef46927f506c70b6a58fd322450a936311dc6ac91f4ec3d8ef949608dbf1f\";\n\nexport const DEVNET_PUBLIC_PORT: number = process.env.DEVNET_PUBLIC_PORT\n  ? Number(process.env.DEVNET_PUBLIC_PORT)\n  : 8080;\nexport const MINING_CLIENT_IMAGE: string =\n  process.env.MINING_CLIENT_IMAGE || \"salamaashoush/chainweb-mining-client:latest\";\nexport const CHAINWEB_NODE_IMAGE: string = process.env.CHAINWEB_NODE_IMAGE || \"salamaashoush/chainweb-node:latest\";\nexport const MINING_TRIGGER_IMAGE: string = process.env.MINING_TRIGGER_IMAGE || \"salamaashoush/mining-trigger:latest\";\nexport const DEVNET_CONFIGS_DIR: string = path.resolve(CWD, \".pact-toolbox\", \"configs\");\nexport const MINIMAL_NETWORK_NAME: string = \"devnet-minimal-network\";\nexport const MINIMAL_CLUSTER_ID: string = \"devnet-minimal\";\nexport const DEFAULT_NETWORK_NAME: string = \"devnet_default_network\";\nexport const NGINX_API_MINIMAL_CONF_NAME: string = \"nginx.api.minimal.conf\";\nexport const SERVICES_CONFIG_FILE: string = path.join(process.cwd(), \"config\", \"services.json\");\nexport const NODE_SERVICE_PORT: number = 1848;\nexport const P2P_PORT: number = 1789;\nexport const MINING_CLIENT_PORT: number = 1917;\nexport const MINING_TRIGGER_PORT: number = 1791;\nexport const MINING_CLIENT_SERVICE_NAME = \"mining-client\";\nexport const MINING_TRIGGER_SERVICE_NAME = \"mining-trigger\";\nexport const BOOTSTRAP_NODE_SERVICE_NAME = \"bootstrap-node\";\nexport const API_PROXY_SERVICE_NAME = \"api-proxy\";\n","import {\n  BOOTSTRAP_NODE_SERVICE_NAME,\n  MINING_CLIENT_PORT,\n  MINING_CLIENT_SERVICE_NAME,\n  MINING_TRIGGER_PORT,\n  MINING_TRIGGER_SERVICE_NAME,\n  NODE_SERVICE_PORT,\n  P2P_PORT,\n} from \"./constants\";\n\nexport const CHAINWEB_NODE_COMMON_YAML_CONTENT_TPL = `\nchainweb:\n  chainwebVersion: development\n  throttling:\n    global: 50\n    mempool: 20\n    putPeer: 11\n  serviceApi:\n    interface: '*'\n    port: 1848\n  p2p:\n    peer:\n      hostaddress:\n        port: 1789\n    ignoreBootstrapNodes: true\n    maxSessionCount: 2\n  mempoolP2p:\n    configuration:\n      maxSessionCount: 2\n`;\n\nexport const CHAINWEB_NODE_LOGGING_YAML_CONTENT_TPL = `\nlogging:\n  logger:\n    log_level: warn\n  backend:\n    format: json\n  telemetryBackend:\n    configuration:\n      format: json\n`;\n\ninterface NginxApiConfigContentOptions {\n  chainwebServiceName: string;\n  miningClientServiceName: string;\n  miningClientPort: number;\n  serviceApiPort: number;\n  p2pPort: number;\n  miningTriggerServiceName: string;\n  miningTriggerPort: number;\n  enableMiningTrigger: boolean;\n}\n\nexport function createNginxApiConfigContent({\n  chainwebServiceName = BOOTSTRAP_NODE_SERVICE_NAME,\n  miningClientServiceName = MINING_CLIENT_SERVICE_NAME,\n  miningTriggerServiceName = MINING_TRIGGER_SERVICE_NAME,\n  miningClientPort = MINING_CLIENT_PORT,\n  miningTriggerPort = MINING_TRIGGER_PORT,\n  serviceApiPort = NODE_SERVICE_PORT,\n  p2pPort = P2P_PORT,\n  enableMiningTrigger = false,\n}: Partial<NginxApiConfigContentOptions> = {}) {\n  return `\n# Service API endpoints\nupstream service-api {\n    server ${chainwebServiceName}:${serviceApiPort};\n}\nupstream mining-api {\n    ip_hash;\n    server ${chainwebServiceName}:${serviceApiPort};\n}\nupstream peer-api {\n    server ${chainwebServiceName}:${p2pPort};\n}\nupstream mining-client-api {\n    server ${miningClientServiceName}:${miningClientPort};\n}\n${\n  enableMiningTrigger\n    ? `upstream mining-trigger-api {\n    server ${miningTriggerServiceName}:${miningTriggerPort};\n}`\n    : \"\"\n}\nserver {\n    server_name api.devnet.chainweb.com\n    listen 80;\n\n    access_log /var/log/nginx/chainweb-api-access.log;\n    error_log /var/log/nginx/chainweb-api-error.log;\n\n    # Service API endpoints\n    location = /info {\n        proxy_pass http://service-api;\n    }\n    location = /health-check {\n        proxy_pass http://service-api;\n    }\n\n    ${\n      enableMiningTrigger\n        ? `# Mining Trigger Proxy\n    location ~ ^/chainweb/0.0/[0-9a-zA-Z-_]+/chain/[0-9]+/pact/api/v1/send {\n        proxy_pass http://mining-trigger-api;\n    }`\n        : \"\"\n    }\n\n    location ~ ^/chainweb/0.0/[0-9a-zA-Z-_]+/chain/[0-9]+/pact/ {\n        proxy_pass http://service-api;\n    }\n    location ~ ^/chainweb/0.0/[0-9a-zA-Z-_]+/chain/[0-9]+/block {\n        proxy_pass http://service-api;\n    }\n    location ~ ^/chainweb/0.0/[0-9a-zA-Z-_]+/chain/[0-9]+/(header|hash|branch|payload) {\n        proxy_pass http://service-api;\n    }\n    location ~ ^/chainweb/0.0/[0-9a-zA-Z-_]+/cut {\n        proxy_pass http://service-api;\n    }\n\n    # Optional Service APIs\n    location ~ ^/chainweb/0.0/[0-9a-zA-Z-_]+/header/updates {\n        proxy_buffering off;\n        proxy_pass http://service-api;\n    }\n\n    # Mining\n    location /chainweb/0.0/[0-9a-zA-Z-_]+/mining/ {\n        proxy_buffering off;\n        proxy_pass http://mining-api;\n    }\n\n    # Mempool\n    location ~ ^/chainweb/0.0/[0-9a-zA-Z-_]+/chain/[0-9]+/mempool/(getPending|member|lookup|insert) {\n        proxy_pass https://peer-api;\n        proxy_ssl_verify off;\n    }\n\n    # Config (P2P API)\n    location = /config {\n        proxy_pass https://peer-api;\n        # needed if self signed certificates are used for nodes:\n        proxy_ssl_verify off;\n    }\n\n    # Mining Client API\n    location = /make-blocks {\n        proxy_pass http://mining-client-api/make-blocks;\n        proxy_buffering off;\n        proxy_ssl_verify off;\n    }\n\n    # Default\n    location / {\n        return 404;\n    }\n}`;\n}\n","import type { DockerServiceConfig } from \"@pact-toolbox/utils\";\nimport {\n  CHAINWEB_NODE_IMAGE,\n  P2P_PORT,\n  MINER_PUBLIC_KEY,\n  MINING_CLIENT_IMAGE,\n  MINING_CLIENT_PORT,\n  DEVNET_PUBLIC_PORT,\n  MINIMAL_CLUSTER_ID,\n  MINIMAL_NETWORK_NAME,\n  MINING_TRIGGER_IMAGE,\n  NODE_SERVICE_PORT,\n  MINING_CLIENT_SERVICE_NAME,\n  MINING_TRIGGER_SERVICE_NAME,\n  BOOTSTRAP_NODE_SERVICE_NAME,\n  API_PROXY_SERVICE_NAME,\n  MINING_TRIGGER_PORT,\n  DEVNET_CONFIGS_DIR,\n} from \"../config/constants\";\nimport type { DevNetServiceDefinition } from \"../types\";\nimport type { DevNetMiningConfig } from \"@pact-toolbox/config\";\n\ninterface ChainwebNodeServiceOptions {\n  image: string;\n  clusterId: string;\n  networkName: string;\n  persistDb?: boolean;\n  nodeServicePort?: number;\n  p2pPort?: number;\n  volume?: string;\n}\n\nexport function createChainwebNodeService({\n  image = CHAINWEB_NODE_IMAGE,\n  clusterId = \"devnet-minimal\",\n  persistDb = true,\n  nodeServicePort = NODE_SERVICE_PORT,\n  p2pPort = P2P_PORT,\n  volume = `devnet_db_${clusterId.replace(\"-\", \"_\")}`,\n}: Partial<ChainwebNodeServiceOptions>): DockerServiceConfig {\n  return {\n    image,\n    containerName: BOOTSTRAP_NODE_SERVICE_NAME,\n    labels: {\n      \"com.chainweb.devnet.description\": \"Devnet Bootstrap Node\",\n      \"com.chainweb.devnet.node\": \"\",\n      \"com.chainweb.devnet.bootstrap-node\": \"\",\n    },\n    restart: \"unless-stopped\",\n    stopSignal: \"SIGINT\",\n    stopGracePeriod: 20,\n    ulimits: [{ Name: \"nofile\", Soft: 65535, Hard: 65535 }],\n    volumes: [\n      persistDb ? `${volume}:/chainweb/db` : undefined,\n      `${DEVNET_CONFIGS_DIR}/devnet-bootstrap-node.cert.pem:/chainweb/devnet-bootstrap-node.cert.pem:ro`,\n      `${DEVNET_CONFIGS_DIR}/devnet-bootstrap-node.key.pem:/chainweb/devnet-bootstrap-node.key.pem:ro`,\n      `${DEVNET_CONFIGS_DIR}/chainweb-node.common.yaml:/chainweb/config/chainweb-node.common.yaml:ro`,\n      `${DEVNET_CONFIGS_DIR}/chainweb-node.logging.yaml:/chainweb/config/chainweb-node.logging.yaml:ro`,\n    ].filter(Boolean) as string[],\n    entrypoint: [\n      \"/chainweb/chainweb-node\",\n      \"+RTS\",\n      \"-T\",\n      \"-H400M\",\n      \"-A64M\",\n      \"-RTS\",\n      \"--config-file=config/chainweb-node.common.yaml\",\n      \"--config-file=config/chainweb-node.logging.yaml\",\n    ],\n    command: [\n      \"--p2p-certificate-chain-file=/chainweb/devnet-bootstrap-node.cert.pem\",\n      \"--p2p-certificate-key-file=/chainweb/devnet-bootstrap-node.key.pem\",\n      `--p2p-hostname=${BOOTSTRAP_NODE_SERVICE_NAME}`,\n      \"--bootstrap-reachability=1\",\n      `--cluster-id=${clusterId}`,\n      \"--p2p-max-session-count=2\",\n      \"--mempool-p2p-max-session-count=10\",\n      `--known-peer-info=YNo7pXthYQ9RQKv1bbpQf2R5LcLYA3ppx2BL2Hf8fIM@${BOOTSTRAP_NODE_SERVICE_NAME}:${p2pPort}`,\n      \"--log-level=info\",\n      \"--enable-mining-coordination\",\n      `--mining-public-key=${MINER_PUBLIC_KEY}`,\n      \"--header-stream\",\n      \"--allowReadsInLocal\",\n      \"--database-directory=/chainweb/db\",\n      \"--disable-pow\",\n    ],\n    expose: [`${nodeServicePort}`, `${p2pPort}`],\n    environment: [\"DISABLE_POW_VALIDATION=true\"],\n    healthCheck: {\n      Test: [\n        \"CMD\",\n        \"/bin/bash\",\n        \"-c\",\n        `exec 3<>/dev/tcp/localhost/${nodeServicePort}; printf \"GET /health-check HTTP/1.1\\\\r\\\\nhost: http://localhost:${nodeServicePort}\\\\r\\\\nConnection: close\\\\r\\\\n\\\\r\\\\n\" >&3; grep -q \"200 OK\" <&3 || exit 1`,\n      ],\n      Interval: 30e9,\n      Timeout: 30e9,\n      Retries: 5,\n      StartPeriod: 120e9,\n    },\n  };\n}\n\ninterface MiningClientServiceOptions {\n  image: string;\n  onDemandMining?: boolean;\n  constantDelayBlockTime?: number;\n  miningClientPort?: number;\n  nodeServicePort?: number;\n}\n\nexport function createMiningClientService({\n  image = MINING_CLIENT_IMAGE,\n  onDemandMining = true,\n  constantDelayBlockTime = 5,\n  miningClientPort = MINING_CLIENT_PORT,\n  nodeServicePort = NODE_SERVICE_PORT,\n}: Partial<MiningClientServiceOptions> = {}): DockerServiceConfig {\n  return {\n    containerName: MINING_CLIENT_SERVICE_NAME,\n    image,\n    restart: \"unless-stopped\",\n    dependsOn: {\n      [BOOTSTRAP_NODE_SERVICE_NAME]: { condition: \"service_healthy\" },\n    },\n    // entrypoint: [\"/app/chainweb-mining-client\"],\n    command: [\n      `--public-key=${MINER_PUBLIC_KEY}`,\n      `--node=${BOOTSTRAP_NODE_SERVICE_NAME}:${nodeServicePort}`,\n      onDemandMining ? \"--worker=on-demand\" : \"--worker=constant-delay\",\n      onDemandMining ? `--on-demand-port=${miningClientPort}` : `--stratum-port=${miningClientPort}`,\n      \"--thread-count=1\",\n      \"--log-level=info\",\n      \"--no-tls\",\n      `--constant-delay-block-time=${constantDelayBlockTime}`,\n    ],\n    // healthCheck: {\n    //   Test: [\"CMD\", \"/bin/bash\", \"-c\", `curl http://localhost:${miningClientPort}/make-blocks -d '{}'`],\n    //   Interval: 30e9,\n    //   Timeout: 30e9,\n    //   Retries: 5,\n    //   StartPeriod: 120e9,\n    // },\n\n    expose: [`${miningClientPort}`],\n  };\n}\n\ninterface MiningTriggerServiceOptions {\n  miningClientUrl: string;\n  chainwebServiceEndpoint: string;\n  miningTriggerPort: number;\n  miningConfig?: DevNetMiningConfig;\n}\n\nexport function createMiningTriggerService({\n  miningClientUrl = `http://${MINING_CLIENT_SERVICE_NAME}:${MINING_CLIENT_PORT}`,\n  chainwebServiceEndpoint = `http://${BOOTSTRAP_NODE_SERVICE_NAME}:${NODE_SERVICE_PORT}`,\n  miningTriggerPort = MINING_TRIGGER_PORT,\n  miningConfig = {},\n}: Partial<MiningTriggerServiceOptions> = {}): DockerServiceConfig {\n  const {\n    transactionBatchPeriod = 0.05,\n    confirmationCount = 5,\n    confirmationPeriod = 1,\n    miningCooldown = 0.05,\n    idlePeriod = 5,\n    disableIdleWorker = false,\n    disableConfirmationWorker = false,\n  } = miningConfig;\n  return {\n    containerName: MINING_TRIGGER_SERVICE_NAME,\n    image: MINING_TRIGGER_IMAGE,\n    entrypoint: [\"/usr/local/bin/mining-trigger\"],\n    command: [\n      `--port=${miningTriggerPort}`,\n      `--mining-client-url=${miningClientUrl}`,\n      `--chainweb-service-endpoint=${chainwebServiceEndpoint}`,\n      `--idle-trigger-period=${idlePeriod}`,\n      `--confirmation-trigger-period=${confirmationPeriod}`,\n      `--transaction-batch-period=${transactionBatchPeriod}`,\n      `--confirmation-count=${confirmationCount}`,\n      `--mining-cooldown=${miningCooldown}`,\n      disableIdleWorker ? \"--disable-idle-worker\" : undefined,\n      disableConfirmationWorker ? \"--disable-confirmation-worker\" : undefined,\n      \"--dev-request-logger\",\n    ].filter(Boolean) as string[],\n    dependsOn: {\n      [BOOTSTRAP_NODE_SERVICE_NAME]: { condition: \"service_healthy\" },\n      [MINING_CLIENT_SERVICE_NAME]: { condition: \"service_healthy\" },\n    },\n    restart: \"unless-stopped\",\n    expose: [`${miningTriggerPort}`],\n  };\n}\n\ninterface ApiProxyServiceOptions {\n  image: string;\n  port: number;\n}\n\nexport function createApiProxyService({\n  image = \"nginx:alpine\",\n  port = DEVNET_PUBLIC_PORT,\n}: Partial<ApiProxyServiceOptions> = {}): DockerServiceConfig {\n  return {\n    containerName: API_PROXY_SERVICE_NAME,\n    image,\n    labels: {\n      \"com.chainweb.devnet.description\": \"Devnet API Proxy\",\n      \"com.chainweb.devnet.api-proxy\": \"\",\n    },\n    dependsOn: {\n      [BOOTSTRAP_NODE_SERVICE_NAME]: { condition: \"service_healthy\" },\n      [MINING_CLIENT_SERVICE_NAME]: { condition: \"service_healthy\" },\n      [MINING_TRIGGER_SERVICE_NAME]: { condition: \"service_healthy\" },\n    },\n    volumes: [`${DEVNET_CONFIGS_DIR}/nginx.api.minimal.conf:/etc/nginx/conf.d/default.conf:ro`],\n    ports: [\n      {\n        target: 80,\n        published: port,\n        protocol: \"tcp\",\n      },\n    ],\n  };\n}\n\ninterface MinimalDevNetOptions {\n  clusterId: string;\n  port: number;\n  networkName: string;\n  persistDb?: boolean;\n  miningConfig?: DevNetMiningConfig;\n}\n\nexport function createMinimalDevNet({\n  clusterId = MINIMAL_CLUSTER_ID,\n  port = DEVNET_PUBLIC_PORT,\n  networkName = MINIMAL_NETWORK_NAME,\n  persistDb = true,\n}: Partial<MinimalDevNetOptions> = {}): DevNetServiceDefinition {\n  const volume = `devnet_db_${clusterId.replace(\"-\", \"_\")}`;\n  return {\n    clusterId,\n    networkName,\n    volumes: persistDb ? [volume] : [],\n    services: {\n      bootstrapNode: createChainwebNodeService({\n        clusterId,\n        persistDb,\n        volume,\n      }),\n      miningClient: createMiningClientService(),\n      miningTrigger: createMiningTriggerService(),\n      apiProxy: createApiProxyService({\n        port,\n      }),\n    },\n  };\n}\n","export const DEFAULT_CERTIFICATE = `-----BEGIN CERTIFICATE-----\nMIIEujCCAqICCQDv90eHc5s8PTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRk\nZXZuZXQtYm9vc3RyYXAtbm9kZTAeFw0yMTA1MTkwMTE2MDhaFw0zMTA1MTcwMTE2\nMDhaMB8xHTAbBgNVBAMMFGRldm5ldC1ib29zdHJhcC1ub2RlMIICIjANBgkqhkiG\n9w0BAQEFAAOCAg8AMIICCgKCAgEAv/0+5U0NhPXdhdCA6vU774GMUAjzt6yZGyVF\nM7E/kR0B69OxUpNlaV5bAyZzh+Jm3GesJwulEltT7ayJqfWUiAJugi5MzzlNZW5P\nK5eyR+I4SuxFaQTzem1BFuldZi7tGlG+TBg+uuApU1E7hURKfuaVGJW8UZCADU7H\nynXXvRQmU3j6e8A3vvMXJz8duetEp8l5MM2f9vLqz5dX89QnOiKCf3XM/KeIpTR1\n2mA4O74RjI8w1/TGBiXnI0wXMLfn0Beye/Ux94w2g7fcrqeCha/tYpDmMHCCwKO5\nSdGPpO0N4ReF9cHgQGZnR/nyw2wsXSAln5cGuKIjbvx6mNKY5iqu9/7TOEspWWj0\nWf23CPgkH2vweovysltN2+S35jPbtP5wcY5RByKRxryVhn/Ea5eAUFD5T0JSc7AG\n4plo6xkkrAnNcIrJ39cmV21NO6veOlXmMXNfzsD2Vjjy5hUXTLZyvBreoamJkE/u\nyBnu1YQzuDtnucdKC1TrQi0wCopnt2JXBTcComu3WMTjV7btQeExC6Q7yhthC4yM\nQymdVQPD/MM392fEw1hsylagFKRvjPg3yju+lNpzfxlgFwldYZeZeF3MpSGjTQ4x\nWwGZHX+jgunQIsI4/d0OOwlp8+aK8q9U/tn6wjFbwFcgTnYBnOdR+UyHvXXQi0dG\nlwnPyC8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAFUidghsmNo2BnGUnioV4H0CN\nnC1gcUN7QZIRBRZPNFFI59vbUibYGMzmugkTrf5tcADWIYIs2N1XCymqFi9q6wgi\nSshaINMA8YtRK31Y2FMsZRMw2qoFXDnz1J0J6pMAM9smfRpD8nhVZrguJP5/Zko2\nwOqVCYvv/nEvIDHLfxJEtosWPbu5PTp7UQhvurGPWR8/gcBGFi0qzOCRIdQPmFzq\ndlWKPQLpkSoNYTF0TY50XE6fO4FO3b9UIIlecjU2DI6jsXqFJZ5d+aw3Tum76zX5\nJD2TOx7eY1rafc555xov3/GeqQI+iqHUEp02jdZURZzWH8bihgzG/OZwiiOn8dea\n/7nKASFWKw652gXf4NgknkYB886vgFx46vqLnGArwvsBjkEvxwwyEPlvqhxD6u4K\new702LS9pnXGkJqLuFET0q2kWkUzan7ou8qN5mBASlBvXo+ZVgyee1crDxAHMGWb\nJVR6ArsZ2htnoo8Q9JZ/OXpPKBP1RkTh4jTYvksdVv8OG/Q2ilTLwIhuxO6oix3r\n8jO9GhC7ZEVt9V/6dpMjKIcRk+9MF52PGduAjvUeGDq2fcA6bj7hciqO5x3eTQna\nZPqsJPmuRPAVCWNo9aNJlZln5Irl5PYx5cFxkBH1tt+1l7wYtHG/xI53UKUCm6rF\n1spFKNWVlQm+ZZwudck=\n-----END CERTIFICATE-----\n`;\n\nexport const DEFAULT_KEY = `-----BEGIN PRIVATE KEY-----\n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\nhRrmoqVyBZLjG0kn8PC4zP5kKDaZpWc=\n-----END PRIVATE KEY-----\n`;\n","import type { NetworkConfig } from \"@pact-toolbox/config\";\n\nimport { getNetworkPort, isDevNetworkConfig, isPactServerNetworkConfig } from \"@pact-toolbox/config\";\nimport { getRandomPort, isPortTaken, logger, writeFile } from \"@pact-toolbox/utils\";\n\nimport { access } from \"node:fs/promises\";\nimport { execSync } from \"node:child_process\";\nimport { DEFAULT_CERTIFICATE, DEFAULT_KEY } from \"./config/certificate\";\n\nexport async function ensureAvailablePorts(networkConfig: NetworkConfig): Promise<void> {\n  const port = getNetworkPort(networkConfig);\n  const isPortInUse = await isPortTaken(port);\n  if (isPortInUse) {\n    logger.warn(`Port ${port} is in use, finding a new one`);\n    if (isPactServerNetworkConfig(networkConfig)) {\n      if (networkConfig.serverConfig) {\n        networkConfig.serverConfig.port = await getRandomPort();\n      }\n    }\n    if (isDevNetworkConfig(networkConfig)) {\n      if (networkConfig.containerConfig) {\n        networkConfig.containerConfig.port = await getRandomPort();\n      }\n    }\n  }\n}\n\nasync function isOpenSSLAvailable(): Promise<boolean> {\n  try {\n    execSync(\"openssl version\", { stdio: \"ignore\" }); // stdio: \"ignore\" to prevent output\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport async function generateSelfSignedCert(certPath: string, keyPath: string): Promise<void> {\n  const openSSLAvailable = await isOpenSSLAvailable();\n  if (!openSSLAvailable) {\n    console.warn(\"OpenSSL not found/usable. Attempting to use static fallback certificates.\");\n    await Promise.all([writeFile(certPath, DEFAULT_CERTIFICATE), writeFile(keyPath, DEFAULT_KEY)]);\n    return;\n  }\n\n  const genKeyCommand = `openssl genpkey -algorithm RSA -out \"${keyPath}\" -pkeyopt rsa_keygen_bits:2048`;\n  const genCertCommand = `openssl req -new -x509 -key \"${keyPath}\" -out \"${certPath}\" -days 365 -subj \"/CN=devnet-bootstrap-node\" -nodes`;\n\n  try {\n    execSync(genKeyCommand, { stdio: \"pipe\" });\n    execSync(genCertCommand, { stdio: \"pipe\" });\n  } catch (error: any) {\n    if (error.stderr) {\n      console.error(`OpenSSL stderr: ${error.stderr.toString()}`);\n    }\n    if (error.stdout) {\n      console.error(`OpenSSL stdout: ${error.stdout.toString()}`);\n    }\n    throw new Error(`Failed to generate certificate/key using OpenSSL.`);\n  }\n}\n\nexport async function ensureCertificates(certFilePath: string, keyFilePath: string): Promise<void> {\n  try {\n    await Promise.all([access(certFilePath), access(keyFilePath)]);\n  } catch {\n    await generateSelfSignedCert(certFilePath, keyFilePath);\n  }\n}\n","function _checkPrivateRedeclaration(e, t) {\n  if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n}\nmodule.exports = _checkPrivateRedeclaration, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var checkPrivateRedeclaration = require(\"./checkPrivateRedeclaration.js\");\nfunction _classPrivateMethodInitSpec(e, a) {\n  checkPrivateRedeclaration(e, a), a.add(e);\n}\nmodule.exports = _classPrivateMethodInitSpec, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var checkPrivateRedeclaration = require(\"./checkPrivateRedeclaration.js\");\nfunction _classPrivateFieldInitSpec(e, t, a) {\n  checkPrivateRedeclaration(e, t), t.set(e, a);\n}\nmodule.exports = _classPrivateFieldInitSpec, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _assertClassBrand(e, t, n) {\n  if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n;\n  throw new TypeError(\"Private element is not present on this object\");\n}\nmodule.exports = _assertClassBrand, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var assertClassBrand = require(\"./assertClassBrand.js\");\nfunction _classPrivateFieldSet2(s, a, r) {\n  return s.set(assertClassBrand(s, a), r), r;\n}\nmodule.exports = _classPrivateFieldSet2, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var assertClassBrand = require(\"./assertClassBrand.js\");\nfunction _classPrivateFieldGet2(s, a) {\n  return s.get(assertClassBrand(s, a));\n}\nmodule.exports = _classPrivateFieldGet2, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import type { DevNetworkConfig } from \"@pact-toolbox/config\";\nimport {\n  ContainerOrchestrator,\n  didMakeBlocks,\n  ensureDir,\n  getUuid,\n  isChainWebAtHeight,\n  isChainWebNodeOk,\n  logger,\n  pollFn,\n  writeFile,\n  type DockerServiceConfig,\n  type Logger,\n  type Spinner,\n} from \"@pact-toolbox/utils\";\nimport { rm } from \"node:fs/promises\";\nimport type { PactToolboxClient } from \"@pact-toolbox/runtime\";\nimport { join } from \"pathe\";\nimport { DEVNET_CONFIGS_DIR, DEVNET_PUBLIC_PORT, MINIMAL_CLUSTER_ID, MINIMAL_NETWORK_NAME } from \"../config/constants\";\nimport {\n  CHAINWEB_NODE_COMMON_YAML_CONTENT_TPL,\n  CHAINWEB_NODE_LOGGING_YAML_CONTENT_TPL,\n  createNginxApiConfigContent,\n} from \"../config/fileTemplates\";\nimport { createMinimalDevNet } from \"../presets/minimal\";\nimport type { DevNetServiceDefinition, ToolboxNetworkApi, ToolboxNetworkStartOptions } from \"../types\";\nimport { ensureCertificates } from \"../utils\";\n\ninterface LocalDevNetNetworkOptions {\n  logger: Logger;\n  activeProfiles?: string[];\n  client: PactToolboxClient;\n  spinner: Spinner;\n}\n\nexport class LocalDevNetNetwork implements ToolboxNetworkApi {\n  public id: string = getUuid();\n  #orchestrator: ContainerOrchestrator;\n  #activeProfiles: string[];\n  #isDetached: boolean = true;\n  #definition: DevNetServiceDefinition;\n  #networkConfig: DevNetworkConfig;\n  #client: PactToolboxClient;\n  #spinner: Spinner;\n  #logger: Logger;\n\n  constructor(networkConfig: DevNetworkConfig, options: LocalDevNetNetworkOptions) {\n    this.#networkConfig = networkConfig;\n    this.#client = options.client;\n    this.#logger = options.logger;\n    this.#spinner = options.spinner;\n    this.#definition = createMinimalDevNet({\n      clusterId: MINIMAL_CLUSTER_ID,\n      networkName: MINIMAL_NETWORK_NAME,\n      port: Number(this.getServicePort()),\n      miningConfig: this.#networkConfig.miningConfig,\n    });\n    this.#orchestrator = new ContainerOrchestrator({\n      networkName: this.#definition.networkName,\n      volumes: this.#definition.volumes,\n      logger: this.#logger,\n      spinner: this.#spinner,\n    });\n    this.#activeProfiles = options.activeProfiles || [];\n  }\n\n  async #setupArtifacts(): Promise<void> {\n    await ensureDir(DEVNET_CONFIGS_DIR);\n\n    await ensureCertificates(\n      join(DEVNET_CONFIGS_DIR, \"devnet-bootstrap-node.cert.pem\"),\n      join(DEVNET_CONFIGS_DIR, \"devnet-bootstrap-node.key.pem\"),\n    );\n\n    await writeFile(join(DEVNET_CONFIGS_DIR, \"chainweb-node.common.yaml\"), CHAINWEB_NODE_COMMON_YAML_CONTENT_TPL);\n\n    await writeFile(join(DEVNET_CONFIGS_DIR, \"chainweb-node.logging.yaml\"), CHAINWEB_NODE_LOGGING_YAML_CONTENT_TPL);\n\n    const nginxConfigContent = createNginxApiConfigContent({\n      enableMiningTrigger: this.hasOnDemandMining(),\n    });\n\n    await writeFile(join(DEVNET_CONFIGS_DIR, \"nginx.api.minimal.conf\"), nginxConfigContent);\n  }\n\n  #filterServicesByProfile(serviceConfigs: DockerServiceConfig[]): DockerServiceConfig[] {\n    if (this.#activeProfiles.length === 0) {\n      // If no profiles active, run services that have NO profile attribute.\n      return serviceConfigs.filter(\n        (config) => !config.profiles || config.profiles.length === 0,\n      ) as unknown as DockerServiceConfig[];\n    }\n\n    // If profiles ARE specified, only run services matching those profiles.\n    return serviceConfigs.filter(\n      (config) => config.profiles && config.profiles.some((p: string) => this.#activeProfiles.includes(p)),\n    );\n  }\n\n  async #ensureDevNetReadyState(): Promise<void> {\n    try {\n      await pollFn(() => isChainWebNodeOk(this.getNodeServiceUrl()), {\n        timeout: 100000,\n        interval: 1000,\n      });\n      this.#spinner.message(\"Devnet service node is accessible.\");\n    } catch (error) {\n      await this.stop();\n      logger.error(\"Failed to start devnet within the expected time.\", error);\n      throw new Error(\"Failed to start devnet within the expected time.\");\n    }\n\n    // Make initial blocks if on-demand mining is enabled\n    if (this.hasOnDemandMining()) {\n      try {\n        await pollFn(\n          () =>\n            didMakeBlocks({\n              count: 5,\n              onDemandUrl: this.getMiningClientUrl(),\n            }),\n          {\n            timeout: 100000,\n            interval: 1000,\n          },\n        );\n        this.#spinner.message(\"Initial blocks created for on-demand mining.\");\n      } catch (error) {\n        logger.error(\"Could not make initial blocks for on-demand mining.\", error);\n        throw new Error(\"Could not make initial blocks for on-demand mining.\");\n      }\n    }\n\n    // Ensure Chainweb node reaches the target height\n    try {\n      await pollFn(() => isChainWebAtHeight(20, this.getNodeServiceUrl()), {\n        timeout: 100000,\n        interval: 1000,\n      });\n      this.#spinner.message(\"Chainweb node reached height 20.\");\n    } catch (error) {\n      logger.error(\"Chainweb node did not reach height 20 within the expected time.\", error);\n      throw new Error(\"Chainweb node did not reach height 20 within the expected time.\");\n    }\n  }\n\n  async start(options?: ToolboxNetworkStartOptions): Promise<void> {\n    this.#spinner.message(\"Starting devnet...\");\n    this.#client = options?.client ?? this.#client;\n    const { isDetached = true, isStateless = false } = options || {};\n    this.#isDetached = isDetached;\n\n    // Modify container name if stateless\n    if (isStateless) {\n      this.#definition = createMinimalDevNet({\n        networkName: `devnet-${this.id}-network`,\n        port: Number(this.getServicePort()),\n        persistDb: false,\n        miningConfig: this.#networkConfig.miningConfig,\n      });\n    }\n\n    this.#spinner.message(\"Setting up devnet artifacts...\");\n    await this.#setupArtifacts();\n    const servicesToRun = this.#filterServicesByProfile(Object.values(this.#definition.services));\n\n    if (servicesToRun.length === 0) {\n      return;\n    }\n    this.#spinner.message(\"Starting devnet services...\");\n    await this.#orchestrator.startServices(servicesToRun);\n    this.#spinner.message(\"Ensuring devnet is ready...\");\n    await this.#ensureDevNetReadyState();\n    if (!this.#isDetached) {\n      await this.#orchestrator.streamAllLogs();\n    }\n    this.#spinner.message(\"Devnet started.\");\n  }\n\n  async stop(): Promise<void> {\n    await this.#orchestrator.stopAllServices();\n    if (!this.#isDetached) {\n      this.#orchestrator.stopAllLogStreams();\n    }\n    try {\n      await rm(DEVNET_CONFIGS_DIR, { recursive: true, force: true });\n    } catch (e) {\n      logger.warn(`Failed to remove generated files in ${DEVNET_CONFIGS_DIR}:`, e);\n    }\n  }\n\n  async restart(options?: ToolboxNetworkStartOptions): Promise<void> {\n    await this.stop();\n    await this.start(options);\n  }\n\n  getServicePort(): number {\n    return this.#networkConfig.containerConfig?.port ?? DEVNET_PUBLIC_PORT;\n  }\n\n  hasOnDemandMining(): boolean {\n    return this.#networkConfig.containerConfig?.onDemandMining ?? true;\n  }\n\n  getMiningClientUrl(): string {\n    return `http://localhost:${this.getServicePort()}`;\n  }\n\n  getNodeServiceUrl(): string {\n    return `http://localhost:${this.getServicePort()}`;\n  }\n\n  async isOk(): Promise<boolean> {\n    return isChainWebNodeOk(this.getNodeServiceUrl());\n  }\n}\n","import type { PactServerConfig, PactServerNetworkConfig } from \"@pact-toolbox/config\";\nimport type { ChildProcessWithoutNullStreams } from \"child_process\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"pathe\";\n\nimport { createPactServerConfig } from \"@pact-toolbox/config\";\nimport {\n  getCurrentPactVersion,\n  getUuid,\n  isAnyPactInstalled,\n  isPortTaken,\n  logger,\n  pollFn,\n  runBin,\n  writeFile,\n} from \"@pact-toolbox/utils\";\n\nimport type { ToolboxNetworkApi, ToolboxNetworkStartOptions } from \"../types\";\nimport type { PactToolboxClient } from \"@pact-toolbox/runtime\";\n\nexport function configToYamlString(config: PactServerConfig): string {\n  let configString = `# This is a generated file, do not edit manually\\n`;\n  for (const [key, value] of Object.entries(config)) {\n    if (value === undefined) {\n      continue;\n    }\n    if (Array.isArray(value)) {\n      configString += `${key}: [${value.join(\", \")}]\\n`;\n    } else {\n      configString += `${key}: ${value}\\n`;\n    }\n  }\n  return configString;\n}\n\nexport function configToJSONString(config: PactServerConfig): string {\n  return JSON.stringify(config, null, 2);\n}\n\nexport async function writePactServerConfig(\n  config: PactServerConfig,\n  format: \"yaml\" | \"json\" = \"yaml\",\n  id: string,\n): Promise<string> {\n  const toolboxDir = join(process.cwd(), \".pact-toolbox/pact\");\n  const configPath = join(toolboxDir, id ? `pact-server-config-${id}.${format}` : `pact-server-config.${format}`);\n  if (config.persistDir) {\n    config.persistDir = id ? `${config.persistDir}-${id}` : config.persistDir;\n  }\n  if (config.logDir) {\n    config.logDir = id ? `${config.logDir}-${id}` : config.logDir;\n  }\n  // write config to file\n  await writeFile(configPath, format === \"yaml\" ? configToYamlString(config) : configToJSONString(config));\n  return configPath;\n}\n\nexport class PactServerNetwork implements ToolboxNetworkApi {\n  public id: string = getUuid();\n  #child?: ChildProcessWithoutNullStreams;\n  #configPath?: string;\n  #serverConfig: PactServerConfig;\n  #pactBin = \"pact\";\n  #client: PactToolboxClient;\n\n  constructor(networkConfig: PactServerNetworkConfig, client: PactToolboxClient) {\n    this.#client = client;\n    this.#serverConfig = createPactServerConfig(networkConfig?.serverConfig);\n    this.#pactBin = networkConfig.pactBin || this.#pactBin;\n  }\n\n  getServicePort(): number {\n    return this.#serverConfig.port || 8080;\n  }\n\n  hasOnDemandMining() {\n    return false;\n  }\n\n  getMiningClientUrl() {\n    return \"\";\n  }\n\n  getNodeServiceUrl(): string {\n    return `http://localhost:${this.getServicePort()}`;\n  }\n\n  async start({\n    isDetached = true,\n    isStateless = false,\n    conflictStrategy = \"error\",\n    client,\n  }: ToolboxNetworkStartOptions = {}): Promise<void> {\n    this.#client = client ?? this.#client;\n    if (await this.isRunning()) {\n      if (conflictStrategy === \"error\") {\n        throw new Error(`Pact server is already running on port ${this.#serverConfig.port}`);\n      }\n      return;\n    }\n    const isInstalled = await isAnyPactInstalled();\n    if (!isInstalled) {\n      throw new Error(\"Pact is not installed, try running `pactup install --latest`\");\n    }\n    if (isStateless) {\n      this.#serverConfig.persistDir = undefined;\n    }\n    this.#configPath = await writePactServerConfig(this.#serverConfig, \"yaml\", isStateless ? this.id : \"\");\n    const pactVersion = await getCurrentPactVersion();\n    logger.info(\"Using pact version\", pactVersion);\n    await runBin(this.#pactBin, [\"-s\", this.#configPath], {\n      silent: isDetached,\n    });\n    // wait for the server to be ready\n    await pollFn(() => this.isOk(), {\n      interval: 200,\n      timeout: 5000,\n    });\n  }\n\n  async stop(): Promise<void> {\n    if (this.#child) {\n      this.#child.kill();\n      if (this.#configPath) {\n        // remove config file\n        await rm(this.#configPath, { force: true });\n      }\n    }\n  }\n\n  async restart(options?: ToolboxNetworkStartOptions): Promise<void> {\n    await this.stop();\n    await this.start(options);\n  }\n\n  async isOk(): Promise<boolean> {\n    const tx = this.#client.execution<string>(\"(tx-hash)\").build();\n    const hash = (await tx.getSignedTransaction()).hash;\n    const txHash = await tx.dirtyRead();\n    if (txHash && txHash === hash) {\n      return true;\n    }\n    return false;\n  }\n\n  async isRunning(): Promise<boolean> {\n    return (await isPortTaken(this.#serverConfig.port || 8080)) && (await this.isOk());\n  }\n}\n","import type { NetworkConfig, PactToolboxConfigObj } from \"@pact-toolbox/config\";\n\nimport { getNetworkConfig, isDevNetworkConfig, isLocalNetwork, isPactServerNetworkConfig } from \"@pact-toolbox/config\";\nimport { deployPreludes, downloadAllPreludes, shouldDownloadPreludes } from \"@pact-toolbox/prelude\";\nimport { PactToolboxClient } from \"@pact-toolbox/runtime\";\nimport {\n  getUuid,\n  logger as defaultLogger,\n  spinner as defaultSpinner,\n  type Logger,\n  type Spinner,\n  LogLevels,\n} from \"@pact-toolbox/utils\";\n\nimport { LocalDevNetNetwork } from \"./networks/devnet\";\nimport { PactServerNetwork } from \"./networks/pactServer\";\nimport type { ToolboxNetworkApi, ToolboxNetworkStartOptions } from \"./types\";\nimport { ensureAvailablePorts } from \"./utils\";\n\nexport interface StartLocalNetworkOptions extends ToolboxNetworkStartOptions {\n  client?: PactToolboxClient;\n  logAccounts?: boolean;\n  network?: string;\n  cleanup?: boolean;\n  autoStart?: boolean;\n  logger?: Logger;\n  spinner?: Spinner;\n}\n\nexport class PactToolboxNetwork implements ToolboxNetworkApi {\n  public id: string = getUuid();\n  #networkApi: ToolboxNetworkApi;\n  #networkConfig: NetworkConfig;\n  #client: PactToolboxClient;\n  #startOptions: StartLocalNetworkOptions;\n  #toolboxConfig: PactToolboxConfigObj;\n  #logger: Logger;\n  #spinner: Spinner;\n\n  constructor(toolboxConfig: PactToolboxConfigObj, startOptions: StartLocalNetworkOptions = {}) {\n    this.#toolboxConfig = toolboxConfig;\n    this.#startOptions = {\n      isDetached: true,\n      logAccounts: false,\n      isStateless: false,\n      ...startOptions,\n    };\n    this.#logger = this.#startOptions.logger ?? defaultLogger;\n    this.#spinner = this.#startOptions.spinner ?? defaultSpinner({ indicator: \"timer\" });\n    const networkConfig = getNetworkConfig(this.#toolboxConfig, this.#startOptions.network);\n    if (!networkConfig) {\n      throw new Error(`Network ${networkConfig} not found in config`);\n    }\n    if (!isLocalNetwork(networkConfig)) {\n      throw new Error(`Netwsork ${networkConfig.name} is not a local or devnet network`);\n    }\n    this.#client = this.#startOptions.client ?? new PactToolboxClient(toolboxConfig);\n    if (isPactServerNetworkConfig(networkConfig)) {\n      this.#networkApi = new PactServerNetwork(networkConfig, this.#client);\n    } else if (isDevNetworkConfig(networkConfig)) {\n      this.#networkApi = new LocalDevNetNetwork(networkConfig, {\n        client: this.#client,\n        logger: this.#logger,\n        spinner: this.#spinner,\n      });\n    } else {\n      throw new Error(`Unsupported network type`);\n    }\n    this.#networkConfig = networkConfig;\n  }\n\n  getServicePort(): number {\n    return this.#networkApi.getServicePort();\n  }\n\n  hasOnDemandMining(): boolean {\n    return this.#networkApi.hasOnDemandMining();\n  }\n\n  getMiningClientUrl(): string {\n    return this.#networkApi.getMiningClientUrl();\n  }\n\n  getNodeServiceUrl(): string {\n    return this.#networkApi.getNodeServiceUrl();\n  }\n\n  getNetworkName(): string {\n    return this.#networkConfig.name ?? \"unknown\";\n  }\n\n  async start(options?: ToolboxNetworkStartOptions): Promise<void> {\n    this.#client = options?.client ?? this.#client;\n    this.#spinner.start(`Starting network ${this.#networkConfig.name}...`);\n    const preludes = this.#toolboxConfig.preludes ?? [];\n    const contractsDir = this.#toolboxConfig.contractsDir ?? \"contracts\";\n    const preludeConfig = {\n      client: this.#client,\n      contractsDir,\n      preludes,\n    };\n    const needDownloadPreludes = this.#toolboxConfig.downloadPreludes && (await shouldDownloadPreludes(preludeConfig));\n\n    if (needDownloadPreludes) {\n      // download preludes\n      await downloadAllPreludes(preludeConfig);\n    }\n    await ensureAvailablePorts(this.#networkConfig);\n    await this.#networkApi.start({\n      ...this.#startOptions,\n      ...options,\n      client: this.#client,\n    });\n\n    if (this.#toolboxConfig.deployPreludes) {\n      await deployPreludes(preludeConfig);\n    }\n\n    if (this.#startOptions.logAccounts) {\n      // log all signers and keys\n      const signers = this.#networkConfig.keyPairs ?? [];\n      for (const signer of signers) {\n        this.#logger.log(`Account: ${signer.account}`);\n        this.#logger.log(`Public: ${signer.publicKey}`);\n        this.#logger.log(`Secret: ${signer.secretKey}`);\n        this.#logger.log(\"--------------------------------\");\n      }\n    }\n    this.#spinner.stop(`Network ${this.#networkConfig.name} started at ${this.getNodeServiceUrl()}`);\n  }\n\n  async restart(): Promise<void> {\n    await this.#networkApi.restart();\n  }\n\n  async stop(): Promise<void> {\n    await this.#networkApi.stop();\n  }\n\n  async isOk(): Promise<boolean> {\n    return this.#networkApi.isOk();\n  }\n}\n\nexport async function createPactToolboxNetwork(\n  config: PactToolboxConfigObj,\n  options: StartLocalNetworkOptions = {},\n): Promise<PactToolboxNetwork> {\n  const logLevel =\n    process.env.LOG_LEVEL && LogLevels[process.env.LOG_LEVEL as keyof typeof LogLevels]\n      ? LogLevels[process.env.LOG_LEVEL as keyof typeof LogLevels]\n      : LogLevels.error;\n  const logger = options.logger ?? defaultLogger.create({ level: logLevel });\n  const spinner = options.spinner ?? defaultSpinner({ indicator: \"timer\" });\n  const network = new PactToolboxNetwork(config, {\n    ...options,\n    logger,\n    spinner,\n  });\n\n  if (!options.autoStart) {\n    return network;\n  }\n\n  let isCleaningUp = false;\n  if (options.cleanup) {\n    async function handleShutdown() {\n      if (isCleaningUp) {\n        return;\n      }\n      logger.info(`Shutting down network ${network.getNetworkName()}...`);\n      isCleaningUp = true;\n      try {\n        await Promise.race([network.stop(), new Promise((resolve) => setTimeout(resolve, 10000))]);\n      } catch (error) {\n        logger.error(`Error during graceful shutdown:`, error);\n      } finally {\n        logger.success(`Network ${network.getNetworkName()} stopped!`);\n        // process.exit(0);\n      }\n    }\n\n    process.on(\"SIGINT\", handleShutdown);\n    process.on(\"SIGTERM\", handleShutdown);\n    // process.on(\"exit\", handleShutdown);\n  }\n  try {\n    await network.start(options);\n  } catch (error) {\n    logger.error(`Failed to start network ${network.id}:`, error);\n    if (!isCleaningUp && options.cleanup) {\n      await network.stop().catch((cleanupError) => {\n        logger.error(`Error during cleanup after failed start:`, cleanupError);\n      });\n    }\n    throw error;\n  }\n  return network;\n}\n"],"x_google_ignoreList":[5,6,7,8,9,10,11,12,13,14],"mappings":"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"}