- Overview
- Key Features
- Technical Architecture
- Getting Started
- User Guide
- Collaboration Features
- Codebase Structure
- Database Schema
- API Endpoints
- WebSocket Protocol
- Blockchain Integration
- Dependencies
- Performance Optimizations
- Security Considerations
- Troubleshooting
- Development Workflow
- Future Roadmap
- Contributing
- License
- Acknowledgments
Solana Forensic Toolkit is a comprehensive blockchain analytics platform designed to transform complex Solana transaction data into intuitive, user-friendly visualizations and insights. The platform empowers users to visualize transaction flows between wallets, track funding sources, identify suspicious patterns, and collaborate in real-time with team members.
In an era where blockchain transactions continue to grow in complexity and volume, Solana Forensic Toolkit addresses the critical need for transparent, accessible, and collaborative blockchain analysis tools. Whether you're a financial investigator, compliance professional, researcher, or crypto enthusiast, Solana Forensic Toolkit provides powerful visualization capabilities to understand and analyze on-chain activities.
Solana Forensic Toolkit's core functionality centers around its interactive flow visualization engine, which displays transaction relationships between wallets on the Solana blockchain. The visualization:
- Presents wallets as nodes and transactions as directional edges
- Supports multiple layout algorithms (force-directed, circular, hierarchical)
- Provides intuitive zoom and pan capabilities for exploring complex networks
- Allows filtering by transaction type, date ranges, and amounts
- Highlights critical transaction paths automatically
- Enables direct interaction with nodes to explore wallet histories
- Supports double-clicking on wallets to view them in Solscan
The platform provides comprehensive wallet analysis features:
- Tracking of funding sources through transaction history
- Historical transaction timelines with volume analysis
- Detection of wallet activity patterns and anomalies
- Automatic labeling of known entities (exchanges, protocols, etc.)
- Transaction clustering to identify related transaction groups
- Risk scoring based on transaction patterns and connections
Solana Forensic Toolkit introduces collaborative blockchain analysis with:
- Real-time team collaboration on visualizations
- Team management with customizable roles and permissions
- Shared visualization workspaces for team members
- Annotation capabilities for marking specific wallets or transactions
- Comment threads for discussing findings
- User presence indicators showing active team members
- Real-time updates when team members make changes
The platform maintains data integrity through:
- Direct integration with Solana RPC nodes for real-time data
- Secure authentication system with role-based access control
- PostgreSQL database for storing analysis results and user data
- WebSocket connections for real-time updates and notifications
Solana Forensic Toolkit is built on a modern, scalable architecture:
- React.js: Core UI framework for building component-based interfaces
- TailwindCSS: Utility-first CSS framework for styling
- Shadcn UI: High-quality UI component system built on Radix UI
- Tanstack Query: Data fetching, caching, and state management
- D3.js: Advanced data visualization library for the graph visualizations
- WebSockets: Real-time communication for collaborative features
- Node.js: JavaScript runtime for the server environment
- Express: Web application framework for the API
- PostgreSQL: Relational database for persistent storage
- Drizzle ORM: TypeScript ORM for database operations
- @solana/web3.js: Solana blockchain interaction library
- Passport.js: Authentication middleware
- Replit: Hosting platform for development and deployment
- Neon Database: Serverless PostgreSQL provider
To run Solana Forensic Toolkit locally, you'll need:
- Node.js (v18+)
- PostgreSQL database
- Solana RPC endpoint (public or private)
-
Clone the repository
-
Install dependencies:
npm install
-
Configure environment variables:
# Database Configuration DATABASE_URL=postgresql://username:password@localhost:5432/Solana Forensic Toolkit # Solana Configuration SOLANA_RPC_URL=https://api.mainnet-beta.solana.com # Server Configuration PORT=5000 NODE_ENV=development SESSION_SECRET=your_secret_session_key # Optional: OpenAI API Key (for AI-powered analytics) # OPENAI_API_KEY=your_openai_api_key -
Set up the database:
npm run db:push
-
Start the application:
npm run dev
Open your web browser and navigate to:
http://localhost:5000
You should see the Solana Forensic Toolkit login page. Since this is a fresh installation, you'll need to create a new account.
- Click on "Create Account" from the login page
- Fill in your desired username, email, and password
- Submit the form to create your account
- You'll be automatically logged in after successful account creation
The Solana Forensic Toolkit interface is organized into several key sections:
- Transaction Flow Visualization: The main visualization area showing wallet nodes and transaction edges
- Filter Sidebar: Controls for filtering the visualization by date, amount, and transaction type
- Transaction Timeline: Chronological representation of transaction activity
- Wallet Summary: Overview of wallet activity, balance, and risk metrics
- Entity Clustering: Grouping of related wallets into logical entities
- Enter a Solana wallet address in the search box
- The platform will fetch transaction data and display the visualization
- Connected wallets will appear as nodes with transactions represented as directional edges
- Click on a node: View wallet details and filter the visualization to show only interactions with that wallet
- Double-click on a node: Open the wallet in Solscan for deeper analysis
- Click on an edge: View transaction details
- Double-click on an edge: Open the transaction in Solscan
- Zoom/Pan: Use the controls or mouse/touchpad to navigate the visualization
- Change Layout: Select different visualization layouts using the dropdown
The filter sidebar allows you to:
- Set date ranges for transactions
- Filter by transaction amount (min/max)
- Select specific transaction types (transfers, swaps, NFTs, etc.)
- Include or exclude specific programs
- Click the "Save & Share" button to save your current visualization
- Use the sharing options to invite team members or generate a link
Solana Forensic Toolkit offers a comprehensive suite of collaboration tools designed specifically for blockchain analysis:
Teams in Solana Forensic Toolkit provide a way to organize collaborators working on related analyses:
- Navigate to the "Team" tab in any visualization
- Click "Create New Team"
- Provide a team name and optional description
- Submit the form to create your team
Once created, you'll become the team admin automatically.
Solana Forensic Toolkit offers three role levels with different capabilities:
-
Admin:
- Full control over team settings
- Add/remove team members
- Modify member roles
- Share/unshare visualizations
- Delete team visualizations
- Edit/delete any team member's annotations
-
Member:
- Create new visualizations for the team
- Edit shared visualizations
- Add annotations to any team visualization
- Edit/delete their own annotations
- View team members and their activities
-
Viewer:
- View shared visualizations
- Add annotations to visualizations
- Edit/delete their own annotations
- Cannot modify visualizations or team settings
To add members to your team:
- Navigate to the "Team" tab
- Select your team from the dropdown if you have multiple teams
- Click the "Invite" button
- Enter the email address of the person you want to invite
- Select the appropriate role (Admin, Member, or Viewer)
- Click "Send Invitation"
The invited user will receive an email notification with instructions to join the team. If they don't have an account yet, they'll be prompted to create one.
To share a visualization with your team:
- Create or open an existing visualization
- Click the "Save & Share" button if the visualization isn't saved yet
- Navigate to the "Team" tab
- Select the team you want to share with
- Click "Share with Team"
The visualization will now be accessible to all team members based on their roles.
Solana Forensic Toolkit enables real-time collaboration through WebSocket connections:
- User Presence: See who's currently viewing the same visualization
- Live Updates: Changes to visualizations and annotations appear instantly for all viewers
- Conflict Resolution: System handles simultaneous edits by multiple users
Solana Forensic Toolkit allows users to add annotations to different elements:
- Visualization Annotations: General notes about the entire visualization
- Wallet Annotations: Notes attached to specific wallet nodes
- Transaction Annotations: Notes attached to specific transactions
To add an annotation:
- Navigate to the "Annotations" tab
- Select the element type (visualization, wallet, transaction)
- Enter your annotation text
- Click "Add Annotation"
Users can also reply to annotations, creating threaded discussions about specific findings.
The Solana Forensic Toolkit codebase follows a client-server architecture with clear separation of concerns:
├── client/ # Frontend React application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── hooks/ # Custom React hooks
│ │ ├── lib/ # Utility functions and services
│ │ ├── pages/ # Page components
│ │ ├── services/ # API service functions
│ │ ├── types/ # TypeScript type definitions
│ │ ├── App.tsx # Main application component
│ │ └── main.tsx # Application entry point
│ └── index.html # HTML template
├── server/ # Backend Express application
│ ├── routes/ # API route handlers
│ ├── services/ # Business logic services
│ ├── db.ts # Database connection setup
│ ├── index.ts # Server entry point
│ ├── routes.ts # Main route registration
│ ├── storage.ts # Data storage interface
│ ├── solana.ts # Solana blockchain connection
│ └── vite.ts # Vite server integration
├── shared/ # Shared code between client and server
│ └── schema.ts # Database schema and types
└── drizzle.config.ts # Drizzle ORM configuration
The frontend follows a component-based architecture using React. It's organized into:
- Presentation Components: UI components that render data and handle user interactions
- Container Components: Connect presentation components to data sources and services
- Custom Hooks: Encapsulate and share stateful logic between components
- Services: Handle API communication and data transformation
Key design patterns used:
- Container/Presentational Pattern: Separation of data and presentation concerns
- Custom Hook Pattern: Reusable stateful logic
- Context API: Global state management for authentication and theme
- Render Props: Component composition for complex UI elements
The backend follows a route-controller-service architecture:
- Routes: Define API endpoints and handle HTTP requests
- Services: Contain business logic and data manipulation
- Storage Interface: Abstracts database operations
- Database Layer: Handles data persistence
Key design patterns used:
- Repository Pattern: Abstraction for data access
- Dependency Injection: Services receive dependencies through constructors
- Middleware Pattern: Request processing pipeline
- Adapter Pattern: Integration with external systems (Solana RPC)
The database schema consists of several core entities:
// Users table
export const users = pgTable("users", {
id: serial("id").primaryKey(),
username: text("username").notNull().unique(),
email: text("email").unique(),
passwordHash: text("password_hash"),
createdAt: timestamp("created_at").defaultNow(),
lastLogin: timestamp("last_login"),
});
// User sessions
export const sessions = pgTable("sessions", {
sid: text("sid").primaryKey(),
sess: jsonb("sess").notNull(),
expire: timestamp("expire").notNull(),
});// Wallets table
export const wallets = pgTable("wallets", {
id: serial("id").primaryKey(),
address: text("address").notNull().unique(),
label: text("label"),
type: text("type").default("wallet"),
firstSeen: timestamp("first_seen").defaultNow(),
lastActivity: timestamp("last_activity"),
lastFetched: timestamp("last_fetched"),
riskScore: integer("risk_score"),
isMonitored: boolean("is_monitored").default(false),
userId: integer("user_id").references(() => users.id),
});
// Transactions table
export const transactions = pgTable("transactions", {
id: serial("id").primaryKey(),
signature: text("signature").notNull().unique(),
fromAddress: text("from_address").notNull(),
toAddress: text("to_address").notNull(),
amount: numeric("amount"),
timestamp: timestamp("timestamp").notNull(),
transactionType: text("transaction_type"),
program: text("program"),
status: text("status").default("confirmed"),
blockNumber: bigint("block_number", { mode: "number" }),
slot: bigint("slot", { mode: "number" }),
memo: text("memo"),
raw: jsonb("raw"),
});// Visualizations table
export const visualizations = pgTable("visualizations", {
id: serial("id").primaryKey(),
name: text("name").notNull(),
walletAddress: text("wallet_address").notNull(),
config: jsonb("config").notNull(),
description: text("description"),
userId: integer("user_id").references(() => users.id),
dateRange: jsonb("date_range"),
amountRange: jsonb("amount_range"),
transactionTypes: jsonb("transaction_types"),
programs: jsonb("programs"),
createdAt: timestamp("created_at").defaultNow(),
updatedAt: timestamp("updated_at").defaultNow(),
isPublic: boolean("is_public").default(false),
shareToken: text("share_token").unique(),
lastViewed: timestamp("last_viewed"),
});
// Teams table
export const teams = pgTable("teams", {
id: serial("id").primaryKey(),
name: text("name").notNull(),
description: text("description"),
createdById: integer("created_by_id").references(() => users.id),
createdAt: timestamp("created_at").defaultNow(),
});
// Team members
export const teamMembers = pgTable("team_members", {
id: serial("id").primaryKey(),
teamId: integer("team_id").references(() => teams.id).notNull(),
userId: integer("user_id").references(() => users.id).notNull(),
role: text("role").default("member").notNull(),
addedAt: timestamp("added_at").defaultNow(),
lastActive: timestamp("last_active"),
});
// Comments/Annotations
export const comments = pgTable("comments", {
id: serial("id").primaryKey(),
visualizationId: integer("visualization_id").references(() => visualizations.id).notNull(),
userId: integer("user_id").references(() => users.id).notNull(),
content: text("content").notNull(),
referencedNodeAddress: text("referenced_node_address"),
referencedTransactionSignature: text("referenced_transaction_signature"),
createdAt: timestamp("created_at").defaultNow(),
updatedAt: timestamp("updated_at"),
parentId: integer("parent_id").references(() => comments.id),
});The API provides these main endpoint groups:
-
Authentication:
POST /api/auth/login: Log in a userPOST /api/auth/logout: Log out the current userGET /api/auth/user: Get the current user
-
Wallets:
GET /api/wallets/:address: Get wallet detailsGET /api/wallets/:address/transactions: Get wallet transactions
-
Visualizations:
GET /api/visualizations: List user visualizationsGET /api/visualizations/:id: Get visualization detailsPOST /api/visualizations: Create a visualizationPATCH /api/visualizations/:id: Update a visualizationDELETE /api/visualizations/:id: Delete a visualization
-
Teams:
GET /api/teams: List user teamsPOST /api/teams: Create a teamGET /api/teams/:id: Get team detailsPATCH /api/teams/:id: Update a teamDELETE /api/teams/:id: Delete a teamGET /api/teams/:id/members: List team membersPOST /api/teams/:id/members/invite: Invite a team memberPATCH /api/teams/:id/members/:memberId: Update member roleDELETE /api/teams/:id/members/:memberId: Remove a member
-
Annotations:
GET /api/visualizations/:id/annotations: List annotationsPOST /api/visualizations/:id/annotations: Create an annotationPATCH /api/annotations/:id: Update an annotationDELETE /api/annotations/:id: Delete an annotationPOST /api/annotations/:id/replies: Reply to an annotation
The WebSocket implementation uses a simple message protocol:
interface WebSocketMessage {
type: string;
[key: string]: any;
}
// Example message types
interface JoinVisualizationMessage extends WebSocketMessage {
type: 'join-visualization';
visualizationId: number;
userId: number;
username: string;
}
interface CursorUpdateMessage extends WebSocketMessage {
type: 'cursor-update';
visualizationId: number;
userId: number;
position: { x: number; y: number };
}
interface NewAnnotationMessage extends WebSocketMessage {
type: 'new-annotation';
visualizationId: number;
annotationId: number;
userId: number;
username: string;
}These messages are serialized as JSON for transmission over the WebSocket connection.
The application integrates with the Solana blockchain through:
-
Connection Setup:
import { Connection } from '@solana/web3.js'; export function getSolanaConnection(): Connection { const endpoint = process.env.SOLANA_RPC_URL || "https://api.mainnet-beta.solana.com"; return new Connection(endpoint); }
-
Transaction Fetching:
async function fetchTransactionsForWallet(address: string): Promise<Transaction[]> { const connection = getSolanaConnection(); const publicKey = new PublicKey(address); // Fetch signatures const signatures = await connection.getSignaturesForAddress( publicKey, { limit: 100 } ); // Fetch transaction details const transactionDetails = await connection.getParsedTransactions( signatures.map(sig => sig.signature) ); // Transform and store transactions // ... }
-
Data Processing:
- Parse raw transaction data
- Extract sender, receiver, amounts
- Identify transaction types
- Calculate relationships between wallets
The application processes Solana transactions in several steps:
-
Fetch Transaction Signatures: Get recent transaction signatures for a wallet
-
Fetch Transaction Details: Get parsed transaction data for each signature
-
Extract Relevant Information:
- Sender and receiver addresses
- Transaction amount and token type
- Program ID to determine transaction type
- Timestamp and block information
-
Process Instruction Data: Different instructions require specific parsing:
- System Program transfers
- Token Program transfers
- Swap operations
- NFT transactions
- DeFi interactions
-
Build Transaction Graph:
- Create nodes for wallets
- Create edges for transactions
- Calculate edge weights based on amounts
- Apply layout algorithms
Solana Forensic Toolkit relies on numerous dependencies to provide its functionality. Below is a detailed breakdown of the key dependencies and how they contribute to the application:
-
@tanstack/react-query (v5.x):
- Purpose: Advanced data fetching, caching, and state management
- Features: Automatic revalidation, background fetching, pagination support, optimistic updates
- Why it's used: Provides a robust solution for handling server state in React components with built-in caching, retry logic, and deduplication of requests
- Usage in Solana Forensic Toolkit: Used for all API requests to fetch wallet data, transactions, and user information
-
d3 (v7.x):
- Purpose: Data visualization library for creating complex, interactive graphics
- Features: Wide range of visualization primitives, transitions, animations, force simulations
- Why it's used: Industry standard for creating custom, interactive data visualizations with fine-grained control
- Usage in Solana Forensic Toolkit: Powers the transaction flow visualization with force-directed layouts, zoom/pan capabilities, and interactive elements
-
react-hook-form (v7.x):
- Purpose: Form state management and validation
- Features: Performance-optimized form handling, validation, error management
- Why it's used: Reduces re-renders and provides a simple API for complex form logic
- Usage in Solana Forensic Toolkit: Handles all forms including user registration, team creation, and visualization filtering
-
zod (v3.x):
- Purpose: TypeScript-first schema validation
- Features: Runtime type checking, error handling, TypeScript integration
- Why it's used: Provides both runtime validation and static type inference
- Usage in Solana Forensic Toolkit: Validates form inputs, API payloads, and ensures type safety throughout the application
-
wouter (v2.x):
- Purpose: Client-side routing
- Features: Lightweight (1.3kB), hook-based API, path pattern matching
- Why it's used: Simple alternative to React Router with minimal footprint
- Usage in Solana Forensic Toolkit: Handles navigation between application pages and maintains URL state
-
tailwindcss (v3.x):
- Purpose: Utility-first CSS framework
- Features: Responsive design utilities, dark mode support, customization options
- Why it's used: Accelerates UI development with composable utility classes
- Usage in Solana Forensic Toolkit: Primary styling solution for all UI components
-
@radix-ui/react- (various)*:
- Purpose: Unstyled, accessible UI primitives
- Features: Keyboard navigation, ARIA attributes, focus management
- Why it's used: Provides accessibility-first building blocks for UI components
- Usage in Solana Forensic Toolkit: Foundation for custom UI components including dialogs, dropdowns, and tabs
-
class-variance-authority (v0.7.x):
- Purpose: Building type-safe UI components with variants
- Features: Type-safe variant API, conditional class application
- Why it's used: Simplifies creating components with multiple variants and states
- Usage in Solana Forensic Toolkit: Used to create customizable UI components with consistent API
-
shadcn/ui:
- Purpose: Collection of reusable UI components
- Features: Built on Radix UI, styled with Tailwind CSS, fully customizable
- Why it's used: Provides high-quality, accessible components without the constraints of a component library
- Usage in Solana Forensic Toolkit: Used for UI elements like buttons, cards, modals, and form inputs
-
lucide-react (v0.284.x):
- Purpose: Icon library for React
- Features: 1000+ icons, customizable size/color, consistent design
- Why it's used: Provides a comprehensive set of well-designed icons
- Usage in Solana Forensic Toolkit: Used for all icons throughout the interface for actions, navigation, and visual cues
-
tailwindcss-animate (v1.0.x):
- Purpose: Animation utilities for Tailwind CSS
- Features: Transition, animation, and transform utilities
- Why it's used: Extends Tailwind with animation capabilities
- Usage in Solana Forensic Toolkit: Used for micro-interactions, loading states, and UI transitions
-
express (v4.x):
- Purpose: Web application framework for Node.js
- Features: Routing, middleware, HTTP utilities
- Why it's used: Industry standard for building robust Node.js web servers
- Usage in Solana Forensic Toolkit: Powers the API server with route handling and middleware
-
express-session (v1.17.x):
- Purpose: Session middleware for Express
- Features: Session creation, storage, and management
- Why it's used: Provides secure session handling capabilities
- Usage in Solana Forensic Toolkit: Manages user authentication sessions
-
passport (v0.6.x):
- Purpose: Authentication middleware for Node.js
- Features: Flexible authentication strategies, session integration
- Why it's used: Standardized approach to authentication with various strategies
- Usage in Solana Forensic Toolkit: Handles user authentication with local strategy (username/password)
-
bcryptjs (v2.4.x):
- Purpose: Password hashing library
- Features: Secure password hashing, salting, and comparison
- Why it's used: Industry standard for secure password storage
- Usage in Solana Forensic Toolkit: Securely stores user passwords in the database
-
@solana/web3.js (v1.87.x):
- Purpose: JavaScript API for Solana blockchain
- Features: Transaction creation, account management, RPC methods
- Why it's used: Official library for interacting with Solana
- Usage in Solana Forensic Toolkit: Fetches transaction data, account information, and other blockchain data
-
drizzle-orm (v0.29.x):
- Purpose: TypeScript ORM for SQL databases
- Features: Type-safe queries, migrations, relations
- Why it's used: Modern, lightweight ORM with excellent TypeScript support
- Usage in Solana Forensic Toolkit: Handles all database operations with type safety
-
@neondatabase/serverless (v0.6.x):
- Purpose: PostgreSQL client for serverless environments
- Features: Connection pooling, WebSocket transport, prepared statements
- Why it's used: Optimized for serverless deployments with efficient connections
- Usage in Solana Forensic Toolkit: Connects to Neon PostgreSQL database for all data storage
-
ws (v8.14.x):
- Purpose: WebSocket implementation for Node.js
- Features: RFC-6455 compliant, high performance, minimal abstractions
- Why it's used: Mature, stable WebSocket server implementation
- Usage in Solana Forensic Toolkit: Enables real-time communication for collaborative features
-
memorystore (v1.6.x):
- Purpose: Memory-backed session store for Express
- Features: Session expiration, memory usage limiting
- Why it's used: Simple session storage solution with automatic cleanup
- Usage in Solana Forensic Toolkit: Stores session data with TTL for authentication
-
typescript (v5.2.x):
- Purpose: Typed superset of JavaScript
- Features: Static typing, modern JavaScript features, tooling integration
- Why it's used: Enhances code quality and developer experience
- Usage in Solana Forensic Toolkit: Used throughout the codebase for type safety
-
vite (v4.4.x):
- Purpose: Frontend build tool and development server
- Features: HMR, ESM, optimized builds, plugin architecture
- Why it's used: Significantly faster than traditional bundlers
- Usage in Solana Forensic Toolkit: Development server and production build tool
-
drizzle-kit (v0.20.x):
- Purpose: CLI tools for Drizzle ORM
- Features: Migration generation, schema pushing, database introspection
- Why it's used: Companion tool for Drizzle ORM
- Usage in Solana Forensic Toolkit: Manages database schema migrations and updates
-
tsx (v3.13.x):
- Purpose: TypeScript execution environment
- Features: Fast compilation, ESM support, watch mode
- Why it's used: Allows direct execution of TypeScript files
- Usage in Solana Forensic Toolkit: Runs the backend server during development
-
date-fns (v2.30.x):
- Purpose: JavaScript date utility library
- Features: Date manipulation, formatting, parsing
- Why it's used: Modular design with tree-shaking support
- Usage in Solana Forensic Toolkit: Handles all date and time operations in the application
-
nanoid (v4.0.x):
- Purpose: Unique ID generator
- Features: Secure, URL-friendly, small footprint
- Why it's used: More compact and secure than UUID
- Usage in Solana Forensic Toolkit: Generates unique identifiers for entities without database IDs
-
clsx (v2.0.x):
- Purpose: Conditional class name builder
- Features: Small footprint, supports various input types
- Why it's used: Simplifies conditional class application
- Usage in Solana Forensic Toolkit: Used to conditionally apply CSS classes throughout the UI
-
recharts (v2.8.x):
- Purpose: Charting library for React
- Features: Responsive charts, customizable components, animation
- Why it's used: Built on D3 with React component API
- Usage in Solana Forensic Toolkit: Creates statistical charts for wallet transaction analysis
The application implements several performance optimizations:
- Data Pagination: Limit transaction fetching to manageable chunks
- Lazy Loading: Defer loading of visualization data until needed
- Memoization: Cache expensive computations using useMemo and useCallback
- Virtualization: Render only visible elements in large lists
- Code Splitting: Dynamically import components when needed
- Progressive Rendering: Show core UI quickly and load details progressively
Solana Forensic Toolkit implements several security measures:
- Authentication: Secure login with session management
- Authorization: Role-based access control for teams and visualizations
- Data Validation: Input validation using Zod schemas
- HTTPS: Encrypted communication for all data transfers
- Environment Variables: Secure configuration using environment variables
Common issues and solutions:
If the application fails to start, check:
- Database connection: Ensure your PostgreSQL server is running and accessible
- Port conflicts: Make sure port 5000 is not in use by another application
- Environment variables: Verify all required environment variables are set correctly
If transaction data loads slowly:
- Check your Solana RPC endpoint performance
- Consider using a dedicated RPC service
- Apply more specific filters to reduce the amount of data fetched
If you encounter login problems:
- Clear your browser cookies
- Check that the database tables for users and sessions are properly created
- Verify that the
SESSION_SECRETenvironment variable is set
If transaction data appears incomplete:
- Public RPC endpoints may have rate limits or data retention policies
- Some specialized transactions might not be parsed correctly
- Try using a dedicated RPC endpoint with complete historical data
If you're not seeing real-time updates:
- Check your internet connection
- Refresh the page to reconnect the WebSocket
- Verify that you have the appropriate permissions
- Check if other real-time features (like presence indicators) are working
- Clone the repository
- Install dependencies:
npm install - Set up environment variables:
DATABASE_URL=postgresql://user:password@host:port/database SOLANA_RPC_URL=https://your-solana-rpc-endpoint - Start the development server:
npm run dev
- Type Safety: Use TypeScript for all code
- Code Formatting: Follow consistent formatting with Prettier
- Linting: Enforce code quality with ESLint
- Commit Conventions: Use conventional commits
- Pull Request Process: Code reviews for all changes
The Solana Forensic Toolkit project continues to evolve with planned enhancements:
- Multi-chain Support: Extending visualization capabilities to other blockchains
- Advanced Pattern Detection: Machine learning integration for anomaly detection
- Customizable Dashboards: User-configurable analytics dashboards
- Reporting Engine: Export capabilities for compliance and investigation reports
- API Access: Programmatic access to analysis capabilities
- Mobile Support: Enhanced mobile experience for on-the-go analysis
We welcome contributions to Solana Forensic Toolkit! To contribute:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
Please ensure your code follows the project's coding standards and includes appropriate tests.
Solana Forensic Toolkit is available under the MIT License. See the LICENSE file for details.
Solana Forensic Toolkit was made possible through the extensive research done by Syrem, Founder of ChainLabs Technologies.
CLASSIFIED CONTENT