Contract Deployment
Deploy Compact smart contracts to Midnight testnet or mainnet with proper configuration, verification, and error handling.
When to Use
- Deploying a compiled Compact contract for the first time
- Configuring network endpoints for deployment
- Handling deployment transaction confirmation
- Troubleshooting failed deployments
- Setting up deployment scripts for CI/CD
Key Concepts
Deployment Flow
- Compile contract - Use
compact compile to generate artifacts
- Configure network - Set indexer, prover, and node endpoints
- Fund deployer - Ensure account has sufficient tDUST (testnet) or DUST (mainnet)
- Submit transaction - Deploy contract and wait for confirmation
- Verify deployment - Query contract address on chain
Network Configuration
| Network |
Indexer |
Prover |
Use Case |
| Testnet |
indexer.testnet.midnight.network |
prover.testnet.midnight.network |
Development, testing |
| Mainnet |
indexer.midnight.network |
prover.midnight.network |
Production |
Contract Artifacts
After compact compile, the output directory contains:
contract.cjs - Contract bytecode and circuits
contract.d.cts - TypeScript types for contract interface
circuit-keys/ - ZK circuit proving keys
References
| Document |
Description |
| deployment-config.md |
Network configuration and environment setup |
| network-endpoints.md |
Endpoint URLs and connection patterns |
Examples
| Example |
Description |
| single-contract/ |
Deploy a single contract |
| multi-contract/ |
Deploy multiple contracts with dependencies |
Quick Start
1. Configure Network
import { NetworkConfig } from '@midnight-ntwrk/midnight-js-types';
const config: NetworkConfig = {
indexer: 'https://indexer.testnet.midnight.network',
indexerWs: 'wss://indexer.testnet.midnight.network/ws',
prover: 'https://prover.testnet.midnight.network',
};
2. Load Contract Artifacts
import { Contract } from './contract.cjs';
import type { ContractTypes } from './contract.d.cts';
const contractArtifact = Contract;
3. Deploy
import { deployContract } from '@midnight-ntwrk/midnight-js-contracts';
const deployedContract = await deployContract({
wallet,
artifact: contractArtifact,
initialState: { /* initial ledger state */ },
config,
});
console.log('Deployed at:', deployedContract.address);
Common Patterns
Environment-Based Configuration
const getNetworkConfig = (): NetworkConfig => {
const network = process.env.MIDNIGHT_NETWORK || 'testnet';
if (network === 'mainnet') {
return {
indexer: 'https://indexer.midnight.network',
indexerWs: 'wss://indexer.midnight.network/ws',
prover: 'https://prover.midnight.network',
};
}
return {
indexer: 'https://indexer.testnet.midnight.network',
indexerWs: 'wss://indexer.testnet.midnight.network/ws',
prover: 'https://prover.testnet.midnight.network',
};
};
Deployment with Retry
async function deployWithRetry(
config: DeployConfig,
maxRetries = 3
): Promise<DeployedContract> {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await deployContract(config);
} catch (error) {
if (attempt === maxRetries) throw error;
console.log(`Attempt ${attempt} failed, retrying...`);
await new Promise(r => setTimeout(r, 2000 * attempt));
}
}
throw new Error('Deployment failed after retries');
}
Deployment Verification
async function verifyDeployment(
address: string,
indexer: IndexerClient
): Promise<boolean> {
try {
const contractInfo = await indexer.getContractInfo(address);
return contractInfo !== null;
} catch {
return false;
}
}
Related Skills
midnight-setup - Environment prerequisites before deployment
contract-calling - Invoking deployed contracts
lifecycle-management - Managing contracts post-deployment
midnight-ci - Automated deployment in CI/CD
Related Commands
/midnight:check - Verify environment is ready for deployment