If enterprises cannot access bank capital quickly, they are forced to resort to black credit at very high cost, leading to bankruptcy risk.
A deep-tier supply-chain finance protocol for Vietnamese exporters. Tokenized receivables, oracle-verified invoices, zero-knowledge linkage, and a cascade engine that splits an anchor's payment across every supplier upstream, atomically, on delivery, without asking the anchor buyer to open its ERP.
If enterprises cannot access bank capital quickly, they are forced to resort to black credit at very high cost, leading to bankruptcy risk.
A small supplier's cash flow structurally originates from the anchor buyer, but the bank cannot see the invoice trail two tiers up.
HDBank VCF: 4,202 suppliers, all tier-1. The ceiling is a governance problem, not a technology problem.
From a printed invoice in Bac Ninh to an atomic DvP settlement on Sepolia, every state change, in order. Numbers are real, from the deployed contracts.
Suppliers, banks, and SBV receive ONCHAINID contracts with KYC, AML, and (for banks) SBV_LICENSE claims. Every token transfer runs through six compliance modules: MaxHolders, MaturityLock, SBVLicense, DisputeFreeze, ClaimExpiry, CascadeSettlement.
Supplier submits an e-invoice reference. Chainlink Functions pings MISA, the DON reaches consensus, and InvoiceVerified is emitted. No verified invoice, no token.
ReceivableMinter is the only address with the Agent role. It claims the verification event and mints an ERC-3643 token keyed to the supplier. State machine starts at Minted.
Supplier lists on the Marketplace. Banks commit a keccak256(amount,rate,nonce), then reveal. Winner takes the highest advance, tiebreak on lowest rate. No front-running.
One transaction: VND moves from bank → supplier, token moves supplier → bank, state flips to Funded. If any ERC-3643 check fails, the whole thing reverts. Bank keeps VND. Supplier keeps token.
Each supplier requests linkage to their customer's token. Tier-1 confirms the anchor buyer as anchor. The chain is now on-chain: #11 → #10 → #9 → Anchor.
Poseidon2-hashed commitments published to ZKLinkageRegistry. On Hyperledger Besu this replaces cleartext linkage; competitors in the consortium can't read each other's supply chains.
Off-chain in Noir. Tier-1 proves membership in the anchor Merkle tree (root 0x1bdb95…). Each deeper tier folds its parent's proof into its own. Banks see a single ZK-verified badge, nothing else.
The anchor buyer settles with tier-1 via normal banking rails. A MockPaymentOracle (Chainlink in production) detects the credit and fires a PaymentDetected event keyed to token #9.
A CascadeEngine clone (EIP-1167 minimal proxy) computes tranches, marks itself distributed, and waits. Each recipient (bank, upstream supplier, protocol fee) calls release()and pulls their share. Token state → Settled → Burned.
You keep making casings for the anchor buyer. We turn your unpaid invoice into an ERC-3643 token, list it to three banks, and wire VND to your account the moment a bid clears. No property collateral. No branch visits.
Twenty-five contracts across five layers on Sepolia. No handwaving; every address below is verified on Etherscan.
| Layer | Contract | Address | Role |
|---|---|---|---|
| Identity | IdentityRegistry | 0x346B7694E250F762A0884829a4d5d4eafA619858 | Wallet ↔ ONCHAINID mapping |
| Identity | ClaimTopicsRegistry | 0xF1e4e720ae8e3DbfC8638ac4623DEddF7Dd8d1Ed | KYC / AML / SBV_LICENSE topics |
| Identity | TrustedIssuersRegistry | 0x67af3FdFbf8Fa2E8F9eD38130020E4F46eBB96E7 | Authorized claim issuers |
| Token | ReceivableToken (T-REX) | 0xc9Ef49a0AAA70702880A0A9DB93B69C1d6B688F6 | ERC-3643 receivable state machine |
| Token | ModularCompliance | 0x7aeC0B8b0c0AA88e506b89C632a70B432aEC6B37 | Pluggable compliance module bus |
| Compliance | MaxHoldersModule | 0xca8f76ec95C51b3F6bC582062Aa9Bd17D65cDEf1 | Caps distinct holders |
| Compliance | MaturityLockModule | 0xF336aCB7E95620748b789B64418b43068CD0bF8f | No transfer pre-maturity |
| Compliance | SBVLicenseModule | 0xF009201C546b4721A0443f93FFc44F1AD5b0dB41 | Recipient must hold SBV claim |
| Compliance | DisputeFreezeModule | 0x2E65064cc32af9Ff3df44C4c0dAe9aD2E5405dE4 | Freeze disputed receivables |
| Compliance | ClaimExpiryModule | 0xF36E5b6154DcD5775f586eAE723BB9D69CA51246 | Enforce claim expiry |
| Compliance | CascadeSettlementModule | 0x6ac6097e64548C2A8590FEB23Ec3Efbe09171e6A | Blocks transfer until cascade set |
| Oracle | ReceivableVerifier | 0xEE0799FAB69a8b12f7BF2636969aE58Bb160843f | Chainlink Functions consumer (MISA) |
| Oracle | ReceivableMinter | 0x37f50c5fecc4ea64d706Da46C87cA469A5B24462 | Agent-role minter (dedup by invoice) |
| Oracle | MockPaymentOracle | 0x9E30B030fBda769159cd336722c13d2e06199ee6 | Simulated anchor-payment detector |
| Protocol | Marketplace | 0x89C171fA74EbF13C0eFc105093E8Ff12d0B4ECCE | Sealed-bid auction + atomic DvP |
| Protocol | LinkageRegistry | 0xcDf0be24141203254a0abDC8CEa83D79Df76f630 | Cleartext multi-tier linkage |
| Protocol | CascadeEngineFactory | 0xB4BF24Debe783be6aE101B0F19016c56793d8D9D | EIP-1167 clone factory |
| Protocol | MockVND | 0xd12607Bd58F48059F19B74Bc2FD21a0f36941EEe | ERC-20 stablecoin (₫) |
| Protocol | SyndicationVault | 0xE35A548190E03F58A83A7710e35F2f5f641e355e | ERC-4626 multi-bank vault |
| ZK | HonkVerifier | 0xf12a8D073EE838943f25228B06950f6a62757D5e | UltraHonk verifier (Aztec/Barretenberg) |
| ZK | ZKLinkageRegistry | 0x2AD4147fF8a8c769717365a2F3CC5fEeD0DDa58a | Privacy-preserving linkage proofs |
| ZK | ZKTranscriptLib | 0x2928FBA6dbE6CC1D07a63bA970a3B0b770A67e52 | Fiat-Shamir transcript library |
Three suppliers, two banks, one anchor. Watch an invoice become a token become an auction become a funded advance become a three-way cascade. On real contracts, with real gas.