⚠️ NOTICE: Deployment Testing in Progress We have recently deployed a major platform update and are currently performing post-deployment testing and validation. Please do not use this website or submit any transactions until testing is complete. Some features may be unavailable or behave unexpectedly. Thank you for your patience as we work to ensure everything is functioning correctly.
Proof of delivery
The supplier anchors a delivery document's fingerprint; on proof the contract is fulfilled and both get a certificate.
proof-of-delivery v1Who enforces what
- Condition
deliveredProof verifiedApplication-enforced - Action
completeRecord the outcomeApplication-enforced - Action
completeIssue a certificateApplication-enforcedpreview
- Consensus-enforced
- Every DigiByte node enforces it. Nobody can override it, including Contracts.
- DigiAsset-indexer-enforced
- DigiAsset indexers apply it after a transaction confirms. It is not DigiByte consensus: a valid DigiByte transaction can still be treated as burning assets.
- Application-enforced
- Contracts decides it in its own application, from data you can check. You trust Contracts' nodes, records and evaluation.
- Cryptographically verifiable
- Anyone can check it from public data and mathematics alone (wallet signatures, drand). Contracts records it; you need not trust Contracts to verify it.
Before it can be signed, fill in
- a DigiByte address for every party
- the delivery document's SHA-256
Simulation
The standard scenarios, run through the same rule engine the live service uses, with example values in every blank (addresses nobody holds keys for, and a format-valid example asset).
| Scenario | Outcome | Actions |
|---|---|---|
Nothing happens Everyone signs, then nobody does anything until expiry. | breached | none |
Delivery proven happens The least that makes rule “Delivery proven” true happens at block 24500005. | fulfilled | complete: update contract state (execute) complete: issue certificate (preview) |
Data unavailable The rule conditions are met, but every outside data source is unreachable. Nothing irreversible may happen. | none | none |
Rules
1. Delivery proven
When “delivered”
- → Record the outcome: fulfilled. The contract ends.Application-enforcedIrreversible
- → Issue a completion certificate to the supplier and customer.Application-enforcedIrreversiblePreview
Expiry
At DigiByte block 24,540,320 (20 confirmations), if no outcome has been recorded, the contract ends as breached. Nothing that happens at or after expiry counts.
Conditions
deliveredProof verifiedApplication-enforcedDocument fingerprint 000000000000… is anchored via Proof, signed by the supplier, with 20 confirmations.
A party links the Proof proof; Contracts checks the anchoring transaction on its own DigiByte node (OP_RETURN, Merkle inclusion, confirmations) and does not rely on Proof's own status.
- An anchor proves the fingerprint existed at a time, not that the document's content is true.
- Only proofs a party links are evaluated; proofs Contracts anchors itself (source "digicontract") are not available yet.
What you are trusting
DigiByte itself does not enforce these rules. Contracts evaluates them from public data and records the outcome; the parties’ signatures and any anchors can be checked by anyone.
- Contracts' evaluation and records
- Contracts' DigiByte node
- A party linking the proof (an unlinked proof is not seen)
Irreversible once done
- Delivery proven: Record the outcome: fulfilled. The contract ends.
- Delivery proven: Issue a completion certificate to the supplier and customer.
These run only when every condition they depend on is known. Missing or unconfirmed data never triggers them.
Some parts are in preview: they are part of the agreement, but Contracts will monitor or perform them only once that feature launches.
Use it from code
The same template is available from the API (GET /api/contracts/v1/templates/proof-of-delivery) and the TypeScript SDK:
const { draft } = await client.templates.get("proof-of-delivery");
// fill in addresses and amounts, then:
const { id } = await client.contracts.create(draft, { idempotencyKey: crypto.randomUUID() });