Skip to navigation

Lifecycle events and fields

View as Markdown

Events appear in batch.events. The wire frame version and event schema are independent. The schema described here is onchain.lifecycle.v1. JSON fragments on this page illustrate tagged values; they are not complete events or captured production messages.

Common lifecycle envelope

All listed fields are present on lifecycle events. Nullable relations are emitted as null, not omitted. The minimal source-quality envelope is a separate shape described below.

FieldJSON typeMeaning
schemastringonchain.lifecycle.v1
eventIdtyped string IDStable notification identity for dedup
eventTypestringEvent type below
entityIdHash32 stringEntity whose assessment changes
assessmentRevisioncanonical decimal u64 stringEntity assessment revision
rulesVersionstringInterpretation rules identity
observedAttimestamp stringObservation time, not client acceptance time
evidenceStagestring enumEvidence stage
transactionId, intentId, occurrenceIdHash32 string or nullKnown relations; occurrence identifies inclusion
correctionOftyped event ID or nullPrevious notification being corrected
facetsobjectRouting context
payloadtagged objectVariant selected by kind
eventOrdinalcanonical decimal stringAdded by delivery; original batch index

Evidence stages are pending_observation, admitted_intent, receipt_complete, canonicality_assessment, resolution_assessment. An enum value does not imply its own public event type.

facets contains required network, owners, signers, tokenIds, conditionIds, stages, correctionTargets; the latter six are arrays and may be empty. NetworkRef is an object with namespace: "eip155", chain_id: 137 as a JSON integer and genesis_hash as a Hash32. It is distinct from frame scope’s string network polygon:137. Signer facets do not imply a signer selector.

Domain IDs are opaque and are not interchangeable with transaction hashes. Hash32 uses 0x followed by 64 lowercase hex characters; addresses use 0x followed by 40 lowercase hex characters. Null relation means no known relation, not a zero hash. Raw uint256 values use canonical unsigned decimal strings, with range 0 through 2^256−1; revisions use u64 decimal strings.

fill.intent

An admitted provisional participation from supported calldata. It is not an execution result. Payload requires kind: "intent", intent_id (Hash32) and pending (object).

All pending fields below are present; only calculationEvidenceRef can be null.

Pending fieldsType / meaning
network, transactionHash, exchangeDestinationNetworkRef, Hash32, address
transactionId, invocationId, intentIdDomain Hash32 IDs
role, calldataOrdinal, orderHashmaker/taker, JSON u32 integer, Hash32
conditionId, owner, signer, tokenId, sideHash32, addresses, uint256 decimal string, "0" buy / "1" sell
makerAsset, takerAssetcollateral or outcome_token
signedMakerAmount, signedTakerAmountSigned raw amounts as uint256 strings
requestedFillMakerAmount, requestedFeeArgumentCall arguments as uint256 strings; not actual amounts
limitRatioRequired makerAmount, takerAmount uint256 strings
calculationTagged result below
generationId, deploymentEvidenceRef, operatorEvidenceRefHash32 evidence references
calculationEvidenceRefHash32 or null
orderSignatureVerified, executionGuaranteedBooleans; do not infer stronger claims from calldata

Calculation fragment:

{"status":"unavailable","reason":"taker_execution_dependent"}

The other variant is provisional_maker_taking with required raw amount string and rule string identifying the supported calculation rule. Unavailable reasons: taker_execution_dependent, rule_unverified, zero_maker_amount, fill_exceeds_signed_maker_amount, arithmetic_overflow. Fields from another variant are not substitutes for the selected result.

Save intent as provisional; exclude it from actual volume. Valid admitted pending facts do not claim executionGuaranteed: true. One transaction can have several intents, and repeated order hashes do not prove a unique execution relation.

transaction.included and transaction.reverted

These describe a full receipt outcome for a particular inclusion. Payload requires kind: "inclusion", inclusion_id (Hash32), outcome (success/revert) and normalizationStatus (tagged object).

Normalization fragment:

{"status":"normalized"}

Other statuses are no_exchange_events, reverted, or unsupported with required reason. Unsupported reasons: incomplete_taker_emission, fee_evidence, match_shape, conservation, amount_exceeds_u128, arithmetic_overflow.

Record outcome and normalization separately from executions. Revert creates no fills. Unsupported normalization is not a zero fill. Success does not prove finality or guarantee supported executions. Receipt-only inclusion is valid, and this envelope is not the raw receipt.

fill.execution

A normalized execution from a complete receipt. A later event of the same type can refine its intent relation, with a new revision rather than another trade.

Payload fields are all required and non-null:

FieldType / meaning
kindexecution
execution_idHash32 execution identity
amountsRequired side, tokenId, grossCash, shares, fee, netCash
intentTagged exact/ambiguous/unavailable correlation
resource_idsArray of shared resource Hash32 IDs

side is string "0" (buy) or "1" (sell). Remaining amounts are uint256 decimal strings. Cash and shares use raw units from verified asset configuration; maker/taker perspectives must not be summed as independent volume.

Correlation fragment:

{"status":"unavailable","reason":"intent_not_observed"}

Exact correlation requires status: "exact" and value (IntentId). Ambiguous requires status: "ambiguous" and candidates (IntentId array). Unavailable requires reason: intent_not_observed, unsupported_invocation or insufficient_evidence. No exact join is promised from transaction hash alone. Missing intent correlation does not turn receipt-backed actual amounts into estimates.

Apply by execution/entity and revision, respecting occurrence canonicality. Receipt-first and partial fills are valid. See identities and amounts.

canonicality.changed

An updated chain-evidence assessment of one inclusion. Payload requires kind: "canonicality_changed", inclusion_id (Hash32), prior and current.

Assessment values: unassessed, included, orphaned, depth_confirmed, chain_finalized. Fragment:

{"prior":"included","current":"orphaned"}

Update the canonical projection of this inclusion and related executions. Reinclusion creates a different occurrence. Depth does not establish chain finality. canonicality.orphaned and canonicality.chain_finalized are not wire event types: they are assessment values in this event type.

transaction.resolution

Evidence about an observed transaction’s fate, not a fabricated receipt or automatic terminal replacement. Required payload fields: kind: "resolution", resolution_id Hash32, reason object, status object and evidence_ref Hash32.

reason tagRequired additional fieldsInterpretation
horizon_expired_unknownhorizon: timestamp stringNo proven cancellation
competing_candidatecandidate_transaction_id: Hash32, sender: address, nonce: decimal u64 stringCandidate has not necessarily won
nonce_consumedconsuming_transaction_id, block_hash: Hash32Still subject to applicable chain corrections

The nested tag is named reason, not kind. Status is either unresolved, or receipt_observed with required inclusion_ids Hash32 array. Fragment:

{"status":"unresolved"}

Save the assessment and revision, allowing later receipt evidence. Resolution creates neither an execution nor volume.

source.gap and capability.changed

These report source observation quality using a minimal envelope. They do not require the lifecycle relation/facets fields above.

Required fields: schema, eventId, eventType, entityId, assessmentRevision, rulesVersion, observedAt, evidenceStage, payload, plus delivered eventOrdinal. observationReason, when available, is present as a string (realtime, recovery_backfill, late_resolution); otherwise it is omitted, not emitted as null.

rulesVersion is source-quality.v1, evidenceStage is source_observation, revision is "1". Entity ID uses idx:v1:source-quality: followed by Hash32; it is not a transaction ID. Observation time is an RFC3339 string.

Payload requires only sourceScope, network, contractScope, capability, reason. Network is string polygon:137. Source/contract scopes are bounded lowercase ASCII names using letters, digits, ., :, _, -.

source.gap has capability gap; reasons are transport, protocol, queue_overload, queue_failure, process_restart, process_shutdown, source_control, removed_log. capability.changed has capability ready and reason subscription_ack.

Update quality coverage without creating fills. Quiet-wallet subscriptions can receive these notices; ready does not recover missing pending. Private epochs/recovery bytes are excluded. See source health.

Mixed wire names

Preserve snake_case fields such as intent_id, execution_id, resource_ids, inclusion_id, resolution_id, evidence_ref and resolution variant fields. The common envelope and many nested structs use camelCase. Converting the entire payload to a uniform casing changes the contract.

Complete synthetic source-derived examples

These are deterministic software fixtures produced by the existing reducer and serializers, not observed trades or production captures. The pending fixture has orderSignatureVerified: false and synthetic evidence references: it demonstrates reducer output and JSON shape only, not successful signed-envelope verification or admission.

The following six objects are complete stored lifecycle domain events. They are not a customer batch frame: delivery adds eventOrdinal and the batch envelope. Normal lifecycle facets are preserved. The success, orphan correction, revert and unresolved examples illustrate different fixture scenarios; do not aggregate them into one trade.

fill.intent: complete stored domain event

{
"assessmentRevision": "1",
"correctionOf": null,
"entityId": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
"eventId": "idx:v1:event:cdcafdc6e056c0c2020b69114cd7bc880e8320bc991e4f9ab313001d00f117a2",
"eventType": "fill.intent",
"evidenceStage": "admitted_intent",
"facets": {
"conditionIds": [
"0x3131313131313131313131313131313131313131313131313131313131313131"
],
"correctionTargets": [],
"network": {
"chain_id": 137,
"genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
"namespace": "eip155"
},
"owners": [
"0x4141414141414141414141414141414141414141"
],
"signers": [
"0x4242424242424242424242424242424242424242"
],
"stages": [
"pending"
],
"tokenIds": [
"7"
]
},
"intentId": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
"observedAt": "2026-09-24T11:59:59Z",
"occurrenceId": null,
"payload": {
"intent_id": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
"kind": "intent",
"pending": {
"calculation": {
"reason": "rule_unverified",
"status": "unavailable"
},
"calculationEvidenceRef": null,
"calldataOrdinal": 0,
"conditionId": "0x3131313131313131313131313131313131313131313131313131313131313131",
"deploymentEvidenceRef": "0x8282828282828282828282828282828282828282828282828282828282828282",
"exchangeDestination": "0x5151515151515151515151515151515151515151",
"executionGuaranteed": false,
"generationId": "0x8181818181818181818181818181818181818181818181818181818181818181",
"intentId": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
"invocationId": "0xcede4c97c84a925d9aa90c18aa8df61ad1facd18c5adce0facb2245178c72c00",
"limitRatio": {
"makerAmount": "1000000",
"takerAmount": "2000000"
},
"makerAsset": "collateral",
"network": {
"chain_id": 137,
"genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
"namespace": "eip155"
},
"operatorEvidenceRef": "0x8383838383838383838383838383838383838383838383838383838383838383",
"orderHash": "0x7171717171717171717171717171717171717171717171717171717171717171",
"orderSignatureVerified": false,
"owner": "0x4141414141414141414141414141414141414141",
"requestedFeeArgument": "0",
"requestedFillMakerAmount": "500000",
"role": "maker",
"side": "0",
"signedMakerAmount": "1000000",
"signedTakerAmount": "2000000",
"signer": "0x4242424242424242424242424242424242424242",
"takerAsset": "outcome_token",
"tokenId": "7",
"transactionHash": "0x2121212121212121212121212121212121212121212121212121212121212121",
"transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}
},
"rulesVersion": "onchain-lifecycle-reducer-v1",
"schema": "onchain.lifecycle.v1",
"transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}

transaction.included: complete stored domain event

{
"assessmentRevision": "1",
"correctionOf": null,
"entityId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
"eventId": "idx:v1:event:a1cafc222af33186886a4166ee57e0c29c6a3091de6cd7b468c22fccf2aff2df",
"eventType": "transaction.included",
"evidenceStage": "receipt_complete",
"facets": {
"conditionIds": [
"0x3131313131313131313131313131313131313131313131313131313131313131"
],
"correctionTargets": [],
"network": {
"chain_id": 137,
"genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
"namespace": "eip155"
},
"owners": [
"0x4141414141414141414141414141414141414141"
],
"signers": [
"0x4242424242424242424242424242424242424242"
],
"stages": [
"included"
],
"tokenIds": [
"7"
]
},
"intentId": null,
"observedAt": "2026-09-24T12:00:00Z",
"occurrenceId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
"payload": {
"inclusion_id": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
"kind": "inclusion",
"normalizationStatus": {
"status": "normalized"
},
"outcome": "success"
},
"rulesVersion": "onchain-lifecycle-reducer-v1",
"schema": "onchain.lifecycle.v1",
"transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}

fill.execution: complete stored domain event

{
"assessmentRevision": "1",
"correctionOf": null,
"entityId": "0x97643d249648bbc7ea9fd77472dfa580116b0ac19d00734d4c6d25c8b7de09de",
"eventId": "idx:v1:event:0fc9fc197498bcff3c630c02e568df73b954ffb924315256db63cb92f6c74499",
"eventType": "fill.execution",
"evidenceStage": "receipt_complete",
"facets": {
"conditionIds": [
"0x3131313131313131313131313131313131313131313131313131313131313131"
],
"correctionTargets": [],
"network": {
"chain_id": 137,
"genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
"namespace": "eip155"
},
"owners": [
"0x4141414141414141414141414141414141414141"
],
"signers": [
"0x4242424242424242424242424242424242424242"
],
"stages": [
"included"
],
"tokenIds": [
"7"
]
},
"intentId": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
"observedAt": "2026-09-24T12:00:00Z",
"occurrenceId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
"payload": {
"amounts": {
"fee": "0",
"grossCash": "500000",
"netCash": "500000",
"shares": "1000000",
"side": "0",
"tokenId": "7"
},
"execution_id": "0x97643d249648bbc7ea9fd77472dfa580116b0ac19d00734d4c6d25c8b7de09de",
"intent": {
"status": "exact",
"value": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe"
},
"kind": "execution",
"resource_ids": []
},
"rulesVersion": "onchain-lifecycle-reducer-v1",
"schema": "onchain.lifecycle.v1",
"transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}

canonicality.changed: complete stored domain event

{
"assessmentRevision": "2",
"correctionOf": "idx:v1:event:a1cafc222af33186886a4166ee57e0c29c6a3091de6cd7b468c22fccf2aff2df",
"entityId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
"eventId": "idx:v1:event:fb09803b9c2df714b623c1f2c708b6ed88c821358fa0dd880f8e48a48e304bd0",
"eventType": "canonicality.changed",
"evidenceStage": "canonicality_assessment",
"facets": {
"conditionIds": [
"0x3131313131313131313131313131313131313131313131313131313131313131"
],
"correctionTargets": [
"idx:v1:event:a1cafc222af33186886a4166ee57e0c29c6a3091de6cd7b468c22fccf2aff2df"
],
"network": {
"chain_id": 137,
"genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
"namespace": "eip155"
},
"owners": [
"0x4141414141414141414141414141414141414141"
],
"signers": [
"0x4242424242424242424242424242424242424242"
],
"stages": [
"included"
],
"tokenIds": [
"7"
]
},
"intentId": null,
"observedAt": "2026-09-24T12:01:00Z",
"occurrenceId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
"payload": {
"current": "orphaned",
"inclusion_id": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
"kind": "canonicality_changed",
"prior": "included"
},
"rulesVersion": "onchain-lifecycle-reducer-v1",
"schema": "onchain.lifecycle.v1",
"transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}

transaction.reverted: complete stored domain event

{
"assessmentRevision": "1",
"correctionOf": null,
"entityId": "0xe04266478ddb8561a55744f42fc3967182d8b7c947634d670ba369168b55b03d",
"eventId": "idx:v1:event:f6d684b8e2bc41a01340a157fe9f98fc2b065e459b9259755698be5f8e48c09c",
"eventType": "transaction.reverted",
"evidenceStage": "receipt_complete",
"facets": {
"conditionIds": [
"0x3131313131313131313131313131313131313131313131313131313131313131"
],
"correctionTargets": [],
"network": {
"chain_id": 137,
"genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
"namespace": "eip155"
},
"owners": [
"0x4141414141414141414141414141414141414141"
],
"signers": [
"0x4242424242424242424242424242424242424242"
],
"stages": [
"reverted"
],
"tokenIds": [
"7"
]
},
"intentId": null,
"observedAt": "2026-09-24T12:00:00Z",
"occurrenceId": "0xe04266478ddb8561a55744f42fc3967182d8b7c947634d670ba369168b55b03d",
"payload": {
"inclusion_id": "0xe04266478ddb8561a55744f42fc3967182d8b7c947634d670ba369168b55b03d",
"kind": "inclusion",
"normalizationStatus": {
"status": "reverted"
},
"outcome": "revert"
},
"rulesVersion": "onchain-lifecycle-reducer-v1",
"schema": "onchain.lifecycle.v1",
"transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}

transaction.resolution: complete stored domain event

{
"assessmentRevision": "1",
"correctionOf": null,
"entityId": "0x349d80700e610533793b1610cc015809f1d55203c76216f25ddc078922d639d3",
"eventId": "idx:v1:event:70590494b01201d7c7f718881b13ca0521dbbd39402fa5b7cde0c8612b51068b",
"eventType": "transaction.resolution",
"evidenceStage": "resolution_assessment",
"facets": {
"conditionIds": [
"0x3131313131313131313131313131313131313131313131313131313131313131"
],
"correctionTargets": [],
"network": {
"chain_id": 137,
"genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
"namespace": "eip155"
},
"owners": [
"0x4141414141414141414141414141414141414141"
],
"signers": [
"0x4242424242424242424242424242424242424242"
],
"stages": [
"resolution"
],
"tokenIds": [
"7"
]
},
"intentId": null,
"observedAt": "2026-09-24T12:10:01Z",
"occurrenceId": null,
"payload": {
"evidence_ref": "0x8585858585858585858585858585858585858585858585858585858585858585",
"kind": "resolution",
"reason": {
"horizon": "2026-09-24T12:10:00Z",
"reason": "horizon_expired_unknown"
},
"resolution_id": "0x349d80700e610533793b1610cc015809f1d55203c76216f25ddc078922d639d3",
"status": {
"status": "unresolved"
}
},
"rulesVersion": "onchain-lifecycle-reducer-v1",
"schema": "onchain.lifecycle.v1",
"transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}

Quality notices: complete projected batch frames

These two deterministic fixtures use the actual replay projection and server serializer. Unlike stored domain events above, each includes a delivery ordinal and batch envelope. Private epochs and quality routing facets are excluded. The fixture clock is synthetic, not a current source-status claim.

{
"batchId": "f29d6487-26da-f45c-6f88-1f3f122b4c9c",
"deliveryMode": "replay",
"events": [
{
"assessmentRevision": "1",
"entityId": "idx:v1:source-quality:0x5231b4aec309843f01fdbea761b7119f7f6eb6ef03cf0618e31d90b2241f73d2",
"eventId": "idx:v1:event:f29d648726daf45c6f881f3f122b4c9c8d4d8d37dc782192547e6ce8052ae110",
"eventOrdinal": "0",
"eventType": "capability.changed",
"evidenceStage": "source_observation",
"observedAt": "2027-01-15T08:00:00.000000000Z",
"payload": {
"capability": "ready",
"contractScope": "ctf-exchange-v2",
"network": "polygon:137",
"reason": "subscription_ack",
"sourceScope": "polygon.pending"
},
"rulesVersion": "source-quality.v1",
"schema": "onchain.lifecycle.v1"
}
],
"frameSequence": "3",
"kind": "batch",
"matchedEventCount": "1",
"position": "1",
"sourceEventCount": "1",
"version": 1
}
{
"batchId": "d33b5269-9292-82f5-a691-62e0c96a97f2",
"deliveryMode": "replay",
"events": [
{
"assessmentRevision": "1",
"entityId": "idx:v1:source-quality:0x5231b4aec309843f01fdbea761b7119f7f6eb6ef03cf0618e31d90b2241f73d2",
"eventId": "idx:v1:event:d33b5269929282f5a69162e0c96a97f29daad45593fec0e50379bba74a452f40",
"eventOrdinal": "0",
"eventType": "source.gap",
"evidenceStage": "source_observation",
"observedAt": "2027-01-15T08:00:00.000000000Z",
"payload": {
"capability": "gap",
"contractScope": "ctf-exchange-v2",
"network": "polygon:137",
"reason": "transport",
"sourceScope": "polygon.pending"
},
"rulesVersion": "source-quality.v1",
"schema": "onchain.lifecycle.v1"
}
],
"frameSequence": "4",
"kind": "batch",
"matchedEventCount": "1",
"position": "2",
"sourceEventCount": "1",
"version": 1
}