warda_grant.sil · v4 · fingerprint b3e5eeefacf2021f
Every verdict below comes from TxScriptEngine, the same script
engine a Kaspa node validates a transaction with. Nothing here is inferred from reading
the source.
118 transactions built and executed. This is a conformance result, not a safety one — what that distinction costs is two sections down.
GUARANTEES.md disagree, and which
claims no constructed transaction could reach. The last of those is a section, not an
omission.One bar per entrypoint, on one scale: a longer bar is more published claims. Boundary means a numeric pair was measured on the claim's own axis, one unit apart. Flip means only the refusal was executed, attributable because the case is a single field from an accepted baseline — a Merkle root has no number line, so its claims can only ever be flip grade. Neither is better; they are different evidence.
auth_spenddelegaterevokereclaimreabsorbsettleThe engine collapses every failed require into one opaque
VerifyError. It never says which rule rejected, so asserting that something
was refused proves nothing on its own — a malformed signature script looks exactly like a
working spending cap.
Every case is a single field changed from a baseline this run proved the engine accepts. A rejection can therefore only be caused by the field that moved. Numeric rules are exercised one unit either side of their boundary, so a rule that is present but in the wrong place shows up as a disagreement rather than as a pass.
The filled mark is the tightest value the engine accepted. The barred mark is the loosest it refused. Both were executed; neither is inferred.
No violations — nothing the guarantees forbid was accepted. No over-refusals — nothing they permit was refused.
This is the report's denominator: each enforcement claim GUARANTEES.md
makes, and each require in the two exits, against what this run executed.
A claim nothing covers is listed here as uncovered rather than left out of the count.
Boundary — a numeric pair was measured on the claim's own axis, one unit apart. Flip — only the refusal was executed, and it is attributable because the case is a single field away from an accepted baseline. A Merkle root has no number line, so its claims can only ever be flip grade.
| Entry | Claim | Grade |
|---|---|---|
auth_spend | the payee is on the allowlist | flip |
| the amount is within the per-spend cap | boundary |
| total spending stays within budget | boundary |
| per-epoch spending stays within the epoch cap | boundary |
| epochs are consumed once, in order | flip |
| the claimed time has actually arrived | boundary |
| the window has opened | boundary |
| the window has not closed | boundary |
| authority is unchanged in the successor | flip |
| the successor state is exactly right | flip |
| the continuation keeps the remainder | boundary |
| the agent signed it | flip |
delegate | the child cannot exceed the parent's uncommitted budget | boundary |
| every attenuable field only narrows | boundary |
| the allowlist is inherited exactly | flip |
| the child starts clean | flip |
| the parent changes in exactly one way | flip |
| coin follows authority | flip |
| exactly one child | flip |
revoke | signed by the revocation key | flip |
| the output is P2PK(principalKey) | flip |
| the output keeps the balance, less maxFee | boundary |
reclaim | the term is over — tx.daa >= expiresAt | boundary |
| signed by the principal key | flip |
| the output is P2PK(principalKey) | flip |
| the output keeps the balance, less maxFee | boundary |
reabsorb | the child is a real input, and not the parent itself | flip |
| the pop is proven — the parent carried exactly this child | flip |
| the child has no outstanding children of its own | flip |
| reserve is released by exactly the child's budget | flip |
| the child's spending becomes the parent's | flip |
| everything else about the parent stands still | flip |
| the parent's agent signed it | flip |
| one continuation, and the coin from both inputs lands in it | boundary |
settle | signed by the revocation key | flip |
| the co-input is a grant of this template | flip |
| exactly two inputs | flip |
| output 0 is that grant's single authorised continuation | not covered |
| the output keeps both inputs' coin, less maxFee | boundary |
| Rule | Transaction | Guarantee | Engine |
|---|---|---|---|
| baseline | 0.5 KAS to an allowlisted payee, in the window, within every cap | permits | accepted |
| per-spend cap | exactly the cap | permits | accepted |
| per-spend cap | one sompi under the cap | permits | accepted |
| per-spend cap | one sompi over the cap | forbids | refused |
| per-spend cap | a hundred times the cap | forbids | refused |
| per-spend cap | one sompi | permits | accepted |
| per-spend cap | nothing at all | forbids | refused |
| per-spend cap | a negative amount | forbids | refused |
| budget | exactly the uncommitted budget | permits | accepted |
| budget | one sompi past the uncommitted budget | forbids | refused |
| budget | exactly what is left once reserve is counted | permits | accepted |
| budget | one sompi into the reserve | forbids | refused |
| epoch limit | exactly this epoch's remaining allowance | permits | accepted |
| epoch limit | one sompi past this epoch's allowance | forbids | refused |
| epoch ratchet | a later epoch, with its own fresh allowance | permits | accepted |
| epoch ratchet | the recorded epoch, which is already exhausted | forbids | refused |
| epoch ratchet | an EARLIER epoch — the v1 allowance reset | forbids | refused |
| epoch ratchet | the first epoch, long past | forbids | refused |
| cltv | locktime exactly the claimed DAA | permits | accepted |
| cltv | locktime one DAA below the claim | forbids | refused |
| window opens | the first DAA of the window | permits | accepted |
| window opens | one DAA before the window opens | forbids | refused |
| window closes | the last DAA of the window | permits | accepted |
| window closes | the first DAA after expiry | forbids | refused |
| window closes | well past expiry | forbids | refused |
| authority immutable | budgetTotal raised by one in the successor | forbids | refused |
| authority immutable | budgetTotal lowered by one in the successor | forbids | refused |
| authority immutable | maxPerSpend raised by one in the successor | forbids | refused |
| authority immutable | maxPerSpend lowered by one in the successor | forbids | refused |
| authority immutable | epochLimit raised by one in the successor | forbids | refused |
| authority immutable | epochLimit lowered by one in the successor | forbids | refused |
| authority immutable | epochLength raised by one in the successor | forbids | refused |
| authority immutable | epochLength lowered by one in the successor | forbids | refused |
| authority immutable | notBefore raised by one in the successor | forbids | refused |
| authority immutable | notBefore lowered by one in the successor | forbids | refused |
| authority immutable | expiresAt raised by one in the successor | forbids | refused |
| authority immutable | expiresAt lowered by one in the successor | forbids | refused |
| authority immutable | delegationDepth raised by one in the successor | forbids | refused |
| authority immutable | delegationDepth lowered by one in the successor | forbids | refused |
| authority immutable | agentKey swapped in the successor | forbids | refused |
| authority immutable | recipientsRoot swapped in the successor | forbids | refused |
| authority immutable | templateId swapped in the successor | forbids | refused |
| successor accounting | spend the money, record nothing | forbids | refused |
| successor accounting | spentTotal short by one | forbids | refused |
| successor accounting | spentTotal over by one | forbids | refused |
| successor accounting | reserved raised by one | forbids | refused |
| successor accounting | reserved lowered by one | forbids | refused |
| successor accounting | epochSpent short by one | forbids | refused |
| successor accounting | epochSpent over by one | forbids | refused |
| successor accounting | epochIndex pushed forward | forbids | refused |
| successor accounting | epochIndex pushed backward | forbids | refused |
| continuation value | a fee of exactly maxFee | permits | accepted |
| continuation value | a fee one sompi over maxFee | forbids | refused |
| continuation value | the whole remainder taken as fee | forbids | refused |
| signature | signed by a key that is not the agent's | forbids | refused |
| allowlist | member 0xa1 of the allowlist | permits | accepted |
| allowlist | member 0xa2 of the allowlist | permits | accepted |
| allowlist | member 0xa3 of the allowlist | permits | accepted |
| allowlist | member 0xa4 of the allowlist | permits | accepted |
| allowlist | a payee absent from the allowlist | forbids | refused |
| allowlist | a proof naming an allowlisted payee, money going elsewhere | forbids | refused |
| delegation baseline | a child narrower on every axis | permits | accepted |
| delegation attenuation | child maxPerSpend exactly equal to the parent's | permits | accepted |
| delegation attenuation | child maxPerSpend one step wider than the parent's | forbids | refused |
| delegation attenuation | child epochLimit exactly equal to the parent's | permits | accepted |
| delegation attenuation | child epochLimit one step wider than the parent's | forbids | refused |
| delegation attenuation | child notBefore exactly equal to the parent's | permits | accepted |
| delegation attenuation | child notBefore one step wider than the parent's | forbids | refused |
| delegation attenuation | child expiresAt exactly equal to the parent's | permits | accepted |
| delegation attenuation | child expiresAt one step wider than the parent's | forbids | refused |
| delegation attenuation | child delegationDepth one below the parent's | permits | accepted |
| delegation attenuation | child delegationDepth exactly equal to the parent's | forbids | refused |
| delegation start | a child born already having spent one sompi | forbids | refused |
| delegation reserve | no reserve taken | forbids | refused |
| delegation reserve | reserve one KAS short | forbids | refused |
| delegation reserve | reserve one KAS over | forbids | refused |
| delegation budget | a child taking exactly the parent's uncommitted budget | permits | accepted |
| delegation budget | one sompi more than the parent has left | forbids | refused |
| delegation allowlist | a child claiming a different allowlist with an empty witness | forbids | refused |
| delegation coin | the child's coin exactly its budget | permits | accepted |
| delegation coin | the child's coin one sompi short of its budget | forbids | refused |
| delegation coin | one sompi over | forbids | refused |
| delegation fanout | one child | permits | accepted |
| delegation fanout | two children in one delegation | forbids | refused |
| revoke signature | the revocation key | permits | accepted |
| revoke signature | the agent's key, not the revocation key | forbids | refused |
| revoke signature | the principal's key, not the revocation key | forbids | refused |
| revoke destination | paying anybody but the principal | forbids | refused |
| revoke conservation | a fee of exactly maxFee | permits | accepted |
| revoke conservation | one sompi more than maxFee burned | forbids | refused |
| reclaim signature | the principal's key | permits | accepted |
| reclaim signature | the agent's key, not the principal's | forbids | refused |
| reclaim signature | the revocation key, not the principal's | forbids | refused |
| reclaim destination | sweeping to anybody but the principal | forbids | refused |
| reclaim term | the first DAA the term allows | permits | accepted |
| reclaim term | one DAA before the term is over | forbids | refused |
| reclaim conservation | a fee of exactly maxFee | permits | accepted |
| reclaim conservation | one sompi more than maxFee burned | forbids | refused |
| settle baseline | a child settled home, its spending charged and its reserve released | permits | accepted |
| settle child index | the child claimed at the parent's own index | forbids | refused |
| settle child index | the child claimed at an input that does not exist | forbids | refused |
| settle child index | the child claimed at a negative index | forbids | refused |
| settle pop | a previous reserve root the parent never carried | forbids | refused |
| settle leaves first | a child that still has coin committed to a grandchild | forbids | refused |
| settle reserve | the reserve not released | forbids | refused |
| settle reserve | more reserve released than was held | forbids | refused |
| settle charge | the child's spending never charged to the parent | forbids | refused |
| settle charge | one sompi less charged than the child spent | forbids | refused |
| settle parent still | the parent raising its own per-payment cap | forbids | refused |
| settle parent still | the parent extending its own expiry | forbids | refused |
| settle parent still | the parent inflating its own budget | forbids | refused |
| settle parent signature | the parent's half signed by the revocation key | forbids | refused |
| settle child signature | the revocation key | permits | accepted |
| settle child signature | the child's half signed by the agent's key | forbids | refused |
| settle child signature | the child's half signed by the principal's key | forbids | refused |
| settle co-input | the revocation key settling a child against its own dust | forbids | refused |
| settle conservation | a fee of exactly maxFee across both inputs | permits | accepted |
| settle conservation | one sompi more than maxFee | forbids | refused |
Everything above compares the bytecode to a written claim, which is why it cannot notice a rule that should exist and does not. A second pass asks a question nobody had to write down first: it generates spend attempts structurally, discards everything the engine refused, and asserts one property of what is left — an accepted spend must not leave the agent able to do more than it could before, minus what it just paid.
| Covenant | Generated | Engine accepted | Authority grew |
|---|---|---|---|
warda_grant.sil v4, as written | 768 | 61 | 0 |
| the same, with the epoch ratchet removed | 768 | 69 | 8 |
The second row is the self-check, and it is not decoration. An oracle that has
never fired is indistinguishable from one that cannot, so the run ends by deleting
require(currentEpoch >= prevState.epochIndex) from the covenant —
and requiring the same oracle to catch it. It does: an agent whose epoch allowance is exhausted claims an earlier epoch, and the whole allowance comes back.
That is the one line in this report that says a clean run above is worth something. The oracle can fire, it fires on a covenant this one used to be, and it is silent on the covenant as written.
settle: that output 0 is the co-input grant's single authorised continuation. The baseline builds exactly that shape, so there is no transaction in this run where it is the only thing wrong — the refusals that would prove it are indistinguishable from the co-input check firing first.maxProofDepth 4. Whether the same boundaries hold at depth 16, or with a 65,536-member tree, or a one-sompi budget, is untested.GUARANTEES.md: allowance from unused epochs stays spendable after the chain passes expiresAt. That is a property of the design, correctly implemented, not a defect the engine can report.This instrument checks the bytecode against a written claim. It cannot notice a rule that should exist and does not, because the document it takes its claims from is the same document that would have omitted it.
That is not a hypothetical. Of the five vulnerabilities this covenant has had, none would have been caught by the claims suite. The epoch cap that limited nothing and the missing expiry check were both absent from the guarantees at the time. The template-id defect is not engine-visible. The fifth was in settle, The fifth is now covered — but only because it has already been found: the claim it violates was written as part of its fix, and a suite whose oracle is the documentation learns about a hole the day somebody else closes it. Every one of the five was found the same way, and it was not this way: a person asked what an adversary supplies at each input, built it, and watched the engine accept it.
The section above it is the answer to that, and the only one this tool has: an oracle that consults no document, and a covenant with a known hole in it to prove the oracle can fire.