311 lines
9.0 KiB
Markdown
311 lines
9.0 KiB
Markdown
# CBDC Mint Burn Flow
|
|
|
|
## Overview
|
|
|
|
CBDC minting and burning operations ensure 1:1 reserve backing for all CBDC issuance. This flow documents the complete process from reserve verification through ledger posting for both minting (issuance) and burning (redemption) operations.
|
|
|
|
## Prerequisites
|
|
|
|
- Sovereign bank is registered and active
|
|
- Treasury account exists for the sovereign bank
|
|
- Reserve account has sufficient balance (for minting)
|
|
- Valid operator identity
|
|
- CBDC service operational
|
|
|
|
## Visual Flow Diagram
|
|
|
|
### Minting Flow
|
|
|
|
```
|
|
┌─────────────┐
|
|
│ Mint Request│
|
|
└──────┬──────┘
|
|
│
|
|
│ 1. Verify Reserve
|
|
▼
|
|
┌─────────────────────────┐
|
|
│ Verify 1:1 Reserve │
|
|
│ Backing │
|
|
│ - Check reserve balance │
|
|
│ - Verify >= mint amount │
|
|
└──────┬──────────────────┘
|
|
│
|
|
│ 2. Reserve OK
|
|
▼
|
|
┌─────────────────────────┐
|
|
│ Create Issuance Record │
|
|
│ - Record ID │
|
|
│ - Amount minted │
|
|
│ - Operator identity │
|
|
│ - Reserve backing │
|
|
└──────┬──────────────────┘
|
|
│
|
|
│ 3. Post to Ledger
|
|
▼
|
|
┌─────────────────────────┐
|
|
│ Ledger Posting │
|
|
│ - Debit: Treasury │
|
|
│ - Credit: CBDC wallet │
|
|
│ - Type: TYPE_B │
|
|
└──────┬──────────────────┘
|
|
│
|
|
│ 4. Complete
|
|
▼
|
|
┌─────────────┐
|
|
│ CBDC Minted │
|
|
└─────────────┘
|
|
```
|
|
|
|
### Burning Flow
|
|
|
|
```
|
|
┌─────────────┐
|
|
│ Burn Request│
|
|
└──────┬──────┘
|
|
│
|
|
│ 1. Create Record
|
|
▼
|
|
┌─────────────────────────┐
|
|
│ Create Issuance Record │
|
|
│ - Record ID │
|
|
│ - Amount burned │
|
|
│ - Operator identity │
|
|
└──────┬──────────────────┘
|
|
│
|
|
│ 2. Post to Ledger
|
|
▼
|
|
┌─────────────────────────┐
|
|
│ Ledger Posting │
|
|
│ - Debit: CBDC wallet │
|
|
│ - Credit: Treasury │
|
|
│ - Type: TYPE_B │
|
|
└──────┬──────────────────┘
|
|
│
|
|
│ 3. Release Reserve
|
|
▼
|
|
┌─────────────┐
|
|
│ CBDC Burned │
|
|
└─────────────┘
|
|
```
|
|
|
|
## Step-by-Step Process
|
|
|
|
### Minting Process
|
|
|
|
#### Step 1: Reserve Verification
|
|
1. Receive mint request with:
|
|
- Sovereign bank ID
|
|
- Wallet ID (optional)
|
|
- Amount to mint
|
|
- Operator identity
|
|
- Reason (optional)
|
|
2. Get treasury account for sovereign bank:
|
|
- Lookup accounts by sovereign bank ID
|
|
- Filter by account type: `treasury`
|
|
- Filter by currency: `OMF` (reserve currency)
|
|
3. Check reserve balance:
|
|
- Get current balance
|
|
- Compare with mint amount
|
|
- Verify: `reserveBalance >= mintAmount`
|
|
4. If insufficient reserve, throw error: "Insufficient reserve backing for CBDC minting"
|
|
|
|
**Code Reference**: `src/core/cbdc/cbdc.service.ts:22-136`
|
|
|
|
#### Step 2: Create Issuance Record
|
|
1. Generate unique record ID: `CBDC-MINT-{uuid}`
|
|
2. Create CBDC issuance record:
|
|
- Record ID
|
|
- Sovereign bank ID
|
|
- Wallet ID (if provided)
|
|
- Amount minted: `amount`
|
|
- Amount burned: `0`
|
|
- Net change: `amount`
|
|
- Operation type: `MINT`
|
|
- Operator identity
|
|
- Reserve backing: `amount` (1:1 backing)
|
|
- Timestamp: current UTC time
|
|
- Metadata: reason if provided
|
|
3. Store record in database
|
|
|
|
**Code Reference**: `src/core/cbdc/cbdc.service.ts:38-52`
|
|
|
|
#### Step 3: Ledger Posting
|
|
1. Get treasury account (same as Step 1)
|
|
2. Determine ledger ID: `{sovereignBankId}-CBDC`
|
|
3. Post double-entry to ledger:
|
|
- Debit account: Treasury account ID
|
|
- Credit account: Treasury account ID (simplified - in production would be CBDC wallet)
|
|
- Amount: `amount`
|
|
- Currency: `OMDC` (CBDC currency code)
|
|
- Asset type: `CBDC`
|
|
- Entry type: `TYPE_B` (CBDC issuance)
|
|
- Reference ID: record ID
|
|
- Metadata: `{ operationType: 'mint', walletId, reason }`
|
|
4. Verify ledger entry created successfully
|
|
|
|
**Code Reference**: `src/core/cbdc/cbdc.service.ts:54-67`
|
|
|
|
#### Step 4: Return Result
|
|
1. Map issuance record to CbdcIssuance type
|
|
2. Return issuance details:
|
|
- Record ID
|
|
- Amount minted
|
|
- Reserve backing
|
|
- Timestamp
|
|
|
|
**Code Reference**: `src/core/cbdc/cbdc.service.ts:69`
|
|
|
|
### Burning Process
|
|
|
|
#### Step 1: Create Issuance Record
|
|
1. Receive burn request with:
|
|
- Sovereign bank ID
|
|
- Wallet ID (optional)
|
|
- Amount to burn
|
|
- Operator identity
|
|
- Reason (optional)
|
|
2. Generate unique record ID: `CBDC-BURN-{uuid}`
|
|
3. Create CBDC issuance record:
|
|
- Record ID
|
|
- Sovereign bank ID
|
|
- Wallet ID (if provided)
|
|
- Amount minted: `0`
|
|
- Amount burned: `amount`
|
|
- Net change: `-amount` (negative)
|
|
- Operation type: `BURN`
|
|
- Operator identity
|
|
- Timestamp: current UTC time
|
|
- Metadata: reason if provided
|
|
4. Store record in database
|
|
|
|
**Code Reference**: `src/core/cbdc/cbdc.service.ts:75-101`
|
|
|
|
#### Step 2: Ledger Posting
|
|
1. Get treasury account for sovereign bank
|
|
2. Determine ledger ID: `{sovereignBankId}-CBDC`
|
|
3. Post double-entry to ledger:
|
|
- Debit account: Treasury account ID (CBDC wallet - simplified)
|
|
- Credit account: Treasury account ID (Treasury - simplified)
|
|
- Amount: `amount`
|
|
- Currency: `OMDC`
|
|
- Asset type: `CBDC`
|
|
- Entry type: `TYPE_B` (CBDC redemption)
|
|
- Reference ID: record ID
|
|
- Metadata: `{ operationType: 'burn', walletId, reason }`
|
|
4. Verify ledger entry created successfully
|
|
|
|
**Code Reference**: `src/core/cbdc/cbdc.service.ts:103-116`
|
|
|
|
#### Step 3: Return Result
|
|
1. Map issuance record to CbdcIssuance type
|
|
2. Return issuance details:
|
|
- Record ID
|
|
- Amount burned
|
|
- Net change
|
|
- Timestamp
|
|
|
|
**Code Reference**: `src/core/cbdc/cbdc.service.ts:118`
|
|
|
|
## Error Handling
|
|
|
|
### Error: Insufficient Reserve Backing
|
|
- **Detection**: Reserve balance < mint amount
|
|
- **Action**: Throw error "Insufficient reserve backing for CBDC minting"
|
|
- **Recovery**: Add reserves, retry minting
|
|
|
|
### Error: Treasury Account Not Found
|
|
- **Detection**: No treasury account found
|
|
- **Action**: Throw error "Treasury account not found"
|
|
- **Recovery**: Create treasury account, retry
|
|
|
|
### Error: Ledger Posting Failure
|
|
- **Detection**: Ledger service returns error
|
|
- **Action**: Rollback issuance record, throw error
|
|
- **Recovery**: Verify ledger service, retry
|
|
|
|
### Error: Invalid Amount
|
|
- **Detection**: Amount <= 0
|
|
- **Action**: Throw validation error
|
|
- **Recovery**: Correct amount, retry
|
|
|
|
## Integration Points
|
|
|
|
### Related Services
|
|
- **CBDC Service**: `src/core/cbdc/cbdc.service.ts`
|
|
- **Account Service**: `src/core/accounts/account.service.ts`
|
|
- **Ledger Service**: `src/core/ledger/ledger.service.ts`
|
|
- **CBDC Wallet Service**: `src/core/cbdc/cbdc-wallet.service.ts`
|
|
|
|
### API Endpoints
|
|
- `POST /api/v1/cbdc/mint` - Mint CBDC
|
|
- `POST /api/v1/cbdc/burn` - Burn CBDC
|
|
- `GET /api/v1/cbdc/issuance/:recordId` - Get issuance record
|
|
|
|
### Database Models
|
|
- `CbdcIssuance` - CBDC issuance records
|
|
- `CbdcWallet` - CBDC wallet records
|
|
- `BankAccount` - Treasury accounts
|
|
|
|
## Performance Metrics
|
|
|
|
- **Reserve Verification**: < 20ms target
|
|
- **Record Creation**: < 10ms target
|
|
- **Ledger Posting**: < 50ms target
|
|
- **Total End-to-End**: < 80ms target
|
|
- **Throughput**: 5,000+ operations/second
|
|
- **Availability**: 99.99% uptime target
|
|
|
|
## Security Considerations
|
|
|
|
### Reserve Backing
|
|
- 1:1 reserve backing enforced
|
|
- Reserve balance checked before minting
|
|
- Reserve backing recorded in issuance record
|
|
|
|
### Operator Identity
|
|
- Operator identity required for all operations
|
|
- Identity logged in issuance record
|
|
- Audit trail for all mint/burn operations
|
|
|
|
### Authorization
|
|
- Only authorized operators can mint/burn
|
|
- Sovereign bank must be active
|
|
- Treasury account must exist
|
|
|
|
## Testing Scenarios
|
|
|
|
### Happy Path - Minting
|
|
1. Valid mint request
|
|
2. Sufficient reserve balance
|
|
3. Successful record creation
|
|
4. Successful ledger posting
|
|
5. CBDC minted
|
|
|
|
### Happy Path - Burning
|
|
1. Valid burn request
|
|
2. Successful record creation
|
|
3. Successful ledger posting
|
|
4. CBDC burned
|
|
|
|
### Error Scenarios
|
|
1. Insufficient reserve backing
|
|
2. Treasury account not found
|
|
3. Ledger posting failure
|
|
4. Invalid amount
|
|
5. Invalid operator identity
|
|
|
|
### Edge Cases
|
|
1. Maximum mint amount
|
|
2. Minimum mint amount
|
|
3. Mint with zero amount (should fail)
|
|
4. Burn more than available
|
|
5. Concurrent mint/burn operations
|
|
|
|
---
|
|
|
|
**Related Flows**:
|
|
- [CBDC Wallet Transfer Flow](./cbdc-wallet-transfer-flow.md)
|
|
- [CBDC Interoperability Flow](./cbdc-interoperability-flow.md)
|
|
- [GSS Settlement Flow](./gss-settlement-flow.md)
|
|
|