Mesh LogoMesh

Midnight Setup

Complete development setup for building Midnight Network dApps

@meshsdk/midnight-setup - Complete development setup for building Midnight Network dApps with zero-knowledge privacy and TypeScript support.

Getting Started

Install and set up @meshsdk/midnight-setup for building zero-knowledge privacy dApps on Midnight Network.

Installation

Install the Midnight setup package using your preferred package manager:

# Using npm
npm install @meshsdk/midnight-setup

# Using yarn
yarn add @meshsdk/midnight-setup

Quick Start

import { MidnightSetupAPI } from '@meshsdk/midnight-setup';

// Deploy a new contract
const api = await MidnightSetupAPI.deployContract(providers, contractInstance);

// Join an existing contract
const api = await MidnightSetupAPI.joinContract(providers, contractInstance, contractAddress);

// Get contract state
const state = await api.getContractState();

// Get ledger state
const ledgerState = await api.getLedgerState();

Core API Methods

Complete reference for MidnightSetupAPI methods and provider setup.

MidnightSetupAPI

The MidnightSetupAPI is the main class for interacting with Midnight Network contracts.

MethodDescriptionUsage
deployContract(providers, contractInstance)Deploy a new contractCreates new contract instance
joinContract(providers, contractInstance, address)Join existing contractConnect to deployed contract
getContractState()Read contract stateGet current contract data
getLedgerState()Read ledger stateGet blockchain data

Deploy Contract

import { MidnightSetupAPI } from '@meshsdk/midnight-setup';

const api = await MidnightSetupAPI.deployContract(providers, contractInstance);
console.log('Contract deployed:', api.deployedContractAddress);

Join Contract

import { MidnightSetupAPI } from '@meshsdk/midnight-setup';

const contractAddress = "contract_address_here";
const api = await MidnightSetupAPI.joinContract(providers, contractInstance, contractAddress);
console.log('Connected to contract:', contractAddress);

Lace Wallet Integration

Complete Lace Beta Wallet integration for Midnight Network dApps.

Wallet Features

FeatureDescriptionImplementation
Connect WalletConnect to Lace Beta Walletwallet.enable()
Disconnect WalletDisconnect from walletwallet.disconnect()
Get Wallet StateRetrieve wallet address and keyswallet.state()
Deploy ContractDeploy contracts through walletwallet.submitTransaction()
Join ContractJoin existing contractswallet.balanceAndProveTransaction()
Balance TransactionsBalance and prove transactionsWallet API integration

Wallet Provider Setup

// Connect to Lace Wallet
const wallet = window.midnight?.mnLace;
if (!wallet) {
  throw new Error('Please install Lace Beta Wallet for Midnight Network');
}

// Enable wallet and get state
const walletAPI = await wallet.enable();
const walletState = await walletAPI.state();
const uris = await wallet.serviceUriConfig();

React Wallet Hook

import { useMidnightWallet } from './hooks/useMidnightWallet';

function App() {
  const { 
    connectWallet, 
    disconnectWallet, 
    walletState, 
    isConnected 
  } = useMidnightWallet();
  
  return (
    <div>
      {isConnected ? (
        <button onClick={disconnectWallet}>Disconnect</button>
      ) : (
        <button onClick={connectWallet}>Connect Wallet</button>
      )}
    </div>
  );
}

Integration Examples

The fastest way to build on Midnight Network with pre-built smart contracts, complete API, and ready-to-use code snippets.

Installation

npm install @meshsdk/midnight-setup \
  @midnight-ntwrk/dapp-connector-api@3.0.0 \
  @midnight-ntwrk/midnight-js-fetch-zk-config-provider@2.0.2 \
  @midnight-ntwrk/midnight-js-http-client-proof-provider@2.0.2 \
  @midnight-ntwrk/midnight-js-indexer-public-data-provider@2.0.2 \
  @midnight-ntwrk/midnight-js-level-private-state-provider@2.0.2 \
  @midnight-ntwrk/midnight-js-network-id@2.0.2

Features

  • Type-safe SDK - Full TypeScript support
  • Provider abstraction - Easy wallet and network integration
  • Contract state management - Query contract and ledger states
  • Flexible contract support - Works with any Midnight smart contract
  • Lightweight - Only 10.4 KB package size
  • ESM & CJS - Supports both module systems

Quick Start

1. Setup Providers

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

import type { MidnightSetupContractProviders } from "@meshsdk/midnight-setup";

export async function setupProviders(): Promise<MidnightSetupContractProviders> {
  const wallet = window.midnight?.mnLace;
  if (!wallet) {
    throw new Error("Please install Lace Beta Wallet for Midnight Network");
  }

  const walletAPI = await wallet.enable();
  const walletState = await walletAPI.state();
  const uris = await wallet.serviceUriConfig();

  return {
    privateStateProvider: levelPrivateStateProvider({
      privateStateStoreName: "my-dapp-state",
    }),
    zkConfigProvider: new FetchZkConfigProvider(
      window.location.origin,
      fetch.bind(window),
    ),
    proofProvider: httpClientProofProvider(uris.proverServerUri),
    publicDataProvider: indexerPublicDataProvider(
      uris.indexerUri,
      uris.indexerWsUri,
    ),
    walletProvider: {
      coinPublicKey: walletState.coinPublicKey,
      encryptionPublicKey: walletState.encryptionPublicKey,
      balanceTx: (tx, newCoins) => {
        return walletAPI.balanceAndProveTransaction(tx, newCoins);
      },
    },
    midnightProvider: {
      submitTx: (tx) => {
        return walletAPI.submitTransaction(tx);
      },
    },
  };
}

2. Deploy a Contract

import { MidnightSetupAPI } from "@meshsdk/midnight-setup";

import { setupProviders } from "./providers";

async function deployContract() {
  const providers = await setupProviders();
  const contractInstance = new MyContract({});

  const api = await MidnightSetupAPI.deployContract(
    providers,
    contractInstance,
  );

  console.log("Contract deployed at:", api.deployedContractAddress);
  return api;
}

3. Join Existing Contract

async function joinContract(contractAddress: string) {
  const providers = await setupProviders();
  const contractInstance = new MyContract({});

  const api = await MidnightSetupAPI.joinContract(
    providers,
    contractInstance,
    contractAddress,
  );

  return api;
}

4. Read Contract State

// Get contract state
const contractState = await api.getContractState();
console.log("Contract data:", contractState.data);

// Get ledger state
const ledgerState = await api.getLedgerState();
console.log("Message:", ledgerState.ledgerState?.message);

Resources