WebisoftWebisoft
Trustless IBC interoperabilityConfidential

Midnight Cosmos Bridge

A scope of work for a trustless bridge from Midnight into the Cosmos / IBC ecosystem. The one-way Midnight → Cosmos deposit path verifies real GRANDPA finality on-chain today; this proposal hardens it to production and makes it bidirectional.

Webisoft·$70,000 USD·2 milestones·v1.0

Prepared by Utkarsh Varma, Webisoft Technologie Inc.

Section 01

Overview

Midnight is a Substrate chain with GRANDPA finality; the Cosmos ecosystem speaks IBC. A purpose-built Cosmos SDK chain — the interop chain — can verify Midnight's consensus and state proofs entirely on-chain and then relay assets to 189+ IBC networks. That makes a trustless bridge feasible without oracles or a multisig committee in the deposit path.

This document has two parts. Engineering explains how the bridge is made possible, what runs today, and how each step is cryptographically grounded in the real IBC, Cosmos and Midnight specifications. Breakdown of Work turns that into two fixed milestones — $40,000 to harden the proven one-way path into a production, IBC-native light client, and $30,000 to make it bidirectional and roll it out across the ecosystem.

The starting point is real, not a slide. We brought the demo stack up locally — a live Midnight node and the Cosmos interop chain, both producing blocks, with the bridge module active and the demo app connected to both. The honest status of every link — proven, partial, and planned — is laid out in section 02.

Total

$70,000USD

Milestones

$40K + $30K

Timeline

~13 weeks

One-way deposit

Working

Section 02

How the bridge is made possible

Engineering

Midnight is a Substrate chain that finalizes blocks with GRANDPA — ed25519 authorities reaching a 2/3+1 weighted supermajority over blake2b-256 block headers — with global state committed in a base-16 Patricia-Merkle trie and encoded with SCALE. The interop chain is a standard Cosmos SDK / ibc-go v8 application. The bridge is possible because a Cosmos chain can run a light client that re-derives Midnight's finality and state proofs entirely on-chain: verify the GRANDPA justification's ed25519 signatures and supermajority, anchor the justification to the blake2b-256 hash of the SCALE-encoded header, store that header's state root, then verify a Patricia-Merkle membership proof of a bridge deposit against that GRANDPA-verified root before minting. No oracle and no external committee sits in that deposit path.

What works today is the cryptographic core of this one-way deposit path, running in the native Go x/midnightbridge keeper. The GRANDPA verifier is wire-correct: it reconstructs the 53-byte precommit message with a u32 block number, verifies each precommit with ed25519, binds every vote to the justification target, rejects duplicates, and enforces the (2·total)/3+1 threshold. It checks that the justification target equals blake2b-256(SCALE(header)), and a mint requires a state root previously stored by a GRANDPA-verified client update. We brought this stack up locally — a real Midnight node and the Cosmos interop chain both producing blocks, with the bridge module active and the demo app connected to both.

What we will do is harden this proven core into a production, IBC-native bridge and then make it bidirectional. M1 ports the verifier into a governance-deployable ICS-08 08-wasm client with the correct ibc-go ABI, upgrades the trie proof from key-existence to key-and-value binding against a real Midnight bridge pallet, pins the GRANDPA authority set, opens a real ICS-20 channel, hardens the relayer, and validates against a non-dev multi-validator node. M2 adds the Cosmos-to-Midnight return path as a 3-of-5 BIP-340 attestor committee with a documented migration toward trust-minimized verification, a real ZK privacy gateway, multi-chain rollout, and an independent security review on a public testnet.

System architecture

GRANDPA finality verified on-chain, wire-correct

VerifyGrandpaJustification performs per-precommit ed25519 verification over the reconstructed 53-byte message (1-byte tag, target hash, u32 target number LE, u64 round LE, u64 set id LE). It rejects unknown authorities and duplicate votes, binds each precommit to the justification target hash and number, and enforces a (2·total)/3+1 weighted supermajority. This is the on-chain verifier; it matches real Substrate GRANDPA for the deposit path.

Header anchoring with blake2b-256

The keeper computes blake2b-256 over the SCALE-encoded Midnight header and requires the GRANDPA justification target hash to equal it. This binds the finality proof to a concrete header whose state_root field becomes the trusted commitment root. The end-to-end test independently recomputes this hash against the live node and asserts equality.

State-root provenance gates every mint

ConfirmDeposit calls LoadVerifiedStateRoot for the deposit height, which only returns a root previously stored by a GRANDPA-verified client update. No verified root means no mint. This separates consensus verification from the state-proof step while keeping both trustless.

Substrate Patricia-Merkle trie proof verification

The proof decoder parses the SCALE Vec<Vec<u8>> read proof into trie nodes, and the verifier walks the base-16 Patricia-Merkle trie by nibbles, re-hashing nodes with blake2b-256 and checking they chain back to the GRANDPA-verified state root. The current working tree requires the specific bridge-transfer storage key derived with twox128 and blake2_128_concat.

Deduplication, caps and circuit breakers

A deposit commitment blake2b256(txHash, receiver, amount, denom) plus the raw txHash are checked and marked, preventing replay. Per-transaction and per-epoch mint caps, a circuit breaker, staleness bounds, strictly increasing height, and an equivocation freeze on conflicting state roots protect the mint path.

Inherited IBC stack and ICS-20 onward transfer

The Cosmos app wires real ibc-go v8: core IBC, the ICS-20 transfer keeper composed with erc20, rate-limit, fee and packet-forward middleware, 07-tendermint, and 08-wasm backed by a real WasmVM with the gov account as authority. Bridge-minted tokens are standard bank coins (denom midnight/DUST in the demo), so they can in principle be sent through this generic ICS-20 stack like any native denom — but the mint path and the transfer stack are separate code paths today; wiring them and opening a real channel are scoped work. The hard, chain-specific work is the Midnight light client, not the transport.

What the deposit proves, and the honest gap

As committed at HEAD the trie-to-mint link is satisfied by a structural-integrity fallback that binds no key and no amount, and the authority set can fall back to trust-on-first-use, all against a single-validator dev node with a mocked Cardano follower. Uncommitted working-tree changes remove the fallback, but value-binding against a real bridge pallet and a pinned multi-validator authority set are M1 deliverables. The bridge proves Midnight reached finality on a state root; binding the mint to a specific deposit value is the hardening target.

Bidirectional return path and privacy

Cosmos-to-Midnight today only burns the wrapped asset and emits a burn event; nothing yet credits Midnight. M2 adds a 3-of-5 BIP-340 attestor committee verified by Midnight's native signature checks, then a migration toward real CometBFT light-client verification. The privacy gateway, today a stub, gains real Groth16 verification and nullifier dedup so value unshields only at the boundary and re-shields on return.

Midnight → Cosmos, step by step

The One-Way Transaction

A deposit from Midnight to Cosmos follows one finality-bound path. The relayer only carries proofs; every check happens on the interop chain.

Deposit sequence
01
User on Midnight

Unshields and locks DUST into the bridge pallet, emitting an UnshieldedTokens event recorded in bridge storage. (Per the Midnight ledger NIGHT is the transferable asset; correcting the bridged asset from DUST to NIGHT is M1 work.)

ZSwap eUTXO: Pedersen value commitments, SHA-256 coin commitment and nullifier; value moves from the shielded sets into the public UTXO set.

02
Midnight GRANDPA

Finalizes the block containing the deposit and produces a justification.

ed25519 precommit signatures from the authority set over the 53-byte message; 2/3+1 weighted supermajority; blake2b-256 header hash.

03
Relayer

Subscribes to GRANDPA justifications, fetches the header and a state read proof for the bridge deposit key.

SCALE decoding of header and justification; state_getReadProof returns Patricia-Merkle trie nodes; storage key derived via twox128 and blake2_128_concat.

04
Interop chain keeper

Processes MsgUpdateMidnightClient: verifies the justification and stores the header state root for that height.

per-precommit ed25519 verify, duplicate-vote rejection, target binding, (2·total)/3+1 threshold, blake2b-256 header match.

05
Interop chain keeper

Processes MsgConfirmDeposit: verifies the trie membership proof against the stored state root, then mints.

Patricia-Merkle-16 trie walk with blake2b-256 node hashing against the verified root; bridge-transfer key membership; dedup commitment; per-tx and epoch caps.

06
Interop chain

Mints the wrapped token (denom midnight/DUST in the demo) to the receiver and emits a mint event.

bank MintCoins then send to account under the midnight/ denom prefix; supply bounded by the epoch mint cap.

07
Interop chain ICS-20

Onward transfer (scoped, not yet wired): the wrapped coin can be sent over an IBC channel to a counterparty chain as a separate ICS-20 transfer once a channel is opened.

ICS-20 ics20-1 unordered channel; packet commitment sha256(timeoutTimestamp ‖ timeoutHeight ‖ sha256(data)); per-channel escrow; timeout and ack refund.

Security model

Cryptographic Chain of Trust

Unbroken chain from finality to mint

Deposit path trust assumption

A mint requires a GRANDPA justification finalized by 2/3+1 of Midnight's authority set — the same honest-supermajority assumption Midnight itself relies on. The relayer cannot forge finality or state.

State-proof binding

The mint is gated on a Patricia-Merkle membership proof against a GRANDPA-verified state root. In the working tree this is key-bound to the bridge transfer key; full value-binding (amount, recipient, denom) against a real bridge pallet is the M1 target so the minted amount is not relayer-asserted.

Authority-set anchor

Today the first update can bootstrap the authority set from the justification's own signers (trust-on-first-use); signatures are real but the canonical set is not independently pinned. M1 pins the set at genesis or governance and implements delayed rotation.

Relayer is permissionless and untrusted

Like every IBC relayer, a malicious relayer can delay or censor but cannot mint without valid GRANDPA and trie proofs. A default-deny relayer whitelist additionally gates ConfirmDeposit.

Misbehaviour and circuit breakers

Conflicting state roots at one height freeze the client (equivocation freeze), and per-tx, epoch-mint-cap and staleness checks plus a circuit breaker bound damage from any single bad input.

Return-path trust (M2)

The Cosmos-to-Midnight return path begins as a 3-of-5 BIP-340 attestor committee: safety requires m-of-n collusion, liveness tolerates n-m offline, with nonce replay protection. This is explicitly a trusted-committee step with a documented migration toward CometBFT verification.

Privacy boundary

Value is exposed only at the bridge boundary: unshielded on deposit and re-shielded on return. The M2 privacy gateway enforces this with real Groth16 verification and nullifier dedup.

Dev-environment caveat

The bridge demo and e2e run against a single-validator Midnight dev node with a mocked main-chain follower, so 2/3+ of validators is 2/3 of one. M1 validates against a multi-validator node following a real Cardano main chain.

Grounded in real IBC, Cosmos and Midnight specs

Compatibility & Specifications

Every Midnight primitive maps to a concrete IBC / Cosmos requirement. The matrix below is the engineering contract for the bridge, with an honest status on each row.

Midnight propertyCosmos / IBC requirementBridging mechanismStatus
GRANDPA finality, ed25519 authorities, 2/3+1 supermajorityICS-02 client validity predicateOn-chain GRANDPA justification verification in the keeper today; ported to ICS-08 08-wasm in M1Working
ed25519 precommit signatures over 53-byte message, u32 block numberICS-02 signature verificationPrecommit message encoder plus ed25519 verify per precommit, wire-correctWorking
BlakeTwo256 header hashing over SCALE-encoded headerConsensusState commitment root anchoringblake2b-256(SCALE(header)) matched to target; header state_root stored as the rootWorking
Patricia-Merkle-16 state trie and state_rootICS-23 verifyMembershipTrie walker against the GRANDPA-verified root; key-bound today, value-bound in M1Partial
SCALE codec for headers, justifications and proofs08-wasm encoding-agnostic client messageSCALE decoders rewrapped behind the ibc-go client_message Binary ABI in M1Partial
Unshielding into the public UTXO set as bridge entryICS-20 source-zone lock then mintBridge pallet UnshieldedTokens event becomes the deposit record proven by the trie proofPartial
GRANDPA ScheduledChange authority-set rotationICS-02 handling of validator-set changesScheduledChange digest parsing; delay-zero today, delayed rotation in M1Partial
Authority set as the trust anchorICS-02 trusted client state validator setPin the set at genesis or governance, removing trust-on-first-usePlanned
Block timestamp for client status and timeoutsICS-02 getTimestampAtHeight, ICS-04 timeoutsRead the real header timestamp, enabling trusting-period and packet timeoutsPlanned
08-wasm light client deployable by governanceICS-08 MsgStoreCode, checksum allowlist, MsgCreateClientRewrite contract to the real ibc-go ABI and run the governance deployPlanned
midnight wrapped token onward transferICS-20 fungible token transfer over a real channelOpen an ics20-1 channel via Hermes or Hyperspace and route the minted bank coin through the transfer stackPlanned
Cosmos-to-Midnight return with CometBFT proof07-tendermint commit and IAVL proof on Midnight3-of-5 BIP-340 attestor committee first, migrating toward a real light clientPlanned
Interop chain as IBC gateway

Specification grounding

IBC ICS-02 Client Semantics

Defines ClientState, ConsensusState, verifyClientMessage, checkForMisbehaviour, updateState and verifyMembership the Midnight client must implement.

cosmos/ibc · ics-002-client-semantics

IBC ICS-08 Wasm Client

08-wasm hosts client logic as governance-deployed Wasm with sudo VerifyMembership and UpdateState; deploy via MsgStoreCode and a checksum allowlist.

cosmos/ibc · ics-008-wasm-client

IBC ICS-23 Vector Commitments

verifyMembership and verifyNonMembership against a CommitmentRoot with position-binding; the Substrate base-16 trie must satisfy completeness and soundness.

cosmos/ibc · ics-023 · cosmos/ics23

IBC ICS-20 Fungible Token Transfer

ics20-1 unordered channels, source-zone escrow and sink-zone burn, denom trace port/channel/baseDenom, timeout and failed-ack refunds.

cosmos/ibc · ics-020-fungible-token-transfer

IBC ICS-04 Channel and Packet Semantics

Packet commitment sha256(timeoutTimestamp ‖ timeoutHeight ‖ sha256(data)), acknowledgement and receipt proofs, timeouts requiring getTimestampAtHeight.

cosmos/ibc · ics-004-channel-and-packet-semantics

Cosmos 08-wasm governance

MsgStoreCode signer must equal the gov authority, checksum added to the on-chain allowlist, upgrades via gov-gated MsgMigrateContract.

ibc.cosmos.network · v8 wasm light-clients

CometBFT consensus

Instant deterministic finality with greater-than-2/3 voting power and ed25519 consensus keys, so a Cosmos header at height H is final for the counterparty client.

docs.cometbft.com · spec/consensus

07-tendermint light client

Return-path verification of Cosmos into Midnight needs ed25519 commit-signature and validator-set checks within the trusting period plus IAVL proofs against app_hash.

cosmos/ibc-go · 07-tendermint

Midnight consensus

AURA block production with sr25519 and GRANDPA finality with ed25519, BlakeTwo256 header hashing, SCALE encoding, BEEFY over Keccak-256 MMR.

docs.midnight.network · network-architecture

Midnight ledger ZSwap

Shielded ZSwap eUTXO with SHA-256 coin commitments and nullifiers and Pedersen value commitments; UnshieldedOffer moves value into the public UTXO set as the bridge entry point.

midnight-ledger · zswap, intents-transactions

Midnight NIGHT and DUST

NIGHT is the transferable unshielded capital asset; DUST is the non-transferable fee token, so NIGHT is the bridgeable asset.

midnight-ledger · night, dust

Composable Centauri precedent

A production GRANDPA Wasm light client deployed by governance via 08-wasm — the reference path for a Substrate chain into Cosmos.

ibcprotocol.dev · wasm-client

Honest status + local reproduction

What Works Today

We hold a hard line between what is cryptographically proven, what is partial, and what is scoped next. No overclaiming — the value of this engagement depends on knowing exactly where the line sits.

Proven today

  • The Go GRANDPA verifier in the x/midnightbridge keeper is real and wire-correct: per-precommit ed25519 verify over the 53-byte message with a u32 block number, duplicate-vote rejection, target binding, and a (2·total)/3+1 weighted supermajority.
  • blake2b-256 header anchoring is enforced on-chain: the justification target hash must equal blake2b-256 of the SCALE-encoded header, and the end-to-end test recomputes and asserts this against the live Midnight node.
  • A mint requires a state root previously stored by a GRANDPA-verified client update; with no verified root there is no mint.
  • The Substrate Patricia-Merkle-16 trie proof walker is genuine: it decodes the SCALE read proof and re-hashes nodes with blake2b-256 to chain back to the verified state root.
  • The IBC stack is real and inherited: ibc-go v8 core, ICS-20 transfer with erc20, rate-limit, fee and packet-forward middleware, 07-tendermint, and 08-wasm backed by a real WasmVM.
  • Safety controls are present in the keeper: txHash replay protection, proof-staleness and strictly-increasing-height checks, and an equivocation freeze on conflicting state roots are part of the committed bridge; deposit-commitment value binding, per-transaction and per-epoch mint caps, a circuit breaker, a denom whitelist and a default-deny relayer whitelist were added in the current working tree.
  • The repo ships a pre-compiled Compact bridge contract with real per-circuit ZK prover and verifier artifacts, plus a lock script that — run against a local Midnight node and proof server — calls lock_funds to generate a real ZK proof. The Compact source is not included and the demo's validation witnesses are stubbed.

Current limitations

  • The bridge demo runs against a single-validator Midnight dev node with a mocked Cardano follower, so 2/3+ of validators is effectively 2/3 of one — real finality, but not mainnet consensus.
  • As committed at HEAD the mint binds neither amount nor sender to an on-chain lock: ConfirmDeposit tries the bridge key then a system-events key (key existence only, no value check), and because the e2e proof is for a fixed system key it falls through to a structural trie-integrity check that only proves the proof hashes to the verified state root — the test passes an arbitrary amount and sender.
  • The canonical Midnight validator set is not pinned by default genesis, and a dev-mode fallback can bootstrap the authority set from the justification's own signers (trust-on-first-use) whenever no set is pinned — reachable in the default and e2e configurations.
  • The relayer hardcodes account and sequence numbers and anchors every state proof on a fixed well-known storage key rather than the specific deposit key, though it does scan and relay real unshielded bridge-pallet events.
  • The Rust 08-wasm contract is non-conformant to the ibc-go 08-wasm ABI and lacks migrate, upgrade and metadata handlers; the deploy script compiles the contract but its on-chain store and instantiate steps are commented out, and the channel-setup script is a placeholder — so no client is stored and no channel is opened.
  • A separate IBC packet path (the bridge module's OnRecvPacket) can mint from a JSON packet with no GRANDPA or trie verification — a trusted-relayer side door that must be removed or gated so every mint goes through the verified ConfirmDeposit path.
  • The privacy gateway does not yet verify ZK proofs — it checks a boolean — and nullifier dedup is deferred.
  • The bridge currently wraps DUST; per the Midnight ledger the transferable asset is NIGHT (DUST is the non-transferable fee resource), so the bridged-asset model must be corrected.

Scoped next

  • A conformant ICS-08 08-wasm GRANDPA light client deployable by governance via MsgStoreCode, checksum allowlist and MsgCreateClient, with MsgMigrateContract upgrades.
  • Key-and-value-bound trie membership proofs against a real Midnight bridge pallet so the minted amount, recipient and denom are bound to a proven storage value.
  • A pinned GRANDPA authority set with delayed rotation and a real header timestamp for getTimestampAtHeight and ICS-04 timeouts.
  • A real ICS-20 channel to a first counterparty plus a hardened, durable relayer that syncs account/sequence and anchors proofs on the bridge key.
  • End-to-end validation against a multi-validator Midnight node following a real Cardano main chain, with an operational metrics and alerting dashboard.
  • The Cosmos-to-Midnight return path as a 3-of-5 BIP-340 attestor committee, with a documented migration toward trust-minimized CometBFT verification.
  • A real privacy gateway with Groth16 verification and nullifier dedup, multi-chain rollout to Osmosis, Celestia and Noble, an independent security review and a public testnet.
Reproduced locally — both chains live

We ran the bridge demo on a workstation: a real Midnight node and the Cosmos interop chain, both producing blocks, with the relay server and bridge module active. The dashboard below is the project's own demo app connected to those live local chains.

Cosmos interop chain

localchain_9000-1

CometBFT 0.38.17 · height 48 and advancing · validator power 10

Midnight node

0.22.0-d31d1d5e

block 0x6c (108) and advancing · state root 0xc37dda5b…17dee2

Relay server

active

midnight1k8ezt0pf0ugyc7j9p2q3y4dmnjt58xz2exsddu

Midnight to Cosmos bridge demo dashboard connected to both live local chains
Section 03

Two fixed milestones · $40,000 + $30,000

Breakdown of Work

The work is split into two milestones. Each is a fixed price and a shippable, demoable outcome: M1 makes the proven one-way path production-trustless and IBC-native; M2 makes the bridge bidirectional and rolls it out across the ecosystem.

M1

Harden the Trustless One-Way Deposit Path into an IBC-Native Light Client

Weeks 1–7

$40,000 USD

ObjectiveTake the deposit path that verifies real GRANDPA finality on-chain today and turn it into a production-grade, governance-deployable IBC 08-wasm light client with key-and-value-bound state proofs — removing every dev-only shortcut so a mint is provably gated on a specific Midnight deposit record rather than test constants. End state: a real ICS-20 channel to a first counterparty carrying midnight wrapped assets, a hardened relayer, and full observability, validated end-to-end against a real Midnight node.

Work order items

M1.1

Port the GRANDPA verifier into a conformant ICS-08 08-wasm light client

Repackage the already-real Go GRANDPA verification logic into a Rust 08-wasm contract whose sudo and query messages match the ibc-go v8 ABI exactly: client_message as Binary, Height with revision number and height, MerklePath with key_path, and the delay periods. Add the missing migrate, VerifyUpgradeAndUpdateState, CheckSubstituteAndUpdateState and ExportMetadata handlers.

Deliverable. A WasmVM-loadable client the stock ibc-go 08-wasm keeper can drive through createClient, updateState, verifyMembership and misbehaviour, with a passing ABI conformance suite.

M1.2

Replace key-existence proofs with key-and-value-bound membership

Verify the actual bridge-transfer storage value (receiver, amount, denom) and bind the minted amount, recipient and denom to the proven storage value, against a Midnight runtime that carries the bridge pallet. Remove the structural-integrity fallback.

Deliverable. ConfirmDeposit that mints only the exact amount and recipient committed in a GRANDPA-verified storage value, with negative tests proving an arbitrary or unbound amount is rejected.

M1.3

Pin the GRANDPA authority set, ship governance deploy and rotation

Remove the trust-on-first-use bootstrap and pin Midnight's canonical authority set at genesis or via governance. Implement delayed authority-set rotation from ScheduledChange digests, wire a real header timestamp, and execute the MsgStoreCode proposal, checksum allowlist and MsgCreateClient.

Deliverable. A governance-deployed, checksum-allowlisted Midnight 08-wasm client instantiated on-chain with a pinned validator set and working rotation.

M1.4

Open an ICS-20 channel and route wrapped assets

Stand up a Hermes or Hyperspace relayer, run a real connection and ics20-1 channel handshake against a first counterparty, and route the minted wrapped token through the existing transfer and packet-forward stack with refund-on-timeout.

Deliverable. An open, named ICS-20 channel and a test that transfers a wrapped Midnight asset to the counterparty and back with correct escrow and timeout behavior.

M1.5

Harden the relayer into a reliable IBC messenger

Anchor state proofs on the real bridge storage slot, sync account and sequence numbers from chain, populate the authority set id and sender, wire the real proof path, add submit retries and inclusion waits, and persist last-relayed state.

Deliverable. A relayer that submits messages both chains accept, recovers from restarts without replay gaps, and passes a soak test against a live node.

M1.6

End-to-end validation against a real node plus observability

Run the full deposit path against a multi-validator Midnight node following a real Cardano main chain, drop the dev mocks, and ship a metrics and alerting dashboard covering client height, proof verification, mint volume, caps and freezes.

Deliverable. A green end-to-end suite against a non-dev Midnight node plus a live operational dashboard with alert rules for client staleness and circuit-breaker trips.

M2

Bidirectional Bridge, Privacy Gateway and Multi-Chain Rollout

Weeks 8–13

$30,000 USD

ObjectiveBuild the Cosmos-to-Midnight return path, preserve Midnight's privacy across the boundary, roll the bridge out to the broader IBC ecosystem, and validate the whole system under independent security review on a public testnet. The return path starts as an attestor committee with a defined migration toward a trust-minimized light-client or ZK design.

Work order items

M2.1

Ship the Cosmos-to-Midnight return path as a threshold attestor committee

Implement the 3-of-5 BIP-340 Schnorr attestor committee. Each attestor runs a Cosmos full node, observes the finalized burn event, and signs (receiver, amount, cosmos_tx_hash, height). Midnight verifies the threshold via native signature checks and an m-of-n maintenance authority with a nonce counter for replay protection, then re-shields.

Deliverable. A working withdrawal: burn the wrapped asset on Cosmos, collect 3-of-5 attestations, and credit the unlocked asset on Midnight, with replay and offline-attestor tests.

M2.2

Define and prototype the trust-minimized return-path migration

Because the Compact ZK VM cannot verify CometBFT in-circuit, document and prototype the migration toward real Tendermint verification: either a Substrate 07-tendermint pallet with real ed25519 and IAVL verification or a ZK attestation light client.

Deliverable. An architecture decision record plus a prototype that performs real CometBFT commit-signature and IAVL proof verification.

M2.3

Build the privacy gateway for shielded transfers

Replace the stub with real Groth16 proof verification and nullifier dedup. Ensure value unshields only at the boundary on deposit and re-shields on return, and correct the asset model so the bridgeable capital asset is NIGHT.

Deliverable. A privacy gateway that verifies real ZK proofs, enforces replay protection, and demonstrates a shielded-to-shielded round trip that never exposes amounts off-boundary.

M2.4

Multi-chain rollout to Osmosis, Celestia and Noble

Open governance-gated ICS-20 channels and run relayers to three additional ecosystems, register denom traces and packet-forward routes, and configure per-channel rate limits and escrow monitoring.

Deliverable. Live channels to at least three additional ecosystems with verified transfers, denom-trace registration and per-channel rate limits.

M2.5

Independent security review and remediation

Commission an independent review of the GRANDPA light client, trie-proof verifier, attestor threshold and replay logic, and IBC middleware composition. Triage, remediate criticals and highs, and re-test, including economic and liveness analysis of the attestor model.

Deliverable. A published review report, a remediation log closing all critical and high findings, and a regression suite for each fix.

M2.6

Public testnet launch and operations runbook

Deploy the full bidirectional bridge to a public testnet with the governance-deployed light client, attestor committee, privacy gateway and multi-chain channels, and publish an operations runbook covering key management, rotation and incident response.

Deliverable. A live public testnet bridge with a documented operations runbook and a monitored attestor and relayer fleet.

Sequencing across ~13 weeks

Delivery Roadmap

Milestone schedule

Fixed price · USD

Investment

MilestonePrice
M1Harden one-way deposit into IBC-native light client$40,000
M2Bidirectional, privacy gateway and multi-chain rollout$30,000
Total$70,000 USD

Fixed price per milestone

M1 is $40,000, M2 is $30,000. Scope per milestone is locked at kickoff; changes are handled as a short written addendum.

Milestone-based billing

M1 is invoiced at kickoff to begin; M2 is invoiced on acceptance of M1. Each milestone ends in a demoable outcome.

Full IP ownership

All code and deliverables transfer to the client on payment of each milestone.

What we rely on, what's excluded

Assumptions & Scope

Assumptions

  • Midnight exposes a real bridge pallet that records deposits as queryable, GRANDPA-verifiable storage values; M1 value-binding depends on the final on-chain storage layout.
  • A non-dev, multi-validator Midnight network following a real Cardano main chain is available for M1 end-to-end validation; otherwise validation runs against the best available staging network.
  • The Cosmos interop chain remains on ibc-go v8 with 08-wasm, transfer, packet-forward and rate-limit wired in; counterparty chains run compatible ibc-go versions.
  • Governance access is available to pass MsgStoreCode, allowlist the client checksum, instantiate via MsgCreateClient and later MsgMigrateContract.
  • Midnight's runtime supports the threshold signature and m-of-n maintenance-authority semantics the M2 return path relies on.
  • The bridgeable capital asset is NIGHT, not the non-transferable DUST fee token; wrapped denoms and supply invariants are modeled on NIGHT.
  • Client provides Midnight and Cosmos testnet endpoints, funded relayer signing keys, and the runtime metadata needed for SCALE storage-key derivation.

Out of scope

  • Mainnet launch, custody of real user funds, and any token-economic or liquidity provisioning for wrapped assets.
  • Changes to Midnight's core consensus, ledger or Compact toolchain beyond the bridge pallet and integration points.
  • A fully in-circuit ZK verification of CometBFT on Midnight, which the specs establish as currently infeasible; M2 delivers the attestor committee plus a migration prototype only.
  • Formal verification or audit certification beyond the single independent security review scoped in M2.
  • Consumer wallet or end-user UX beyond the operational monitoring dashboard.
  • Indexer, explorer or analytics infrastructure beyond the operations dashboard.
  • Legal, regulatory and compliance review of cross-chain asset transfers.
Section 04

Next Steps

From here to a production-bound bridge, in three steps.

1

Review this scope

Confirm the engineering plan and milestone breakdown, and flag anything to add, cut or re-sequence.

2

Sign the letter of engagement

Sent on your confirmation — covers the fixed price, milestone terms and IP ownership.

3

Kick off Milestone 1

We confirm node and governance access, pin the authority set, and begin the 08-wasm light client.

Direct contact: utkarsh@webisoft.com

Webisoft · Montreal, QC · webisoft.com

Confidential — Midnight ↔ Cosmos Bridge Scope of Work