> For the complete documentation index, see [llms.txt](https://docs.glacislabs.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.glacislabs.com/zero-delta/integration-guide/api/transaction-models.md).

# Transaction Models

The tracked transaction and its steps, including the chained-journey fields that describe a two-leg order as one user intent.

The shapes returned by the `/transactions` endpoints. For the other schemas, see Models.

### TrackedTransaction

Key fields (a single-transaction GET additionally returns the `steps` array):

<table data-search="false"><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>id</code></td><td>string</td><td>Deployment-scoped uid (for example <code>"rwa:0x52b1…"</code>), unique across redeployments. <strong>This is not <code>orderId</code></strong> — see below.</td></tr><tr><td><code>orderId</code></td><td>string</td><td>The raw on-chain order id. This is what the escrow's <code>cancel</code> / <code>claimCancellation</code> / <code>getOrder</code> calls take; passing <code>id</code> there reverts. Returned by the API but <strong>not yet declared in the published OpenAPI spec</strong>, so a generated client may not surface it.</td></tr><tr><td><code>txHash</code></td><td>string</td><td>Source transaction hash (the lookup key).</td></tr><tr><td><code>protocol</code></td><td>string[]</td><td>GMP protocol(s) involved.</td></tr><tr><td><code>sourceChainId</code> / <code>destChainId</code></td><td>string</td><td>Source / destination chain IDs.</td></tr><tr><td><code>wallet</code></td><td>string</td><td>Order owner wallet.</td></tr><tr><td><code>status</code></td><td>TrackingStatus</td><td>Lifecycle status <strong>of this order</strong>. For a chained order see <code>journeyStatus</code>.</td></tr><tr><td><code>claimable</code></td><td>boolean</td><td>True iff <code>claimCancellation()</code> on the execution-chain escrow would succeed right now (status is <code>awaiting_claim</code> or <code>expired</code>).</td></tr><tr><td><code>fromTokenAddress</code> / <code>fromTokenSymbol</code> / <code>fromTokenDecimals</code></td><td>—</td><td>Source token metadata.</td></tr><tr><td><code>fromTokenAmount</code> / <code>fromTokenRawAmount</code></td><td>string</td><td>Human-readable / raw source amount.</td></tr><tr><td><code>toTokenAddress</code> / <code>toTokenSymbol</code> / <code>toTokenDecimals</code></td><td>—</td><td>Destination token metadata. On a chained leg 1 this is the internal <strong>connector</strong>, not what the user bought — see the <code>finalToToken*</code> fields.</td></tr><tr><td><code>toTokenAmount</code> / <code>toTokenRawAmount</code></td><td>string</td><td>Human-readable / raw destination amount.</td></tr><tr><td><code>completedSteps</code> / <code>totalSteps</code></td><td>integer</td><td>Step progress.</td></tr><tr><td><code>currentStep</code></td><td>string</td><td>Current step name.</td></tr><tr><td><code>submittedAt</code> / <code>arrivedAt</code> / <code>filledAt</code> / <code>deliveredAt</code> / <code>failedAt</code></td><td>string or null</td><td>Lifecycle timestamps.</td></tr><tr><td><code>failedReason</code> / <code>failedStep</code></td><td>string</td><td>Failure detail.</td></tr><tr><td><code>steps</code></td><td>TransactionStep[]</td><td>Step entries (single-transaction GET only).</td></tr><tr><td><code>sourceExplorerLink</code> / <code>destinationExplorerLink</code></td><td>string</td><td>Explorer links.</td></tr><tr><td><code>destinationTx</code></td><td>string</td><td>Destination transaction hash.</td></tr><tr><td><code>gmpStatus</code> / <code>gmpMessageId</code></td><td>string</td><td>GMP status / message ID.</td></tr><tr><td><code>orderNonce</code></td><td>string</td><td>Per-source-chain order nonce (decimal string); part of the identity triple that derives <code>orderId</code>.</td></tr><tr><td><code>destinationReceiver</code></td><td>string</td><td>Receiver of the ask token on the destination chain.</td></tr><tr><td><code>orderDeadline</code></td><td>string</td><td>Order deadline (unix seconds, decimal string); <code>"0"</code> means none.</td></tr><tr><td><code>executionChainId</code></td><td>string</td><td>Chain where the escrow lives (where <code>cancel</code> / <code>claimCancellation</code> are called).</td></tr><tr><td><code>executionEscrowAddress</code></td><td>string</td><td>Escrow proxy address on the execution chain.</td></tr><tr><td><code>createdAt</code> / <code>updatedAt</code></td><td>string</td><td>RFC 3339 timestamps.</td></tr></tbody></table>

#### Chained-journey fields

A chained (two-leg) order is the shape used when the asset being bought exists only on the chained destination chain — an RWA vault share on Plume, for example. It is **one user intent settled as two orders**, and these fields describe the journey rather than the individual leg.

<table data-search="false"><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>isDirect</code></td><td>boolean</td><td>True for a direct-bridged transfer (<code>OrderDirectBridged</code>): a same-token order bridged straight to the destination at submit time — no solver fill, no execution-chain round-trip, and not cancellable.</td></tr><tr><td><code>isChained</code></td><td>boolean</td><td>True for <strong>either</strong> leg of a chained order. On leg 1 the <code>toToken*</code> fields describe the internal connector, not the asset the user bought.</td></tr><tr><td><code>chainedParentOrderId</code></td><td>string</td><td>Order ID of leg 1, present only on the child. Rows carrying it are excluded from <code>GET /transactions</code> unless <code>includeChainedLegs=true</code>.</td></tr><tr><td><code>chainedChildOrderId</code></td><td>string</td><td>Order ID of leg 2, once <code>continueChain</code> has created it. Absent during the park window between leg 1's fill and leg 2's creation.</td></tr><tr><td><code>journeyStatus</code></td><td>TrackingStatus</td><td>Status of the <strong>user's intent</strong>, which for a chained order is not the status of any one leg: leg 1 reaching <code>delivered</code> means the connector was parked on the destination escrow, not that the user received anything. Reads <code>continuing</code> for that window. <strong>Branch completion checks on this field</strong>, falling back to <code>status</code> when it is absent.</td></tr><tr><td><code>journeyStartedAt</code></td><td>string</td><td>When leg 1 was submitted — the start of the whole journey.</td></tr><tr><td><code>journeyCompletedAt</code></td><td>string or null</td><td>When the <strong>final</strong> leg delivered. Null until the journey actually completes. It means the user got their asset at this time, not that movement stopped.</td></tr><tr><td><code>legs[]</code></td><td>TransactionLeg[]</td><td>The whole journey, index 0 being this order. Present <strong>only</strong> on a chained parent and omitted entirely for a single-leg order, so the single-leg response shape is unchanged.</td></tr><tr><td><code>finalToTokenAddress</code></td><td>string</td><td>The destination the user actually asked for, as opposed to the internal connector in <code>toToken*</code>. Correct from the moment of submit, including before leg 2 exists — leg 2's ask is ABI-encoded into <code>Order.nextOrders</code> on-chain at submit.</td></tr><tr><td><code>finalToTokenSymbol</code> / <code>finalToTokenDecimals</code></td><td>—</td><td>Metadata for the asset the user actually bought.</td></tr><tr><td><code>finalToTokenAmount</code> / <code>finalToTokenRawAmount</code></td><td>string</td><td>Human-readable / on-chain raw amount of that asset.</td></tr><tr><td><code>finalDestChainId</code></td><td>string</td><td>The chain the user's asset actually lands on. On a chained order this is not <code>destChainId</code> of leg 1.</td></tr><tr><td><code>deliveryEvidence</code></td><td>string</td><td>Qualifies a <code>delivered</code> status; absent for any order not claiming delivery. <code>observed</code> means the delivery was seen — a solver-confirmed outbound row, a same-chain direct transfer, or a fill that was itself the delivery. <code>presumed</code> means it was inferred.</td></tr><tr><td><code>sourceEventMissing</code></td><td>boolean</td><td>The source-chain submit event was never indexed, so the row was reconstructed. Returned by the API but <strong>not yet declared in the published OpenAPI spec</strong>.</td></tr></tbody></table>

> **A chained order spans three chains, and the execution chain is neither end.** Leg 1 is a same-symbol cross-chain move of the bid asset (a USDC to USDC hop is correct, not a bug) onto the execution chain; leg 2 swaps that connector into the ask and delivers it. A destination that looks wrong in a UI is usually the invisible middle hop — read `finalDestChainId` and `finalToToken*`, not `destChainId` and `toToken*`.

### TransactionLeg

One leg of a chained journey, as returned in `TrackedTransaction.legs[]`.

<table data-search="false"><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>index</code></td><td>integer</td><td>Position in the journey, 0-based.</td></tr><tr><td><code>role</code></td><td>string</td><td>What the leg is <strong>for</strong>, so a consumer can label it without re-deriving intent from the token pair. <code>source-swap</code> turns the user's bid into the internal connector and parks it on the destination chain — its ask side is not what the user bought, and its final step is a bridge-and-park rather than a delivery. <code>delivery</code> turns the connector into the asset the user asked for and delivers it.</td></tr><tr><td><code>orderId</code></td><td>string</td><td>On-chain order id for this leg.</td></tr><tr><td><code>txHash</code></td><td>string</td><td>Submit transaction hash for this leg.</td></tr><tr><td><code>sourceChainId</code> / <code>destChainId</code></td><td>string</td><td>Chain IDs for this leg, serialized as strings.</td></tr><tr><td><code>fromTokenAddress</code> / <code>fromTokenSymbol</code> / <code>fromTokenAmount</code></td><td>—</td><td>What this leg sold.</td></tr><tr><td><code>toTokenAddress</code> / <code>toTokenSymbol</code> / <code>toTokenAmount</code></td><td>—</td><td>What this leg bought.</td></tr><tr><td><code>status</code></td><td>TrackingStatus</td><td>Status of this leg alone.</td></tr><tr><td><code>completedSteps</code> / <code>totalSteps</code></td><td>integer</td><td>Step progress for this leg.</td></tr><tr><td><code>submittedAt</code> / <code>arrivedAt</code> / <code>filledAt</code> / <code>deliveredAt</code></td><td>string or null</td><td>Lifecycle timestamps for this leg.</td></tr><tr><td><code>steps</code></td><td>TransactionStep[]</td><td>Step entries for this leg.</td></tr></tbody></table>

### TransactionStep

<table data-search="false"><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>stepNumber</code></td><td>integer</td><td>Step index.</td></tr><tr><td><code>stepName</code></td><td>string</td><td>One of <code>submitted</code>, <code>arrived</code>, <code>filled</code>, <code>delivered</code>.</td></tr><tr><td><code>stepStatus</code></td><td>string</td><td>One of <code>completed</code>, <code>pending</code>, <code>failed</code>, <code>recovered</code>.</td></tr><tr><td><code>eventType</code></td><td>string</td><td>Underlying event type.</td></tr><tr><td><code>chainName</code> / <code>chainId</code></td><td>string</td><td>Chain this step occurred on.</td></tr><tr><td><code>txHash</code></td><td>string</td><td>Step transaction hash.</td></tr><tr><td><code>explorerLink</code> / <code>protocolExplorerLink</code></td><td>string</td><td>Explorer links.</td></tr><tr><td><code>blockNumber</code></td><td>integer</td><td>Block number.</td></tr><tr><td><code>blockTimestamp</code></td><td>string or null</td><td>Block timestamp.</td></tr><tr><td><code>gasUsed</code></td><td>integer</td><td>Gas units consumed (omitted when unknown).</td></tr><tr><td><code>gasPriceWei</code></td><td>string</td><td>Effective gas price in wei (omitted when unknown).</td></tr></tbody></table>

### TransactionStats

| Field                           | Type           | Description                            |
| ------------------------------- | -------------- | -------------------------------------- |
| `total`                         | integer        | Total matching transactions.           |
| `byStatus`                      | object         | Count keyed by TrackingStatus.         |
| `byProtocol`                    | object         | Count keyed by protocol.               |
| `avgDeliveryMs`                 | number or null | Average delivery time in milliseconds. |
| `bySourceChain` / `byDestChain` | object         | Counts keyed by chain ID.              |
