RGB conformance specification

Rules for reading RGB invoices and validating consignments, for both RGB lines, with conformance test vectors.

Version 0.0.1 · 41 rules · 725 vectors · generated from the ruleset · living document

Independent and early. Not affiliated with RGB-WG, the RGB Protocol Association or LNP/BP, and not for real funds.
  1. 1. Abstract
  2. 2. Status of this document
  3. 3. Conformance
  4. 4. Rules
  5. 5. Test vectors
  6. 6. Implementations
  7. 7. References

1. Abstract

This document specifies the rules an implementation of RGB applies when it reads invoices and validates consignments, for both RGB lines: v0.11 (RGB Protocol Association) and v0.12 (RGB-WG). Each rule comes with test vectors. The rules are data (rules/v011.jsonld, rules/v012.jsonld); §4 is generated from them, and the live suite runs every vector in your browser.

2. Status of this document

A living document, version 0.0.1, generated from source on each build. It is an independent community project, not affiliated with or endorsed by the RGB Protocol Association, RGB-WG or LNP/BP. It describes the rules as the reference crates implement them at the versions named in each rule, plus a few checks the rgbjs implementation adds (marked rgbjs). Where this document and the reference code disagree, the reference code is right and this document is wrong. It is early work: not for real funds.

3. Conformance

The key words MUST, MUST NOT, SHOULD and MAY are to be read as in RFC 2119.

Each rule has a level:

An implementation conforms if, for every vector in §5, its verdict matches: accept, reject, or for informative vectors reject or visibly different. Error messages are shown but not compared, so implementations may word them differently. Implementations MUST NOT crash on any vector: a decode error is a verdict, an abort is not.

4. Rules

41 rules: 31 upstream, 5 rgbjs, 5 informative. Each row links to its vectors in the live suite.

4.1 RGB v0.11

Rules for the RGB v0.11 line (RGB Protocol Association: rgb-protocol and RGB-Tools crates), as implemented by rgb-invoicing, rgb-ops, rgb-consensus and rgb-schemas 0.11.1.

4.1.1 Invoices v0.11

Parsing an rgb: invoice string. Grammar: rgb:<contract|~>/<schema|~>/<state|~>/<chain>:<utxob:…|wvout:…>[?query].

RuleRequirementLevelError and sourceVectors
v011-invoice-schemeAn invoice is a URI with the scheme rgb. Anything else, including a missing scheme, is rejected.
invoice.scheme == "rgb"
upstreamInvoiceParseError::Invalid, InvoiceParseError::InvalidScheme
rgb-invoicing 0.11.1 src/parse.rs
5
v011-invoice-beneficiaryThe beneficiary is <chain>:utxob:<blinded seal> or <chain>:wvout:<address payload>[+<internal key>], with a known chain prefix (bc, tb3, tb4, sb, sbc, bcrt, lq, tl).
parse(invoice.beneficiary) is BlindedSeal | WitnessVout
upstreamInvoiceParseError::Beneficiary
rgb-invoicing 0.11.1 src/parse.rs
5
v011-invoice-expiryThe expiry query parameter, if present, is a Unix timestamp in seconds.
invoice.query.expiry is integer
upstreamInvoiceParseError::InvalidExpiration
rgb-invoicing 0.11.1 src/parse.rs
1
v011-invoice-queryQuery parameters are key=value pairs. endpoints is a comma-separated list of transports with a host: rpc://, rpcs://, http(s)://, ws(s):// or storm://. Unknown keys are kept, not rejected.
∀ p ∈ invoice.query: p has '=' ∧ (p.key ≠ endpoints ∨ all(parse_transport))
upstreamInvoiceParseError::InvalidQueryParam
rgb-invoicing 0.11.1 src/parse.rs
6
v011-invoice-roundtripA valid invoice prints back exactly as it was given.
to_string(parse(s)) == s
upstream-
rgb-invoicing 0.11.1 src/parse.rs (Display for RgbInvoice)
22
v011-invoice-fieldsParsing an invoice made by rgb-cmd recovers the contract, network, amount and beneficiary that were given to rgb invoice. Amounts are encoded in a digit-free base32 alphabet: BF is 100.
parse(rgb_invoice(contract, amount, seal)) == {contract, amount, seal}
upstream-
rgb-invoicing 0.11.1 src/invoice.rs (RgbInvoice)
2

4.1.2 Consignment files v0.11

Reading a binary consignment: RGB\0 followed by TFR (transfer) or CON (contract), then the strict-encoded consignment.

RuleRequirementLevelError and sourceVectors
v011-file-headerA consignment file starts with RGB\0 and the magic TFR or CON.
bytes[0..4] == "RGB\0" ∧ bytes[4..7] ∈ {TFR, CON}
upstreamLoadError::InvalidMagic
rgb-ops 0.11.1 src/containers/file.rs:63
48
v011-strict-decodingThe body is strict-encoded: maps and sets are sorted with no duplicates, collections stay within their bounds, identifiers aren't empty, reserved version bytes have their defined value, and the data doesn't end early. Any deviation is a decode error, not a different reading of the data.
strict_decode(body) succeeds ∧ encoding is canonical
upstreamDecodeError (DataIntegrityError, BrokenMapOrder, BrokenSetOrder, RepeatedMapValue, RepeatedSetValue, Confinement, Io UnexpectedEof)
rgb-strict-encoding 1.0.5 src/error.rs
48
v011-consignment-typeThe transfer flag inside the consignment matches the file type: TFR files hold transfers, CON files hold contracts, and a contract consignment has no bundles or terminals.
consignment.transfer == (magic == TFR) ∧ (¬transfer → bundles = terminals = ∅)
upstreamFailure::Custom("invalid consignment type")
rgb-ops 0.11.1 src/containers/consignment.rs:376
18
v011-terminals-presentEvery bundle a transfer names as a terminal is in the consignment.
∀ b ∈ terminals.keys: b ∈ bundle_ids
upstreamFailure::Custom("terminal bundle id … is not present in the consignment")
rgb-ops 0.11.1 src/containers/consignment.rs:388
24

4.1.3 Schema and type trust v0.11

What the validator takes on trust. The consignment carries its schema and types, but they are checked against definitions the validator already has.

RuleRequirementLevelError and sourceVectors
v011-known-schemargbjs only validates consignments for the standard schemas it can trust: NIA, CFA, UDA, IFA and PFA from rgb-schemas 0.11.1. Wallets do the same with the schemas they have imported.
consignment.schema_id ∈ {NIA, CFA, UDA, IFA, PFA}
rgbjsrgbjs: unknown schema …
rgbjs rust/v011/src/lib.rs (known schemas from rgb-schemas 0.11.1)
48
v011-schema-matchThe schema shipped in the consignment is the one the contract's genesis commits to.
schema_id(consignment.schema) == genesis.schema_id
upstreamFailure::SchemaMismatch
rgb-consensus 0.11.1 src/validation/status.rs:136
48
v011-trusted-typesEvery type in the consignment equals the trusted definition with the same semantic ID. Upstream compares with Ty's PartialEq, which treats variants with the same tag as equal even if their names differ (rgb-strict-encoding Variant::eq); rgbjs also requires the names to match.
∀ (id, ty) ∈ consignment.types: trusted[id] == ty (names included)
upstreamFailure::TypeSystemMismatch; rgbjs: type … differs from the trusted … definition
rgb-consensus 0.11.1 src/validation/validator.rs:285 (validate_schema)
48

4.1.4 Genesis and operations v0.11

Each operation (genesis and transitions) belongs to the contract, has the ID it claims, follows the schema, and passes its AluVM scripts.

RuleRequirementLevelError and sourceVectors
v011-contract-idThe contract ID is a commitment to the genesis. Changing anything the genesis commits to yields a different contract, which a recipient will not mistake for the one in their invoice.
contract_id == commit(genesis)
informative-
rgb-consensus 0.11.1 src/operation/operations.rs (Genesis::contract_id)
18
v011-same-contractEvery transition in the consignment names this contract.
∀ op ∈ transitions: op.contract_id == contract_id
upstreamFailure::ContractMismatch
rgb-consensus 0.11.1 src/validation/status.rs:209
24
v011-opidA transition's claimed ID is the commitment to its contents.
∀ op: op.claimed_id == commit(op)
upstreamFailure::TransitionIdMismatch
rgb-consensus 0.11.1 src/validation/status.rs:211
24
v011-schema-conformanceOperations use only the global and owned state types their schema declares, with values of the declared semantic type and the declared number of assignments.
∀ op: types(op) ⊆ schema ∧ occurrences(op) ∈ schema.bounds ∧ typecheck(op.globals)
upstreamFailure::SchemaUnknownGlobalStateType, SchemaUnknownAssignmentType, SchemaAssignmentOccurrences, SchemaInvalidGlobalValue
rgb-consensus 0.11.1 src/validation/status.rs:171-202
48
v011-scripts-presentEvery AluVM library an operation's validation calls is shipped in the consignment.
∀ lib ∈ called(schema): lib ∈ consignment.scripts
upstreamFailure::MissingScript
rgb-consensus 0.11.1 src/validation/status.rs:260
48
v011-aluvmEach operation passes its schema's AluVM validation scripts, for example that a fungible transfer doesn't create value.
∀ op: aluvm_run(schema.validator(op)) == ok
upstreamFailure::ScriptFailure
rgb-consensus 0.11.1 src/validation/status.rs:255
49

4.1.5 Witnesses and seals v0.11

For transfers: each bundle is anchored in a witness transaction that closes the seals it spends. Whether the witness is mined is a separate, on-chain check.

RuleRequirementLevelError and sourceVectors
v011-dbc-outputThe witness transaction has the output its commitment method needs: OP_RETURN for opret, taproot for tapret.
∃ out ∈ witness.outputs: out is OP_RETURN ∨ taproot
upstreamFailure::NoDbcOutput
rgb-consensus 0.11.1 src/validation/status.rs:232
12
v011-anchorThe bundle's multi-protocol commitment proof places it at the right position for this contract's protocol ID.
mpc_verify(anchor.proof, contract_id, bundle_id)
upstreamFailure::AnchorInvalid
rgb-consensus 0.11.1 src/validation/status.rs:229
24
v011-seal-closingThe witness transaction spends every seal the bundle closes, and its commitment matches the bundle.
∀ seal ∈ closed(bundle): seal.outpoint ∈ witness.inputs ∧ commitment(witness) == bundle
upstreamFailure::SealsInvalid
rgb-consensus 0.11.1 src/validation/status.rs:226
24
v011-terminals-hintThe blinded seals a transfer lists as its terminals are not validated. A changed terminal leaves a valid consignment that no longer names the recipient's seal, so results must show the terminals, and a recipient checks that their own seal is there.
result.terminals == consignment.terminals
informative-
rgb-ops 0.11.1 src/containers/consignment.rs:250 (terminals)
18
v011-state-shows-changesFields of an unsigned witness transaction that its commitment doesn't cover (such as input sequence numbers) can change without making the transfer invalid; its txid changes instead. Results must show the witness IDs and state a consignment produces, so such a change is visible.
result.witnesses and result.state reflect the consignment
informative-
rgb-ops 0.11.1 src/containers/anchors.rs:274 (PubWitness)
24

4.2 RGB v0.12

Rules for the RGB v0.12 line (RGB-WG / LNP/BP), as implemented by rgb-std and rgb-invoice 0.12.0-rc.3, rgb-core, sonic-api, sonic-callreq, hypersonic and ultrasonic 0.12.0.

4.2.1 Invoices v0.12

Parsing a contract: invoice string. Grammar: contract:<chain>@<contract>/[<api>/][<method>/[<state>/]]<value>@<seal>/[?query].

RuleRequirementLevelError and sourceVectors
v012-invoice-schemeAn invoice is a URI with the scheme contract. A v0.11 rgb: invoice is rejected, so the two lines' invoices can't be confused.
invoice.scheme == "contract"
upstreamParseInvoiceError::NoScheme; CallReqParseError (invalid contract call request URI scheme)
sonic-callreq 0.12.0 src/uri.rs; rgb-invoice 0.12.0-rc.3 src/lib.rs:132
2
v012-invoice-roundtripA valid invoice prints back as it was given. Known deviation: with rgb-invoice's RgbInvoice type, CallScope's Display doesn't pass on the {:-} flag, so the contract ID prints with a second contract: prefix (contract:tb@contract:<id>, AluVM/sonic#27). Both forms parse to the same invoice; conforming implementations accept both.
fold(to_string(parse(s))) == s, where fold removes the doubled contract: prefix
upstream-
sonic-callreq 0.12.0 src/uri.rs:65 (Display for CallRequest)
10
v012-invoice-fieldsParsing an invoice made by rgb-wallet recovers the contract, layer 1, value and seal (an at: auth token or a wout: witness output) given to rgb invoice.
parse(rgb_invoice(contract, value, seal)) == {contract, value, seal}
upstream-
sonic-callreq 0.12.0 src/data.rs:110 (CallRequest)
2

4.2.2 Consignment files v0.12

Reading a binary consignment: the 8-byte magic RGBCNSGN, a 2-byte file version, a consignment version byte, the contract ID, then the strict-encoded consignment.

RuleRequirementLevelError and sourceVectors
v012-file-headerA consignment file starts with RGBCNSGN and file version 0, followed by consignment version 0. Later versions are rejected, not guessed at.
bytes[0..8] == "RGBCNSGN" ∧ file_version == 0 ∧ consign_version == 0
upstreambinfile magic/version error; DecodeError("unsupported future consignment version")
rgb-std 0.12.0-rc.3 src/contracts.rs:657 (CONSIGN_MAGIC_NUMBER), src/consignment.rs:124 (parse_consignment)
28
v012-strict-decodingThe body is strict-encoded: maps and sets are sorted with no duplicates, enum and union tags are known, identifiers are valid, strings are UTF-8, reserved bytes have their defined value, and the data doesn't end early.
strict_decode(body) succeeds ∧ encoding is canonical
upstreamDecodeError (DataIntegrityError, BrokenMapOrder, BrokenSetOrder, RepeatedMapValue, RepeatedSetValue, EnumTagNotKnown, UnionTagNotKnown, Utf8, Io UnexpectedEof)
strict_encoding 2.9.1 src/error.rs
28
v012-bounded-allocationA decoder must not allocate memory in proportion to a length it read from the data before checking it. Upstream strict_encoding and strict_types 2.9.1 pre-allocate from such lengths, so one corrupted byte can request about 4.4 GB (aborting a wasm or memory-limited process) or overflow capacity and panic. The pinned rgb-wallet 0.12.0-rc.3 crashes on rgb accept of such a file. A corrupted length must give a decode error or a verdict, never a crash.
∀ forged length: decode returns an error, never aborts
rgbjsDecodeError or a verdict (instead of an out-of-memory abort or capacity-overflow panic)
strict_encoding 2.9.1 src/embedded.rs:514 and strict_types 2.9.1 src/value/decode.rs:91 (Vec::with_capacity(len)); fixed in rgbjs rust/patches/
4

4.2.3 Articles and issuer trust v0.12

A v0.12 consignment carries its articles: the codex (which the contract ID commits to) and the semantics (APIs, types, libraries), which the contract ID does not commit to.

RuleRequirementLevelError and sourceVectors
v012-header-contractThe contract ID in the file header equals the ID computed from the articles. Upstream reads the header ID to decide whether the contract is known, then imports the articles under their own ID; rgbjs rejects a mismatch.
header.contract_id == articles.contract_id
rgbjsrgbjs: header names contract … but the articles are for …
rgbjs rust/v012/src/lib.rs (validate_consignment)
28
v012-genesis-codexGenesis carries a codex_id field that neither the contract ID nor validation uses: the contract ID commits to the codex in the issue instead. rgbjs rejects a genesis whose codex_id differs from that codex.
genesis.codex_id == issue.codex.codex_id
rgbjsrgbjs: genesis names codex … but the contract uses …
ultrasonic 0.12.0 src/operation.rs:282 (Genesis.codex_id), src/issue.rs:79 (Issue::commit_encode)
28
v012-codex-libsEvery zk-AluVM library the codex verifiers call is in the articles.
∀ lib ∈ codex.verifier_libs: lib ∈ semantics.codex_libs
upstreamSemanticError::MissingCodexLib
sonic-api 0.12.0 src/api.rs:579
28
v012-issuer-trustThe semantics say what the state means but travel outside the contract ID, so they are trusted only when they match a known issuer. The issuer ID's checksum covers type IDs but not type contents (strict_types TypeSystem::id hashes the keys only), so rgbjs requires the full semantics to match, names included.
trusted ⇔ ∃ issuer ∈ known: issuer.id == id(semantics) ∧ issuer.semantics == semantics
rgbjsresult.issuer.trusted == false
sonic-api 0.12.0 src/issuer.rs:58 (IssuerId), src/api.rs:193 (Semantics commit_encode)
28

4.2.4 Genesis and operations v0.12

Every operation is evaluated into the contract: its codex verifier passes and the seals it defines and spends are consistent.

RuleRequirementLevelError and sourceVectors
v012-contract-idThe contract ID commits to the issue: version, metadata, codex ID and genesis. Changing them yields a different contract.
contract_id == commit(issue.version, issue.meta, codex_id, genesis_opid)
informative-
ultrasonic 0.12.0 src/issue.rs:76 (Issue::commit_encode)
21
v012-same-contractEvery operation in the consignment names this contract.
∀ op: op.contract_id == contract_id
upstreamCallError::WrongContract
ultrasonic 0.12.0 src/codex.rs:296
12
v012-verify-scriptEach operation calls a verifier its codex defines, and passes that zk-AluVM verifier.
∀ op: codex.verify(op) == ok
upstreamCallError::NotFound, CallError::Script
ultrasonic 0.12.0 src/codex.rs:308-342
16
v012-seal-definitionsEvery cell an operation spends has a known seal definition, and the seals an operation reveals match the auth tokens in its outputs.
∀ op, cell ∈ op.inputs: seal(cell) known ∧ ∀ (no, seal) ∈ op.seals: auth_token(seal) == op.outputs[no].auth
upstreamVerificationError::NoSealDefinition, VerificationError::SealsDefinitionMismatch
rgb-core 0.12.0 src/verify.rs:283-286
28

4.2.5 Witnesses and seals v0.12

For transfers: each operation that spends seals comes with the witness transaction that closes them. Whether the witness is mined is a separate, on-chain check.

RuleRequirementLevelError and sourceVectors
v012-witness-knownAn operation that closes seals has a witness.
∀ op ≠ genesis: op.witness ≠ ∅
upstreamVerificationError::NoWitness
rgb-core 0.12.0 src/verify.rs:275
6
v012-seal-closingThe witness transaction spends every seal the operation closes, and its anchor commits to the operation.
∀ seal ∈ closed(op): seal.primary ∈ witness.inputs ∧ verify(anchor, witness, op)
upstreamVerificationError::SealsNotClosed
rgb-core 0.12.0 src/verify.rs:278
12
v012-state-shows-changesSome bytes are not committed to: a revealed seal definition that doesn't match its auth token (the allocation becomes unknown rather than moving), or uncommitted fields of an unsigned witness transaction (its txid changes). Such a consignment can still be valid, so results must show the state and witness IDs it produces.
result.state and result.witnesses reflect the consignment
informative-
rgb-std 0.12.0-rc.3 src/contract.rs:467 (Contract::state)
17

5. Test vectors

725 vectors (vectors/index.json), all copied into this repository; nothing is fetched at runtime.

ConsignmentBytes, all sweptCorruptions caught, by rule
vectors/v011/cfa.transfer.rgb4949v011-trusted-types 2645, v011-strict-decoding 1135, v011-known-schema 400, v011-opid 172, v011-seal-closing 165, v011-same-contract 124, v011-terminals-present 100, v011-scripts-present 51, v011-state-shows-changes 50, v011-terminals-hint 32, v011-schema-match 32, v011-aluvm 16, v011-schema-conformance 12, v011-file-header 7, v011-anchor 6, v011-consignment-type 1, v011-dbc-output 1
vectors/v011/created-cfa.contract.rgb4362v011-trusted-types 2645, v011-strict-decoding 1092, v011-known-schema 400, v011-contract-id 106, v011-scripts-present 51, v011-schema-match 32, v011-aluvm 16, v011-schema-conformance 12, v011-file-header 7, v011-consignment-type 1
vectors/v011/created-ifa.contract.rgb5896v011-trusted-types 3300, v011-strict-decoding 1366, v011-known-schema 799, v011-state-shows-changes 186, v011-contract-id 139, v011-schema-match 32, v011-aluvm 32, v011-scripts-present 23, v011-schema-conformance 11, v011-file-header 7, v011-consignment-type 1
vectors/v011/created-nia.contract.rgb4551v011-trusted-types 2995, v011-strict-decoding 1083, v011-known-schema 261, v011-contract-id 95, v011-scripts-present 51, v011-schema-match 32, v011-aluvm 16, v011-schema-conformance 10, v011-file-header 7, v011-consignment-type 1
vectors/v011/created-pfa.contract.rgb4829v011-trusted-types 3123, v011-strict-decoding 1147, v011-known-schema 317, v011-contract-id 128, v011-scripts-present 40, v011-schema-match 32, v011-aluvm 16, v011-schema-conformance 13, v011-file-header 7, v011-state-shows-changes 5, v011-consignment-type 1
vectors/v011/created-uda.contract.rgb6903v011-trusted-types 5101, v011-strict-decoding 1175, v011-known-schema 336, v011-contract-id 117, v011-scripts-present 93, v011-schema-match 32, v011-schema-conformance 25, v011-aluvm 16, v011-file-header 7, v011-consignment-type 1
vectors/v011/demo.contract.rgb4579v011-trusted-types 2995, v011-strict-decoding 1083, v011-known-schema 261, v011-contract-id 123, v011-scripts-present 51, v011-schema-match 32, v011-aluvm 16, v011-schema-conformance 10, v011-file-header 7, v011-consignment-type 1
vectors/v011/ifa.transfer.rgb6530v011-trusted-types 3300, v011-strict-decoding 1421, v011-known-schema 799, v011-state-shows-changes 209, v011-same-contract 190, v011-opid 172, v011-seal-closing 166, v011-terminals-present 100, v011-scripts-present 50, v011-terminals-hint 32, v011-schema-match 32, v011-aluvm 32, v011-schema-conformance 13, v011-file-header 7, v011-anchor 5, v011-consignment-type 1, v011-dbc-output 1
vectors/v011/pfa.transfer.rgb5503v011-trusted-types 3123, v011-strict-decoding 1197, v011-known-schema 317, v011-opid 172, v011-seal-closing 165, v011-same-contract 163, v011-terminals-present 100, v011-aluvm 80, v011-state-shows-changes 50, v011-scripts-present 45, v011-terminals-hint 32, v011-schema-match 32, v011-schema-conformance 12, v011-file-header 7, v011-anchor 6, v011-consignment-type 1, v011-dbc-output 1
vectors/v011/receive-nia.transfer.rgb5154v011-trusted-types 2995, v011-strict-decoding 1133, v011-known-schema 261, v011-opid 172, v011-seal-closing 165, v011-same-contract 122, v011-terminals-present 100, v011-scripts-present 51, v011-state-shows-changes 50, v011-terminals-hint 32, v011-schema-match 32, v011-aluvm 16, v011-schema-conformance 10, v011-file-header 7, v011-anchor 6, v011-consignment-type 1, v011-dbc-output 1
vectors/v011/transfer-demo.transfer.rgb5114v011-trusted-types 2995, v011-strict-decoding 1133, v011-known-schema 261, v011-opid 172, v011-seal-closing 165, v011-terminals-present 100, v011-same-contract 82, v011-scripts-present 51, v011-state-shows-changes 50, v011-terminals-hint 32, v011-schema-match 32, v011-aluvm 16, v011-schema-conformance 10, v011-file-header 7, v011-anchor 6, v011-consignment-type 1, v011-dbc-output 1
vectors/v011/uda.transfer.rgb7473v011-trusted-types 5101, v011-strict-decoding 1223, v011-known-schema 336, v011-seal-closing 165, v011-opid 156, v011-same-contract 130, v011-terminals-present 100, v011-scripts-present 93, v011-state-shows-changes 50, v011-terminals-hint 32, v011-schema-match 32, v011-schema-conformance 24, v011-aluvm 16, v011-file-header 7, v011-anchor 6, v011-consignment-type 1, v011-dbc-output 1
vectors/v012/DemoToken.rgb6762v012-issuer-trust 3696, v012-strict-decoding 1552, v012-codex-libs 917, v012-header-contract 452, v012-seal-definitions 76, v012-file-header 35, v012-genesis-codex 32, v012-state-shows-changes 2
vectors/v012/NftDemo.contract.rgb9053v012-issuer-trust 5650, v012-strict-decoding 1788, v012-codex-libs 946, v012-header-contract 524, v012-seal-definitions 76, v012-file-header 35, v012-genesis-codex 32, v012-state-shows-changes 2
vectors/v012/TransferDemo.transfer.rgb7443v012-issuer-trust 3696, v012-strict-decoding 1598, v012-codex-libs 917, v012-header-contract 454, v012-seal-closing 304, v012-seal-definitions 188, v012-verify-script 130, v012-state-shows-changes 53, v012-file-header 38, v012-genesis-codex 32, v012-same-contract 32, v012-witness-known 1
vectors/v012/UfDemo.transfer.rgb7352v012-issuer-trust 3626, v012-strict-decoding 1575, v012-codex-libs 917, v012-header-contract 458, v012-seal-closing 304, v012-seal-definitions 188, v012-verify-script 130, v012-state-shows-changes 53, v012-file-header 36, v012-genesis-codex 32, v012-same-contract 32, v012-witness-known 1
vectors/v012/created-fna.contract.rgb6765v012-issuer-trust 3696, v012-strict-decoding 1552, v012-codex-libs 917, v012-header-contract 454, v012-seal-definitions 76, v012-file-header 36, v012-genesis-codex 32, v012-state-shows-changes 2
vectors/v012/created-ufa.contract.rgb6649v012-issuer-trust 3626, v012-strict-decoding 1529, v012-codex-libs 917, v012-header-contract 433, v012-seal-definitions 76, v012-file-header 34, v012-genesis-codex 32, v012-state-shows-changes 2
vectors/v012/receive-fna.transfer.rgb7439v012-issuer-trust 3696, v012-strict-decoding 1598, v012-codex-libs 917, v012-header-contract 451, v012-seal-closing 304, v012-seal-definitions 188, v012-verify-script 130, v012-state-shows-changes 53, v012-file-header 37, v012-genesis-codex 32, v012-same-contract 32, v012-witness-known 1

6. Implementations

rgbjs (rgbjs 1917069): each line's Rust crates compiled to WebAssembly, run in Node and the browser. A copy is in engine/. Other implementations can run the suite with lib/runner.js, which needs parseInvoice and validateConsignment for each line.

7. References