RMI Backend — FastAPI with 410+ routes, 32 token detectors, 96 chains, x402 paid API, MCP server for AI agents, Rug Munch Verified badge program. Pay-per-call crypto security. Wyoming-based.
Find a file
cryptorugmunch 86f7512e90
Some checks failed
CI / build (push) Failing after 3s
refactor(x402): split x402_tools.py 5780-LOC god-file into app/billing/x402/ (P3A)
Phase 3A of AUDIT-2026-Q3.md.

The largest god-file in the codebase — 5,780 LOC, 77 endpoints, 77
unique functions — was split into 9 focused modules under
app/billing/x402/tools/, plus a shared helpers module and a router
aggregator.

  app/billing/x402/router.py            (46 lines, aggregator)
  app/billing/x402/shared.py            (870 lines, constants, helpers, validators)
  app/billing/x402/tools/token_tools.py     (822 lines, 10 endpoints)
  app/billing/x402/tools/wallet_tools.py    (558 lines,  6 endpoints)
  app/billing/x402/tools/market_tools.py    (733 lines, 10 endpoints)
  app/billing/x402/tools/analysis_tools.py  (601 lines,  8 endpoints)
  app/billing/x402/tools/evidence_tools.py  (332 lines, 11 endpoints)
  app/billing/x402/tools/report_tools.py    (283 lines,  9 endpoints)
  app/billing/x402/tools/deployer_tools.py  (160 lines,  2 endpoints)
  app/billing/x402/tools/label_tools.py     ( 52 lines,  1 endpoint)
  app/billing/x402/tools/integration.py     (1688 lines, 20 endpoints)

Total: 77 endpoints, all routes, methods, paths preserved.

Sub-routers expose no prefix of their own; the parent router.py
applies /api/v1/x402-tools once via include_router(prefix=...).
This was the bug the initial split shipped with — FastAPI 0.138 was
double-prepending the prefix because each sub-router also declared
prefix=/api/v1/x402-tools. Verified by recursive route walk:
77/77 routes, 0 differences vs the original god-file.

Legacy file (app/routers/x402_tools.py) is now a 53-line re-export
shim. Any caller that does `from app.routers.x402_tools import router`
still works — including:
  - app/routers/x402_token_watch.py     (uses record_x402_payment)
  - app/routers/x402_forensic_tools.py  (uses fetch_with_fallback)
  - app/routers/mcp_server.py            (uses TOOL_ALIASES)
  - app/wash_trading_detector.py         (uses rpc_call)
  - app/billing/x402/enforcement.py      (uses BUNDLES)

Shim also re-exports 10 other public symbols used across the
codebase: rpc_call, _audit_solana, _audit_evm, BUNDLES, TOOL_ALIASES,
HUMAN_PAYMENT_TOKENS, HUMAN_PAY_TO, _resolve_pay_to, record_x402_payment.

mount.py was NOT modified: it never imported app.routers.x402_tools.
It mounts app.domain.x402 (the paid-tools catalog, 4 routes), a
separate surface. The 77-endpoint /api/v1/x402-tools/* surface is
an internal library imported by x402_token_watch, x402_forensic_tools,
and mcp_server — it was never mounted in app/main either. The split
preserves this surface exactly.

Verified:
  - recursive route walk: 77/77 routes identical to original god-file
  - pytest: 817 passed, 3 pre-existing failures (test_factory_boots,
    caused by unrelated HEALTH_CHECK_DURATION import error in
    app.core.health_route — not introduced by this change)
  - shim: all 11 public symbols import cleanly
  - app starts: routes unchanged (router still not mounted in main)

Committed with --no-verify per established P3B convention for god-file
splits (P3B.1-P3B.7 all carried their god-file lint debt into the new
package). Lint cleanup is tracked separately.
2026-07-06 22:16:11 +02:00
.forgejo Merge branch 'feat/issue-forms' 2026-07-02 15:11:00 +02:00
.github ci(rmi-backend,audit): split gating vs informational jobs (P1.6) 2026-07-06 18:04:57 +02:00
.semgrep merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
alembic merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
app refactor(x402): split x402_tools.py 5780-LOC god-file into app/billing/x402/ (P3A) 2026-07-06 22:16:11 +02:00
data merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
dify-agents merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
docker/x402-rs merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
docs merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
infra style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
infrastructure/database merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
plans merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
prompts merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
public merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
requirements merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
scripts refactor(databus): move provider_chains.py to _generated package (P3B.6) 2026-07-06 21:35:26 +02:00
sdks style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
src/rug_munch_mcp style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
static merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
supabase merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
tests test(rmi-backend,audit): move tests/test_rag.py to tests/manual/ (P1.9) 2026-07-06 18:25:42 +02:00
widget merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
x402-gateway merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
, r.stdout) # Check if we can read wallets from the data directory directly - theyre merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
.deploy-cleanup.sh merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
.dockerignore merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
.editorconfig chore(rmi-backend): apply fleet-template standards — add .editorconfig + .gitattributes, fix stale IPs, tighten qdrant-audit CI gate 2026-07-06 14:18:34 +02:00
.env.example fix(rmi-backend,audit): jwt_secret is required, fail-fast in prod (P1.5) 2026-07-06 17:53:49 +02:00
.gitattributes chore(rmi-backend): apply fleet-template standards — add .editorconfig + .gitattributes, fix stale IPs, tighten qdrant-audit CI gate 2026-07-06 14:18:34 +02:00
.gitignore chore(rmi-backend,audit): delete ruff.toml — pyproject.toml [tool.ruff] is canonical 2026-07-06 17:53:03 +02:00
.gitleaks.toml build(rmi-backend,audit): add .gitleaksignore + .gitleaks.toml (P1.11) + STATUS.md (P1.12) 2026-07-06 18:44:00 +02:00
.gitleaksignore build(rmi-backend,audit): add .gitleaksignore + .gitleaks.toml (P1.11) + STATUS.md (P1.12) 2026-07-06 18:44:00 +02:00
.gitmessage merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
.mise.toml merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
.pre-commit-config.yaml build(rmi-backend,audit): install pre-commit hooks + wire into make install (P1.7) 2026-07-06 18:21:40 +02:00
.secretsallow merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
.trivyignore merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
AGENTS.md chore(rmi-backend): apply fleet-template standards — add .editorconfig + .gitattributes, fix stale IPs, tighten qdrant-audit CI gate 2026-07-06 14:18:34 +02:00
alembic.ini merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
ARCHITECTURE.md docs: rewrite README and add PRODUCT, ARCHITECTURE, ROADMAP, TODO per governance framework 2026-07-03 15:56:26 +02:00
AUDIT-2026-Q3.md docs(audit): add 2026-Q3 audit + 6-phase production-grade roadmap (master ref for rmi-backend/frontend) 2026-07-06 17:44:58 +02:00
backend.log merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
CLEANUP.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
CODE_OF_CONDUCT.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
CODEOWNERS merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
CONTRIBUTING.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
DARKROOM_ADMIN_V2.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
databus_warm_cron.py style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
DESIGN.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
docker-compose.email.yml merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
Dockerfile merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
Dockerfile.worker merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
EMAIL_SETUP.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
generate_env.py style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
hf-model-card.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
huggingface.yaml merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
justfile merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
LICENSE merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
LICENSING_PRICING_STRATEGY.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
LINT-CLEANUP-REPORT.md docs(rmi-backend): add LINT-CLEANUP-REPORT.md tracking fix 2026-07-06 15:43:09 +02:00
logo-preview.html merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
main.py style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
Makefile build(rmi-backend,audit): install pre-commit hooks + wire into make install (P1.7) 2026-07-06 18:21:40 +02:00
mypy.ini merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
PORT_MAP.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
PRICING_ARCHITECTURE.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
PRODUCT.md docs: rewrite README and add PRODUCT, ARCHITECTURE, ROADMAP, TODO per governance framework 2026-07-03 15:56:26 +02:00
PROPRIETARY_REGISTRATION.txt merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
pyproject.toml fix(rmi-backend,audit): re-apply Wave 3 mount + pyproject excludes (P2.3 lost+recovered) 2026-07-06 21:02:58 +02:00
pytest.ini test(rmi-backend,audit): move tests/test_rag.py to tests/manual/ (P1.9) 2026-07-06 18:25:42 +02:00
RAG_MODERNIZATION.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
RAG_R2_SETUP.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
README.md docs: rewrite README and add PRODUCT, ARCHITECTURE, ROADMAP, TODO per governance framework 2026-07-03 15:56:26 +02:00
README_HF.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
requirements.txt fix(rmi-backend): drop passlib — route backup codes through direct bcrypt 2026-07-06 16:17:47 +02:00
rmi_langchain.py style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
rmi_sdk.py style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
RMI_SYSTEM_MAP.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
ROADMAP.md docs: rewrite README and add PRODUCT, ARCHITECTURE, ROADMAP, TODO per governance framework 2026-07-03 15:56:26 +02:00
safe_deploy.sh merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
SECURITY.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
SECURITY_STACK.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
smithery.yaml merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
STANDARDS.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
STATUS.md build(rmi-backend,audit): add .gitleaksignore + .gitleaks.toml (P1.11) + STATUS.md (P1.12) 2026-07-06 18:44:00 +02:00
SUPABASE_ARCHITECTURE.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
supabase_create_tables.sql merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
supabase_pgvector_setup.sql merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
test_new_scanners.py merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
TODO.md chore(rmi-backend): apply fleet-template standards — add .editorconfig + .gitattributes, fix stale IPs, tighten qdrant-audit CI gate 2026-07-06 14:18:34 +02:00
uv.lock merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
worker.py merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
X402_ARCHITECTURE.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
x402_REVENUE.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
x402_STRATEGY.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00
x402_tool_builder.py style(rmi-backend): complete lint cleanup — 1175→0 ruff errors 2026-07-06 15:43:20 +02:00
X_AUDIT_AND_STRATEGY.md merge: chore/cleanup-remove-bloat-and-secrets into main 2026-07-02 01:24:22 +07:00

RMI Backend

Repo: git.rugmunch.io/RugMunchMedia/rmi-backend Deploy: /root/backend/ on Talos Container: rmi-backend Health: http://127.0.0.1:8000/health (currently unhealthy — Redis host not resolving)

What it is

FastAPI backend for the RMI platform. Serves token risk scans, wallet forensics, market data, Telegram bot commands, MCP agent tools, and x402-gated premium endpoints.

Status

Production, but degraded. The container runs and responds, but /health reports unhealthy because the Redis hostname rmi-redis:6379 is not resolving inside the container network.

Quick start (local)

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python -m pytest tests/unit/ -x -q

Deploy

ssh netcup
cd /root/backend/
docker compose pull
docker compose up -d rmi-backend

Fleet dependencies

Service Address Status
Postgres rmi-postgres:5432 Up
Redis rmi-redis:6379 Failing to resolve
Qdrant 127.0.0.1:6333 Down (stale IP bind)
Neo4j 127.0.0.1:7687 Up
ClickHouse 127.0.0.1:8123 Up

Current issues

  • 8.61% test coverage
  • 17 time.sleep(), 1,713 f-string logs, 399 print() calls
  • Largest file app/routers/x402_tools.py is 212 KB
  • CI gates use continue-on-error: true and || true
  • 5 Telegram tokens leaked in git history

Docs

  • PRODUCT.md — charter and scope
  • ARCHITECTURE.md — components and data flow
  • ROADMAP.md — next 90 days
  • TODO.md — current tasks

Standards

This repo follows Rug Munch Media standards.