Discreet Log Contracts (DLCs)
DLCs let two parties bet on real-world outcomes (price, sports, weather) with on-chain settlement, without revealing contract terms on chain. The oracle never knows about the bet; the chain only sees a 2-of-2 multisig + a CET that looks like an ordinary cooperative spend.
Original 2017 paper: Tadge Dryja. Wire format and transaction
construction come from github.com/discreetlogcontracts/dlcspecs,
which still labels itself an "In Progress Specification" and has not
merged a change to master since February 2023 — see Standardization
below before treating any of it as a moving target.
Core mechanism
-
Oracle setup (one-time):
- Oracle has long-term key
P_oracle. - For each event, oracle publishes nonce
R_event = k * Gin advance. - Oracle pledges: when event happens, publishes
s_outcomesuch thats_outcome * G = R_event + e_outcome * P_oraclewheree_outcome = H(R_event, outcome_label).
- Oracle has long-term key
-
Funding (party setup):
- Alice and Bob agree on contract: payout function
(outcome → (a, b)). - They pre-sign all possible CETs as adaptor signatures over
each outcome's
T_outcome = R_event + e_outcome * P_oracle. - Together they fund a 2-of-2 multisig output (the funding tx).
- Alice and Bob agree on contract: payout function
-
Settlement:
- Oracle publishes
s_outcomefor the actual outcome. - The party favored by that outcome adapts their pre-signed CET
with
s_outcomeand broadcasts. - Settlement happens in a single tx, looking like a generic 2-of-2 spend on chain.
- Oracle publishes
-
Refund (timeout):
- If oracle never publishes (event canceled), parties can refund via a CSV time-locked refund tx pre-signed during funding.
Why "discreet"
- On chain, an observer sees: funding tx (2-of-2 multisig output), settlement tx (a regular spend). No contract terms, no oracle key, no payout structure.
- Oracle never learns about the contract. Oracles can serve many unrelated DLCs from one event publication.
Numerical outcomes
For continuous outcomes (e.g., BTC price ∈ [0, 100k]), oracle uses
multi-nonce attestation: publishes one R_i per bit / digit of
the outcome. Parties pre-sign CETs covering ranges of bit patterns.
CET count grows with precision:
- 0.1% precision over a 100k range → ~1000 CETs.
- Modern DLC libraries use CET trees + adaptor combinator tricks to compress.
DLC vs other primitives
| Property | DLC | HTLC | LN PTLC |
|---|---|---|---|
| On-chain footprint | 1 funding + 1 settlement | 1 setup + 1 redeem | LN channel update |
| Oracle/preimage | external oracle attestation | internal preimage | internal point |
| Outcome space | discrete or numerical | binary (revealed/not) | binary |
| Atomicity | enforced via adaptor sigs | enforced via hash | enforced via point |
Standardization
github.com/discreetlogcontracts/dlcspecs defines:
- Funding protocol.
- CET construction.
- Adaptor sig encoding.
- Oracle attestation format.
Wire protocol uses Lightning-style TLV messages over Tor / clearnet.
Status (as of September 2026): the spec is a de-facto standard
frozen at its early-2023 state. The newest commit on master is
9cd9148 "Correct Typo in Signature Point calculation" (2023-02-13);
the README still describes a work-in-progress draft with an unfinished
v0 milestone, and 43 issues are open. No DLC BIP has ever been filed —
the bitcoin/bips index contains no entry for DLCs or discreet log
contracts as of September 2026. The repo is not archived and 22 pull
requests are open, six of them updated with new commits or comments in
March 2026, but nothing has merged in over three years. Everything the
README lists as "Future Work" — DLC transfers/updates, option-style
DLCs, Taproot DLCs, DLC construction inside Lightning — remains
unspecified. Treat the 2023 documents as the interop contract and
cross-check field-level details against a live implementation rather
than waiting on spec updates.
Implementations
Maintenance state as of September 2026:
rust-dlc(p2pderivativesorg, by Crypto Garage) — most complete Rust stack, but slow-moving.dlc-managerorchestrates the funding/CET/refund tx chain,dlc-triecovers numerical contracts,dlc-messagesthe wire format.- Integrates with
rust-bitcoin,bdk. - v0.8.0 on crates.io, published 2025-12-13, which is also the date
of the newest commit on
master. The repo carries git tags but has published no GitHub releases. - Its own README says the library "has not been thoroughly tested in production yet", recommends "avoiding using it on main-net", and notes it "is not yet fully compliant" with dlcspecs. Do not bill it as production-grade on the strength of feature coverage alone.
bitcoin-s(Suredbits) — Scala;dlc-wallet,dlc-oracleanddlc-nodemodules. The most actively maintained full node-plus-DLC stack; 1.9.12 released 2026-03-21.node-dlc(Atomic Finance) — TypeScript; v1.2.1 (July 2026), still taking feature work.cfd-dlc(Crypto Garage) — C++ library with a JS wrapper, used by the P2PDerivatives client. Last pushed February 2023; dormant.NDLC(Nicolas Dorier) — C# implementation intended for BTCPayServer. Last pushed January 2021; abandoned.
Earlier revisions of this skill also listed dlc-protocol (DLC.dev,
Python), dlc-tools (JS/TS) and DLCKit (Bitfinex iOS). None of the
three could be located in September 2026: no matching repositories
surface in a GitHub search, dlc.dev does not respond, and none appear
in the dlcspecs implementation list. Treat them as gone.
Use cases
- Sports betting — outcome = team A or B wins.
- Price hedging — bilateral derivatives on BTC/USD.
- Parametric insurance — payout based on weather oracle.
- Lightning Loop alternatives — DLC-based off-chain mechanisms.
- Bitcoin-collateralized lending — Lygos (formed August 2025 from Atomic Finance's DLC stack) runs DLC-backed institutional loans.
Earlier revisions of this skill paired "Lava / Atomic Finance" here as
live DLC apps; both halves are stale as of September 2026. Lava's CEO
stated in November 2025 that Lava "no longer uses DLCs … for loans
because the technology doesn't meet our security standards", and
reporting that month described collateral moving to a custodial
cold-storage model — though lava.xyz again markets loans as "fully
Bitcoin-collateralized and self-custodial" as of September 2026, with
no mention of DLCs anywhere on the page. Atomic Finance sunset its own
consumer app in 2025 and atomic.finance no longer resolves, but its
node-dlc library is still maintained (see Implementations).
Operational considerations
- Oracle availability: parties must trust the oracle to publish the outcome. Multiple oracles → "DLC with k-of-n oracles" combines attestations.
- CET storage: pre-signed CETs (per outcome) can total megabytes of data per contract. Both parties must persist their share.
- Fee management: each pre-signed CET has a fixed fee at construction time. If mempool fee rates spike, settlement may not confirm. Mitigation: CPFP via anchor outputs, RBF if not pre-signed immutably, or fee-bump-via-replacement on a per-CET basis.
Security caveats
- Oracle compromise = funds at risk. Use multi-oracle (k-of-n) structure for high-value contracts.
- Replay across CETs — adaptor points must be unique per outcome
(built-in via
e_outcomederivation). - Refund path must always exist; otherwise oracle outage = permanent fund lock.
Common pitfalls
- Underestimating CET storage requirements for fine-grained numerical contracts.
- Hard-coding fee rates instead of using anchor outputs / fee bumping.
- Trusting a single oracle for high-value contracts.
- Confusing DLC oracles (which are just signers, no chain) with chain oracles like UMA, Chainlink, etc.