This document provides comprehensive documentation for the Soroban Security Scanner database schema, including tables, relationships, indexes, and migration procedures.
The database schema is designed to support a comprehensive security scanning platform for Soroban smart contracts on the Stellar network. It includes modules for user management, wallet operations, transactions, multi-signature operations, bounty systems, security monitoring, and analytics.
- Database: PostgreSQL 14+
- ORM: SQLx with Rust
- Migration System: SQLx migrations
- Connection Pool: PgPool with configurable limits
Stores user account information and authentication data.
Columns:
id(UUID, Primary Key) - Unique user identifieremail(VARCHAR(255), Unique) - User email addressusername(VARCHAR(100), Unique) - Unique usernamepassword_hash(VARCHAR(255)) - Bcrypt password hashstellar_address(VARCHAR(56), Unique) - Stellar public keyrole(ENUM) - User role (admin, security_researcher, developer, auditor, user)status(ENUM) - Account status (active, inactive, suspended, pending_verification)email_verified(BOOLEAN) - Email verification statustwo_factor_enabled(BOOLEAN) - 2FA statustwo_factor_secret(VARCHAR(32)) - 2FA secret keyprofile(JSONB) - Additional profile datacreated_at(TIMESTAMP) - Account creation timeupdated_at(TIMESTAMP) - Last update timelast_login_at(TIMESTAMP) - Last login timelogin_count(INTEGER) - Total login attemptsreputation_score(INTEGER) - User reputation (0-100)is_verified(BOOLEAN) - Identity verification statusverification_token(VARCHAR(255)) - Email verification tokenpassword_reset_token(VARCHAR(255)) - Password reset tokenpassword_reset_expires(TIMESTAMP) - Password reset expiry
Security Fields:
failed_login_attempts(INTEGER) - Failed login countlast_failed_login_at(TIMESTAMP) - Last failed login timeaccount_locked_until(TIMESTAMP) - Account lock expirysecurity_questions(JSONB) - Security question answersbackup_codes(JSONB) - 2FA backup codesip_whitelist(JSONB) - Allowed IP addressesdevice_fingerprints(JSONB) - Trusted device fingerprintsrisk_score(INTEGER) - Security risk assessment (0-100)
Indexes:
- Primary key on
id - Unique indexes on
email,username,stellar_address - Performance indexes on
role,status,created_at
Stores user wallet information and balances.
Columns:
id(UUID, Primary Key) - Unique wallet identifieruser_id(UUID, Foreign Key) - Owner user IDstellar_address(VARCHAR(56), Unique) - Stellar public keywallet_name(VARCHAR(100)) - User-defined wallet namedescription(TEXT) - Wallet descriptionwallet_type(VARCHAR(50)) - Wallet type (standard, hardware, multisig)status(ENUM) - Wallet status (active, inactive, frozen, compromised)balance_lumens(DECIMAL(19,7)) - XLM balancenative_balance(DECIMAL(19,7)) - Native token balanceis_primary(BOOLEAN) - Primary wallet flagis_verified(BOOLEAN) - Verification statusverification_level(INTEGER) - Verification level (0-3)metadata(JSONB) - Additional wallet metadatacreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update timelast_transaction_at(TIMESTAMP) - Last transaction timetransaction_count(INTEGER) - Total transaction countfrozen_reason(TEXT) - Reason for wallet freezesecurity_score(INTEGER) - Security rating (0-100)
Security Fields:
last_security_scan_at(TIMESTAMP) - Last security scansecurity_scan_result(JSONB) - Scan resultssuspicious_activity_count(INTEGER) - Suspicious activity countlast_suspicious_activity_at(TIMESTAMP) - Last suspicious activitytransaction_limits(JSONB) - Transaction limitsapproved_origins(JSONB) - Approved transaction origins
Indexes:
- Primary key on
id - Foreign key index on
user_id - Unique index on
stellar_address - Performance indexes on
status,wallet_type,created_at
Stores all transaction records and metadata.
Columns:
id(UUID, Primary Key) - Unique transaction identifiertransaction_hash(VARCHAR(64), Unique) - Stellar transaction hashfrom_wallet_id(UUID, Foreign Key) - Source walletto_wallet_id(UUID, Foreign Key) - Destination walletuser_id(UUID, Foreign Key) - Initiating usertransaction_type(ENUM) - Transaction typestatus(ENUM) - Transaction statusamount_lumens(DECIMAL(19,7)) - XLM amountamount_native(DECIMAL(19,7)) - Native token amountfee_paid(DECIMAL(19,7)) - Transaction feememo(TEXT) - Transaction memomemo_type(VARCHAR(20)) - Memo typestellar_ledger_sequence(BIGINT) - Stellar ledger numberstellar_operation_count(INTEGER) - Operation countenvelope(JSONB) - Full transaction enveloperesult(JSONB) - Transaction resulterror_message(TEXT) - Error detailscreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update timeconfirmed_at(TIMESTAMP) - Confirmation timeexpires_at(TIMESTAMP) - Expiry timerelated_scan_id(UUID) - Related security scanrelated_bounty_id(UUID) - Related bountybatch_transaction_id(UUID) - Batch operation IDmetadata(JSONB) - Additional metadata
Security Fields:
risk_level(VARCHAR(20)) - Risk assessment (low, medium, high, critical)fraud_score(INTEGER) - Fraud likelihood (0-100)ip_address(INET) - Source IP addressdevice_fingerprint(VARCHAR(255)) - Device identifiergeolocation(JSONB) - Geographic datais_suspicious(BOOLEAN) - Suspicious flagrequires_review(BOOLEAN) - Manual review requiredreviewed_by(UUID) - Reviewer user IDreviewed_at(TIMESTAMP) - Review timereview_notes(TEXT) - Review comments
Indexes:
- Primary key on
id - Unique index on
transaction_hash - Foreign key indexes on
from_wallet_id,to_wallet_id,user_id - Performance indexes on
transaction_type,status,created_at
Stores multi-signature transaction operations.
Columns:
id(UUID, Primary Key) - Unique operation IDuser_id(UUID, Foreign Key) - Initiating useroperation_name(VARCHAR(255)) - Operation descriptiondescription(TEXT) - Detailed descriptionstellar_address(VARCHAR(56)) - Multi-sig account addressthreshold_signers(INTEGER) - Required signaturestotal_signers(INTEGER) - Total signersstatus(ENUM) - Operation statustransaction_envelope(JSONB) - Transaction envelopecreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update timeexpires_at(TIMESTAMP) - Expiry timeexecuted_at(TIMESTAMP) - Execution timeexecuted_transaction_hash(VARCHAR(64)) - Executed transaction hashmetadata(JSONB) - Additional metadata
Stores individual signer information for multi-sig operations.
Columns:
id(UUID, Primary Key) - Unique signer IDmulti_sig_operation_id(UUID, Foreign Key) - Parent operationsigner_address(VARCHAR(56)) - Signer public keysigner_wallet_id(UUID, Foreign Key) - Signer walletsigner_user_id(UUID, Foreign Key) - Signer userweight(INTEGER) - Signature weightstatus(ENUM) - Signature statussignature_data(TEXT) - Base64 encoded signaturesigned_at(TIMESTAMP) - Signature timecreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update timecomments(TEXT) - Signer comments
Indexes:
- Primary key on
id - Foreign key index on
multi_sig_operation_id - Unique constraint on (
multi_sig_operation_id,signer_address)
Stores security-related alerts and notifications.
Columns:
id(UUID, Primary Key) - Unique alert IDuser_id(UUID, Foreign Key) - Affected userwallet_id(UUID, Foreign Key) - Affected wallettransaction_id(UUID, Foreign Key) - Related transactionalert_type(VARCHAR(50)) - Alert typeseverity(VARCHAR(20)) - Alert severitytitle(VARCHAR(255)) - Alert titledescription(TEXT) - Alert descriptionalert_data(JSONB) - Alert-specific datastatus(VARCHAR(20)) - Alert statusresolved_by(UUID, Foreign Key) - Resolver userresolved_at(TIMESTAMP) - Resolution timeresolution_notes(TEXT) - Resolution detailscreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update time
Stores rate limiting information for API endpoints.
Columns:
id(UUID, Primary Key) - Unique limit IDidentifier(VARCHAR(255)) - Rate limit identifier (IP, user ID)resource_type(VARCHAR(50)) - Resource typewindow_start(TIMESTAMP) - Window start timewindow_end(TIMESTAMP) - Window end timerequest_count(INTEGER) - Current request countmax_allowed(INTEGER) - Maximum allowed requestsis_blocked(BOOLEAN) - Block statusblock_expires_at(TIMESTAMP) - Block expirymetadata(JSONB) - Additional metadatacreated_at(TIMESTAMP) - Creation time
Stores device tracking information for security.
Columns:
id(UUID, Primary Key) - Unique device IDuser_id(UUID, Foreign Key) - Device ownerdevice_fingerprint(VARCHAR(255)) - Device fingerprintdevice_name(VARCHAR(100)) - Device namedevice_type(VARCHAR(50)) - Device typeoperating_system(VARCHAR(100)) - OS informationbrowser(VARCHAR(100)) - Browser informationip_address(INET) - Last known IPuser_agent(TEXT) - User agent stringis_trusted(BOOLEAN) - Trust statuslast_seen_at(TIMESTAMP) - Last activityfirst_seen_at(TIMESTAMP) - First activityusage_count(INTEGER) - Usage countmetadata(JSONB) - Additional metadata
Organizes bounties by project.
Columns:
id(UUID, Primary Key) - Unique project IDname(VARCHAR(255)) - Project namedescription(TEXT) - Project descriptionrepository_url(VARCHAR(500)) - Repository URLcontract_address(VARCHAR(56)) - Contract addressowner_id(UUID, Foreign Key) - Project owneris_active(BOOLEAN) - Active statusis_public(BOOLEAN) - Public visibilitytotal_budget(DECIMAL(19,7)) - Total budgetbudget_currency(VARCHAR(10)) - Budget currencymetadata(JSONB) - Additional metadatacreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update time
Stores bounty information and requirements.
Columns:
id(UUID, Primary Key) - Unique bounty IDproject_id(UUID, Foreign Key) - Parent projecttitle(VARCHAR(255)) - Bounty titledescription(TEXT) - Bounty descriptioncategory(ENUM) - Bounty categoryseverity(ENUM) - Bounty severitystatus(ENUM) - Bounty statusreward_amount(DECIMAL(19,7)) - Reward amountreward_currency(VARCHAR(10)) - Reward currencymax_reward_amount(DECIMAL(19,7)) - Maximum rewardassignee_id(UUID, Foreign Key) - Assigned usersubmitter_id(UUID, Foreign Key) - Submitting userreviewer_id(UUID, Foreign Key) - Reviewing userdeadline(TIMESTAMP) - Submission deadlinerequirements(JSONB) - Bounty requirementssubmission_guidelines(TEXT) - Guidelinesevaluation_criteria(JSONB) - Evaluation criteriatags(JSONB) - Bounty tagsview_count(INTEGER) - View countapplicant_count(INTEGER) - Applicant countsubmission_count(INTEGER) - Submission countcreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update timesubmitted_at(TIMESTAMP) - Submission timereviewed_at(TIMESTAMP) - Review timeaccepted_at(TIMESTAMP) - Acceptance timepaid_at(TIMESTAMP) - Payment timemetadata(JSONB) - Additional metadata
Manages escrow for bounty payments.
Columns:
id(UUID, Primary Key) - Unique escrow IDbounty_id(UUID, Foreign Key) - Related bountyfunder_id(UUID, Foreign Key) - Funding userbeneficiary_id(UUID, Foreign Key) - Beneficiary useramount(DECIMAL(19,7)) - Escrow amountcurrency(VARCHAR(10)) - Currency typestatus(ENUM) - Escrow statusrelease_conditions(JSONB) - Release conditionsdispute_reason(TEXT) - Dispute reasondispute_evidence(JSONB) - Dispute evidencestellar_transaction_hash(VARCHAR(64)) - Funding transactionrelease_transaction_hash(VARCHAR(64)) - Release transactionrefund_transaction_hash(VARCHAR(64)) - Refund transactioncreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update timefunded_at(TIMESTAMP) - Funding timereleased_at(TIMESTAMP) - Release timerefunded_at(TIMESTAMP) - Refund timedisputed_at(TIMESTAMP) - Dispute timeresolved_at(TIMESTAMP) - Resolution timeexpires_at(TIMESTAMP) - Expiry timemetadata(JSONB) - Additional metadata
Stores raw analytics event data.
Columns:
id(UUID, Primary Key) - Unique event IDevent_type(ENUM) - Event typeuser_id(UUID, Foreign Key) - Event usersession_id(UUID, Foreign Key) - User sessionwallet_id(UUID, Foreign Key) - Related wallettransaction_id(UUID, Foreign Key) - Related transactionbounty_id(UUID, Foreign Key) - Related bountyproject_id(UUID, Foreign Key) - Related projectip_address(INET) - Source IPuser_agent(TEXT) - User agentevent_data(JSONB) - Event-specific datatimestamp(TIMESTAMP) - Event timestampprocessed(BOOLEAN) - Processing statuscreated_at(TIMESTAMP) - Creation time
Stores pre-aggregated metrics for reporting.
Columns:
id(UUID, Primary Key) - Unique metric IDmetric_name(VARCHAR(100)) - Metric namemetric_type(VARCHAR(50)) - Metric typeaggregation_period(ENUM) - Aggregation periodperiod_start(TIMESTAMP) - Period startperiod_end(TIMESTAMP) - Period endvalue(DECIMAL(19,4)) - Metric valuedimensions(JSONB) - Filter dimensionsmetadata(JSONB) - Additional metadatacreated_at(TIMESTAMP) - Creation timeupdated_at(TIMESTAMP) - Last update time
- active_users - All active, verified users
- user_wallet_summary - User wallet statistics
- transaction_summary - Daily transaction summaries
- high_risk_users - Users with high risk scores
- suspicious_transactions - Flagged transactions
- active_security_alerts - Open security alerts
- active_bounties - Open and assigned bounties
- user_bounty_stats - User bounty statistics
- bounty_analytics - Monthly bounty analytics
- platform_overview - Platform metrics overview
- handle_failed_login - Manages failed login attempts and account locking
- assess_transaction_risk - Evaluates transaction risk and creates alerts
- create_bounty_escrow - Creates escrow for bounty payments
- release_escrow_payment - Releases escrow to beneficiaries
- aggregate_daily_metrics - Aggregates daily platform metrics
- cleanup_analytics_events - Cleans up old analytics data
- generate_daily_report - Generates daily platform report
- 001_initial_schema.sql - Core tables and relationships
- 002_add_security_features.sql - Security enhancements and monitoring
- 003_add_bounty_system.sql - Bounty marketplace and escrow system
- 004_add_analytics_and_reporting.sql - Analytics and reporting features
# Using SQLx CLI
sqlx migrate run --database-url "postgresql://user:password@localhost:5432/soroban_security_scanner"
# Using Rust code
let db = Database::new(config).await?;
db.run_migrations().await?;- Primary Keys: All tables have UUID primary keys
- Foreign Keys: All foreign key columns are indexed
- Query Patterns: Indexes for common query patterns
- Time-based: Timestamp columns for time-range queries
- Unique Constraints: Email, username, wallet addresses
- Default: 20 max connections, 5 min connections
- Timeouts: 30s connect, 10min idle, 30min max lifetime
- Health Checks: Periodic connection validation
Consider partitioning large tables by date:
transactionsby monthanalytics_eventsby weeksecurity_alertsby month
- Passwords: Bcrypt hashing with salt
- 2FA: TOTP secret encryption
- PII: Consider field-level encryption for sensitive data
- Row Level Security: Implement RLS for user data isolation
- Database Roles: Separate roles for application access
- Audit Logging: Comprehensive audit trail for all operations
- Daily Backups: Automated daily database backups
- Point-in-Time Recovery: WAL archiving for PITR
- Testing: Regular backup restoration testing
- Connectivity: Database connection testing
- Performance: Query performance monitoring
- Resource Usage: Connection pool and resource monitoring
- Vacuum: Regular table vacuuming
- Analyze: Update table statistics
- Reindex: Periodic index rebuilding
- Cleanup: Old data cleanup procedures
- Connection Timeouts: Check connection pool settings
- Slow Queries: Review execution plans and indexes
- Lock Contention: Monitor long-running transactions
- Disk Space: Monitor table sizes and cleanup
- Query Optimization: Use EXPLAIN ANALYZE for slow queries
- Index Usage: Monitor index effectiveness
- Configuration: Tune PostgreSQL configuration parameters
- Connection Pooling: Optimize pool size based on load
- Always Use Migrations: Never modify schema directly
- Backward Compatibility: Consider existing data
- Testing: Test migrations on staging first
- Rollback Plans: Always have rollback strategies
- Type Safety: Use Rust structs for all database models
- Error Handling: Comprehensive error handling for database operations
- Transactions: Use database transactions for multi-table operations
- Connection Management: Proper connection lifecycle management
This schema provides a robust foundation for the Soroban Security Scanner platform with comprehensive security, scalability, and analytics capabilities.