Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

What is a manifest?

Any multi-UTXO protocol — whether it uses Bitcoin miniscript, Tapscript, or Liquid Simplicity — imposes a specific transaction layout. Covenants that do transaction introspection are especially strict: input 0 must be a specific asset, output 1 must go to a specific script hash, output 2 must carry exactly the right amount. The on-chain program enforces this, but someone still has to document what layout it expects.

Historically that documentation was a PDF, a Notion page, or a comment in the source. It was informal and only useful to the person who wrote it. Anyone else building a wallet integration had to reverse-engineer the expected transaction shapes and hope the docs were current.

A manifest formalises that document. The same information that used to go into prose — "the pre-lock UTXO must be at input index 0, the collateral goes to output 2, the borrower's NFT must be co-spent" — is expressed as structured JSON that tools can read.

Manifest, instance, state

A live contract is three things, not one:

What it holdsLifetime
The manifestThe protocol definition: contract templates, actions, inputs, outputs, witnesses.Static — one file, shared by every deployment of the protocol.
The instanceThe compile-time field values for one deployment: this borrower's pubkey, this loan's amount.Fixed when the contract is instantiated, then read by every later action.
The stateThe live on-chain UTXO set for that instance.Changes with every broadcast.

The manifest is the cookbook recipe; the instance is the specific ingredients you bought; the state is what's currently in the pot.

Only the manifest is a document you write and share. The other two are data a wallet accumulates by running actions, and it must keep them: without the instance it cannot rebuild the contract's addresses, and without the state it cannot find the UTXOs to spend.

Where that data lives is the wallet's business. The format says what has to persist between actions, never how to store it. The CLI in this book writes JSON files next to the manifest; a browser extension would use its own storage, and a hosted wallet a database. Nothing in a manifest depends on the choice.

For the first several recipes we work only with the manifest — the other two are introduced in Instance, state & constructors.

What a manifest contains

Everything a wallet needs to build the protocol's transactions without reading the covenant source: the contract types and their compile-time fields, the on-chain states those contracts can create, and the valid transactions between them.

Anatomy of a manifest dissects each section in turn. But first, let's get the tooling ready.