@@ -13,12 +13,16 @@ import { blockDebugInProduction } from '../middleware/debugGate.js'
1313import { writeRateLimiter } from '../middleware/rateLimit.js'
1414import { ConflictError } from '../types/index.js'
1515import { getQueueMetrics } from '../queue/queueMetrics.js'
16+ import { getFeatureFlags , getPublicFeatureFlags } from '../config/featureFlags.js'
1617
1718const router = Router ( )
1819const stellarService = new StellarService ( )
1920const reflectorService = new ReflectorService ( )
2021const rebalanceHistoryService = new RebalanceHistoryService ( )
2122const riskManagementService = new RiskManagementService ( )
23+ const featureFlags = getFeatureFlags ( )
24+ const publicFeatureFlags = getPublicFeatureFlags ( )
25+ const deploymentMode = featureFlags . demoMode ? 'demo' : 'production'
2226
2327// Import autoRebalancer from index.js (will be available after server starts)
2428let autoRebalancer : any = null
@@ -85,16 +89,17 @@ router.get('/health', (req, res) => {
8589 res . json ( {
8690 status : 'ok' ,
8791 timestamp : new Date ( ) . toISOString ( ) ,
88- mode : 'demo' ,
92+ mode : deploymentMode ,
8993 features : {
9094 contract_deployed : true ,
9195 real_price_feeds : true ,
9296 automatic_monitoring : true ,
9397 circuit_breakers : true ,
94- demo_portfolios : true ,
98+ demo_portfolios : featureFlags . demoMode ,
9599 risk_management : true ,
96100 rebalance_history : true ,
97- auto_rebalancer : autoRebalancer ? autoRebalancer . getStatus ( ) . isRunning : false
101+ auto_rebalancer : autoRebalancer ? autoRebalancer . getStatus ( ) . isRunning : false ,
102+ flags : publicFeatureFlags
98103 }
99104 } )
100105} )
@@ -150,14 +155,16 @@ router.post('/portfolio', writeRateLimiter, async (req, res) => {
150155 userAddress,
151156 allocations,
152157 threshold,
153- mode : 'demo'
158+ mode : deploymentMode
154159 } )
155160
156161 res . json ( {
157162 portfolioId,
158163 status : 'created' ,
159- mode : 'demo' ,
160- message : 'Portfolio created with simulated $10,000 balance'
164+ mode : deploymentMode ,
165+ message : featureFlags . demoMode
166+ ? 'Portfolio created with simulated $10,000 balance'
167+ : 'Portfolio created with real on-chain balances'
161168 } )
162169 } catch ( error ) {
163170 logger . error ( 'Failed to create portfolio' , { error : getErrorObject ( error ) } )
@@ -193,7 +200,7 @@ router.get('/portfolio/:id', async (req, res) => {
193200 portfolio,
194201 prices,
195202 riskMetrics,
196- mode : 'demo' ,
203+ mode : deploymentMode ,
197204 lastUpdated : new Date ( ) . toISOString ( )
198205 } )
199206 } catch ( error ) {
@@ -322,7 +329,7 @@ router.post('/portfolio/:id/rebalance', writeRateLimiter, async (req, res) => {
322329 res . status ( responseStatus ) . json ( {
323330 result,
324331 status : result . status === 'failed' ? 'failed' : 'completed' ,
325- mode : 'demo' ,
332+ mode : deploymentMode ,
326333 message : result . status === 'failed'
327334 ? 'Rebalance execution failed safely'
328335 : result . status === 'partial'
@@ -578,7 +585,14 @@ router.get('/prices', async (req, res) => {
578585 } catch ( error ) {
579586 console . error ( '[ERROR] Prices endpoint failed:' , error )
580587
581- // Always return valid fallback data in correct format
588+ if ( ! featureFlags . allowFallbackPrices ) {
589+ return res . status ( 503 ) . json ( {
590+ success : false ,
591+ error : 'Price feeds unavailable and ALLOW_FALLBACK_PRICES is disabled'
592+ } )
593+ }
594+
595+ // Return explicit fallback data only when feature flag allows it.
582596 const fallbackPrices = {
583597 XLM : { price : 0.358878 , change : - 0.60 , timestamp : Date . now ( ) / 1000 , source : 'fallback' } ,
584598 BTC : { price : 111150 , change : 0.23 , timestamp : Date . now ( ) / 1000 , source : 'fallback' } ,
@@ -817,8 +831,13 @@ router.get('/system/status', async (req, res) => {
817831 const circuitBreakers = riskManagementService . getCircuitBreakerStatus ( )
818832
819833 // Check API health
820- const prices = await reflectorService . getCurrentPrices ( )
821- const priceSourcesHealthy = Object . keys ( prices ) . length > 0
834+ let priceSourcesHealthy = false
835+ try {
836+ const prices = await reflectorService . getCurrentPrices ( )
837+ priceSourcesHealthy = Object . keys ( prices ) . length > 0
838+ } catch {
839+ priceSourcesHealthy = false
840+ }
822841
823842 // Auto-rebalancer status
824843 const autoRebalancerStatus = autoRebalancer ? autoRebalancer . getStatus ( ) : { isRunning : false }
@@ -827,14 +846,14 @@ router.get('/system/status', async (req, res) => {
827846 res . json ( {
828847 success : true ,
829848 system : {
830- status : 'operational' ,
849+ status : priceSourcesHealthy ? 'operational' : 'degraded ',
831850 uptime : process . uptime ( ) ,
832851 timestamp : new Date ( ) . toISOString ( ) ,
833852 version : '1.0.0'
834853 } ,
835854 portfolios : {
836855 total : portfolioCount ,
837- active : portfolioCount // Assuming all are active for demo
856+ active : portfolioCount
838857 } ,
839858 rebalanceHistory : historyStats ,
840859 riskManagement : {
@@ -853,7 +872,8 @@ router.get('/system/status', async (req, res) => {
853872 webSockets : true ,
854873 autoRebalancing : autoRebalancerStatus . isRunning ,
855874 stellarNetwork : true
856- }
875+ } ,
876+ featureFlags : publicFeatureFlags
857877 } )
858878 } catch ( error ) {
859879 console . error ( '[ERROR] Failed to get system status:' , error )
0 commit comments