Skip to main content

Midnight JS API

Midnight.js API Reference v4.0.2


Midnight.js

TypeScript SDK for building privacy-preserving dApps on the Midnight blockchain.

Midnight.js provides tools for deploying and interacting with smart contracts, managing encrypted private state, generating zero-knowledge proofs, and submitting transactions to the Midnight network.

Architecture

Midnight.js uses a modular provider pattern where each capability is pluggable:

MidnightProviders
├── privateStateProvider — Encrypted local state storage
├── publicDataProvider — Blockchain data queries via GraphQL
├── zkConfigProvider — ZK artifact retrieval (prover/verifier keys)
├── proofProvider — Zero-knowledge proof generation
├── walletProvider — Transaction balancing and signing
├── midnightProvider — Transaction submission to the network
└── loggerProvider — Optional diagnostics logging

Packages

Core

PackagePurpose
@midnight-ntwrk/midnight-js-typesShared types, interfaces, and provider contracts
@midnight-ntwrk/midnight-js-contractsContract deployment, circuit calls, and transaction submission
@midnight-ntwrk/midnight-js-network-idNetwork identifier configuration for runtime and ledger WASM APIs
@midnight-ntwrk/midnight-js-utilsShared utilities (hex encoding, bech32m, assertions)

Providers

PackagePurpose
@midnight-ntwrk/midnight-js-indexer-public-data-providerGraphQL-based blockchain data provider (queries and subscriptions)
@midnight-ntwrk/midnight-js-level-private-state-providerAES-256-GCM encrypted persistent state storage via LevelDB
@midnight-ntwrk/midnight-js-http-client-proof-providerHTTP client for the Midnight proof server
@midnight-ntwrk/midnight-js-fetch-zk-config-providerBrowser-compatible ZK artifact provider using the Fetch API
@midnight-ntwrk/midnight-js-node-zk-config-providerNode.js filesystem-based ZK artifact provider
@midnight-ntwrk/midnight-js-logger-providerApplication-specific Pino logger configuration

Tooling

PackagePurpose
@midnight-ntwrk/midnight-js-compactCompact compiler manager for contract compilation

Quick Start

1. Configure the network

import { setNetworkId } from '@midnight-ntwrk/midnight-js-network-id';

setNetworkId('testnet');

2. Assemble providers

import { levelPrivateStateProvider } from '@midnight-ntwrk/midnight-js-level-private-state-provider';
import { indexerPublicDataProvider } from '@midnight-ntwrk/midnight-js-indexer-public-data-provider';
import { httpClientProofProvider } from '@midnight-ntwrk/midnight-js-http-client-proof-provider';
import { FetchZkConfigProvider } from '@midnight-ntwrk/midnight-js-fetch-zk-config-provider';

const zkConfigProvider = new FetchZkConfigProvider(zkArtifactsUrl);

const providers: MidnightProviders = {
privateStateProvider: levelPrivateStateProvider({
privateStoragePasswordProvider: () => password,
accountId: walletAddress,
}),
publicDataProvider: indexerPublicDataProvider(queryUrl, subscriptionUrl),
zkConfigProvider,
proofProvider: httpClientProofProvider(proofServerUrl, zkConfigProvider),
walletProvider, // from @midnight-ntwrk/wallet-sdk-facade
midnightProvider, // from @midnight-ntwrk/wallet-sdk-facade
};

3. Deploy and interact with a contract

import { deployContract, findDeployedContract } from '@midnight-ntwrk/midnight-js-contracts';

const deployed = await deployContract(providers, {
compiledContract,
privateStateId: 'my-state',
initialPrivateState: { counter: 0n },
});

const result = await deployed.callTx.increment();

4. Query state

import { getStates, getPublicStates } from '@midnight-ntwrk/midnight-js-contracts';

const states = await getStates(providers, contractAddress, privateStateId);
const publicStates = await getPublicStates(providers, contractAddress);

Key Concepts

Contract Model

TermDescription
CircuitSmart contract function that executes locally and generates a zero-knowledge proof
WitnessPrivate computation that runs on the end-user's device
Private stateUser-local state updated by circuits — never stored on-chain
Ledger stateOn-chain public contract state

ZK Artifacts

ArtifactRole
Prover keyBinary used to create zero-knowledge proofs
Verifier keyBinary used for on-chain proof verification
ZKIRZero-Knowledge Intermediate Representation of compiled contracts

Transaction Flow

1. Execute circuit locally  →  Unproven transaction
2. Generate ZK proofs → ProofProvider
3. Balance transaction → WalletProvider
4. Submit to network → MidnightProvider
5. Wait for finalization → PublicDataProvider

Transaction Status

StatusMeaning
SucceedEntirelyAll transaction segments succeeded
FailFallibleGuaranteed portion succeeded, fallible portion failed
FailEntirelyTransaction is invalid

Private State Security

  • Encryption: AES-256-GCM at rest
  • Key derivation: PBKDF2-SHA256 (600,000 iterations)
  • Isolation: Account-scoped storage keyed by SHA-256 hash of wallet address
  • No built-in recovery: Production deployments require a backup strategy