8.1 KiB
8.1 KiB
Track Feature Matrix
Feature flag mapping for SolaceScanScout Explorer tiered architecture.
Overview
Features are gated by track level. Users with higher track levels automatically have access to lower track features.
| Track | Level | Description |
|---|---|---|
| Track 1 | 1 | Public (no auth) - Basic explorer |
| Track 2 | 2 | Approved users - Full indexed explorer |
| Track 3 | 3 | Analytics users - Advanced analytics |
| Track 4 | 4 | Operators - Control panels |
UI Components → Track Requirements
Navigation & Layout
| Component | Track 1 | Track 2 | Track 3 | Track 4 |
|---|---|---|---|---|
| Home page | ✅ | ✅ | ✅ | ✅ |
| Blocks list | ✅ | ✅ | ✅ | ✅ |
| Transactions list | ✅ | ✅ | ✅ | ✅ |
| Address detail (basic) | ✅ | ✅ | ✅ | ✅ |
| Address detail (full) | ❌ | ✅ | ✅ | ✅ |
| Token balances | ❌ | ✅ | ✅ | ✅ |
| Transaction history | ❌ | ✅ | ✅ | ✅ |
| Internal transactions | ❌ | ✅ | ✅ | ✅ |
| Analytics dashboard | ❌ | ❌ | ✅ | ✅ |
| Flow graphs | ❌ | ❌ | ✅ | ✅ |
| Bridge analytics | ❌ | ❌ | ✅ | ✅ |
| Operator panel | ❌ | ❌ | ❌ | ✅ |
| Validator status | ❌ | ❌ | ❌ | ✅ |
| Protocol config | ❌ | ❌ | ❌ | ✅ |
Search & Discovery
| Feature | Track 1 | Track 2 | Track 3 | Track 4 |
|---|---|---|---|---|
| Basic search (block/tx/addr) | ✅ | ✅ | ✅ | ✅ |
| Enhanced search (tokens) | ❌ | ✅ | ✅ | ✅ |
| Search history | ❌ | ✅ | ✅ | ✅ |
| Saved addresses | ❌ | ✅ | ✅ | ✅ |
| Advanced filters | ❌ | ❌ | ✅ | ✅ |
Bridge Features
| Feature | Track 1 | Track 2 | Track 3 | Track 4 |
|---|---|---|---|---|
| Bridge status monitor | ✅ | ✅ | ✅ | ✅ |
| Bridge transfer history | ❌ | ✅ | ✅ | ✅ |
| Bridge analytics | ❌ | ❌ | ✅ | ✅ |
| Bridge control | ❌ | ❌ | ❌ | ✅ |
WETH Utilities
| Feature | Track 1 | Track 2 | Track 3 | Track 4 |
|---|---|---|---|---|
| WETH wrap/unwrap | ✅ | ✅ | ✅ | ✅ |
| WETH balance check | ✅ | ✅ | ✅ | ✅ |
| WETH history | ❌ | ✅ | ✅ | ✅ |
API Endpoints → Track Requirements
Track 1 Endpoints (Public)
GET /api/v1/track1/blocks/latest- Track 1GET /api/v1/track1/txs/latest- Track 1GET /api/v1/track1/block/:number- Track 1GET /api/v1/track1/tx/:hash- Track 1GET /api/v1/track1/address/:addr/balance- Track 1GET /api/v1/track1/bridge/status- Track 1
Track 2 Endpoints (Approved)
GET /api/v1/track2/address/:addr/txs- Track 2+GET /api/v1/track2/address/:addr/tokens- Track 2+GET /api/v1/track2/token/:contract- Track 2+GET /api/v1/track2/search?q=- Track 2+GET /api/v1/track2/address/:addr/internal-txs- Track 2+
Track 3 Endpoints (Analytics)
GET /api/v1/track3/analytics/flows- Track 3+GET /api/v1/track3/analytics/bridge- Track 3+GET /api/v1/track3/analytics/token-distribution- Track 3+GET /api/v1/track3/analytics/address-risk- Track 3+
Track 4 Endpoints (Operator)
GET /api/v1/track4/operator/bridge/events- Track 4 onlyGET /api/v1/track4/operator/validators- Track 4 onlyGET /api/v1/track4/operator/contracts- Track 4 onlyGET /api/v1/track4/operator/protocol-state- Track 4 only
Frontend Routes → Track Requirements
| Route | Track 1 | Track 2 | Track 3 | Track 4 |
|---|---|---|---|---|
/ (Home) |
✅ | ✅ | ✅ | ✅ |
/blocks |
✅ | ✅ | ✅ | ✅ |
/blocks/:number |
✅ | ✅ | ✅ | ✅ |
/transactions |
✅ | ✅ | ✅ | ✅ |
/transactions/:hash |
✅ | ✅ | ✅ | ✅ |
/address/:addr (basic) |
✅ | ✅ | ✅ | ✅ |
/address/:addr (full) |
❌ | ✅ | ✅ | ✅ |
/address/:addr/tokens |
❌ | ✅ | ✅ | ✅ |
/address/:addr/txs |
❌ | ✅ | ✅ | ✅ |
/token/:contract |
❌ | ✅ | ✅ | ✅ |
/analytics |
❌ | ❌ | ✅ | ✅ |
/analytics/flows |
❌ | ❌ | ✅ | ✅ |
/analytics/bridge |
❌ | ❌ | ✅ | ✅ |
/operator |
❌ | ❌ | ❌ | ✅ |
/operator/bridge |
❌ | ❌ | ❌ | ✅ |
/operator/validators |
❌ | ❌ | ❌ | ✅ |
Feature Flag Implementation
Backend Feature Flags
type FeatureFlag struct {
Name string
RequiredTrack int
Description string
}
var FeatureFlags = map[string]FeatureFlag{
"address_full_detail": {Name: "address_full_detail", RequiredTrack: 2},
"token_balances": {Name: "token_balances", RequiredTrack: 2},
"tx_history": {Name: "tx_history", RequiredTrack: 2},
"internal_txs": {Name: "internal_txs", RequiredTrack: 2},
"analytics_dashboard": {Name: "analytics_dashboard", RequiredTrack: 3},
"flow_tracking": {Name: "flow_tracking", RequiredTrack: 3},
"bridge_analytics": {Name: "bridge_analytics", RequiredTrack: 3},
"operator_panel": {Name: "operator_panel", RequiredTrack: 4},
"validator_status": {Name: "validator_status", RequiredTrack: 4},
"protocol_config": {Name: "protocol_config", RequiredTrack: 4},
}
Frontend Feature Flags
const FEATURE_FLAGS = {
ADDRESS_FULL_DETAIL: { track: 2 },
TOKEN_BALANCES: { track: 2 },
TX_HISTORY: { track: 2 },
INTERNAL_TXS: { track: 2 },
ANALYTICS_DASHBOARD: { track: 3 },
FLOW_TRACKING: { track: 3 },
BRIDGE_ANALYTICS: { track: 3 },
OPERATOR_PANEL: { track: 4 },
VALIDATOR_STATUS: { track: 4 },
PROTOCOL_CONFIG: { track: 4 },
};
Permission Mapping
Track 1 (Public)
{
"permissions": [
"explorer.read.blocks",
"explorer.read.transactions",
"explorer.read.address.basic",
"explorer.read.bridge.status",
"weth.wrap",
"weth.unwrap"
]
}
Track 2 (Approved)
{
"permissions": [
"explorer.read.blocks",
"explorer.read.transactions",
"explorer.read.address.full",
"explorer.read.tokens",
"explorer.read.tx_history",
"explorer.read.internal_txs",
"explorer.search.enhanced",
"explorer.read.bridge.status",
"weth.wrap",
"weth.unwrap"
]
}
Track 3 (Analytics)
{
"permissions": [
"explorer.read.blocks",
"explorer.read.transactions",
"explorer.read.address.full",
"explorer.read.tokens",
"explorer.read.tx_history",
"explorer.read.internal_txs",
"explorer.search.enhanced",
"explorer.read.bridge.status",
"analytics.read.flows",
"analytics.read.bridge",
"analytics.read.token_distribution",
"analytics.read.address_risk",
"weth.wrap",
"weth.unwrap"
]
}
Track 4 (Operator)
{
"permissions": [
"explorer.read.blocks",
"explorer.read.transactions",
"explorer.read.address.full",
"explorer.read.tokens",
"explorer.read.tx_history",
"explorer.read.internal_txs",
"explorer.search.enhanced",
"explorer.read.bridge.status",
"analytics.read.flows",
"analytics.read.bridge",
"analytics.read.token_distribution",
"analytics.read.address_risk",
"operator.read.bridge_events",
"operator.read.validators",
"operator.read.contracts",
"operator.read.protocol_state",
"operator.write.bridge_control",
"weth.wrap",
"weth.unwrap"
]
}
Feature Gate Logic
Backend
func HasAccess(userTrack int, requiredTrack int) bool {
return userTrack >= requiredTrack
}
Frontend
function hasAccess(userTrack, requiredTrack) {
return userTrack >= requiredTrack;
}
function isFeatureEnabled(featureName, userTrack) {
const feature = FEATURE_FLAGS[featureName];
if (!feature) return false;
return hasAccess(userTrack, feature.track);
}
Feature Flag API Endpoint
GET /api/v1/features
Get available features for current user.
Response:
{
"track": 2,
"features": {
"address_full_detail": true,
"token_balances": true,
"tx_history": true,
"internal_txs": true,
"analytics_dashboard": false,
"flow_tracking": false,
"bridge_analytics": false,
"operator_panel": false,
"validator_status": false,
"protocol_config": false
},
"permissions": [...]
}