Protocol Specification v0.6

Field Tables

The family (opens in a new tab) and opcode select one exact layout. An operation stores ordered 64-bit words, ordered byte strings and, where permitted, an appeal deadline (opens in a new tab). Names in this view explain positions; field names are not transmitted as part of an operand.

The view below is taken from the repository's machine-readable operation table. Its layout and decoder checks are described in Wire Format. Product acceptance still requires the authentication and authority checks in Validation.

Every table on this page is generated from one file, spec/operations.json, by scripts/render-operations.py. The script expands each field of an operation entry into rows: a group use becomes the fields of that group, and an optional field becomes a presence row followed by its own fields.

PythonFrom an entry to table rowsscripts/render-operations.pyL82-L138Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
def expand(self, fields, where, prefix="", condition=None, groups=()):    rows = []    for field in fields:        kind = field["kind"]        if kind == "use":            group = field["group"]            if group not in self.data["groups"]:                fail(f"{where}: unknown group {group!r}")            if group in groups:                fail(f"{where}: group {group!r} uses itself")            rows += self.expand(self.data["groups"][group]["fields"], where, prefix,                                condition, groups + (group,))            continue        path = prefix + field["name"]        note = field.get("description", "")        once = "1" if condition is None else f"1 if `{condition}` is 1"        many = "N" if condition is None else f"N if `{condition}` is 1"        if kind == "word":            text = " ".join(part for part in [note, self.accepted(field, where)                                              if field["type"] == "code" else ""] if part)            rows.append(dict(path=path, count=once, type=self.word_type(field, where), text=text,                             word=field))        elif kind == "optional":            rows.append(dict(path=path, count=once, type="presence",                             text=" ".join(part for part in ["0 absent, 1 present.", note] if part)))            rows += self.expand(field["fields"], where, path + ".", path, groups)        elif kind == "counted_set":            item = field["item"]            accepted = self.accepted(item, where) if item["type"] == "code" else ""            rows.append(dict(path=path, count=once, type="count",                             text=" ".join(part for part in ["Number of items N.", note] if part)))            rows.append(dict(path=path + "[]", count=many, type=self.word_type(item, where),                             text=" ".join(part for part in ["Strictly ascending.", accepted] if part)))        elif kind == "counted_pairs":            first, second = field["first"], field["second"]            rows.append(dict(path=path, count=once, type="count", text=" ".join(                part for part in [f"Number of entries N. Each entry is `{first['name']}` then "                                  f"`{second['name']}`.", note] if part)))            for member, text in [(first, "Strictly ascending."), (second, "")]:                accepted = self.accepted(member, where) if member["type"] == "code" else ""                rows.append(dict(path=f"{path}[].{member['name']}", count=many,                                 type=self.word_type(member, where),                                 text=" ".join(part for part in [text, accepted] if part)))        elif kind == "tagged":            values = self.enum(field["enum"])            codes = [case["code"] for case in field["cases"]]            if sorted(codes) != codes or set(codes) != set(values):                fail(f"{where}: cases of {path} must list every {field['enum']} code in order")            cases = [(case["code"], values[case["code"]],                      self.expand(case["fields"], where, path + ".", condition, groups))                     for case in field["cases"]]            rows.append(dict(path=path, count=once, type=f"`{field['enum']}` code", cases=cases,                             text=" ".join(part for part in [                                 "Selects a case; the words of that case end the layout.", note] if part)))        else:            fail(f"{where}: unknown field kind {kind!r}")    return rows

Operand layout

The family and opcode select one layout; the wire carries only values, and the layout names each position.

The family and opcode select one layout; the wire carries only values, and the layout names each position. Core field 12, family, is 1, so the operation travels in body field 16, state_sync, which holds one Operation whose opcode is 1. Family 1 with opcode 1 selects the Debit entry of spec/operations.json, which names each word by its order: the call_prefix group as orders 1 to 11, the credential presence word at order 12 and six words that follow only after a 1, the versions count at order 19 and its pairs of asset and version, and generation last. The only blob is amount, 32 bytes, and Debit carries no deadline. Core 1 12 varint family = 1 16 bytes, tag 15 + family state_sync holds one Operation Operation 1 varint opcode = 1 2 fixed64, repeated words 14 + 2N, or 20 + 2N 3 bytes, repeated blobs 1 blob 4 and 5 deadline family 1 and opcode 1 select Debit 2 Debit layout names and order from spec/operations.json Words order 1 to 11 call_prefix 3 order 12, 0 or 1 credential order 13 to 18, if 1 six words 4 order 19, count N versions order 20 asset order 21 version order 22 generation 6 N pairs 5 Blobs blob 1 of 1, 32 bytes amount amount_u256
  1. 1

    Family picks the body

    Core field 12, family, is 1, so the operation travels in body field 16, state_sync. The body tag is 15 plus the family.

  2. 2

    One layout

    Family 1 with opcode 1 selects Debit, one entry of spec/operations.json. An opcode outside 1 to 6 in this family is INVALID_FORMAT.

  3. 3

    Shared prefix

    The words in order 1 to 11 are the call_prefix group, from message_reference to recipient, which starts every ordinary, legal and spend call.

  4. 4

    Presence word

    credential must be 0 or 1, and its six words follow only after a 1. Any other value is INVALID_FORMAT.

  5. 5

    Counted pairs

    versions gives the pair count N. N pairs of asset and version follow, with asset strictly ascending.

  6. 6

    Nothing else

    The words end at generation and the blobs at amount. A missing or extra word or blob, or any deadline, is INVALID_FORMAT.

  • Selects the layout
  • Present only after a presence word of 1
  • Must be absent in Debit

Schematic: only the Core fields that select the layout are drawn. In the Debit layout, order numbers are the Order column of its tables; the other numbers are wire tags.

Figure 1: Family, opcode and the Debit operand layout they select

Positional operand layout of every OIP (opens in a new tab) v0.6 operation. The Core family and the operation opcode select exactly one layout of ordered words, ordered blobs and a deadline mode. Field names document the layout and never appear on the wire.

The table is operations.json (opens in a new tab) and its format is operations.schema.json (opens in a new tab). This name view is generated from the table by python scripts/render-operations.py; edit the table, not this file. The specification name of an operation is its name in the family table of wire-conformance.md (opens in a new tab).

Layout rules#

NormativeBytes, test vectors and proofs

  • The family and the opcode select exactly one layout. A decoder MUST reject an opcode outside 1 through the operation count of its family with INVALID_FORMAT.
  • Words are read in table order and a layout MUST consume every word. A missing word or a trailing word is INVALID_FORMAT.
  • An optional field starts with a presence word that MUST be 0 or 1. Its fields follow only when the presence word is 1.
  • A counted set starts with a count word followed by that many items in strictly ascending order, so it has no duplicates.
  • A counted pair list starts with a count word followed by that many pairs whose first members are strictly ascending.
  • A tagged field is the last field of its layout. Its tag word selects one case, and that case fixes the exact number of remaining words.
  • Blobs are matched by position and the blob count MUST equal the layout's blob count.
  • An enumerated word MUST hold an accepted code. A word whose accepted codes are any takes every value; the enum only names the known codes.
  • A decoder runs with a nesting limit, the number of Core levels it may decode counting the outer Core. A canonical_core blob is decoded with that limit reduced by one, and a decoder MUST reject a Core it reaches with a limit of zero with INVALID_FORMAT.
  • A layout fault is INVALID_FORMAT. A failed check returns the error listed with that check. A nested canonical Core returns the error of its own decode.
  • A v0.6 decoder MUST reject an Operation field that operation_record does not list with INVALID_FORMAT.

Both reference decoders read the words through one cursor that applies the word rules above. A presence word above 1, a set that is not strictly ascending and a word left over at the end all fail with INVALID_FORMAT.

Word cursorsrc/wire/operands.rsL148-L202Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
struct Words<'a>(&'a [u64]);impl Words<'_> {    fn word(&mut self) -> Result<u64> {        let (word, remaining) = self.0.split_first().ok_or(BAD)?;        self.0 = remaining;        Ok(*word)    }    fn size(&mut self) -> Result<usize> {        usize::try_from(self.word()?).map_err(|_| BAD)    }    fn origin(&mut self) -> Result<OriginKey> {        Ok(OriginKey {            domain: self.word()?,            event: self.word()?,        })    }    fn present(&mut self) -> Result<bool> {        match self.word()? {            0 => Ok(false),            1 => Ok(true),            _ => Err(BAD),        }    }    fn optional_origin(&mut self) -> Result<Option<OriginKey>> {        if self.present()? {            Ok(Some(self.origin()?))        } else {            Ok(None)        }    }    fn optional_word(&mut self) -> Result<Option<u64>> {        if self.present()? {            Ok(Some(self.word()?))        } else {            Ok(None)        }    }    fn take(&mut self, count: usize) -> Result<&[u64]> {        let (items, remaining) = self.0.split_at_checked(count).ok_or(BAD)?;        self.0 = remaining;        Ok(items)    }    fn set(&mut self) -> Result<BTreeSet<u64>> {        let count = self.size()?;        let items = self.take(count)?;        if items.windows(2).any(|pair| pair[0] >= pair[1]) {            return Err(BAD);        }        Ok(items.iter().copied().collect())    }    fn end(&self) -> Result<()> {        if self.0.is_empty() { Ok(()) } else { Err(BAD) }    }}

The Go decoders read counted sets and optional fields through valueSet and valueOptional, which apply the same cursor checks and also return the typed value. The legal order decoder of family 2 calls both.

GoSets and optional fields in Gogo/wire/typed_values.goL49-L58Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
func (w *words) valueSet() ([]uint64,error) {    count,err:=w.word();if err!=nil {return nil,err}    values,err:=w.take(count);if err!=nil || !strictlySorted(values) {return nil,ErrFormat}    return values,nil}func (w *words) valueOptional(count uint64) ([]uint64,error) {    present,err:=w.present();if err!=nil {return nil,err};if !present {return valueNone(),nil}    values,err:=w.take(count);if err!=nil {return nil,err}    switch count {case 1:return valueSome(valueScalar(values[0])),nil;case 2:return valueSome(valuePair(values[0],values[1])),nil;default:panic("unsupported semantic optional field")}}

Operation record#

NormativeBytes, test vectors and proofs

Fields appear in ascending tag order: the opcode, then every word, then every blob, then at most one appeal deadline alternative.

TagFieldWire typeLabelDescription
1opcodevarintrequiredOperation number within the family.
2wordsfixed64repeatedOrdered 64-bit operand words, one unpacked field per word.
3blobslength_delimitedrepeatedOrdered byte-string operands.
4appeal_deadline_indefinitevarintoneof appeal_deadlineIndefinite appeal deadline. The only valid value is 1 (true).
5appeal_deadline_utc_secondsfixed64oneof appeal_deadlineFinite appeal deadline in UTC seconds.

The schema's Operation message declares these five fields, and its comment names spec/operations.json as the table that gives each position its meaning.

Protocol BuffersOperationproto/oip.protoL46-L64Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
// An operation carries positional operands. The family of the enclosing body// member and the opcode fix the meaning and order of every entry in words and// blobs. The field-meaning table spec/operations.json lists, for each family// and opcode, the positions, enumerations and whether the reference// configuration accepts the operation.message Operation {  optional uint64 opcode = 1;  repeated fixed64 words = 2 [packed = false];  repeated bytes blobs = 3;  // The appeal deadline of a regulatory action (family 2). Operations of  // other families reject both members. In this version an absent member and  // appeal_deadline_indefinite both mean that no appeal deadline applies.  oneof appeal_deadline {    // Only the value true is canonical.    bool appeal_deadline_indefinite = 4;    // Unix time in UTC seconds.    fixed64 appeal_deadline_utc_seconds = 5;  }}

Deadline modes#

NormativeBytes, test vectors and proofs

ModeMeaning
absentNeither appeal deadline field is present. A present deadline is INVALID_FORMAT.
appealAbsent, indefinite or finite. The finite form is the appeal deadline in UTC seconds. In this version the product treats absent and indefinite alike as no appeal deadline.

Operations#

NormativeBytes, test vectors and proofs

31 operations. Families 1 through 7 have 6, 3, 8, 8, 2, 2, 2 operations in opcode order.

FamilyOpcodeOperationSpecification nameReference acceptsCallBlobsDeadline
1 STATE_SYNC1Debitdebityesyes1absent
1 STATE_SYNC2RecordTerminalrecord terminal evidenceyesyes2absent
1 STATE_SYNC3DeliverCreditdeliver credityesyes1absent
1 STATE_SYNC4Refundrefundyesyes2absent
1 STATE_SYNC5PublishPrimarypublish primaryyesyes1absent
1 STATE_SYNC6OrdinarySpendordinary spendyesyes2absent
2 REGULATORY_ACTION1EmitLegalOrderemit legal orderyesyes2appeal
2 REGULATORY_ACTION2CommitLegalOrdercommit legal orderyesyes2appeal
2 REGULATORY_ACTION3EnforcementSpendenforcement spendyesyes3appeal
3 LOCK_MANAGEMENT1Reservereserveyesyes1absent
3 LOCK_MANAGEMENT2Dispatchdispatchyesyes1absent
3 LOCK_MANAGEMENT3Cancelcancelyesyes2absent
3 LOCK_MANAGEMENT4Fencefenceyesyes2absent
3 LOCK_MANAGEMENT5Preemptpreemptyesyes2absent
3 LOCK_MANAGEMENT6Reconcilereconcileyesyes2absent
3 LOCK_MANAGEMENT7Writewritenoyes1absent
3 LOCK_MANAGEMENT8Timeouttimeoutnoyes1absent
4 QUERY1CurrentReadcurrentyesno0absent
4 QUERY2HistoricalReadhistoricalyesno0absent
4 QUERY3RawReadrawyesno0absent
4 QUERY4OperationStatusoperation statusyesno0absent
4 QUERY5Journaljournalyesno0absent
4 QUERY6CaptureCachecapture cacheyesno0absent
4 QUERY7OwnerReadowneryesno0absent
4 QUERY8ExactReceiptexact receiptyesno1absent
5 ACK1SettlementAcknowledgementexact settlement acknowledgementyesno1absent
5 ACK2CorrelatedResponsecorrelated responsenono1absent
6 HEARTBEAT1Capabilitiescapabilitiesnono0absent
6 HEARTBEAT2Livenesslivenessnono0absent
7 GOVERNANCE1OwnerHandoverowner handoveryesno3absent
7 GOVERNANCE2InstallEpochauthorized epoch installationnono3absent

Reference configuration#

NormativeBytes, test vectors and proofs

The Ed25519 (opens in a new tab) reference configuration accepts only the operations whose reference_accepts value is true. It refuses every other operation with UNSUPPORTED_VERSION before admission (opens in a new tab), because that operation is outside the selected version profile, which is the version together with its accepted operation set.

Accepted: 25 of 31 operations. Refused with UNSUPPORTED_VERSION: Write, Timeout, CorrelatedResponse, Capabilities, Liveness, InstallEpoch.

Both reference implementations write the accepted set as opcode ranges per family, and every other family or opcode returns false. Rust checks the configured operation set in the authority entry paths, including response generation and exact Debit resolution. The generic Rust transport decoder has no configuration-specific operation set. Go exposes the configured check through ReceiveAccepting; its generic Receive path does not select that set. Where the check runs, a false answer refuses the frame with UNSUPPORTED_VERSION.

Operations the reference acceptssrc/authority/recovery/wire/ed25519.rsL455-L465Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
fn supported_frame(core: &Core) -> bool {    match core.body.as_ref() {        Some(Body::StateSync(op)) => matches!(op.opcode, Some(1..=6)),        Some(Body::RegulatoryAction(op)) => matches!(op.opcode, Some(1..=3)),        Some(Body::Ack(op)) => op.opcode == Some(1),        Some(Body::Query(op)) => matches!(op.opcode, Some(1..=8)),        Some(Body::LockManagement(op)) => matches!(op.opcode, Some(1..=6)),        Some(Body::Governance(op)) => op.opcode == Some(1),        _ => false,    }}

Responses#

NormativeBytes, test vectors and proofs

A call carries a caller-qualified call identifier (opens in a new tab): the Core principal with the call_sequence word. Only calls have a correlated response.

Every delivery and refusal code applies to every call. The recorded codes of each call are listed with the operation.

Family 1 STATE_SYNC#

NormativeBytes, test vectors and proofs

Core body field state_sync (tag 16). 6 operations.

Each operation is one entry of the operations array in spec/operations.json, and the tables under its heading expand that entry. Debit, opcode 1, starts with the shared groups call_prefix, credential and version_vector and adds one generation word.

JSONDebit entryspec/operations.jsonL290-L307Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
{  "family": 1, "opcode": 1, "name": "Debit", "title": "debit",  "summary": "Source debit for the bound transfer.",  "reference_accepts": true,  "words": [    {"kind": "use", "group": "call_prefix"},    {"kind": "use", "group": "credential"},    {"kind": "use", "group": "version_vector"},    {"kind": "word", "name": "generation", "type": "generation"}  ],  "blobs": [    {"name": "amount", "type": "amount_u256"}  ],  "deadline": "absent",  "target_domain": "origin_domain",  "call": true,  "recorded_codes": [1, 2, 3, 4, 12]},

Debit#

Family 1 STATE_SYNC (opens in a new tab), opcode 1, specification name "debit". Source debit for the bound transfer.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 4 ORIGINAL_REJECTED, 12 DEBITED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22generation1generation

Blobs:

OrderFieldTypeDescription
1amountamount_u256

RecordTerminal#

Family 1 STATE_SYNC, opcode 2, specification name "record terminal evidence". Records the terminal decision of the source for the binding.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 16 RECORDED, 21 EVIDENCE_REFRESHED, 23 DUPLICATE_DECISION. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22decision_kind1decision_kind codeAccepted: every listed code.
23evidence_reference1record_reference

Blobs:

OrderFieldTypeDescription
1amountamount_u256
2terminal_evidenceproofEvidence of the decision for this binding, kind and reference.

DeliverCredit#

Family 1 STATE_SYNC, opcode 3, specification name "deliver credit". Settles a confirmed decision at the destination.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal destination, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 17 CREDITED, 24 DUPLICATE_CONFIRMED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22evidence_reference1record_reference

Blobs:

OrderFieldTypeDescription
1amountamount_u256

Refund#

Family 1 STATE_SYNC, opcode 4, specification name "refund". Settles a reversed decision at the source.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 19 REFUNDED, 25 DUPLICATE_REVERSED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22generation1generation
23evidence_reference1record_reference

Blobs:

OrderFieldTypeDescription
1amountamount_u256
2terminal_evidenceproofEvidence of the REVERSED decision for this binding and reference.

PublishPrimary#

Family 1 STATE_SYNC, opcode 5, specification name "publish primary". Publishes the primary outcome of the binding.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 22 PUBLISHED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version

Blobs:

OrderFieldTypeDescription
1amountamount_u256

OrdinarySpend#

Family 1 STATE_SYNC, opcode 6, specification name "ordinary spend". Ordinary spend from the root binding.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal destination, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 28 SPEND_EXECUTED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12reference1commit_positionCommit position of the confirmed decision of the root binding.
13sender1principal_id
14spend_recipient1principal_id
15spend_kind1spend_kind codeAccepted: 0 ORDINARY.

Blobs:

OrderFieldTypeDescription
1amountamount_u256Amount of the root binding.
2spend_amountamount_u256

Family 2 REGULATORY_ACTION#

NormativeBytes, test vectors and proofs

Core body field regulatory_action (tag 17). 3 operations.

EmitLegalOrder, opcode 1, follows call_prefix with the order words, allows an appeal deadline and lists one decode check.

JSONEmitLegalOrder entryspec/operations.jsonL403-L434Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
{  "family": 2, "opcode": 1, "name": "EmitLegalOrder", "title": "emit legal order",  "summary": "Legal order at the source emission stage.",  "reference_accepts": true,  "words": [    {"kind": "use", "group": "call_prefix"},    {"kind": "word", "name": "action", "type": "code", "enum": "legal_action", "accepted": "all"},    {"kind": "word", "name": "officer", "type": "principal_id"},    {"kind": "word", "name": "jurisdiction", "type": "u64", "description": "Jurisdiction code of the order."},    {"kind": "word", "name": "legal_basis", "type": "u64", "description": "Legal basis code of the order."},    {"kind": "word", "name": "issuance_epoch", "type": "epoch"},    {"kind": "counted_set", "name": "scope", "item": {"type": "asset_id"}},    {"kind": "optional", "name": "predecessor", "description": "Origin of the preceding order.", "fields": [      {"kind": "word", "name": "domain", "type": "domain_id"},      {"kind": "word", "name": "event", "type": "event_id"}    ]},    {"kind": "optional", "name": "confiscation_destination", "fields": [      {"kind": "word", "name": "principal", "type": "principal_id"}    ]}  ],  "blobs": [    {"name": "amount", "type": "amount_u256"},    {"name": "order_authorization", "type": "proof", "description": "Officer authorization of the exact order, verified by the configured legal adapter."}  ],  "deadline": "appeal",  "target_domain": "origin_domain",  "checks": [    {"when": "decode", "rule": "issuance_epoch equals origin_epoch.", "error": "INVALID_SOURCE"}  ],  "call": true,  "recorded_codes": [1, 2, 3, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38]},

Both reference decoders read the words of EmitLegalOrder and CommitLegalOrder in table order, refuse leftover words and then check the target domain and the issuance epoch (opens in a new tab), which fail with INVALID_SOURCE.

Legal order operandssrc/wire/operands.rsL452-L494Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
fn legal(core: &Core, op: &Operation) -> Result<Operands> {    let (id, p, mut words) = native(core, op)?;    let [_, proof] = op.blobs.as_slice() else {        return Err(BAD);    };    if proof.is_empty() {        return Err(BAD);    }    let stage = match op.opcode {        Some(1) => LegalStage::SourceEmission,        Some(2) => LegalStage::ReceivingCommit,        _ => return Err(BAD),    };    let action = match words.word()? {        1 => LegalAction::Freeze,        2 => LegalAction::Restrict,        3 => LegalAction::Seize,        4 => LegalAction::Confiscate,        5 => LegalAction::Unfreeze,        6 => LegalAction::Unrestrict,        7 => LegalAction::Release,        _ => return Err(BAD),    };    let order = Order {        binding: p.binding,        action,        officer: words.word()?,        jurisdiction: words.word()?,        legal_basis: words.word()?,        issuance_epoch: words.word()?,        scope: words.set()?,        predecessor: words.optional_origin()?,        destination: words.optional_word()?,        appeal_deadline: deadline(op),    };    words.end()?;    let target = match stage {        LegalStage::SourceEmission => p.binding.origin.domain,        LegalStage::ReceivingCommit => p.binding.destination,    };    if p.endpoint != target || order.issuance_epoch != p.origin_epoch {        return Err(WireError::InvalidSource);    }

EmitLegalOrder#

Family 2 REGULATORY_ACTION (opens in a new tab), opcode 1, specification name "emit legal order". Legal order at the source emission stage.

  • Reference configuration: accepted.
  • Deadline: appeal. Absent, indefinite or finite. The finite form is the appeal deadline in UTC seconds. In this version the product treats absent and indefinite alike as no appeal deadline.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 26 LEGAL_EMITTED, 30 LEGAL_INVALID_AUTHORITY, 31 LEGAL_INVALID_STATE, 32 LEGAL_INVALID_BINDING, 33 LEGAL_MISSING_PRIOR_FREEZE, 34 LEGAL_MISSING_PRIOR_SEIZURE, 35 LEGAL_APPEAL_STILL_OPEN, 36 LEGAL_APPEAL_DEADLINE_MISMATCH, 37 LEGAL_MISSING_DESTINATION, 38 LEGAL_CONFLICTING_ORDER. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12action1legal_action codeAccepted: every listed code.
13officer1principal_id
14jurisdiction1u64Jurisdiction code of the order.
15legal_basis1u64Legal basis code of the order.
16issuance_epoch1epoch
17scope1countNumber of items N.
18scope[]Nasset_idStrictly ascending.
19predecessor1presence0 absent, 1 present. Origin of the preceding order.
20predecessor.domain1 if predecessor is 1domain_id
21predecessor.event1 if predecessor is 1event_id
22confiscation_destination1presence0 absent, 1 present.
23confiscation_destination.principal1 if confiscation_destination is 1principal_id

Blobs:

OrderFieldTypeDescription
1amountamount_u256
2order_authorizationproofOfficer authorization of the exact order, verified by the configured legal adapter.

Checks:

  • decode: issuance_epoch equals origin_epoch. Otherwise INVALID_SOURCE.

CommitLegalOrder#

Family 2 REGULATORY_ACTION, opcode 2, specification name "commit legal order". Legal order at the receiving commit stage.

  • Reference configuration: accepted.
  • Deadline: appeal. Absent, indefinite or finite. The finite form is the appeal deadline in UTC seconds. In this version the product treats absent and indefinite alike as no appeal deadline.
  • Target: the Core target_domain MUST equal destination, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 27 LEGAL_APPLIED, 30 LEGAL_INVALID_AUTHORITY, 31 LEGAL_INVALID_STATE, 32 LEGAL_INVALID_BINDING, 33 LEGAL_MISSING_PRIOR_FREEZE, 34 LEGAL_MISSING_PRIOR_SEIZURE, 35 LEGAL_APPEAL_STILL_OPEN, 36 LEGAL_APPEAL_DEADLINE_MISMATCH, 37 LEGAL_MISSING_DESTINATION, 38 LEGAL_CONFLICTING_ORDER. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12action1legal_action codeAccepted: every listed code.
13officer1principal_id
14jurisdiction1u64Jurisdiction code of the order.
15legal_basis1u64Legal basis code of the order.
16issuance_epoch1epoch
17scope1countNumber of items N.
18scope[]Nasset_idStrictly ascending.
19predecessor1presence0 absent, 1 present. Origin of the preceding order.
20predecessor.domain1 if predecessor is 1domain_id
21predecessor.event1 if predecessor is 1event_id
22confiscation_destination1presence0 absent, 1 present.
23confiscation_destination.principal1 if confiscation_destination is 1principal_id

Blobs:

OrderFieldTypeDescription
1amountamount_u256
2order_authorizationproofOfficer authorization of the exact order, verified by the configured legal adapter.

Checks:

  • decode: issuance_epoch equals origin_epoch. Otherwise INVALID_SOURCE.

EnforcementSpend#

Family 2 REGULATORY_ACTION, opcode 3, specification name "enforcement spend". Spend under an enforcement order.

  • Reference configuration: accepted.
  • Deadline: appeal. Absent, indefinite or finite. The finite form is the appeal deadline in UTC seconds. In this version the product treats absent and indefinite alike as no appeal deadline.
  • Target: the Core target_domain MUST equal destination, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 28 SPEND_EXECUTED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12reference1commit_positionCommit position of the confirmed decision of the root binding.
13sender1principal_id
14spend_recipient1principal_id
15spend_kind1spend_kind codeAccepted: 1 RECOVER, 2 SEIZE, 3 CONFISCATE, 4 LIQUIDATE.
16officer1principal_id
17jurisdiction1u64Jurisdiction code of the order.
18legal_basis1u64Legal basis code of the order.
19assets1countNumber of items N.
20assets[]Nasset_idStrictly ascending.
21prior_seizure1presence0 absent, 1 present. Origin of the prior seizure.
22prior_seizure.domain1 if prior_seizure is 1domain_id
23prior_seizure.event1 if prior_seizure is 1event_id

Blobs:

OrderFieldTypeDescription
1amountamount_u256Amount of the root binding.
2spend_amountamount_u256
3order_authorizationproofOfficer authorization of the exact enforcement order, verified by the configured legal adapter.

Family 3 LOCK_MANAGEMENT#

NormativeBytes, test vectors and proofs

Core body field lock_management (tag 18). 8 operations.

Reserve, opcode 1, uses the same three groups as Debit and ends with a duration word of type clock_interval.

JSONReserve entryspec/operations.jsonL496-L513Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
{  "family": 3, "opcode": 1, "name": "Reserve", "title": "reserve",  "summary": "Reserves the lock footprint of the binding.",  "reference_accepts": true,  "words": [    {"kind": "use", "group": "call_prefix"},    {"kind": "use", "group": "credential"},    {"kind": "use", "group": "version_vector"},    {"kind": "word", "name": "duration", "type": "clock_interval"}  ],  "blobs": [    {"name": "amount", "type": "amount_u256"}  ],  "deadline": "absent",  "target_domain": "origin_domain",  "call": true,  "recorded_codes": [1, 2, 3, 10]},

Reserve#

Family 3 LOCK_MANAGEMENT (opens in a new tab), opcode 1, specification name "reserve". Reserves the lock footprint of the binding.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 10 RESERVED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22duration1clock_interval

Blobs:

OrderFieldTypeDescription
1amountamount_u256

Dispatch#

Family 3 LOCK_MANAGEMENT, opcode 2, specification name "dispatch". Dispatches a held lock.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 11 SOURCE_DISPATCHED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22generation1generation

Blobs:

OrderFieldTypeDescription
1amountamount_u256

Cancel#

Family 3 LOCK_MANAGEMENT, opcode 3, specification name "cancel". Closes a held lock.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 13 CLOSED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22generation1generation

Blobs:

OrderFieldTypeDescription
1amountamount_u256
2recovery_authorizationproofSigned recovery action of the current owner for the exact request.

Fence#

Family 3 LOCK_MANAGEMENT, opcode 4, specification name "fence". Closes a dispatched lock.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 13 CLOSED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22generation1generation

Blobs:

OrderFieldTypeDescription
1amountamount_u256
2recovery_authorizationproofSigned recovery action of the current owner for the exact request.

Preempt#

Family 3 LOCK_MANAGEMENT, opcode 5, specification name "preempt". Takes over an expired lock with the next generation.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 14 PREEMPTED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22duration1clock_interval

Blobs:

OrderFieldTypeDescription
1amountamount_u256
2recovery_authorizationproofSigned recovery action of the current owner for the exact request.

Reconcile#

Family 3 LOCK_MANAGEMENT, opcode 6, specification name "reconcile". Reconciles a credited lock against confirmed evidence.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 18 RECONCILED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22generation1generation
23evidence_reference1record_reference

Blobs:

OrderFieldTypeDescription
1amountamount_u256
2terminal_evidenceproofEvidence of the CONFIRMED decision for this binding and reference.

Write#

Family 3 LOCK_MANAGEMENT, opcode 7, specification name "write". Writes a permitted data value for the asset.

  • Reference configuration: not accepted; refused with UNSUPPORTED_VERSION.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 20 DATA_UPDATED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22generation1generation
23value1u64Data value to write.

Blobs:

OrderFieldTypeDescription
1amountamount_u256

Timeout#

Family 3 LOCK_MANAGEMENT, opcode 8, specification name "timeout". Advances the ledger clock.

  • Reference configuration: not accepted; refused with UNSUPPORTED_VERSION.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Target: the Core target_domain MUST equal origin_domain, otherwise INVALID_SOURCE.
  • Call: yes. Recorded codes: 1 REJECTED, 2 BUSY, 3 UNAVAILABLE, 15 TIME_OBSERVED. Delivery and refusal codes also apply.

Words:

OrderFieldCountTypeDescription
1message_reference1u64Caller message reference carried into the product payload.
2call_sequence1call_sequence
3session1session_id
4revision1revisionRevision of the signed cut.
5origin_epoch1epochAuthority epoch of the original request.
6origin_domain1domain_id
7origin_event1event_id
8asset1asset_id
9owner1principal_idFunding owner at the origin domain.
10destination1domain_id
11recipient1principal_id
12credential1presence0 absent, 1 present.
13credential.asset1 if credential is 1asset_id
14credential.origin_domain1 if credential is 1domain_id
15credential.origin_event1 if credential is 1event_id
16credential.holder1 if credential is 1principal_id
17credential.generation1 if credential is 1generation
18credential.epoch1 if credential is 1epoch
19versions1countNumber of entries N. Each entry is asset then version.
20versions[].assetNasset_idStrictly ascending.
21versions[].versionNasset_version
22elapsed1clock_interval

Blobs:

OrderFieldTypeDescription
1amountamount_u256

Family 4 QUERY#

NormativeBytes, test vectors and proofs

Core body field query (tag 19). 8 operations.

CurrentRead, opcode 1, is not a call: a session word and a revision word come before the shared query group, and the entry has no blobs.

JSONCurrentRead entryspec/operations.jsonL646-L658Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
{  "family": 4, "opcode": 1, "name": "CurrentRead", "title": "current",  "summary": "Current read at the expected cut.",  "reference_accepts": true,  "words": [    {"kind": "word", "name": "session", "type": "session_id"},    {"kind": "word", "name": "revision", "type": "revision", "description": "Revision of the expected cut."},    {"kind": "use", "group": "query"}  ],  "blobs": [],  "deadline": "absent",  "call": false},

CurrentRead#

Family 4 QUERY (opens in a new tab), opcode 1, specification name "current". Current read at the expected cut.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id
2revision1revisionRevision of the expected cut.
3query1query_tag codeSelects a case; the words of that case end the layout.

Cases of query:

TagCaseWords after the tag
1APPLICATION_ASSETquery.asset asset_id
2SOURCE_BALANCEquery.domain domain_id, query.asset asset_id
3DESTINATION_BALANCEquery.domain domain_id, query.asset asset_id, query.holder principal_id
4ROOT_BALANCEquery.origin_domain domain_id, query.origin_event event_id, query.destination domain_id, query.asset asset_id, query.holder principal_id
5REGULATORY_STATEquery.domain domain_id, query.asset asset_id
6TERMINAL_RECEIPTquery.origin_domain domain_id, query.origin_event event_id

Blobs: none.

HistoricalRead#

Family 4 QUERY, opcode 2, specification name "historical". Read at a retained historical revision.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id
2revision1revisionHistorical revision to read.
3query1query_tag codeSelects a case; the words of that case end the layout.

Cases of query:

TagCaseWords after the tag
1APPLICATION_ASSETquery.asset asset_id
2SOURCE_BALANCEquery.domain domain_id, query.asset asset_id
3DESTINATION_BALANCEquery.domain domain_id, query.asset asset_id, query.holder principal_id
4ROOT_BALANCEquery.origin_domain domain_id, query.origin_event event_id, query.destination domain_id, query.asset asset_id, query.holder principal_id
5REGULATORY_STATEquery.domain domain_id, query.asset asset_id
6TERMINAL_RECEIPTquery.origin_domain domain_id, query.origin_event event_id

Blobs: none.

RawRead#

Family 4 QUERY, opcode 3, specification name "raw". Raw data read.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id
2query1query_tag codeSelects a case; the words of that case end the layout.

Cases of query:

TagCaseWords after the tag
1APPLICATION_ASSETquery.asset asset_id
2SOURCE_BALANCEquery.domain domain_id, query.asset asset_id
3DESTINATION_BALANCEquery.domain domain_id, query.asset asset_id, query.holder principal_id
4ROOT_BALANCEquery.origin_domain domain_id, query.origin_event event_id, query.destination domain_id, query.asset asset_id, query.holder principal_id
5REGULATORY_STATEquery.domain domain_id, query.asset asset_id
6TERMINAL_RECEIPTquery.origin_domain domain_id, query.origin_event event_id

Blobs: none.

OperationStatus#

Family 4 QUERY, opcode 4, specification name "operation status". Status of the operation for an origin.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id
2origin_domain1domain_id
3origin_event1event_id

Blobs: none.

Journal#

Family 4 QUERY, opcode 5, specification name "journal". Journal read.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id

Blobs: none.

CaptureCache#

Family 4 QUERY, opcode 6, specification name "capture cache". Read from the capture cache.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id
2query1query_tag codeSelects a case; the words of that case end the layout.

Cases of query:

TagCaseWords after the tag
1APPLICATION_ASSETquery.asset asset_id
2SOURCE_BALANCEquery.domain domain_id, query.asset asset_id
3DESTINATION_BALANCEquery.domain domain_id, query.asset asset_id, query.holder principal_id
4ROOT_BALANCEquery.origin_domain domain_id, query.origin_event event_id, query.destination domain_id, query.asset asset_id, query.holder principal_id
5REGULATORY_STATEquery.domain domain_id, query.asset asset_id
6TERMINAL_RECEIPTquery.origin_domain domain_id, query.origin_event event_id

Blobs: none.

OwnerRead#

Family 4 QUERY, opcode 7, specification name "owner". Registered owner of the asset.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id
2asset1asset_id

Blobs: none.

ExactReceipt#

Family 4 QUERY, opcode 8, specification name "exact receipt". Receipt for an exact original call.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id

Blobs:

OrderFieldTypeDescription
1original_corecanonical_coreComplete immutable original call.

Checks:

  • decode: The nesting limit is at least 2, which leaves one level for original_core. Otherwise INVALID_FORMAT.
  • decode: original_core decodes as an ordinary, legal or spend call. Otherwise INVALID_FORMAT.
  • consumer: The original call has the deployment, source domain, target domain, principal and authority epoch of this Core and version 6. Otherwise INVALID_SOURCE.

Family 5 ACK#

NormativeBytes, test vectors and proofs

Core body field ack (tag 20). 2 operations.

SettlementAcknowledgement, opcode 1, lists its words directly and adds a consumer check that the acknowledging target is the Core source_domain.

JSONSettlementAcknowledgement entryspec/operations.jsonL750-L775Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
{  "family": 5, "opcode": 1, "name": "SettlementAcknowledgement", "title": "exact settlement acknowledgement",  "summary": "Exact settlement acknowledgement from the secondary target.",  "reference_accepts": true,  "words": [    {"kind": "word", "name": "origin_domain", "type": "domain_id"},    {"kind": "word", "name": "origin_event", "type": "event_id"},    {"kind": "word", "name": "commit_position", "type": "commit_position", "description": "Commit position of the published decision."},    {"kind": "word", "name": "target", "type": "domain_id", "description": "Secondary target that acknowledges the settlement."},    {"kind": "word", "name": "asset", "type": "asset_id"},    {"kind": "word", "name": "owner", "type": "principal_id"},    {"kind": "word", "name": "destination", "type": "domain_id"},    {"kind": "word", "name": "recipient", "type": "principal_id"},    {"kind": "word", "name": "origin_epoch", "type": "epoch"},    {"kind": "word", "name": "decision_kind", "type": "code", "enum": "decision_kind", "accepted": "all"}  ],  "blobs": [    {"name": "amount", "type": "amount_u256"}  ],  "deadline": "absent",  "checks": [    {"when": "consumer", "rule": "target equals the Core source_domain.", "error": "INVALID_SOURCE"}  ],  "call": false,  "reference_note": "The reference accepts it only from the configured acknowledger principal of the remote domain."},

SettlementAcknowledgement#

Family 5 ACK (opens in a new tab), opcode 1, specification name "exact settlement acknowledgement". Exact settlement acknowledgement from the secondary target.

  • Reference configuration: accepted. The reference accepts it only from the configured acknowledger principal of the remote domain.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1origin_domain1domain_id
2origin_event1event_id
3commit_position1commit_positionCommit position of the published decision.
4target1domain_idSecondary target that acknowledges the settlement.
5asset1asset_id
6owner1principal_id
7destination1domain_id
8recipient1principal_id
9origin_epoch1epoch
10decision_kind1decision_kind codeAccepted: every listed code.

Blobs:

OrderFieldTypeDescription
1amountamount_u256

Checks:

  • consumer: target equals the Core source_domain. Otherwise INVALID_SOURCE.

CorrelatedResponse#

Family 5 ACK, opcode 2, specification name "correlated response". Signed response correlated with an original call.

  • Reference configuration: not accepted; refused with UNSUPPORTED_VERSION. The reference authority signs it after the original call returns. Callers verify it with the reference response verifier. The reference authority does not accept it as a request.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1caller_namespace1principal_id
2call_sequence1call_sequence
3kind1response_kind codeAccepted: every listed code.
4code1response_code codeThe response verifier checks the code against the original call. Accepted: any value.
5commit1presence0 absent, 1 present.
6commit.position1 if commit is 1commit_position

Blobs:

OrderFieldTypeDescription
1original_corecanonical_coreCanonical Core of the original call in its original bytes.

Checks:

  • decode: The nesting limit is at least 2, which leaves one level for original_core. Otherwise INVALID_FORMAT.
  • decode: A commit is present only when kind is RECORDED. Otherwise INVALID_FORMAT.
  • decode: The original has the version and deployment of this Core, its principal equals caller_namespace, and its source and target domains are this Core's target and source domains. Otherwise INVALID_SOURCE.
  • decode: The original is not a correlated response. Otherwise INVALID_FORMAT.
  • decode: An original call has the call identifier (caller_namespace, call_sequence). When it is a Debit, a present commit position equals its revision. Otherwise INVALID_FORMAT.
  • decode: An original exact receipt query carries a call with the deployment, source domain, target domain, principal and authority epoch of that query and version 6. Otherwise INVALID_SOURCE.
  • decode: An original exact receipt query carries a call with the call identifier (caller_namespace, call_sequence). When that call is a Debit, a present commit position equals its revision. Otherwise INVALID_FORMAT.
  • consumer: original_core equals the caller's retained canonical request and the call identifier equals that request's call identifier. Otherwise REPLAY_CONFLICT.

Family 6 HEARTBEAT#

NormativeBytes, test vectors and proofs

Core body field heartbeat (tag 21). 2 operations.

Capabilities, opcode 1, has two plain words followed by four counted sets, and its reference_accepts value is false, so the reference configuration refuses it.

JSONCapabilities entryspec/operations.jsonL806-L822Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
{  "family": 6, "opcode": 1, "name": "Capabilities", "title": "capabilities",  "summary": "Capability offer.",  "reference_accepts": false,  "words": [    {"kind": "word", "name": "challenge", "type": "u64", "description": "Fresh challenge of the offer."},    {"kind": "word", "name": "expires", "type": "utc_seconds"},    {"kind": "counted_set", "name": "versions", "item": {"type": "protocol_version"}},    {"kind": "counted_set", "name": "families", "item": {"type": "code", "enum": "family", "accepted": "any"}},    {"kind": "counted_set", "name": "atomicities", "item": {"type": "code", "enum": "atomicity", "accepted": "any"}},    {"kind": "counted_set", "name": "schemes", "item": {"type": "code", "enum": "signature_scheme", "accepted": "any"}}  ],  "blobs": [],  "deadline": "absent",  "call": false,  "reference_note": "The reference configuration negotiates channels from offers signed outside the Core."},

Capabilities#

Family 6 HEARTBEAT (opens in a new tab), opcode 1, specification name "capabilities". Capability offer.

  • Reference configuration: not accepted; refused with UNSUPPORTED_VERSION. The reference configuration negotiates channels from offers signed outside the Core.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1challenge1u64Fresh challenge of the offer.
2expires1utc_seconds
3versions1countNumber of items N.
4versions[]Nprotocol_versionStrictly ascending.
5families1countNumber of items N.
6families[]Nfamily codeStrictly ascending. Accepted: any value.
7atomicities1countNumber of items N.
8atomicities[]Natomicity codeStrictly ascending. Accepted: any value.
9schemes1countNumber of items N.
10schemes[]Nsignature_scheme codeStrictly ascending. Accepted: any value.

Blobs: none.

Liveness#

Family 6 HEARTBEAT, opcode 2, specification name "liveness". Liveness signal.

  • Reference configuration: not accepted; refused with UNSUPPORTED_VERSION.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1challenge1u64Fresh challenge of the signal.
2expires1utc_seconds

Blobs: none.

Family 7 GOVERNANCE#

NormativeBytes, test vectors and proofs

Core body field governance (tag 22). 2 operations.

OwnerHandover, opcode 1, carries three blobs: the endpoint contexts installed with next_epoch and the consents of both owners.

JSONOwnerHandover entryspec/operations.jsonL835-L859Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
{  "family": 7, "opcode": 1, "name": "OwnerHandover", "title": "owner handover",  "summary": "Owner handover with the consents of both owners.",  "reference_accepts": true,  "words": [    {"kind": "word", "name": "session", "type": "session_id"},    {"kind": "word", "name": "revision", "type": "revision", "description": "Revision of the expected cut."},    {"kind": "word", "name": "asset", "type": "asset_id"},    {"kind": "word", "name": "previous", "type": "principal_id"},    {"kind": "word", "name": "successor", "type": "principal_id"},    {"kind": "word", "name": "old_session", "type": "session_id"},    {"kind": "word", "name": "new_session", "type": "session_id"},    {"kind": "word", "name": "next_epoch", "type": "epoch"}  ],  "blobs": [    {"name": "contexts", "type": "endpoint_contexts_json", "description": "Endpoint contexts installed with next_epoch."},    {"name": "previous_consent", "type": "proof", "description": "Consent of the previous owner."},    {"name": "successor_consent", "type": "proof", "description": "Consent of the successor."}  ],  "deadline": "absent",  "checks": [    {"when": "consumer", "rule": "The Core principal equals previous.", "error": "INVALID_SOURCE"}  ],  "call": false},

OwnerHandover#

Family 7 GOVERNANCE (opens in a new tab), opcode 1, specification name "owner handover". Owner handover with the consents of both owners.

  • Reference configuration: accepted.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id
2revision1revisionRevision of the expected cut.
3asset1asset_id
4previous1principal_id
5successor1principal_id
6old_session1session_id
7new_session1session_id
8next_epoch1epoch

Blobs:

OrderFieldTypeDescription
1contextsendpoint_contexts_jsonEndpoint contexts installed with next_epoch.
2previous_consentproofConsent of the previous owner.
3successor_consentproofConsent of the successor.

Checks:

  • consumer: The Core principal equals previous. Otherwise INVALID_SOURCE.

InstallEpoch#

Family 7 GOVERNANCE, opcode 2, specification name "authorized epoch installation". Authorized installation of the next authority epoch.

  • Reference configuration: not accepted; refused with UNSUPPORTED_VERSION.
  • Deadline: absent. Neither appeal deadline field is present. A present deadline is INVALID_FORMAT.
  • Call: no. It has no correlated response.

Words:

OrderFieldCountTypeDescription
1session1session_id
2revision1revisionRevision of the expected cut.
3next_epoch1epoch

Blobs:

OrderFieldTypeDescription
1contextsendpoint_contexts_jsonEndpoint contexts installed with next_epoch.
2sessionssession_bindings_jsonSession bindings installed with next_epoch. The list can be empty.
3maintenance_authorizationproofMaintenance authorization of the exact installation.

Shared groups#

NormativeBytes, test vectors and proofs

GroupUsed byDescription
call_prefixDebit, RecordTerminal, DeliverCredit, Refund, PublishPrimary, OrdinarySpend, EmitLegalOrder, CommitLegalOrder, EnforcementSpend, Reserve, Dispatch, Cancel, Fence, Preempt, Reconcile, Write, TimeoutPrefix of every ordinary, legal and spend call. The call identifier is the Core principal with call_sequence. The signed cut is the Core authority_epoch with revision. The binding is the origin, asset, owner, destination and recipient with the amount in the first blob.
credentialDebit, RecordTerminal, DeliverCredit, Refund, PublishPrimary, Reserve, Dispatch, Cancel, Fence, Preempt, Reconcile, Write, TimeoutOptional lock credential of an ordinary command.
version_vectorDebit, RecordTerminal, DeliverCredit, Refund, PublishPrimary, Reserve, Dispatch, Cancel, Fence, Preempt, Reconcile, Write, TimeoutSigned asset version vector of an ordinary command. An asset without an entry has version zero.
queryCurrentRead, HistoricalRead, RawRead, CaptureCacheTyped query operand. The tag selects the queried value and its exact operands.

A group is defined once under groups and used by name. Debit and Reserve begin with these three.

JSONShared groups call_prefix, credential and version_vectorspec/operations.jsonL208-L245Highlighted lines are discussed in the textSource (opens the lines on GitHub in a new tab)
"groups": {  "call_prefix": {    "description": "Prefix of every ordinary, legal and spend call. The call identifier is the Core principal with call_sequence. The signed cut is the Core authority_epoch with revision. The binding is the origin, asset, owner, destination and recipient with the amount in the first blob.",    "fields": [      {"kind": "word", "name": "message_reference", "type": "u64", "description": "Caller message reference carried into the product payload."},      {"kind": "word", "name": "call_sequence", "type": "call_sequence"},      {"kind": "word", "name": "session", "type": "session_id"},      {"kind": "word", "name": "revision", "type": "revision", "description": "Revision of the signed cut."},      {"kind": "word", "name": "origin_epoch", "type": "epoch", "description": "Authority epoch of the original request."},      {"kind": "word", "name": "origin_domain", "type": "domain_id"},      {"kind": "word", "name": "origin_event", "type": "event_id"},      {"kind": "word", "name": "asset", "type": "asset_id"},      {"kind": "word", "name": "owner", "type": "principal_id", "description": "Funding owner at the origin domain."},      {"kind": "word", "name": "destination", "type": "domain_id"},      {"kind": "word", "name": "recipient", "type": "principal_id"}    ]  },  "credential": {    "description": "Optional lock credential of an ordinary command.",    "fields": [      {"kind": "optional", "name": "credential", "fields": [        {"kind": "word", "name": "asset", "type": "asset_id"},        {"kind": "word", "name": "origin_domain", "type": "domain_id"},        {"kind": "word", "name": "origin_event", "type": "event_id"},        {"kind": "word", "name": "holder", "type": "principal_id"},        {"kind": "word", "name": "generation", "type": "generation"},        {"kind": "word", "name": "epoch", "type": "epoch"}      ]}    ]  },  "version_vector": {    "description": "Signed asset version vector of an ordinary command. An asset without an entry has version zero.",    "fields": [      {"kind": "counted_pairs", "name": "versions",        "first": {"kind": "word", "name": "asset", "type": "asset_id"},        "second": {"kind": "word", "name": "version", "type": "asset_version"}}    ]  },

Word types#

NormativeBytes, test vectors and proofs

All words are 64-bit fixed-width values on the wire.

TypeDescription
u64Unsigned 64-bit integer. The field description gives its meaning.
call_sequenceCaller sequence number. With the Core principal as namespace it forms the caller-qualified call identifier.
session_idRegistered session identifier.
revisionLedger revision. With the Core authority_epoch it forms a commit cut.
commit_positionLedger commit position of a retained result.
epochAuthority epoch number.
domain_idRegistered domain identifier.
event_idEvent number within its origin domain. With that domain it forms an origin key.
asset_idRegistered asset identifier.
principal_idRegistered principal identifier.
generationLock generation.
asset_versionAsset version in a signed version vector.
record_referenceReference to a terminal evidence record.
clock_intervalInterval on the ledger clock. A time-enabled profile counts the ledger clock in Unix seconds.
utc_secondsUTC time in seconds since the Unix epoch.
protocol_versionOIP protocol version number.
codeCode of the enum named by the field.

Blob types#

NormativeBytes, test vectors and proofs

TypeLengthDescription
amount_u25632Unsigned 256-bit integer as exactly 32 big-endian bytes. The product range is u64, so the first 24 bytes MUST be zero.
proofat least 1Non-empty authorization or evidence bytes. The configured adapter verifies them against the exact canonical fields.
canonical_coreat least 1Complete canonical encoding of a v0.6 Core, decoded with the nesting limit reduced by one. It is data and is not admitted again as a delivery.
endpoint_contexts_jsonat least 1Compact JSON array of endpoint context objects with the keys endpoint, epoch, grants, dependencies and write_permissions in that order. The array is non-empty and its endpoint values are strictly ascending. The bytes MUST equal the reference serializer's re-encoding of the decoded value.
session_bindings_jsonat least 1Compact JSON array of [session, {"principal": principal, "authority_epoch": epoch}] pairs with strictly ascending session values. The bytes MUST equal the reference serializer's re-encoding of the decoded value.

Enums#

NormativeBytes, test vectors and proofs

family#

Core family (tag 12). The Core body field of a family has tag 15 plus the family code.

CodeNameBody field
1STATE_SYNCstate_sync
2REGULATORY_ACTIONregulatory_action
3LOCK_MANAGEMENTlock_management
4QUERYquery
5ACKack
6HEARTBEATheartbeat
7GOVERNANCEgovernance

primary#

Core primary code (tag 13). The decoder accepts 1 through 5. The codes have no names and no effect in this version.

Accepted range: 1 through 5.

No named codes.

secondary#

Optional Core secondary code (tag 14). Any value is accepted and preserved with its presence. The codes have no names and authorize no product effect.

No named codes.

signature_scheme#

Core signature scheme (opens in a new tab) (tag 15). The reference profile (opens in a new tab) uses SINGLE with Ed25519.

CodeName
1SINGLE
2THRESHOLD

atomicity#

Core atomicity (opens in a new tab) (tag 23).

CodeName
1BEST_EFFORT
2GUARANTEED
3ALL_OR_NOTHING

priority#

Core priority (opens in a new tab) (tag 24). CRITICAL requires ALL_OR_NOTHING and current privileged authority. The reference configuration does not grant that authority.

CodeName
0CRITICAL
1REGULATORY
2HIGH
3NORMAL
4LOW

Action of a legal order.

CodeName
1FREEZE
2RESTRICT
3SEIZE
4CONFISCATE
5UNFREEZE
6UNRESTRICT
7RELEASE

spend_kind#

Kind of a spend. An ordinary spend accepts only ORDINARY and an enforcement spend accepts only the other kinds.

CodeName
0ORDINARY
1RECOVER
2SEIZE
3CONFISCATE
4LIQUIDATE

decision_kind#

Terminal decision of a source.

CodeName
1CONFIRMED
2REVERSED

query_tag#

Case of a typed query operand.

CodeName
1APPLICATION_ASSET
2SOURCE_BALANCE
3DESTINATION_BALANCE
4ROOT_BALANCE
5REGULATORY_STATE
6TERMINAL_RECEIPT

response_kind#

Kind of a correlated response. A recorded response reports a retained product outcome; a delivery response reports the delivery state; a refusal reports a validation refusal.

CodeName
1RECORDED
2DELIVERY
3REFUSAL

response_code#

Code of a correlated response. Each code fixes its response kind and whether the commit position is present.

CodeNameKindCommitDescription
1REJECTED1 RECORDEDabsent
2BUSY1 RECORDEDabsent
3UNAVAILABLE1 RECORDEDabsent
4ORIGINAL_REJECTED1 RECORDEDabsentExact original Debit closed without effect.
10RESERVED1 RECORDEDpresent
11SOURCE_DISPATCHED1 RECORDEDpresent
12DEBITED1 RECORDEDpresent
13CLOSED1 RECORDEDpresent
14PREEMPTED1 RECORDEDpresent
15TIME_OBSERVED1 RECORDEDpresent
16RECORDED1 RECORDEDpresent
17CREDITED1 RECORDEDpresent
18RECONCILED1 RECORDEDpresent
19REFUNDED1 RECORDEDpresent
20DATA_UPDATED1 RECORDEDpresent
21EVIDENCE_REFRESHED1 RECORDEDpresent
22PUBLISHED1 RECORDEDpresent
23DUPLICATE_DECISION1 RECORDEDpresent
24DUPLICATE_CONFIRMED1 RECORDEDpresent
25DUPLICATE_REVERSED1 RECORDEDpresent
26LEGAL_EMITTED1 RECORDEDpresent
27LEGAL_APPLIED1 RECORDEDpresent
28SPEND_EXECUTED1 RECORDEDpresent
30LEGAL_INVALID_AUTHORITY1 RECORDEDabsent
31LEGAL_INVALID_STATE1 RECORDEDabsent
32LEGAL_INVALID_BINDING1 RECORDEDabsent
33LEGAL_MISSING_PRIOR_FREEZE1 RECORDEDabsent
34LEGAL_MISSING_PRIOR_SEIZURE1 RECORDEDabsent
35LEGAL_APPEAL_STILL_OPEN1 RECORDEDabsent
36LEGAL_APPEAL_DEADLINE_MISMATCH1 RECORDEDabsent
37LEGAL_MISSING_DESTINATION1 RECORDEDabsent
38LEGAL_CONFLICTING_ORDER1 RECORDEDabsent
50UNRESOLVED2 DELIVERYabsent
51RESPONSE_LOST2 DELIVERYabsent
52DEADLINE_EXPIRED2 DELIVERYabsent
53CANCELLED2 DELIVERYabsent
54TTL_EXPIRED2 DELIVERYabsent
55DELIVERY_BUSY2 DELIVERYabsent
56DELIVERY_UNAVAILABLE2 DELIVERYabsent
70INVALID_FORMAT3 REFUSALabsent
71UNSUPPORTED_VERSION3 REFUSALabsent
72INVALID_SOURCE3 REFUSALabsent
73INVALID_SIGNATURE3 REFUSALabsent
74INVALID_THRESHOLD_SIGNATURE3 REFUSALabsent
75TTL_INVALID3 REFUSALabsent
76REPLAY_CONFLICT3 REFUSALabsent
77PRODUCT_REJECTED3 REFUSALabsent

Edition history#

  • 0.6.0: Added this edition. The v0.5 specification remains available at its original addresses.