A self-custody, geopolitically neutral verification layer that any institution can use regardless of which side of the trade they are on - covering fiat-to-fiat, fiat-to-crypto, and crypto-to-crypto lanes.
Traditional payment infrastructure (SWIFT, DTCC, CLS) is centralized, slow (T+1 to T+2), and controlled by a narrow set of jurisdictions.
Single-chain solutions are fast but not jurisdictionally neutral - a single regulator can freeze or censor transactions at the protocol level.
JIL Sovereign provides a geopolitically neutral verification layer. The protocol does not take a position on either side of a transaction.
Both counterparties submit to the same neutral state machine, governed by compliance rules in the zone matching their jurisdiction.
The settlement-api accepts instructions from any authenticated client. The settlement-engine processes them through a deterministic
9-state pipeline. The ledger-router submits finalized transactions to jil5600-core (the Rust L1 engine). Neither side gets preferential treatment.
What Makes It Neutral
Side-agnostic: Both buyer and seller interact with the same settlement-api. No "home team" advantage.
Self-custody: Users hold their own keys via MPC 2-of-3 threshold signing. JIL never takes custody.
Multi-jurisdictional: Sovereign Compliance Network (SCN) Validators across 13 compliance zones. No single regulator can halt the network.
Deterministic pipeline: All settlements traverse the same 9-state machine. SIMPLE auto-advances; DVP/PVP require bilateral attestation.
Fee at finality: Settlement fee (default 35 bps) is calculated and recorded only when the settlement reaches the final state - not at submission.
Post-quantum ready: Dilithium/Kyber cryptographic primitives for long-term security.
02Three Settlement Lanes
The neutral settlement protocol supports three distinct lanes, each mapped to one or more settlement types (SIMPLE, DVP, PVP).
All three lanes share the same state machine, the same API surface, and the same compliance pipeline.
SIMPLE
Fiat-to-Fiat (FI-to-FI)
Cross-border bank settlement replacement - the institutional alternative to SWIFT and DTCC.
Single compliance check. Auto-transition from accepted to ready.
Travel rule evaluation required (FATF Wire Transfer Rule)
Party data: legal name, account identifier, country, address
ISO 20022 banking fields supported (UETR, BIC, IBAN, charge bearer)
Fees: 35-90 bps per event, $1 floor (vs 50-100 bps for correspondent banking)
Example: Bank A (USD) sends to Bank B (EUR) via JIL settlement coordination layer
SIMPLE | DVP
Fiat-to-Crypto (On-ramp)
Institutional crypto acquisition. Can be SIMPLE (single direction) or DVP (delivery vs payment) with two legs.
DVP: fiat delivery (PAYMENT leg) against crypto delivery (ASSET leg)
Per-leg compliance for DVP - each leg independently verified
Travel rule evaluation applies to fiat leg
Both legs must be attested via attest-ready (DVP only)
A client (institution, wallet, or API consumer) submits a settlement instruction to
the settlement-api. The instruction specifies the settlement type, zone, counterparties,
and either inline amounts (SIMPLE) or multi-leg definitions (DVP/PVP).
SIMPLE: Requires from_account, to_account,
asset, amount. DVP: Requires legs[] with 1 ASSET + 1 PAYMENT leg, plus payer and payee. PVP: Requires legs[] with 2 PAYMENT legs, plus payer and payee.
POST /v1/settlements - single settlement POST /v1/settlements/batch - batch of 1-100 SIMPLE settlements
The ATCE compliance gate runs at creation for all types. If denied, the settlement is immediately rejected.
On success, status is set to received and a unique settlement ID + UETR are assigned.
The settlement engine polls received settlements and evaluates the FATF
Wire Transfer Rule based on the settlement zone configuration. The engine queries the compliance-api
for the zone's travel rule config - threshold amount (USD equivalent), and required fields.
Required party fields (zone-configurable, defaults): originator_name,
originator_account,
beneficiary_name,
beneficiary_account
If required travel rule fields are missing, the settlement is rejected immediately with
SETTLEMENT_REJECTED and the missing fields are listed in the failure reason.
If travel rule passes (or is not required below threshold), status transitions to validated.
settlement-engine (poll loop)compliance-api :8100
status: validated
3
Compliance Engine
The engine transitions validated settlements to compliance_check and runs the
full compliance pipeline against the compliance-api.
SIMPLE settlements: Single compliance check on the from/to/asset/amount. DVP/PVP settlements: Per-leg compliance - each leg is independently checked against the
compliance-api with its own from_account, to_account, asset, and amount.
Atomic rejection: If any leg is denied, the entire settlement is rejected.
There is no partial compliance pass. The compliance receipt hash is stored for audit trail.
On compliance pass, status transitions to accepted.
settlement-engine (poll loop)compliance-api :8100
status: accepted
4
Attestation Gate
This step determines when a settlement is ready for L1 submission.
SIMPLE settlements: Auto-transition. The engine immediately moves the settlement from
accepted to ready. No external action required.
DVP/PVP settlements: Both counterparties must independently attest that their leg is ready
by calling the attest-ready endpoint. The engine checks all legs on each tick - only when every leg has
status = 'ready' does the settlement advance to ready.
Each attestation is recorded in the settlement_attestations table and the corresponding
leg status is updated. The party_id must match either the payer or payee registered on the settlement.
settlement-api :8050settlement-engine (poll loop)
status: ready
5
L1 Submission
The engine submits the ready settlement to the JIL L1 ledger via ledger-router.
The ledger client calls lab_tx RPC on ledger-router :8000, which forwards
the transaction to jil5600-core (the Rust L1 engine).
For DVP/PVP, the first leg is used as the primary submission. Both legs are atomically committed
as part of the same block.
On successful submission, the L1 returns a tx_id and the settlement
moves to submitted. If submission fails, the settlement moves to failed
with the error recorded.
Timeout: If a submitted settlement receives no block inclusion within
SETTLEMENT_TIMEOUT_MS (default 60s), it is marked failed.
The engine polls submitted settlements for block inclusion via lab_receipt RPC.
Once included in a block, the settlement moves to confirmed with the block height,
block hash, and initial confirmation count recorded.
The engine continues polling confirmed settlements until the confirmation count reaches the
FINALITY_CONFIRMATIONS threshold (default: 6 confirmations).
At finality:
1. Fee calculation: Settlement fee is computed at the final state (default 35 bps).
For DVP, the fee is based on the ASSET leg amount. For PVP, the fee is based on the first leg. 2. Leg settlement: For DVP/PVP, all legs are marked settled. 3. Receipt assembly: A structured receipt is built containing the settlement ID, tx_id,
block data, fee breakdown, compliance receipt hash, and leg details (for DVP/PVP). 4. Finality proof: A proof object is stored containing the tx_id, block height, block hash,
confirmation count, and finalization timestamp.
The settlement moves to final and a webhook is dispatched.
After creation, both parties must call POST /v1/settlements/:id/attest-ready
with their respective party_id and leg_index before the settlement advances.
Fees are calculated at finality, not at submission. This means a settlement that fails or is cancelled incurs zero fees.
The default fee is SETTLEMENT_FEE_BPS = 35 (35 basis points, or 0.35%).
Settlement Type
Fee Base
Default bps
Example
SIMPLE
The single amount field
35 bps
1,000,000 JIL → 3,500 JIL fee
DVP
The ASSET leg amount
35 bps
12,500,000 JIL (ASSET leg) → 43,750 JIL fee
PVP
The first leg amount
35 bps
1.0 wBTC-JIL (leg 0) → 0.0035 wBTC-JIL fee
Fee Comparison: JIL vs Traditional Rails
JIL Sovereign: 35-90 bps per settlement event, calculated at finality ($1 floor)
SWIFT (correspondent banking): 15-40 bps + flat fees ($15-$50 per wire)
DTCC (equities): Varies by volume, ~$0.003-0.013 per side plus clearing fees
CLS (FX settlement): ~$0.50-2.00 per trade depending on currency pair and volume
08Finality Timeline Comparison
Bar widths are proportional to wall-clock settlement time. JIL achieves sub-minute finality with 6 L1 confirmations.
JIL
~9s
6 confirms · ~9s
DTCC
T+1
1 business day
SWIFT
T+1 to T+2
1-2 business days
09Core Services
Service
Port
Purpose
settlement-api
8050
REST API for settlement submission, status, cancel, attest-ready, proof, receipt. Runs the settlement-engine poll loop internally.
settlement-consumer
8051
Consumes settlement events from RedPanda for zone-authorized processing on SCN validator nodes.
compliance-api
8100
Zone-specific compliance validation (AML, sanctions, ATCE gate). Provides zone config for travel rule thresholds.
ledger-router
8000
RPC gateway to the L1 engine. Handles lab_tx (submit) and lab_receipt (confirmation check).
jil5600-core
Rust L1
The Rust settlement engine. Processes PaymentTx transactions and produces blocks.
10Configuration
Variable
Default
Purpose
PORT
8050
HTTP port for settlement-api
LEDGER_ROUTER_URL
http://ledger-router:8000
RPC endpoint for L1 transaction submission and receipt polling
COMPLIANCE_API_URL
http://compliance-api:8100
Compliance check + zone config for travel rule
FINALITY_CONFIRMATIONS
6
Number of L1 block confirmations required for finality
SETTLEMENT_FEE_BPS
5
Fee in basis points, calculated at finality
SETTLEMENT_EXPIRY_MINUTES
60
TTL for settlements before automatic expiry
SETTLEMENT_TIMEOUT_MS
60000
Timeout for L1 block inclusion after submission
ENGINE_POLL_INTERVAL_MS
2000
Settlement engine tick interval (processes all state transitions)
KAFKA_BROKERS
redpanda:9092
RedPanda broker for settlement event publishing
JIL_NETWORK_ID
-
Network identifier (mainnet: jil-mainnet-1)
11Key Source Files
File
Purpose
services/settlement-api/src/routes/settlements.ts
POST /v1/settlements, batch, cancel, attest-ready endpoints
services/settlement-api/src/routes/status.ts
GET endpoints: settlement status, proof, receipt, parties, batch summary