xvp.settlement-created.final
A settlement was created through an XvP settlement factory with its cutoff, hashlock and legs; leg indexes match those on xvp.settlement-executed.final. Never carries the hashlock secret; sent once the chain finality watermark reaches its source block, and only to endpoints on the System that owns the settlement's factory.
Delivery contract
| Field | Value |
|---|---|
| Event type | xvp.settlement-created.final |
| Version | 1 |
| Lifecycle state | final |
| Counter-signed receipts | No event-specific advice |
| SDK type | Webhook.XvpSettlementCreatedFinalV1 |
The receipt recommendation does not change delivery behavior. DALP waits for a counter-signed receipt only if the webhook endpoint's counterSignedReceipts value is true when DALP queues the delivery. When the value is false, a normal 2xx response completes the delivery.
Related references:
idxr_xvp_settlement
Payload schema
The schema and examples describe the full payload. Thin delivery omits personal data fields. Use the payload-shape guidance to choose the endpoint configuration.
{
"type": "object",
"properties": {
"chainId": {
"type": "integer",
"exclusiveMinimum": 0
},
"settlementAddress": {
"type": "string",
"minLength": 42,
"maxLength": 42,
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "A valid Ethereum address (42 characters, starting with 0x)",
"examples": ["0x71C7656EC7ab88b098defB751B7401B5f6d8976F"]
},
"occurredAt": {
"type": "string"
},
"transactionHash": {
"type": "string",
"pattern": "^0x[a-fA-F0-9]{64}$"
},
"blockNumber": {
"type": "integer",
"minimum": 0
},
"logIndex": {
"type": "integer",
"minimum": 0
},
"factoryAddress": {
"type": "string",
"minLength": 42,
"maxLength": 42,
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "A valid Ethereum address (42 characters, starting with 0x)",
"examples": ["0x71C7656EC7ab88b098defB751B7401B5f6d8976F"]
},
"creatorAddress": {
"type": "string",
"minLength": 42,
"maxLength": 42,
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "A valid Ethereum address (42 characters, starting with 0x)",
"examples": ["0x71C7656EC7ab88b098defB751B7401B5f6d8976F"]
},
"name": {
"type": "string"
},
"cutoffAt": {
"type": "string"
},
"autoExecute": {
"type": "boolean"
},
"hashlock": {
"type": "string",
"pattern": "^0x[a-fA-F0-9]{64}$"
},
"hasExternalFlows": {
"type": "boolean"
},
"flows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"legIndex": {
"type": "integer",
"minimum": 0
},
"assetAddress": {
"type": "string",
"minLength": 42,
"maxLength": 42,
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "A valid Ethereum address (42 characters, starting with 0x)",
"examples": ["0x71C7656EC7ab88b098defB751B7401B5f6d8976F"]
},
"fromAddress": {
"type": "string",
"minLength": 42,
"maxLength": 42,
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "A valid Ethereum address (42 characters, starting with 0x)",
"examples": ["0x71C7656EC7ab88b098defB751B7401B5f6d8976F"]
},
"toAddress": {
"type": "string",
"minLength": 42,
"maxLength": 42,
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "A valid Ethereum address (42 characters, starting with 0x)",
"examples": ["0x71C7656EC7ab88b098defB751B7401B5f6d8976F"]
},
"amount": {
"type": "string",
"pattern": "^(?:0|[1-9]\\d*)$",
"maxLength": 78
},
"externalChainId": {
"type": "integer",
"minimum": 0
},
"externalAssetDecimals": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
]
}
},
"required": [
"legIndex",
"assetAddress",
"fromAddress",
"toAddress",
"amount",
"externalChainId",
"externalAssetDecimals"
],
"additionalProperties": true
}
}
},
"required": [
"chainId",
"settlementAddress",
"occurredAt",
"transactionHash",
"blockNumber",
"logIndex",
"factoryAddress",
"creatorAddress",
"name",
"cutoffAt",
"autoExecute",
"hashlock",
"hasExternalFlows",
"flows"
],
"additionalProperties": true
}TypeScript SDK example
Use the request's raw body and headers with your endpoint's webhook secret. This handler illustrates verification and event selection. Before writing downstream state, deduplicate deliveries by evt_id and recognize replayed outcomes by their domain identifiers.
const result = await verifyWebhook({
rawBody,
headers,
secret: process.env.DALP_WEBHOOK_SECRET!,
});
if (!result.ok) {
throw new Error(`Webhook verification failed: ${result.code}`);
}
if (result.event.type === "xvp.settlement-created.final") {
const event: Webhook.Event<"xvp.settlement-created.final"> = result.event;
console.log(event.payload);
}HTTP delivery example
This illustrative request shows the delivery shape. Its timestamp and signature are placeholders; a verifier rejects them. Use a signed platform delivery to verify your endpoint.
curl -X POST https://consumer.example.com/dalp/webhooks \
-H "content-type: application/json" \
-H "webhook-id: evt_cc2e00981ea66df527345ad95215e59d" \
-H "webhook-timestamp: 1778112000" \
-H "webhook-signature: v1,docs-example-signature" \
--data '{"evt_id":"evt_cc2e00981ea66df527345ad95215e59d","source_id":"example:xvp.settlement-created.final@1:0","lifecycle_state":"final","payload":{"chainId":537001,"settlementAddress":"0x9999999999999999999999999999999999999999","occurredAt":"2026-09-28T09:15:00.000Z","transactionHash":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","blockNumber":18445260,"logIndex":4,"factoryAddress":"0x4444444444444444444444444444444444444444","creatorAddress":"0x6666666666666666666666666666666666666666","name":"Bond against cash","cutoffAt":"2026-10-05T09:15:00.000Z","autoExecute":true,"hashlock":"0x0000000000000000000000000000000000000000000000000000000000000000","hasExternalFlows":false,"flows":[{"legIndex":0,"assetAddress":"0x5555555555555555555555555555555555555555","fromAddress":"0x6666666666666666666666666666666666666666","toAddress":"0x7777777777777777777777777777777777777777","amount":"250000000000000000000","externalChainId":0,"externalAssetDecimals":null},{"legIndex":1,"assetAddress":"0x8888888888888888888888888888888888888888","fromAddress":"0x7777777777777777777777777777777777777777","toAddress":"0x6666666666666666666666666666666666666666","amount":"1000000000","externalChainId":0,"externalAssetDecimals":null}]},"related":{"idxr_xvp_settlement":"idxr_xvp_settlement_example"},"type":"xvp.settlement-created.final","version":1,"request":{"idempotency_key":"idem_01JZP7R5W8M9N0P1Q2R3S4T5"}}'Version and manifest
This page documents version 1 of xvp.settlement-created.final. This event type is not deprecated. The DALP events manifest contains the machine-readable AsyncAPI entry.
xvp.settlement-cancelled.final
A settlement was cancelled before it executed; each participant's escrow is returned through xvp.assets-refunded.final or parked through xvp.refund-deferred.final; sent once the chain finality watermark reaches its source block, and only to endpoints on the System that owns the settlement's factory.
xvp.settlement-executed.final
A settlement executed and settled its legs; a recipient whose local leg could not be transferred appears in xvp.delivery-deferred.final from the same transaction, and that leg is not delivered until xvp.delivery-claimed.final; sent once the chain finality watermark reaches its source block, and only to endpoints on the System that owns the settlement's factory.