Skip to main content

Deposit Tracking System

Overview

This system tracks wallet-connected deposits from pending to confirmed status, automatically crediting users' accounts once blockchain confirmations are complete.

Architecture

1. Database Schema

New Enum: DepositStatus

  • pending - Transaction sent but not confirmed
  • confirmed - Transaction confirmed on blockchain
  • failed - Transaction failed or rejected

Updated Model: OpportunityDeposit

model OpportunityDeposit {
// ... existing fields
status DepositStatus @default(pending)
confirmations Int @default(0)
requiredConfirmations Int @default(12)
confirmedAt DateTime?
failedReason String?
}

2. Flow Diagram

User sends transaction

Frontend records pending deposit → API: POST /api/opportunities/{id}/deposits/pending

Deposit saved with status='pending'

┌─────────────────────────────────────┐
│ Two confirmation paths (Hybrid): │
│ │
│ A. Manual Check (User-triggered) │
│ POST /api/opportunities/{id}/ │
│ deposits/{depositId}/check │
│ │
│ B. Automated (Background Job) │
│ runs every 2-5 minutes │
│ POST /api/admin/jobs/ │
│ process-deposits │
└─────────────────────────────────────┘

Check blockchain for confirmations

Confirmations >= Required?
↓ YES
Update status='confirmed'
Credit capitalAvailable
Send notification (TODO)

Done! User's balance updated

3. Key Components

A. API Endpoints

POST /api/opportunities/[id]/deposits/pending

  • Called immediately after user sends blockchain transaction
  • Records deposit with status='pending'
  • Stores transaction hash, network, amount, currency
  • Generates descriptive message

POST /api/opportunities/[id]/deposits/[depositId]/check

  • Manual deposit status check (user can click "Check Status" button)
  • Queries blockchain for confirmation count
  • Updates deposit if confirmed
  • Credits user's capitalAvailable

POST /api/admin/jobs/process-deposits

  • Admin-only endpoint to trigger background job
  • Processes all pending deposits
  • Returns summary of results

B. Background Job

lib/jobs/processDeposits.ts

  • Standalone script that can be run via cron or API
  • Queries all pending deposits
  • For each deposit:
    • Connects to blockchain RPC
    • Gets transaction confirmations
    • Updates database
    • Credits user if confirmed
  • Supports BSC, Ethereum, Polygon

Cron Setup Example:

# Run every 3 minutes
*/3 * * * * cd /path/to/reprise && npx tsx lib/jobs/processDeposits.ts >> /var/log/deposit-processor.log 2>&1

C. Frontend Integration

Updated: app/opportunities/[id]/page.tsx

  • After sending transaction, calls pending deposit endpoint
  • Shows user message about pending confirmation
  • Displays tx hash
  • Auto-reloads after 7 seconds to show status

4. Confirmation Requirements

NetworkRequired Confirmations
BSC12
Ethereum20
Polygon12
Default12

5. Descriptive Messages

Pending:

Wallet deposit of 100.00 USDT on BSC - Pending confirmation (Tx: 0x123...)

Confirmed:

Wallet deposit of 100.00 USDT on BSC - Confirmed (Tx: 0x123...)

Setup Instructions

Step 1: Run Database Migration

# Run the SQL migration
psql YOUR_DATABASE_URL < prisma/manual_migrations/add_deposit_status_tracking.sql

# Generate Prisma client
npx prisma generate

Option A: Systemd Service (Recommended for production)

# Navigate to systemd directory
cd systemd

# Run the setup script
./setup.sh

# The script will:
# 1. Install service and timer files
# 2. Enable auto-start on boot
# 3. Start the timer immediately

View logs:

# Follow live logs
sudo journalctl -u opportunitydao-deposit-processor -f

# View last 50 lines
sudo journalctl -u opportunitydao-deposit-processor -n 50

# View logs for specific date
sudo journalctl -u opportunitydao-deposit-processor --since "2025-10-08"

Useful commands:

# Check timer status
sudo systemctl status opportunitydao-deposit-processor.timer

# Check last run
sudo systemctl status opportunitydao-deposit-processor.service

# Run immediately (manual trigger)
sudo systemctl start opportunitydao-deposit-processor.service

# Stop the timer
sudo systemctl stop opportunitydao-deposit-processor.timer

# Disable auto-start
sudo systemctl disable opportunitydao-deposit-processor.timer

# List all timers
systemctl list-timers

Option B: Cron Job (Alternative)

# Add to crontab
crontab -e

# Add this line (runs every 3 minutes):
*/3 * * * * cd /var/www/opportunitydao && /usr/bin/npx tsx lib/jobs/processDeposits.ts >> /var/log/deposit-processor.log 2>&1

Option C: Manual Trigger (For development)

  • Admins can call POST /api/admin/jobs/process-deposits manually
  • Use Postman, curl, or create an admin UI button

Step 3: Configure RPC Endpoints (Optional)

The system uses public RPC endpoints by default. For better reliability, add your own:

// In lib/jobs/processDeposits.ts
const rpcUrls = {
BSC: [
process.env.BSC_RPC_URL || 'https://bsc-dataseed.binance.org/',
// ...fallbacks
],
// ...
}

User Experience

Deposit Flow

  1. User clicks "Add Fresh Capital"
  2. Selects amount and clicks "Send Deposit"
  3. MetaMask/wallet prompts for approval
  4. Transaction sent to blockchain
  5. User sees: "Transaction sent! Hash: 0x123... Your deposit is pending confirmation."
  6. Behind the scenes:
    • Deposit recorded as pending
    • Background job checks confirmations every 3 minutes
    • OR user can manually click "Check Status" (if you add this button)
  7. Once confirmed:
    • Status → confirmed
    • Amount added to capitalAvailable
    • User can now participate in cycles

Manual Check (Optional UI Addition)

You can add a "Check Status" button on pending deposits:

{deposit.status === 'pending' && (
<button onClick={() => checkDepositStatus(deposit.id)}>
Check Status ({deposit.confirmations}/{deposit.requiredConfirmations})
</button>
)}

Future Enhancements (TODOs)

Notification System

  • @TODO: Implement notification bell for Admins and Investors
  • Alert admins when new pending deposits are created
  • Alert investors when deposits are confirmed or failed
  • Alert admins of failed deposits requiring investigation

UI Improvements

  • Show pending deposits on dashboard
  • Display confirmation progress bar
  • Add "Check Now" button for manual verification
  • Show estimated time until confirmation

Advanced Features

  • Email notifications on confirmation
  • Webhook support for external integrations
  • Support for Cardano and Solana
  • Automatic retry for failed RPC connections
  • Admin dashboard for deposit monitoring

Troubleshooting

Deposit not confirming?

  1. Check transaction on block explorer (BSCScan, Etherscan, etc.)
  2. Verify transaction was successful
  3. Check confirmation count vs. required
  4. Run manual check: POST /api/opportunities/{id}/deposits/{depositId}/check
  5. Check background job logs

Background job not running?

  1. Verify cron job is active: crontab -l
  2. Check log file: tail -f /var/log/deposit-processor.log
  3. Test manually: npx tsx lib/jobs/processDeposits.ts
  4. Verify database connectivity

RPC connection issues?

  1. Try different RPC URL from the fallback list
  2. Add your own RPC endpoint (Infura, Alchemy, etc.)
  3. Check rate limits on public RPCs

Security Considerations

  • Only authenticated users can create deposits
  • Only deposit owners can check their deposit status
  • Only admins can trigger background job via API
  • All deposit amounts are validated
  • Duplicate transaction hashes are rejected
  • Description field is auto-generated (not user-controlled)

Testing

# Test recording a pending deposit
curl -X POST http://localhost:3000/api/opportunities/1/deposits/pending \
-H "Content-Type: application/json" \
-d '{
"transactionHash": "0x123...",
"amount": 100,
"network": "BSC",
"currency": "USDT"
}'

# Test manual check
curl -X POST http://localhost:3000/api/opportunities/1/deposits/1/check

# Test background job (admin only)
curl -X POST http://localhost:3000/api/admin/jobs/process-deposits

Performance

  • Background job processes ~100 deposits in < 30 seconds
  • RPC calls are parallelised
  • Failed RPC connections fall back to alternatives
  • Database queries are indexed on status and transactionHash

Monitoring

Recommended metrics to track:

  • Number of pending deposits
  • Average confirmation time
  • Failed deposit rate
  • Background job execution time
  • RPC success rate per network