{"id":37879381,"url":"https://github.com/graphsense/graphsense-lib","last_synced_at":"2026-04-03T12:03:40.921Z","repository":{"id":78514607,"uuid":"549514400","full_name":"graphsense/graphsense-lib","owner":"graphsense","description":"A central repository for Python utility functions and all components that interact with the GraphSense backend. The repository provides a CLI interface for managing essential GraphSense maintenance tasks and provides a REST interface used by the frontend (UI). It acts as the core repository, delivering foundational tool","archived":false,"fork":false,"pushed_at":"2026-03-27T14:28:09.000Z","size":16570,"stargazers_count":14,"open_issues_count":23,"forks_count":6,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-03-28T00:28:24.119Z","etag":null,"topics":["analytics","api","cryptocurrency","forensics-tools"],"latest_commit_sha":null,"homepage":"https://graphsense.org/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/graphsense.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-10-11T09:51:38.000Z","updated_at":"2026-03-25T10:31:43.000Z","dependencies_parsed_at":"2026-02-04T18:06:41.608Z","dependency_job_id":null,"html_url":"https://github.com/graphsense/graphsense-lib","commit_stats":null,"previous_names":[],"tags_count":502,"template":false,"template_full_name":null,"purl":"pkg:github/graphsense/graphsense-lib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphsense%2Fgraphsense-lib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphsense%2Fgraphsense-lib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphsense%2Fgraphsense-lib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphsense%2Fgraphsense-lib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/graphsense","download_url":"https://codeload.github.com/graphsense/graphsense-lib/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphsense%2Fgraphsense-lib/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31349561,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T08:03:20.796Z","status":"ssl_error","status_checked_at":"2026-04-03T08:00:37.834Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics","api","cryptocurrency","forensics-tools"],"created_at":"2026-01-16T16:47:24.042Z","updated_at":"2026-04-03T12:03:40.900Z","avatar_url":"https://github.com/graphsense.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GraphSense Library\n\n[![Test and Build Status](https://github.com/graphsense/graphsense-lib/actions/workflows/run_tests.yaml/badge.svg)](https://github.com/graphsense/graphsense-lib/actions) [![PyPI version](https://badge.fury.io/py/graphsense-lib.svg)](https://badge.fury.io/py/graphsense-lib) [![Python](https://img.shields.io/pypi/pyversions/graphsense-lib)](https://pypi.org/project/graphsense-lib/) [![Downloads](https://static.pepy.tech/badge/graphsense-lib)](https://pepy.tech/project/graphsense-lib)\n\nA comprehensive Python library for the GraphSense crypto-analytics platform. It provides database access, data ingestion, maintenance tools, and analysis capabilities for cryptocurrency transactions and networks.\n\n\u003e **Note:** This library uses optional dependencies. Use `graphsense-lib[all]` to install all features.\n\n## Quick Start\n\n### Installation\n\n```bash\n# Install with all features\nuv add graphsense-lib[all]\n\n# Install from source\ngit clone https://github.com/graphsense/graphsense-lib.git\ncd graphsense-lib\nmake install\n```\n\n### Serving the REST API locally\n\nThe web API requires two backend connections: a **Cassandra** cluster (blockchain data) and a **TagStore** (PostgreSQL). You can configure them via environment variables or a YAML config file.\n\n#### Option A: Environment variables only\n\n```bash\nGS_CASSANDRA_ASYNC_NODES='[\"\u003ccassandra-host\u003e\"]' \\\nGRAPHSENSE_TAGSTORE_READ_URL='postgresql+asyncpg://\u003cuser\u003e:\u003cpassword\u003e@\u003chost\u003e:\u003cport\u003e/tagstore' \\\nGS_CASSANDRA_ASYNC_CURRENCIES='{\"btc\":{\"raw\": \"btc_raw\", \"transformed\": \"btc_transformed\"},\"eth\":{}}' \\\nuv run --extra web uvicorn graphsenselib.web.app:create_app --factory --host localhost --port 9000 --reload\n```\n\n#### Option B: YAML config file\n\nPoint `CONFIG_FILE` to a REST-specific config (see `instance/config.yaml` for a full example):\n\n```bash\nCONFIG_FILE=./instance/config.yaml make serve-web\n```\n\nOr without Make:\n\n```bash\nCONFIG_FILE=./instance/config.yaml \\\nuv run --extra web uvicorn graphsenselib.web.app:create_app --factory --host localhost --port 9000 --reload\n```\n\n#### Option C: `.graphsense.yaml` with a `web` key\n\nIf you already have a `.graphsense.yaml` (or `~/.graphsense.yaml`) for the CLI, you can add a `web` key containing the REST config. The app will pick it up automatically without setting `CONFIG_FILE`:\n\n```yaml\n# .graphsense.yaml\nenvironments:\n  # ... your existing CLI config ...\n\nweb:\n  database:\n    nodes: [\"\u003ccassandra-host\u003e\"]\n    currencies:\n      btc:\n      eth:\n  gs-tagstore:\n    url: \"postgresql+asyncpg://\u003cuser\u003e:\u003cpassword\u003e@\u003chost\u003e:\u003cport\u003e/tagstore\"\n```\n\n```bash\nmake serve-web\n```\n\n**Config resolution order:** explicit `config_file` param \u003e `CONFIG_FILE` env var \u003e `./instance/config.yaml` \u003e `.graphsense.yaml` `web` key \u003e env vars only.\n\n#### Optional REST settings (env vars)\n\n| Variable | Default | Description |\n|---|---|---|\n| `GSREST_DISABLE_AUTH` | `false` | Disable API key authentication |\n| `GSREST_ENSURE_TAGSTORE_SCHEMA_ON_STARTUP` | `false` | Auto-initialize TagStore tables/views at startup when missing |\n| `GSREST_ALLOWED_ORIGINS` | `*` | CORS allowed origins |\n| `GSREST_LOGGING_LEVEL` | — | Logging level (DEBUG, INFO, …) |\n| `GS_CASSANDRA_ASYNC_PORT` | `9042` | Cassandra port |\n| `GS_CASSANDRA_ASYNC_USERNAME` | — | Cassandra username |\n| `GS_CASSANDRA_ASYNC_PASSWORD` | — | Cassandra password |\n\nWhen enabling `GSREST_ENSURE_TAGSTORE_SCHEMA_ON_STARTUP=true`, keep in mind:\n\n- The DB user must have DDL privileges (create tables/views/indexes/extensions/procedures).\n- Startup may be slower because schema checks and potential initialization run before the app serves traffic.\n- In multi-replica deployments, initialize schema once (migration/init job) to avoid startup races.\n\nIf TagStore is not configured (`gs-tagstore` missing) or the TagStore URL is unreachable, the REST app now falls back to a mock TagStore so endpoints still work. In this mode, tag-specific responses (labels, actors, taxonomies, tag counts) are empty.\n\n### Basic Usage\n\n#### Database Access with Configuration File\n\n```python\nfrom graphsenselib.db import DbFactory\n\n# Using GraphSense config file (default: ~/.graphsense.yaml)\nwith DbFactory().from_config(\"development\", \"btc\") as db:\n    highest_block = db.transformed.get_highest_block()\n    print(f\"Highest BTC block: {highest_block}\")\n\n    # Get block details\n    block = db.transformed.get_block(100000)\n    print(f\"Block 100000: {block.block_hash}\")\n```\n\n#### Direct Database Connection\n\n```python\nfrom graphsenselib.db import DbFactory\n\n# Direct connection without config file\nwith DbFactory().from_name(\n    raw_keyspace_name=\"eth_raw\",\n    transformed_keyspace_name=\"eth_transformed\",\n    schema_type=\"account\",\n    cassandra_nodes=[\"localhost\"],\n    currency=\"eth\"\n) as db:\n    print(f\"Highest block: {db.transformed.get_highest_block()}\")\n```\n\n#### Async Database Services\n\nThe async services are used internally by the REST API and can also be used standalone. `AddressesService` depends on several other services:\n\n```python\nfrom graphsenselib.db.asynchronous.services import (\n    BlocksService, AddressesService, TagsService,\n    EntitiesService, RatesService,\n)\n\n# Services are initialized with their dependencies\nblocks_service = BlocksService(db, rates_service, config, logger)\naddresses_service = AddressesService(\n    db, tags_service, entities_service, blocks_service, rates_service, logger\n)\n\naddress_info = await addresses_service.get_address(\"btc\", \"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa\")\ntxs = await addresses_service.list_address_txs(\"btc\", \"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa\")\n```\n\n## Command Line Interface\n\nGraphSense-lib exposes a comprehensive CLI tool: `graphsense-cli`\n\n### Basic Commands\n\n```bash\n# Show help and available commands\ngraphsense-cli --help\n\n# Check version\ngraphsense-cli version\n\n# Show current configuration\ngraphsense-cli config show\n\n# Generate config template\ngraphsense-cli config template \u003e ~/.graphsense.yaml\n\n# Show config file path\ngraphsense-cli config path\n```\n\n## Modules\n\n### Database Management\n\nQuery and manage the GraphSense database state.\n\n```bash\n# Show database management options\ngraphsense-cli db --help\n\n# Check database state/summary\ngraphsense-cli db state -e development\n\n# Get block information\ngraphsense-cli db block info -e development -c btc --height 100000\n\n# Query logs (for Ethereum-based chains)\ngraphsense-cli db logs -e development -c eth --from-block 1000000 --to-block 1000100\n```\n\n### Schema Operations\n\nCreate and validate database schemas.\n\n```bash\n# Show schema options\ngraphsense-cli schema --help\n\n# Create database schema for a currency\ngraphsense-cli schema create -e dev -c btc\n\n# Validate existing schema\ngraphsense-cli schema validate -e dev -c btc\n\n# Show expected schema for currency\ngraphsense-cli schema show-by-currency btc\n\n# Show schema by type (utxo/account)\ngraphsense-cli schema show-by-schema-type utxo\n```\n\n### Data Ingestion\n\nIngest raw cryptocurrency data from nodes.\n\n```bash\n# Show ingestion options\ngraphsense-cli ingest --help\n\n# Ingest blocks from cryptocurrency node\ngraphsense-cli ingest from-node \\\n    -e dev \\\n    -c btc \\\n    --start-block 0 \\\n    --end-block 1000 \\\n    --create-schema\n\n# Ingest with custom batch size\ngraphsense-cli ingest from-node \\\n    -e dev \\\n    -c eth \\\n    --start-block 1000000 \\\n    --end-block 1001000 \\\n    --batch-size 100\n```\n\n### Delta Updates\n\nUpdate transformed keyspace from raw keyspace.\n\n```bash\n# Show delta update options\ngraphsense-cli delta-update --help\n\n# Check update status\ngraphsense-cli delta-update status -e dev -c btc\n\n# Perform delta update\ngraphsense-cli delta-update update -e dev -c btc\n\n# Validate delta update consistency\ngraphsense-cli delta-update validate -e dev -c btc\n\n# Patch exchange rates for specific blocks\ngraphsense-cli delta-update patch-exchange-rates \\\n    -e dev \\\n    -c btc \\\n    --start-block 100000 \\\n    --end-block 200000\n```\n\n### Exchange Rates\n\nFetch and ingest exchange rates from various sources.\n\n```bash\n# Show exchange rate options\ngraphsense-cli exchange-rates --help\n\n# Fetch from CoinDesk\ngraphsense-cli exchange-rates coindesk -e dev -c btc\n\n# Fetch from CoinMarketCap (requires API key in config)\ngraphsense-cli exchange-rates coinmarketcap -e dev -c btc\n```\n\n### Monitoring\n\nMonitor GraphSense infrastructure health and state.\n\n```bash\n# Show monitoring options\ngraphsense-cli monitoring --help\n\n# Get database summary\ngraphsense-cli monitoring get-summary -e dev\n\n# Get summary for specific currency\ngraphsense-cli monitoring get-summary -e dev -c btc\n\n# Send notifications to configured handlers\ngraphsense-cli monitoring notify \\\n    --topic \"database-update\" \\\n    --message \"BTC ingestion completed\"\n```\n\n### Event Watching (Alpha)\n\nWatch for cryptocurrency events and generate notifications.\n\n```bash\n# Show watch options\ngraphsense-cli watch --help\n\n# Watch for money flows on specific addresses\ngraphsense-cli watch money-flows \\\n    -e dev \\\n    -c btc \\\n    --address 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa \\\n    --threshold 1000000  # satoshis\n```\n\n### File Conversion Tools\n\nConvert between different file formats.\n\n```bash\n# Show conversion options\ngraphsense-cli convert --help\n```\n\n## Configuration\n\nGraphSense-lib uses a YAML configuration file that defines database connections and environment settings. Default locations: `./.graphsense.yaml`, `~/.graphsense.yaml`.\n\n### Generate Configuration Template\n\n```bash\ngraphsense-cli config template \u003e ~/.graphsense.yaml\n```\n\n### Example Configuration Structure\n\n```yaml\n# Optional: default environment to use\ndefault_environment: dev\n\nenvironments:\n  dev:\n    # Cassandra cluster configuration\n    cassandra_nodes: [\"localhost\"]\n    port: 9042\n    # Optional authentication\n    # username: \"cassandra\"\n    # password: \"cassandra\"\n\n    # Currency/keyspace configurations\n    keyspaces:\n      btc:\n        raw_keyspace_name: \"btc_raw\"\n        transformed_keyspace_name: \"btc_transformed\"\n        schema_type: \"utxo\"\n\n        # Node connection for ingestion\n        ingest_config:\n          node_reference: \"http://localhost:8332\"\n          # Optional authentication for node\n          # username: \"rpcuser\"\n          # password: \"rpcpassword\"\n\n        # Keyspace setup for schema creation\n        keyspace_setup_config:\n          raw:\n            replication_config: \"{'class': 'SimpleStrategy', 'replication_factor': 1}\"\n          transformed:\n            replication_config: \"{'class': 'SimpleStrategy', 'replication_factor': 1}\"\n\n      eth:\n        raw_keyspace_name: \"eth_raw\"\n        transformed_keyspace_name: \"eth_transformed\"\n        schema_type: \"account\"\n\n        ingest_config:\n          node_reference: \"http://localhost:8545\"\n\n        keyspace_setup_config:\n          raw:\n            replication_config: \"{'class': 'SimpleStrategy', 'replication_factor': 1}\"\n          transformed:\n            replication_config: \"{'class': 'SimpleStrategy', 'replication_factor': 1}\"\n\n  prod:\n    cassandra_nodes: [\"cassandra1.prod\", \"cassandra2.prod\", \"cassandra3.prod\"]\n    username: \"gs_user\"\n    password: \"secure_password\"\n\n    keyspaces:\n      btc:\n        raw_keyspace_name: \"btc_raw\"\n        transformed_keyspace_name: \"btc_transformed\"\n        schema_type: \"utxo\"\n\n        ingest_config:\n          node_reference: \"http://bitcoin-node.internal:8332\"\n\n        keyspace_setup_config:\n          raw:\n            replication_config: \"{'class': 'NetworkTopologyStrategy', 'datacenter1': 3}\"\n          transformed:\n            replication_config: \"{'class': 'NetworkTopologyStrategy', 'datacenter1': 3}\"\n\n# Optional: Slack notification configuration\nslack_topics:\n  database-update:\n    hooks: [\"https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK\"]\n\n  payment_flow_notifications:\n    hooks: [\"https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK\"]\n\n# Optional: API keys for external services\ncoingecko_api_key: \"\"\ncoinmarketcap_api_key: \"YOUR_CMC_API_KEY\"\n\n# Optional: cache directory for temporary files\ncache_directory: \"~/.graphsense/cache\"\n```\n\n## Advanced Features\n\n### Tagpack Management\n\nGraphSense-lib includes comprehensive tagpack management tools (formerly standalone tagpack-tool). For detailed documentation, see [Tagpack README](tagpack/docs/README.md).\n\n```bash\n# Validate tagpacks\ngraphsense-cli tagpack-tool tagpack validate /path/to/tagpack\n\n# Insert tagpack into tagstore\ngraphsense-cli tagpack-tool insert \\\n    --url \"postgresql://user:pass@localhost/tagstore\" \\\n    /path/to/tagpack\n\n# Show quality measures\ngraphsense-cli tagpack-tool quality show-measures \\\n    --url \"postgresql://user:pass@localhost/tagstore\"\n```\n\n### Tagstore Operations\n\n```bash\n# Initialize tagstore database\ngraphsense-cli tagstore init\n\n# Initialize with custom database URL\ngraphsense-cli tagstore init --db-url \"postgresql://user:pass@localhost/tagstore\"\n\n# Get DDL SQL for manual setup\ngraphsense-cli tagstore get-create-sql\n```\n\n### Cross-chain Analysis\n\n```python\n# Using an initialized AddressesService (see above for setup)\nrelated = await addresses_service.get_cross_chain_pubkey_related_addresses(\n    \"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa\"\n)\n\nfor addr in related:\n    print(f\"Network: {addr.network}, Address: {addr.address}\")\n```\n\n### Function Call Parsing\n\n```python\nfrom graphsenselib.utils.function_call_parser import parse_function_call\n\n# Parse Ethereum function calls\nfunction_signatures = {\n    \"0xa9059cbb\": [{\n        \"name\": \"transfer\",\n        \"inputs\": [\n            {\"name\": \"to\", \"type\": \"address\"},\n            {\"name\": \"value\", \"type\": \"uint256\"}\n        ]\n    }]\n}\n\nparsed = parse_function_call(tx_input_bytes, function_signatures)\nif parsed:\n    print(f\"Function: {parsed['name']}\")\n    print(f\"Parameters: {parsed['parameters']}\")\n```\n\n## Development\n\n**Important:** Requires Python \u003e=3.10, \u003c3.13.\n\n### Setup Development Environment\n\n```bash\n# Initialize development environment (installs deps + pre-commit hooks)\nmake dev\n\n# Or install dev dependencies only\nmake install-dev\n```\n\n### Code Quality and Testing\n\nBefore committing, please format, lint, and test your code:\n\n```bash\n# Format code\nmake format\n\n# Lint code\nmake lint\n\n# Run fast tests\nmake test\n\n# Or run all steps at once\nmake pre-commit\n```\n\nFor comprehensive testing:\n\n```bash\n# Run complete test suite (including slow tests)\nmake test\n```\n\n#### Podman Notes\n\nIf you run the test suite with Podman, make sure your shell points at the Podman socket:\n\n```bash\nexport DOCKER_HOST=\"unix://${XDG_RUNTIME_DIR}/podman/podman.sock\"\n```\n\nThe test fixtures automatically disable Ryuk when `DOCKER_HOST` contains `podman.sock` and rely on explicit fixture cleanup instead.\n\n### Release Process\n\nThis repository uses two source-of-truth versions in the root `Makefile`:\n\n- **Library version**: `RELEASESEM` (released with `vX.Y.Z`, `vX.Y.Z-rc.N`, or `vX.Y.Z-dev.N` tags)\n- **OpenAPI/API version**: `WEBAPISEM` (written to `src/graphsenselib/web/version.py`)\n\nThe Python client package version is derived from the API version and should match it.\n\nLibrary package versioning is dynamic via `setuptools_scm` (`pyproject.toml`):\n\n- Git tag `v2.9.8` -\u003e package version `2.9.8`\n- Git tag `v2.9.8-rc.1` -\u003e package version `2.9.8rc1`\n- Git tag `v2.9.8-dev.1` -\u003e package version `2.9.8.dev1`\n- Commits after a tag append local metadata, for example `2.9.8.dev1+g\u003csha\u003e.d\u003cdate\u003e`\n\nUse the root Makefile helpers:\n\n```bash\n# Show all current versions\nmake show-versions\n\n# Update and validate OpenAPI contract version\nmake update-api-version WEBAPISEM=v2.10.0\nmake check-api-version WEBAPISEM=v2.10.0\n\n# Sync client version from API version and validate\nmake sync-client-version WEBAPISEM=v2.10.0\nmake check-client-version WEBAPISEM=v2.10.0\n\n# Generate Python client (package version = OpenAPI info.version)\nmake generate-python-client\n\n# Create both release tags from Makefile versions\nmake tag-version\n```\n\nTagging behavior:\n\n- Library release tag: `vX.Y.Z`, `vX.Y.Z-rc.N`, or `vX.Y.Z-dev.N` (from `RELEASESEM`)\n- Client release tag: `webapi-vA.B.C` (from `WEBAPISEM`)\n\nRecommended library versioning routine:\n\n1. For development prereleases, set `RELEASESEM` to `vX.Y.Z-dev.N` (for example `v2.10.0-dev.1`)\n2. For release candidates, set `RELEASESEM` to `vX.Y.Z-rc.N`\n3. For stable releases, set `RELEASESEM` to `vX.Y.Z`\n4. Create tags with `make tag-version`\n5. Push tags with `git push origin --tags`\n\nCI trigger background:\n\n- Stable library tags (`vX.Y.Z`) trigger:\n  - GitHub Release creation\n  - Python library package build/publish (`graphsense-lib`)\n  - Docker image build/publish\n- Client tags (`webapi-vA.B.C`) trigger Python client package build/publish (`clients/python`)\n- Other library tags (`vX.Y.Z-rc.N`, `vX.Y.Z-dev.N`) do not trigger GitHub Release or Python package publish; they only trigger Docker image build/publish\n\n1. Update CHANGELOG.md with new features and fixes\n2. Update relevant versions (library/API/client) based on what changed\n3. Sync API/client versions if needed (`make update-api-version` + `make sync-client-version`)\n4. Create and push tags:\n\n```bash\nmake tag-version\ngit push origin --tags\n```\n\n## Troubleshooting\n\n### OpenSSL Errors\n\nSome components use OpenSSL hash functions that aren't available by default in OpenSSL 3.0+ (e.g., ripemd160). This can cause test suite failures. To fix this, enable legacy providers in your OpenSSL configuration. See the \"fix openssl legacy mode\" step in `.github/workflows/run_tests.yaml` for an example.\n\n### Common Issues\n\n1. **Connection Refused**: Verify Cassandra is running and accessible\n2. **Schema Validation Errors**: Ensure database schema matches expected version\n3. **Import Errors**: Install with `[all]` option for complete feature set\n4. **Python Version**: Requires Python \u003e=3.10, \u003c3.13\n\n### Getting Help\n\n- Check [GitHub Issues](https://github.com/graphsense/graphsense-lib/issues)\n- Review [GraphSense Documentation](https://graphsense.github.io/)\n- Use `--help` with any CLI command for detailed usage information\n- For tagpack-specific issues, see [Tagpack Documentation](tagpack/docs/README.md)\n\n## License\n\nSee LICENSE file for licensing details.\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Run `make pre-commit` to ensure code quality\n5. Submit a pull request\n\n---\n\n**GraphSense** - Open Source Crypto Analytics Platform\nWebsite: https://graphsense.github.io/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphsense%2Fgraphsense-lib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgraphsense%2Fgraphsense-lib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphsense%2Fgraphsense-lib/lists"}