Class A: Reader
Decodes a Drops leaf and reports its fields correctly. Suitable for a wallet preview, an inspection tool, or a decoder. Makes no claim about whether a Drop exists on chain.
Conformance
Three classes, each a superset of the one before. Every requirement is written so that it either passes or fails against the test vectors. If a statement here cannot be tested, it does not belong on this page.
Decodes a Drops leaf and reports its fields correctly. Suitable for a wallet preview, an inspection tool, or a decoder. Makes no claim about whether a Drop exists on chain.
Everything in class A, plus full Taproot commitment verification against the spent output. May state that a given reveal input is a valid Drop.
Everything in class B, plus confirmation policy, identity assignment, custody projection and reorganisation handling. May serve a record set that others rely on.
An implementation should state which class it claims. A tool that decodes leaves is useful and honest as a class A implementation; a tool that decodes leaves and calls the results verified Drops is neither.
must reject any script that does not decompile to exactly ten chunks in the required arrangement. Test: IV-9, IV-10.
must require the minimal push encoding for every field, and must reproduce the input script byte for byte when re-serializing the parsed fields.
must reject a one-byte body of 0x81 or 0x01 through 0x10, and must accept a one-byte body of 0x00. Test: IV-5.
must accept only the markers drops and drops-pact, and must reject bip110-op-drop. Test: IV-2.
must enforce the content-type grammar, the ASCII requirement and the 80-byte cap, and must reject parameters and uppercase. Test: IV-3, IV-4.
must recompute SHA-256 of the body and compare it with the hash field. Test: IV-1.
must validate the creator key as a point on secp256k1, not by length alone. Test: IV-8.
must enforce the body length range of 1 to 256, and must accept a 256-byte body encoded with OP_PUSHDATA2. Test: IV-6, IV-7.
must not describe a decoded leaf as a verified Drop, a confirmed Drop, or an owned Drop.
should decode the Pact Seed and Pacts reference body profiles when the relevant content type is declared, applying the byte-exact re-encoding rules for both.
must satisfy every class A requirement.
must require a witness of exactly three items with a signature of 64 or 65 bytes, and must reject an input carrying a Taproot annex. Test: CT-9.
must verify that the spent previous output is a 34-byte native P2TR script. Test: CT-1.
must validate the control block length rule and the 128-hash path limit. Test: CT-2, CT-3.
must accept only Tapleaf version 0xc0. Test: CT-4.
must validate the internal key as a curve point. Test: CT-5.
must compute the tapleaf hash, fold the merkle path with sorted branch hashing, apply the TapTweak, and compare both parity and the x-only output key. Test: CT-6, CT-7.
must treat any error raised during verification as a rejection.
must distinguish an unresolved candidate, where the previous output could not be fetched, from a proven rejection. Test: CT-8.
should use a constant-time comparison for the output key.
must satisfy every class B requirement.
must record an artifact only at or beyond its configured confirmation depth, and must refuse a mainnet depth below six. Test: CT-10.
must derive identity from the reveal input index and emit it lowercase in the full portable form.
must assign two distinct identities to a transaction that reveals two Drops on two inputs.
must scope records by network and must not resolve an identity from another network.
must set the initial custody outpoint to output 0 of the reveal, and must apply the P2WPKH and P2TR positive-value test on every subsequent move.
must mark custody burned when a spend does not produce a supported output 0, and must keep the record itself readable.
must maintain a block journal and, on divergence, must roll back and rebuild projections from surviving immutable records rather than patching them.
must stop with a named reason rather than guess when a reorganisation exceeds its budget or the common ancestor is ambiguous.
must publish its network, confirmation depth and indexed height alongside the data it serves.
must not let a recorded rejection alter any other record's state.
must apply the passive-content serving policy if it serves bodies over HTTP, defaulting unknown and active types to an opaque attachment.
should publish custody integrity counters so that projection drift is measurable rather than assumed.
should treat a change to confirmation depth that intersects indexed history as an audited replay, not a silent reinterpretation.
Optional, and independent of the classes above. An implementation that reads Pact records should be able to say which of these it does.
must enforce the 184-byte Seed length, the DPSE magic, zero reserved bytes at offsets 4 and 7, known network and floor tags, and zero engine padding. Test: PV-6 through PV-10.
must enforce the 176-byte Cell descriptor length, the DPCL magic and zero reserved bytes. Test: PV-3 through PV-5.
must enforce the 245-byte transition preimage length and compute the commitment as a tagged hash under Drops/PactTransition. Test: PV-12.
must apply outcome rules P-1 through P-9 in full before describing an outcome as verified, and must state which rules it applied when it applies only some. Test: PV-1, PV-2, PV-11.
must surface the Seed's enforcementFloor anywhere it presents a Pact, and must not imply a stronger guarantee than the floor states.
must not present a Pacts surface as offering execution, custody, authorization, signing, broadcast or value-bearing authority while the capability contract reports mode: reference.
There is no certification authority for Drops. What is available is a fixed set of vectors and a fixed set of requirements, so an implementation can publish exactly which class it claims and which vectors it passes. That is worth more than a badge.