Protocol upgrade

Kaspa Toccata explained

A Kaspa coin can now carry a rule about how it is allowed to move next, and the network itself checks that rule. Toccata turned that on at the base layer, without turning Kaspa into an EVM.

Activated: Rusty Kaspa v2.0.1 is the current Toccata release. v2.0.0 set mainnet activation at DAA score 474,165,565, and mainnet crossed it June 30. See Toccata status for what's checked since.

Direct answer

What Toccata turned on

Four rules, worth naming exactly, because the vague version of this list is where the overclaiming starts.

KIP-17

A UTXO can read the transaction spending it and pin down what the next output has to look like. Vaults, escrow, spend caps, refunds.

KIP-20

Covenant IDs give covenant state a lineage consensus tracks, so nobody can conjure up a fake lookalike.

KIP-16

Instead of L1 running every app step, a script checks a proof from a chosen proof system.

KIP-21

Sequencing commitments let an app prove its own lane instead of almost the whole DAG.

vProgs

Full vProgs are not part of what activated. They come later, for shared app state.

Based apps

Apps anchor state to Kaspa ordering and settle proofs back to it, with no separate sequencer in the way.

That is the whole activated surface. No virtual machine, no accounts, no global shared state, no contract deployment step. A covenant is a rule attached to coins, and nothing sits at an address waiting to be called, so app logic lives in bounded UTXO steps, in proofs, or in app-side work anchored back to L1.

Covenants

Spend rules become state rules

A covenant-style spend requires the next output to keep a rule, which turns a UTXO into a small state machine: the coin moves, but the rule keeps going.

KIP-17 adds the script tools: byte handling, hashing, transaction introspection, and signatures from the stack. A rule by itself will not stop someone forging a lookalike UTXO with logic that looks right and no real history. KIP-20 closes that gap, keeping a stable 32-byte identity through every valid step forward, so a copy without the lineage fails the check.

Use caseWhat the rule controlsStatus
VaultWithdrawal delay, recovery key, spend cap, or escape path.Live
EscrowRelease, refund, timeout, or dispute transition.Live
Assurance fundingPayout only after enough matching commitments arrive before a deadline.Live
Controlled assetsTransfer rules, controller input, or issuer rule.Live
ZK proof checksA claim about chosen public inputs.Live
Cross-app compositionSeveral app states succeed or fail together in one transaction.Demos only
Shared mutable stateMany users mutating one app state at once.Roadmap

Primary sources: KIP-17 covenants and KIP-20 covenant IDs.

Proofs and lanes

Proofs move the work off L1, then settle back

One proof can stand for many off-chain app actions. That L1 transaction may weigh more than a simple payment, but it is a settlement or a check, not the computation itself.

KIP-16 adds OpZkPrecompile with initial Groth16 and RISC0-Succinct paths, letting a script check a proof about chosen public inputs. ZK does not prove prices, bridge truth, or real-world events on its own. Outside facts need an anchor: a light client, a finality certificate, an oracle, or a challenge process.

KIP-21 answers a separate cost problem. Based apps use Kaspa L1 ordering, and the simple design gets expensive fast: every app would have to prove which L1 transactions were for it and which were not, so at scale proving what isn't yours turns into the real burden. Partitioned sequencing commitments let a prover follow one app lane instead.

Standard fee floor

Operator changes

Toccata raises the standard fee floor to 100 sompi * max(compute grams, 2 * transaction bytes). Before activation that floor covered only direct RPC submissions; the guide says relayed transactions fall under it too once the fork is live. Mempool policy and consensus stay separate rule sets, which is why a zero-fee transaction can still be valid to consensus while an upgraded node drops an underpriced standard transaction from relay on policy. Upgrade steps for node operators, wallets, exchanges, and pools are on Toccata status.

The byte-size change is tied to proof support. The guide points to the doubled transient-mass limit as the reason hardware specs changed, so ZK-STARK proofs can fit.

Pools and solo miners need to keep post-Toccata block-template fields and test mining flows against them. The hands-on version is mining Kaspa.

Primitives and products

Seven things between a rule and an app

Shipping a consensus rule is like shipping a new instruction in a processor. The instruction is real the moment the chip ships, and useless to almost everyone until somebody writes a compiler that emits it and enough shared convention that two teams can read each other's output. Toccata shipped the instructions on June 30. July was spent on the toolchain.

Checked July 29, 2026. Rows and covenants rechecked August 14. Anything merely announced is left out.

PieceWhat it doesWhere it is
A languageCovenant scripts are compiler output. SilverScript produces them.Experimental Took a breaking change on July 12, after mainnet activation.
A frameworkReal apps are several covenants that have to agree. Argent is the attempt.Unaudited Its README names an audit as the gate. 58 commits in July, no tagged release, last breaking change July 24.
Shared conventionsIf your token and my wallet disagree about byte layout, neither works. KCCs settle that.Proposed Process opened July 15. Five open pull requests, none merged; two others withdrawn August 9 for a planned KCC-0060 renumbering.
An indexShowing someone their tokens means finding every UTXO carrying a covenant ID.Missing No getUtxosByCovenantId RPC. Called planned on the forum. No code.
ExplorersSomeone has to look at a covenant and see what it is.Missing Block explorers do not decode covenant data. One third-party indexer, kascov, does.
WalletsA user signs a covenant transaction without understanding any of this.Missing No verified covenant-signing support in any major Kaspa wallet.
SDKsBindings so an application can build these transactions.Prerelease kaspa-python-sdk v2.0.2.rc1, published July 23.

Four of those seven are the reason mainnet holds 373 active covenants worth about 1.67 million KAS while Testnet-10 holds 74,199. The rules are equally available on both. Only one is a place where the missing pieces do not matter yet. Mainnet covenant creation rose fifteenfold to August 8, then slowed to about 2 percent growth the following week.

Conventions cannot be settled by a protocol upgrade, because they are agreements between people who ship independent software. That argument happens in the open at kas-smiths.org and in the public Core R&D Telegram group, where the token standard draft KCC-0020 still has an open disagreement about whether token metadata belongs inside the spec. Treat everything there as proposal-stage: a thread with a confident name is still a thread, and the test is a merged KIP or a merged KCC. Track both on the KIP and KCC tracker.

The two projects below are the current attempts at closing the rest of the gap.

Application language

Argent, the layer between a covenant and an app

Toccata made covenants enforceable. It did not make them writable. A covenant is opcodes, and writing a multi-contract application in them by hand, then auditing it, is not something most teams will do. Argent is Michael Sutton's attempt at filling that gap, and it is not officially blessed. An Argent actor is a covenant object that a transaction consumes and recreates.

Open the language model, with a worked example

On an account chain, a contract is a thing that sits at an address and receives calls. On Kaspa there is no such thing to call. There are only outputs, and a covenant is a rule about what the next output has to look like. Argent takes that constraint seriously instead of hiding it: an application is a transaction-wide state transition over covenant UTXOs, and the compiler's job is to turn a readable description of that transition into script the network already enforces.

Four ideas carry the core, and they are not the whole surface: the documented set is eight, adding delegate, consumes, and emits, with the route machinery sitting behind those, and routes are where the hard parts live. A state is a typed record. An actor owns one. An entry is a way to spend that actor, taking arguments and declaring which actors it emits. And become names the successor the transaction creates.

state TicketState {
    byte[32] owner;
    int units;
}

actor Ticket owns TicketState {
    entry transfer(byte[32] next_owner, sig owner_sig, pubkey owner_pk) emits next: Ticket {
        require(blake2b(owner_pk) == owner);
        require(checkSig(owner_sig, owner_pk));
        require(next.value == self.value);

        TicketState new_state = {
            owner: next_owner,
            units: units,
        };

        become next <- Ticket(new_state);
    }
}

app Tickets {
    actor Ticket;
}

Nothing here is a call to a contract. The transaction spends the old ticket and creates the new one, and every require is a condition the script engine checks before it will let that happen. If a condition fails, the transaction is invalid. There is no revert, no gas refund, and no partially applied state, because there was never a running program to interrupt.

Inter-Covenant Communication extends the same model across independently compiled applications, so an actor from one app can observe or authorize an actor from another inside a single atomic transaction. That is the piece that makes something like a mint controller possible: one app owns the asset rule, another owns the policy that decides when supply moves, and neither has to be recompiled into the other.

The compiler emits three things for each build: artifact.json as the portable description, manifest.json as build metadata, and ordinary .sil Silverscript contracts. Those contracts use no covenant macros and compile like any other Silverscript, which matters for review: an auditor reads generated script, not a black box. An argentc inspect command reports script and state sizes, static opcode counts, entry arguments, route metadata, and signature-script size estimates without rebuilding. The design targets script composition primitives such as OP_CAT and OP_SUBSTR, transaction introspection, and consensus-supported covenant identities. That last one is KIP-20, which Toccata carried to mainnet.

Every example the compiler ships partitions cleanly: one UTXO per ticket, per game, per position. Two never touch the same state, so the parallel work comes free from the data model instead of a scheduler.

The hard one is shared mutable state, where many users change a single object at once, such as a pooled market maker or an order book. Those are most of what people mean by DeFi, and no public Argent code implements one. The playground's DEX is a single pair, and the compiler's own SECURITY.md never mentions replicas, keepers, or bounded divergence, the shape a partitioned pool would need. Partitioned state looks solved; shared state is a design direction with no implementation anyone can read.

Three repositories, and one person writes nearly all of it. Michael Sutton holds 73 of the compiler's 77 commits.

RepositoryCreatedLast pushStarsReleases
argent2026-06-162026-08-0219None
argent-playground2026-07-092026-07-316None
argent-template2026-07-242026-07-307None

Baseline read on August 14, 2026. This table refreshes from GitHub when the page loads.

Fifty-eight of those commits landed in July, and the project moved out of his personal namespace into an argent-lang organization.

Argent's own README answers the production question in two halves, and quoting only the first gets it wrong. The caution is real: "The project is still under active development and is not yet release-ready," a production path opens only "Once Silverscript completes its audit and is released," and Argent "will still need further audit and hardening before general production use." The second half names what that caution is about: "The main pieces are present: compiler, generated Silverscript, portable artifacts, runtime transaction building, multi-actor routing, cross-app linking," and five more. That is a list of things that work, not things planned. The gate is a review queue, not a construction site: an audit on Silverscript, then a release, then an audit on Argent. Until then the README points at advanced users who can read the generated .sil themselves.

Silverscript, the layer underneath, still labels itself experimental and recommends its bytecode artifact only on testnet-10. Kaspa's Argent chapter is more cautious again, calling it "a design direction and prototype, not a production-stable API." Read that as the ecosystem's conservative floor rather than the project's current state, since the same page still links the old repository path. Either way, anyone describing Argent applications as running on Kaspa mainnet today is describing something that has not happened.

Roadmap architecture

vProgs, and the line Toccata does not cross

Two vProgs transactions touching different resources never wait on each other, and a proof lands on Kaspa L1 instead of a replay of every step.

Status: vProgs are prototype and roadmap work. Full vProgs and native Kaspa DeFi are not live on mainnet.

A global account model makes every app action compete for the same shared state, even when the actions have nothing to do with each other. vProgs break that state into separate named resources, built from the read and write list a transaction declares up front. Each resource acts like its own lane, so only the transactions touching the same one have to settle their order. Hans Moog's vProgs walkthrough does not claim a raw TPS number.

The public kaspanet/vprogs repo calls itself an early-development Rust framework for based computation on Kaspa. Its README splits the framework into six layers, from shared types up to a runnable node, and the repo tree carries more, including a ZK side with a RISC Zero backend.

SignalReading
Last pushJuly 28, 2026
Stars52
Tagged releasesNone
Most recent workA program-agnostic daemon engine and a vprun CLI, landed July 28, 2026

Baseline read on August 14, 2026, unchanged. This table refreshes from the repository when the page loads.

An active repo is evidence of work, not of readiness. The line between this and Toccata is narrower than usually drawn: joining separately compiled covenant apps into one all-or-nothing transaction works on Toccata itself, through Argent's Inter-Covenant Communication, so far only in unaudited offline demos. What vProgs add is the shared mutable state case, which has not reached testnet.

So the model fits products with many users hitting one app, or a proof too big for a covenant spend to carry. Most Kaspa apps do not need it yet. Pick the smallest state model that does the job.

App case

Coordination markets, where a rule replaces an operator

The assurance-funding row above is a coordination market: it pays out only once enough strangers commit to the same condition. A website can run that loop too, and usually a website is the right answer. The version worth putting on a chain is the one where the people paying in expect the operator to move the threshold after seeing the pledges. A covenant moves the release rule out of the operator's database and into the spend rule, where breaking it means making a transaction consensus throws out.

Status: research direction. Two problems have no shipped answer. A covenant cannot see the outside world, so anything settling on a price or an event needs an oracle whose trust model is spelled out first. And no wallet yet shows a user the condition they are about to sign.

Which argues for starting narrow: one condition, one payout rule, and a group small enough to name everyone in it. Assurance funding for a single repeat event is a real test with real users at the end.

Read the spec

The underlying material

Protocol and release references: Rusty Kaspa v2.0.1, Rusty Kaspa v2.0.0, Toccata node setup guide, KIP-16, KIP-17, KIP-20, KIP-21, Kaspa programmability docs, vProgs, Argent, SilverScript, kaspanet/kccs, Kas Smiths, and kascov.