Knowledge Lab · Tokens and covenants

What should I figure out before I start coding a covenant app?

Short answer

Before coding, define the rules your app must never break, who may spend its coins, and how its state changes. Decide whether users can act independently or must share one state. Plan how the app will find and explain its coins, then check tooling maturity and security needs.

Before coding a covenant app, work out its spending rules, state layout, permissions, data needs and verification plan. Choose the smallest design that can enforce the rules, rather than choosing a language first. That is the practical rule in the Toccata Decision Guide. [1]

1. Write down what must never go wrong

Start with the app’s invariant: a rule that must remain true after every allowed action. The Decision Guide recommends choosing the model around that rule. [1]

Write a short specification covering:

  • What each action is allowed to change.
  • Who must approve it.
  • Where the coins may go.
  • What must remain locked.
  • How the app ends or lets someone leave.

For a token issuer, for example, checking the rule means checking that its minting logic cannot create tokens beyond its cap. In his September 2026 explanation, IzioDev described this as part of verifying that a covenant system is sound, alongside checking its launch and any other covenants it relies on. [2]

Treat a successful example transaction as only one part of the specification. Also describe the transactions that the rules must reject.

2. Decide where the state lives

A UTXO is an unspent transaction output: a coin available to spend. Covenant applications can use one live state UTXO, many independent UTXOs, or a family of contracts with different roles. The right choice depends on how users interact. [1]

Use these starting points:

  • One sequential process: one live state UTXO.
  • Independent positions, tickets, vaults or games: a family of separate UTXOs.
  • Token-like conservation: a shared covenant identity with coordinated checks across inputs and outputs.
  • Different roles and routes: multiple cooperating contracts.
  • One private or expensive check: consider inline zero-knowledge verification, which checks a proof inside a covenant. [1]

Then look for contention: many users trying to spend the same state coin. Other warning signs include needing to prove that no matching UTXO exists anywhere, coordinating many fragments of state, or requiring large amounts of supporting data in each transaction. These are design alarms, not automatic reasons to abandon covenants. [1]

If shared state and many operations combined into one transition dominate the app, the Decision Guide points toward a based app instead of a plain covenant: users send ordinary Kaspa transactions, the app’s own software computes the shared state, and a covenant on Kaspa accepts each new state only with a proof that it was computed correctly. This is the vProgs-style path, and it needs operators to run the execution and proving. [1]

3. Separate spending permission from app rules

For every action, specify both who authorizes it and what the transaction must preserve.

IzioDev’s September 2026 explanation makes this distinction concrete: trusting a covenant involves inspecting its source, checking its genesis (the transaction that created it and fixed its covenant ID), and checking that its transition rules actually enforce the intended behavior. If it relies on another covenant, that dependency also needs verification. [2]

A useful design document therefore gives each action its own entry:

  • Required authorization.
  • Required previous state.
  • Allowed next state.
  • Required destination of the coins.
  • Dependencies on other contracts.

4. Plan how the frontend learns the state

Do not assume an address or covenant ID tells your interface everything.

The live UTXO stores a script commitment, not a decoded application-state object. A covenant-aware reader needs enough supporting material to explain what the coin represents. [3]

The Covenant State documentation lists what an indexer, the software that follows the chain and records each covenant’s coins, should track: covenant IDs, live UTXOs, the transactions that created them, the script data needed to decode their state, genesis data, and, for multi-contract apps, the fingerprints of the contract templates and routes they use. [3]

A useful, less obvious consequence is that coin discovery and state decoding are separate jobs. IzioDev highlighted this on 16 September 2026: finding the covenant UTXO does not necessarily reveal its current state; something must track that state. [4]

5. Make verification and tooling part of the design

Plan a reproducible launch record, not just a deployment transaction. On 2 October 2026, Michael Sutton described an initial Argent implementation of genesis proofs: a verifiable connection from a covenant ID to its source code, deployment parameters and starting state. He presented explorer support for these proofs as an ecosystem goal, not a universal existing feature. [5]

Finally, check the exact tools your design needs against your delivery timeline. Active consensus features do not mean all developer tooling is equally mature. [1] Keep compiler output separate from security assurance, and include rejected spends, dependency checks and independent review in your verification plan.

Sources

  1. Decision GuideDocs · Kaspa documentation (docs.kaspa.org, community-run) · October 18, 2026
  2. Post by IzioDevPost · @IzioDev on X · September 24, 2026
  3. Covenant StateDocs · Kaspa documentation (docs.kaspa.org, community-run) · October 18, 2026
  4. Post by IzioDevPost · @IzioDev on X · September 16, 2026
  5. Thread by Michael SuttonPost · @michaelsuttonil on X · October 2, 2026

Checked on

All answers