Go's base64 decoders are lenient in two independent ways, and both JWT verifiers used them raw, so one credential validated under several spellings. The unused low bits of the final quantum are ignored: an HMAC-SHA256 signature is 32 bytes in 43 base64url characters, leaving 2 slack bits and so 4 accepted strings per admin token; an RSA-2048 signature is 256 bytes in 342 characters, leaving 4 slack bits and so 16 per IAM token. Separately, \r and \n are skipped wherever they appear, which Encoding.Strict() does not close -- so Strict alone would not have been a fix. Every string-keyed structure over a credential silently splits under that: a denylist misses the spellings it was not handed, an audit log reads one actor as several, a rate limiter multiplies the budget by the class size. pkg/token holds the one canonical encoding. Decode round-trips rather than enumerating failure modes -- a segment is canonical exactly when it is the encoding of the bytes it decodes to -- and rejects rather than normalizes. token.ID is the hash to key revocation, audit and rate limiting on, so the identity is never the submitted string. Both verifiers now decode every segment through it. JWKS n/e stays lenient on purpose: public key material from the trusted IAM endpoint, where every spelling is the same key. Also in pkg/admin: sign returns raw MAC bytes instead of text, dropping an encode-then-decode round trip in the verify path; the header is now decoded and required to declare HS256, closing alg confusion under future refactor; and a comment referencing a long-deleted hashPassword is gone. Tests: exactly one spelling authenticates on both paths; revocation keyed on token.ID holds across all four; CR/LF, padding, standard alphabet and empty segments rejected. TestValidateToken_TamperedSignature substituted a fixed 'X' that was a no-op whenever the token already ended in one -- a 1-in-64 flake that this bug made a 1-in-16 one -- now derived from the token. LLM.md: admin auth section corrected (bcrypt cost 12, not SHA-256+salt; no ADMIN_* env vars exist; middleware strips those headers rather than setting them; package is not mounted). Co-authored-by: Hanzo Dev <[email protected]>
Broker
Multi-venue trading router with smart order routing, pre-trade risk, instant settlement, and real-time market data aggregation across 16 institutional providers.
go build -o brokerd ./cmd/brokerd/
ALPACA_API_KEY=pk_... ALPACA_API_SECRET=sk_... ./brokerd
Providers
| Provider | Asset Classes | Type |
|---|---|---|
| Alpaca | Equities, Crypto | Broker-dealer (SEC/FINRA) |
| Interactive Brokers | Equities, Options, Futures, FX | Prime broker |
| Tradier | Equities, Options | Broker-dealer |
| Coinbase | Crypto | Exchange (Advanced Trade API) |
| Binance | Crypto | Exchange |
| Kraken | Crypto | Exchange |
| Gemini | Crypto | Exchange |
| SFOX | Crypto | Prime dealer / SOR |
| FalconX | Crypto | Institutional RFQ |
| Fireblocks | Crypto | Custody + OTC |
| BitGo | Crypto | Custody + Prime |
| Circle | USDC / Stablecoins | Stablecoin infrastructure |
| CurrencyCloud | FX (35+ pairs) | Institutional FX (Visa) |
| LMAX | FX, Crypto, Metals | Institutional CLOB |
| Polygon.io | Equities, FX, Crypto | Market data |
| Finix | Payments | Payment processing |
Architecture
┌──────────────┐
│ brokerd │
│ :8090 │
└──────┬───────┘
│
┌────────────────┼────────────────┐
│ │ │
┌──────┴──────┐ ┌─────┴──────┐ ┌──────┴──────┐
│ Smart Order │ │ Risk │ │ Audit │
│ Router │ │ Engine │ │ Log │
└──────┬──────┘ └────────────┘ └─────────────┘
│
┌────┬────┼────┬────┬────┬────┐
│ │ │ │ │ │ │
CEX CEX OTC LP FX Data Pay (16 providers)
│ │ │ │ │ │ │
CB KRK FLX SFX CC POLY FNX
Smart Order Router polls all venues in parallel, ranks by net price (spread + fees), and can split large orders across venues using VWAP.
Risk Engine enforces per-account and global limits: order value, daily volume, open order count, rate limits, symbol whitelists/blacklists.
Settlement Engine manages a prefunding pool for instant crypto buys while ACH settles. Margin monitoring auto-liquidates at configurable drawdown thresholds.
Audit Log is an immutable append-only trail of every order, fill, cancellation, and transfer. Queryable, exportable, with hook support for external logging.
API Reference
Base URL: http://localhost:8090/v1
Auth: Authorization: Bearer <api-key> or X-API-Key: <api-key> header. Health check at /healthz requires no auth.
Accounts
| Method | Path | Description |
|---|---|---|
| POST | /v1/accounts |
Create account (with provider, identity, contact) |
| GET | /v1/accounts |
List all accounts across providers |
| GET | /v1/accounts/{provider}/{accountId} |
Get account detail |
| GET | /v1/accounts/{provider}/{accountId}/portfolio |
Portfolio snapshot |
| PATCH | /v1/accounts/{provider}/{accountId} |
Update account |
| DELETE | /v1/accounts/{provider}/{accountId} |
Close account |
| GET | /v1/accounts/{provider}/{accountId}/activities |
Account activity feed |
Orders
| Method | Path | Description |
|---|---|---|
| POST | /v1/accounts/{provider}/{accountId}/orders |
Place order |
| GET | /v1/accounts/{provider}/{accountId}/orders |
List orders (?status=open|closed|all) |
| GET | /v1/accounts/{provider}/{accountId}/orders/{orderId} |
Get order |
| PATCH | /v1/accounts/{provider}/{accountId}/orders/{orderId} |
Replace/modify order |
| DELETE | /v1/accounts/{provider}/{accountId}/orders/{orderId} |
Cancel order |
| DELETE | /v1/accounts/{provider}/{accountId}/orders |
Cancel all orders |
Positions
| Method | Path | Description |
|---|---|---|
| GET | /v1/accounts/{provider}/{accountId}/positions/{symbol} |
Get position |
| DELETE | /v1/accounts/{provider}/{accountId}/positions/{symbol} |
Close position |
| DELETE | /v1/accounts/{provider}/{accountId}/positions |
Close all positions |
Smart Order Routing
| Method | Path | Description |
|---|---|---|
| GET | /v1/route/{symbol} |
Best venues for symbol |
| GET | /v1/route/{symbol}/{quote} |
Best venues for pair (e.g. BTC/USD) |
| GET | /v1/route/{symbol}/split |
VWAP split plan |
| GET | /v1/route/{symbol}/{quote}/split |
VWAP split plan for pair |
| POST | /v1/smart-order |
Execute smart order (routes to best venue) |
| POST | /v1/smart-order/split |
Execute split across venues |
| GET | /v1/assets |
Aggregated assets across all providers |
Market Data
| Method | Path | Description |
|---|---|---|
| GET | /v1/market/{provider}/snapshot/{symbol} |
Real-time price snapshot |
| GET | /v1/market/{provider}/snapshots |
Multiple snapshots (?symbols=) |
| GET | /v1/market/{provider}/bars/{symbol} |
OHLCV bars (?timeframe=&start=&end=&limit=) |
| GET | /v1/market/{provider}/trades/latest |
Latest trades (?symbols=) |
| GET | /v1/market/{provider}/quotes/latest |
Latest quotes (?symbols=) |
| GET | /v1/market/{provider}/clock |
Market clock |
| GET | /v1/market/{provider}/calendar |
Market calendar |
| GET | /v1/market/{provider}/crypto/bars |
Crypto OHLCV bars |
| GET | /v1/market/{provider}/crypto/quotes |
Crypto quotes |
| GET | /v1/market/{provider}/crypto/trades |
Crypto trades |
| GET | /v1/market/{provider}/crypto/snapshots |
Crypto snapshots |
Consolidated Data
| Method | Path | Description |
|---|---|---|
| GET | /v1/bbo/{symbol} |
Best bid/offer across all venues |
| GET | /v1/bbo/{symbol}/{quote} |
BBO for pair |
| GET | /v1/stream |
SSE stream (real-time consolidated tickers) |
Transfers & Banking
| Method | Path | Description |
|---|---|---|
| GET | /v1/accounts/{provider}/{accountId}/transfers |
List transfers |
| POST | /v1/accounts/{provider}/{accountId}/transfers |
Create transfer (ACH/wire/crypto) |
| DELETE | /v1/accounts/{provider}/{accountId}/transfers/{transferId} |
Cancel transfer |
| GET | /v1/accounts/{provider}/{accountId}/bank-relationships |
List bank relationships |
| POST | /v1/accounts/{provider}/{accountId}/bank-relationships |
Create bank relationship |
| DELETE | /v1/accounts/{provider}/{accountId}/ach-relationships/{achId} |
Delete ACH |
| POST | /v1/accounts/{provider}/{accountId}/recipient-banks |
Add wire recipient |
| GET | /v1/accounts/{provider}/{accountId}/recipient-banks |
List wire recipients |
| DELETE | /v1/accounts/{provider}/{accountId}/recipient-banks/{bankId} |
Remove wire recipient |
Journals (Inter-Account Transfers)
| Method | Path | Description |
|---|---|---|
| POST | /v1/journals/{provider} |
Create journal (JNLC cash / JNLS security) |
| GET | /v1/journals/{provider} |
List journals |
| GET | /v1/journals/{provider}/{journalId} |
Get journal |
| DELETE | /v1/journals/{provider}/{journalId} |
Delete journal |
| POST | /v1/journals/{provider}/batch |
Batch journal |
| POST | /v1/journals/{provider}/reverse_batch |
Reverse batch |
Documents
| Method | Path | Description |
|---|---|---|
| POST | /v1/accounts/{provider}/{accountId}/documents |
Upload document |
| GET | /v1/accounts/{provider}/{accountId}/documents |
List documents |
| GET | /v1/accounts/{provider}/{accountId}/documents/{documentId} |
Get document |
| GET | /v1/accounts/{provider}/{accountId}/documents/{documentId}/download |
Download |
Watchlists
| Method | Path | Description |
|---|---|---|
| POST | /v1/accounts/{provider}/{accountId}/watchlists |
Create watchlist |
| GET | /v1/accounts/{provider}/{accountId}/watchlists |
List watchlists |
| GET | /v1/accounts/{provider}/{accountId}/watchlists/{id} |
Get watchlist |
| PUT | /v1/accounts/{provider}/{accountId}/watchlists/{id} |
Update watchlist |
| DELETE | /v1/accounts/{provider}/{accountId}/watchlists/{id} |
Delete watchlist |
| POST | /v1/accounts/{provider}/{accountId}/watchlists/{id}/assets |
Add asset |
| DELETE | /v1/accounts/{provider}/{accountId}/watchlists/{id}/{symbol} |
Remove asset |
Portfolio History
| Method | Path | Description |
|---|---|---|
| GET | /v1/accounts/{provider}/{accountId}/portfolio/history |
Equity time series (?period=&timeframe=) |
Event Streaming (SSE)
| Method | Path | Description |
|---|---|---|
| GET | /v1/events/{provider}/trades |
Trade events |
| GET | /v1/events/{provider}/accounts |
Account events |
| GET | /v1/events/{provider}/transfers |
Transfer events |
| GET | /v1/events/{provider}/journals |
Journal events |
Risk & Audit
| Method | Path | Description |
|---|---|---|
| GET | /v1/risk/check |
Pre-trade risk check (?provider=&account_id=&symbol=&side=&qty=&price=&type=) |
| GET | /v1/audit |
Query audit log (?action=&provider=&account_id=&symbol=&since=&until=) |
| GET | /v1/audit/stats |
Audit statistics |
| GET | /v1/audit/export |
Export audit log (JSON download) |
Funding
| Method | Path | Description |
|---|---|---|
| POST | /v1/fund/deposit |
Deposit via payment processor |
| POST | /v1/fund/withdraw |
Withdraw via payment processor |
| POST | /v1/fund/webhook/{processor} |
Payment processor webhook |
| GET | /v1/fund/processors |
List available processors |
Providers
| Method | Path | Description |
|---|---|---|
| GET | /v1/providers |
List registered providers |
| GET | /v1/providers/capabilities |
Provider capabilities (asset classes, fees, features) |
Settlement Engine
The prefunding pool enables instant crypto execution while ACH/wire settlement is pending.
User: "Buy 1 BTC" → Pool reserves $50k → Executes at market → ACH initiated
│
ACH clears (2-5 days) ────┤
→ Pool credit released │
│
ACH fails ────────────────┘
→ Auto-liquidate position
→ Recover pool capital
KYC-tiered instant buy limits:
| Tier | Instant Limit | Use Case |
|---|---|---|
| basic | $250 | Email-verified users |
| standard | $5,000 | ID-verified users |
| enhanced | $25,000 | Full KYC + accredited |
| institutional | $250,000 | Institutional accounts |
Margin thresholds (configurable): 20% warning, 30% margin call, 50% auto-liquidation.
Configuration
Required
At least one provider must be configured. Set the API key environment variables for each provider you want to use.
Environment Variables
| Variable | Default | Description |
|---|---|---|
BROKER_LISTEN |
:8090 |
HTTP listen address |
BROKER_API_KEY |
— | Initial API key to register |
BROKER_ORG_ID |
— | Organization ID for API key |
BROKER_DEV_MODE |
false |
Bypass auth (development only) |
ADMIN_USERNAME |
admin |
Admin login username |
ADMIN_PASSWORD |
— | Admin login password (hashed, never plaintext) |
ADMIN_SECRET |
— | JWT signing secret (required for production) |
Provider credentials — set the pair for each provider you want to enable:
| Provider | Variables |
|---|---|
| Alpaca | ALPACA_API_KEY, ALPACA_API_SECRET |
| Interactive Brokers | IBKR_ACCESS_TOKEN, IBKR_ACCOUNT_ID, IBKR_GATEWAY_URL, IBKR_CONSUMER_KEY |
| Coinbase | COINBASE_API_KEY, COINBASE_API_SECRET |
| Binance | BINANCE_API_KEY, BINANCE_API_SECRET |
| Kraken | KRAKEN_API_KEY, KRAKEN_API_SECRET |
| Gemini | GEMINI_API_KEY, GEMINI_API_SECRET |
| SFOX | SFOX_API_KEY |
| FalconX | FALCON_API_KEY, FALCON_API_SECRET, FALCON_PASSPHRASE |
| Fireblocks | FIREBLOCKS_API_KEY, FIREBLOCKS_PRIVATE_KEY |
| BitGo | BITGO_ACCESS_TOKEN, BITGO_ENTERPRISE |
| Circle | CIRCLE_API_KEY |
| Tradier | TRADIER_ACCESS_TOKEN, TRADIER_ACCOUNT_ID |
| Polygon.io | POLYGON_API_KEY |
| CurrencyCloud | CURRENCYCLOUD_LOGIN_ID, CURRENCYCLOUD_API_KEY |
| LMAX | LMAX_API_KEY, LMAX_USERNAME, LMAX_PASSWORD |
| Finix | FINIX_USERNAME, FINIX_PASSWORD |
| Braintree | BRAINTREE_PUBLIC_KEY, BRAINTREE_PRIVATE_KEY, BRAINTREE_MERCHANT_ID |
Build & Test
make build # Build binary
make test # Run tests
make test-race # Run tests with race detector
make lint # go vet
make docker # Build Docker image
make docker-push # Push to ghcr.io
Docker
docker build --platform linux/amd64 -t ghcr.io/luxfi/broker:latest .
docker run -p 8090:8090 -e ALPACA_API_KEY=... -e ALPACA_API_SECRET=... ghcr.io/luxfi/broker:latest
Image: ghcr.io/luxfi/broker — 7.5 MB, alpine-based, healthcheck on /healthz.
Project Structure
broker/
├── cmd/brokerd/ Entry point, provider wiring
├── pkg/
│ ├── api/ HTTP handlers, chi router, middleware
│ ├── admin/ JWT auth (HMAC-SHA256), admin users
│ ├── auth/ API key validation, permissions
│ ├── audit/ Immutable audit trail
│ ├── funding/ Deposit/withdraw via payment processors
│ ├── marketdata/ Real-time ticker aggregation, BBO
│ ├── provider/ Provider interface + 16 implementations
│ │ ├── alpaca/ Full Alpaca Broker API (100% coverage)
│ │ ├── binance/ Binance spot/margin
│ │ ├── bitgo/ BitGo custody + Prime
│ │ ├── circle/ Circle USDC operations
│ │ ├── coinbase/ Coinbase Advanced Trade
│ │ ├── currencycloud/ CurrencyCloud FX
│ │ ├── falcon/ FalconX RFQ
│ │ ├── finix/ Finix payments
│ │ ├── fireblocks/ Fireblocks custody
│ │ ├── gemini/ Gemini exchange
│ │ ├── ibkr/ Interactive Brokers
│ │ ├── kraken/ Kraken exchange
│ │ ├── lmax/ LMAX Digital
│ │ ├── polygon/ Polygon.io data
│ │ ├── sfox/ SFOX prime dealer
│ │ └── tradier/ Tradier equities
│ ├── risk/ Pre-trade risk engine
│ ├── router/ Smart order routing (net-price + VWAP)
│ ├── settlement/ Prefunding pool, instant buy, margin
│ ├── types/ Unified type definitions
│ └── ws/ WebSocket / SSE server
├── Dockerfile
├── Makefile
└── go.mod
Related Projects
| Module | Purpose |
|---|---|
| luxfi/compliance | KYC/AML, identity verification, regulatory frameworks |
| luxfi/bank | Customer apps, payments, admin dashboard |
| hanzoai/commerce | Payment processors (Plaid, Braintree, Stripe) |
| hanzoai/iam | Identity and access management (OAuth2/OIDC) |
License
Copyright 2024-2026 Lux Partners Limited. All rights reserved.