asset.issuance.final
New token units were minted to a recipient, sent once the chain finality watermark reaches the source block. `transferSourceId` names the token.transfer.final event for the same movement, so a ledger books the issuance once.
Delivery contract
| Field | Value |
|---|---|
| Event type | asset.issuance.final |
| Version | 1 |
| Lifecycle state | final |
| Counter-signed receipts | Recommended for endpoints that consume this event |
| SDK type | Webhook.AssetIssuanceFinalV1 |
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_token
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
},
"transactionHash": {
"type": "string",
"pattern": "^0x[a-fA-F0-9]{64}$"
},
"blockNumber": {
"type": "integer",
"minimum": 0
},
"logIndex": {
"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"]
},
"issuer": {
"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"]
},
"recipient": {
"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"]
},
"quantity": {
"type": "string"
},
"transferSourceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"chainId",
"transactionHash",
"blockNumber",
"logIndex",
"assetAddress",
"issuer",
"recipient",
"quantity",
"transferSourceId"
],
"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 === "asset.issuance.final") {
const event: Webhook.Event<"asset.issuance.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_c1100c2e9d4ef14221c300ec00810f23" \
-H "webhook-timestamp: 1778112000" \
-H "webhook-signature: v1,docs-example-signature" \
--data '{"evt_id":"evt_c1100c2e9d4ef14221c300ec00810f23","source_id":"example:asset.issuance.final@1:0","lifecycle_state":"final","payload":{"assetAddress":"0x1111111111111111111111111111111111111111","chainId":537001,"issuer":"0x2222222222222222222222222222222222222222","recipient":"0x3333333333333333333333333333333333333333","quantity":"1000000000000000000000","transactionHash":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","blockNumber":18445200,"logIndex":4,"transferSourceId":"chain:537001:0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:4:0:token.transfer.final@2"},"related":{"idxr_token":"idxr_token_example"},"type":"asset.issuance.final","version":1,"request":{"idempotency_key":"idem_01JZP7R5W8M9N0P1Q2R3S4T5"}}'Version and manifest
This page documents version 1 of asset.issuance.final. This event type is not deprecated. The DALP events manifest contains the machine-readable AsyncAPI entry.
asset.created.final
A factory deployed a new asset token, sent once the chain finality watermark reaches the source block. Carries the asset's type, name, symbol, decimals and on-chain identity; supply arrives later as issuance events.
asset.issuance.provisional
New token units were minted to a recipient in an included block; the issuance may be retracted until the chain finality watermark reaches it.