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.
Delivery contract
| Field | Value |
|---|---|
| Event type | asset.issuance.provisional |
| Version | 1 |
| Lifecycle state | provisional |
| Counter-signed receipts | No event-specific advice |
| SDK type | Webhook.AssetIssuanceProvisionalV1 |
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
When to consume this event
Consume asset.issuance.provisional when your integration needs early notice that an asset issuance transaction has been indexed, but can tolerate the result still being inside the configured reorg depth.
Use this event to stage downstream asset, token, ledger, or reconciliation records. Keep those records reversible and handle asset.issuance.retracted if it arrives. Check the recorded transaction outcome and apply your integration's finality policy before treating the issuance as complete. This provisional event does not promise a later completion event.
Store these identifiers before triggering downstream side effects:
| Field | Why it matters |
|---|---|
webhook-id | Dedupe delivery attempts from the webhook transport. |
evt_id | Identify the DALP event in your event store. |
request.idempotency_key | Correlate the webhook to the originating API request when DALP includes a request record. |
assetAddress | Attach provisional state to the issued asset. |
chainId | Keep the asset address scoped to the originating chain. |
transactionHash | Link the provisional event to the indexed transaction. |
See webhook idempotency and on-chain outcome for retry, replay, payload-shape, and provisional-event handling.
Payload shape
Fat payloads include the issued asset address, chain ID, issuer address, raw issued quantity, and transaction hash. Thin payloads omit issuer. Fetch or store the issuer wallet identifier only when your integration is allowed to process that field.
quantity is a string so consumers can preserve the exact on-chain integer value without JavaScript number rounding.
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.provisional") {
const event: Webhook.Event<"asset.issuance.provisional"> = 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_b1d405f2006dd06f1a77563464ab98e1" \
-H "webhook-timestamp: 1778112000" \
-H "webhook-signature: v1,docs-example-signature" \
--data '{"evt_id":"evt_b1d405f2006dd06f1a77563464ab98e1","source_id":"example:asset.issuance.provisional@1:0","lifecycle_state":"provisional","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.provisional","version":1,"request":{"idempotency_key":"idem_01JZP7R5W8M9N0P1Q2R3S4T5"}}'Version and manifest
This page documents version 1 of asset.issuance.provisional. This event type is not deprecated. The DALP events manifest contains the machine-readable AsyncAPI entry.
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.
asset.issuance.retracted
A provisional asset issuance was retracted because a reorg invalidated the source log.