# Lamassu Database Analysis - Based on Sample Data ## Database Schema Analysis Based on the provided CSV sample data, here's the identified structure: ### Transaction Table Structure (Estimated Column Names) | Position | Field Name (Estimated) | Sample Values | Description | |----------|------------------------|---------------|-------------| | 1 | `id` | `81b3f12e-7c75-41a9-a212-8a82dcbfda07` | Transaction ID (UUID) | | 2 | `device_id` | `b3f790bd3207aec95157de7c7a06d4130586e4d5b2c5b10a5b1dc9ff50498366` | ATM Device identifier | | 3 | `crypto_address` | `bc1qc7gqgck9tx6cgv3d7y89xmqzvn6435u035l09m` | BTC address or Lightning invoice | | 4 | `crypto_atoms` | `512400`, `31100`, `312100` | Amount in smallest crypto unit (satoshis) | | 5 | `crypto_code` | `BTC`, `LN` | Cryptocurrency type | | 6 | `fiat_amount` | `4000.00000`, `100.00000` | Fiat amount requested | | 7 | `fiat_code` | `GTQ` | Fiat currency code (Guatemalan Quetzal) | | 8 | `status` | `confirmed`, `notSeen` | **Transaction status (CRITICAL)** | | 9 | `send` | `t`, `f` | Boolean - Send transaction flag | | 10 | `receive` | `f` | Boolean - Receive transaction flag | | 11 | `flag_11` | `f` | Boolean - Unknown purpose | | 12 | `error_code` | `Operator cancel` | Error/cancellation reason | | 13 | `created` | `2025-06-09 19:12:42.040933+00` | **Transaction creation timestamp** | | 14 | `send_confirmed` | `2025-06-09 19:26:08.801857+00` | Send confirmation timestamp | | 15 | `flag_15` | | Various flags | | 16-18 | `flags_16_18` | `f`, `f`, `f` | Additional boolean flags | | 19 | `confirmations` | `40`, `20`, `8` | Number of confirmations | | 20 | `discount_1` | `0` | First discount field | | 21 | `discount_2` | `100`, `0` | **Discount percentage (CRITICAL)** | | 22 | `dispense_confirmed` | `100` | Dispense confirmation amount | | 23 | `cancel_reason` | `operatorCancel` | Cancellation reason code | | 24 | `machine_id` | `47ac1184-8102-11e7-9079-8f13a7117867` | **Machine UUID (consistent across all)** | | 25 | `batch_id` | `25`, `26`, `16` | Batch identifier | | 26 | `batch_time` | `2025-06-09 19:14:49.618988+00` | Batch processing time | | 27 | `flag_27` | `f` | Boolean flag | | 28-29 | `fields_28_29` | | Additional fields | | 30 | `commission_percentage` | `0.05500`, `0.04500` | **Commission rate** | | 31 | `exchange_rate` | `826091.28000`, `339104.71000` | **Exchange rate at transaction time** | | 32 | `dispensed` | `512400`, `31100` | **Actually dispensed amount** | | 33+ | `additional_fields` | Various | Additional transaction metadata | ## Key Findings for DCA System ### ✅ Critical Fields Identified 1. **Transaction Status**: Column 8 (`status`) - `confirmed` = Successful transaction ✓ - `notSeen` = Failed/incomplete transaction ✗ 2. **Transaction Amounts**: - **Fiat Amount**: Column 6 (`fiat_amount`) - What layperson requested - **Crypto Amount**: Column 4 (`crypto_atoms`) - Satoshis/smallest unit - **Dispensed Amount**: Column 32 (`dispensed`) - Actually given amount 3. **Commission Data**: - **Commission Rate**: Column 30 (`commission_percentage`) - e.g., 0.05500 (5.5%) - **Discount Percentage**: Column 21 (`discount_percentage`) - e.g., 100 = no commission, 10 = 10% off - **Exchange Rate**: Column 31 (`exchange_rate`) - Rate at transaction time 4. **Timing**: - **Created**: Column 13 (`created`) - Transaction initiation - **Confirmed**: Column 14 (`send_confirmed`) - When completed 5. **Machine Identification**: - **Machine ID**: Column 24 (`machine_id`) - Same across all: `47ac1184-8102-11e7-9079-8f13a7117867` ### Transaction Types Observed 1. **Successful Cash-Out (Sell)**: `status = 'confirmed'`, `send = 't'` - Layperson sells BTC, receives fiat - These transactions should trigger DCA distributions 2. **Failed Transactions**: `status = 'notSeen'` - Should be ignored by DCA system 3. **Cancelled Transactions**: Contains `"Operator cancel"` - Should be ignored even if status shows confirmed 4. **Lightning vs On-Chain**: - `crypto_code = 'LN'` for Lightning - `crypto_code = 'BTC'` for on-chain 5. **Discount Analysis from Sample Data**: - Most transactions show `100` in discount field = **NO COMMISSION** - One transaction shows `90` = **90% discount** (only 10% of commission applies) - Standard transactions appear to have 100% discount (commission-free) - Special promotional transactions may have partial discounts ## SQL Query for DCA System Based on this analysis, here's the query to get new successful transactions: ```sql -- Get new successful cash-out transactions for DCA distribution SELECT id, fiat_amount, crypto_atoms, commission_percentage, discount_percentage, -- Column 21: Critical for commission calculation exchange_rate, dispensed, created, send_confirmed, machine_id FROM transactions WHERE status = 'confirmed' AND send = 't' AND error_code IS NULL AND cancel_reason IS NULL AND created > :last_processed_timestamp ORDER BY created ASC; ``` ## Answers to Your Original Questions ### 3. Flow Mode Distribution Logic (FINAL) - **Trigger Transactions**: Both `BTC` and `LN` (Lightning) successful cash-outs - **Target Recipients**: **Flow Mode DCA clients ONLY** (Fixed Mode clients not affected) - **Distribution Amount**: `fiat_amount - actual_commission` (principal only) - **No Minimum**: All successful transactions trigger distribution, regardless of size - **Commission Calculation**: ``` base_commission = fiat_amount * commission_percentage actual_commission = base_commission * (1 - discount_percentage/100) flow_mode_distribution = fiat_amount - actual_commission ``` - **Bitcoin Value Reference**: Use `crypto_atoms` for rate calculations - **Special Cases**: - If `discount_percentage = 100`: No commission, Flow Mode gets full `fiat_amount` - Commission amount (if any) goes to separate distribution system ### 4. Commission Distribution System (UPDATED) - **Base Commission Rate**: `commission_percentage` (e.g., 0.05500 = 5.5%) - **Discount Applied**: `discount_percentage` (e.g., 100 = no commission, 10 = 10% off) - **Commission Calculation**: ``` base_commission = fiat_amount * commission_percentage discount_amount = base_commission * (discount_percentage / 100) actual_commission = base_commission - discount_amount ``` - **Distribution Logic**: - **Principal Amount**: `fiat_amount - actual_commission` → **Flow Mode DCA clients only** - **Commission Amount**: `actual_commission` → **Separate distribution system** (configurable percentages to specified wallets) - **DCA clients can potentially be included** in commission distribution - **Example**: 1000 GTQ transaction, 5.5% commission, 10% discount: - Base commission: 1000 * 0.055 = 55 GTQ - Actual commission: 55 - 5.5 = 49.5 GTQ - **To Flow Mode DCA**: 1000 - 49.5 = 950.5 GTQ - **To Commission Distribution**: 49.5 GTQ (distributed per admin configuration) ### Duplicate Prevention Strategy - Use the `id` field (transaction UUID) to track processed transactions - Store processed transaction IDs in your LNBits extension database - Query: `WHERE id NOT IN (processed_transaction_ids)` ## Recommendations 1. **Focus on Cash-Out Transactions**: Filter for `send = 't'` (layperson selling BTC) 2. **Status Check**: Only process `status = 'confirmed'` 3. **Error Handling**: Exclude transactions with `error_code` or `cancel_reason` 4. **Use Dispensed Amount**: Consider using `dispensed` field for actual transaction value 5. **Commission Decision**: Decide whether DCA clients get commission benefit or not This sample data provides everything needed to build the DCA system! 🎯