-
Notifications
You must be signed in to change notification settings - Fork 2
OmniProtocol Rewrite #691
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
OmniProtocol Rewrite #691
Changes from all commits
333fbfa
5fdf607
b8002a7
3309679
22314c8
c398aff
ca795e1
91e216c
a8170ef
ff87e55
4eedecc
73d0c6f
fb01281
6adfa19
0059896
836d9c5
b710db7
14d2ce0
99a4a49
1c53ad3
72b95f5
a5a09a4
a827c07
f1ea0ef
3b2bf09
afc52a5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -183,11 +183,11 @@ | |||||||||||||||||||
| ) { | ||||||||||||||||||||
| CategorizedLogger.getInstance().setMinLevel( | ||||||||||||||||||||
| level as | ||||||||||||||||||||
| | "debug" | ||||||||||||||||||||
| | "info" | ||||||||||||||||||||
| | "warning" | ||||||||||||||||||||
| | "error" | ||||||||||||||||||||
| | "critical", | ||||||||||||||||||||
| | "debug" | ||||||||||||||||||||
| | "info" | ||||||||||||||||||||
| | "warning" | ||||||||||||||||||||
| | "error" | ||||||||||||||||||||
| | "critical", | ||||||||||||||||||||
| ) | ||||||||||||||||||||
| log.info(`[MAIN] Log level set to: ${level}`) | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
|
|
@@ -257,7 +257,7 @@ | |||||||||||||||||||
| // Allow overriding pg port through RPC_PG_PORT | ||||||||||||||||||||
| indexState.PG_PORT = cfg.database.port | ||||||||||||||||||||
| // Allow overriding server port through RPC_PORT | ||||||||||||||||||||
| indexState.SERVER_PORT = cfg.server.rpcPort || cfg.server.serverPort | ||||||||||||||||||||
| indexState.SERVER_PORT = cfg.server.rpcPort | ||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
# Check the default value for rpcPort in defaults.ts
rg -n 'rpcPort' src/config/defaults.tsRepository: kynesyslabs/node Length of output: 82 🏁 Script executed: # Check the full defaults.ts to understand server config structure
head -50 src/config/defaults.tsRepository: kynesyslabs/node Length of output: 1281 🏁 Script executed: # Check if serverPort still exists in defaults
rg -n 'serverPort' src/config/defaults.tsRepository: kynesyslabs/node Length of output: 217 🏁 Script executed: # Look at the surrounding context in index.ts around line 260
sed -n '250,270p' src/index.tsRepository: kynesyslabs/node Length of output: 957 🏁 Script executed: # Check for any env var defaults for rpcPort
rg -n 'RPC_PORT|rpcPort' src/config/ --type tsRepository: kynesyslabs/node Length of output: 460 🏁 Script executed: # Check for any comments or git history about this change
rg -B5 -A5 'SERVER_PORT = cfg.server.rpcPort' src/index.tsRepository: kynesyslabs/node Length of output: 572 🏁 Script executed: # Check if RPC_PORT is documented as required
rg -i 'RPC_PORT' README.md .env.example .env src/config/Repository: kynesyslabs/node Length of output: 250 🏁 Script executed: # Look for any issue or comment about removing serverPort fallback
rg -i 'serverPort.*fallback|remove.*fallback|intentional' src/Repository: kynesyslabs/node Length of output: 602 Removed The assignment changed from This is inconsistent with the pattern used for Clarify whether this behavioral change is intentional and ensure that 🤖 Prompt for AI Agents |
||||||||||||||||||||
| // Allow overriding signaling server port through RPC_SIGNALING_PORT | ||||||||||||||||||||
| indexState.SIGNALING_SERVER_PORT = | ||||||||||||||||||||
| cfg.server.rpcSignalingPort || cfg.server.signalingServerPort | ||||||||||||||||||||
|
|
@@ -269,12 +269,13 @@ | |||||||||||||||||||
| ) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // MCP Server configuration | ||||||||||||||||||||
| indexState.MCP_SERVER_PORT = cfg.server.rpcMcpPort || cfg.server.mcpServerPort | ||||||||||||||||||||
| indexState.MCP_SERVER_PORT = | ||||||||||||||||||||
| cfg.server.rpcMcpPort || cfg.server.mcpServerPort | ||||||||||||||||||||
| indexState.MCP_ENABLED = cfg.core.mcpEnabled | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // OmniProtocol TCP Server configuration | ||||||||||||||||||||
| indexState.OMNI_ENABLED = cfg.omni.enabled | ||||||||||||||||||||
| indexState.OMNI_PORT = cfg.server.omniPort | ||||||||||||||||||||
| indexState.OMNI_PORT = await getNextAvailablePort(cfg.omni.port) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Setting the server port to the shared state | ||||||||||||||||||||
| getSharedState.serverPort = indexState.SERVER_PORT | ||||||||||||||||||||
|
|
@@ -305,6 +306,7 @@ | |||||||||||||||||||
| // Digest the arguments | ||||||||||||||||||||
| await digestArguments() | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // ANCHOR Preparing the main loop | ||||||||||||||||||||
| // ! Simplify this too | ||||||||||||||||||||
| async function preMainLoop() { | ||||||||||||||||||||
|
|
@@ -356,16 +358,16 @@ | |||||||||||||||||||
| // ANCHOR Looking for the genesis block | ||||||||||||||||||||
| log.info("[BOOTSTRAP] Looking for the genesis block") | ||||||||||||||||||||
| // INFO Now ensuring we have an initialized chain or initializing the genesis block | ||||||||||||||||||||
| await peerBootstrap(indexState.PeerList) | ||||||||||||||||||||
| await findGenesisBlock() | ||||||||||||||||||||
| await loadGenesisIdentities() | ||||||||||||||||||||
| log.info("[CHAIN] 🖥️ Found the genesis block") | ||||||||||||||||||||
|
|
||||||||||||||||||||
| log.info("[PEER] 🌐 Bootstrapping peers...") | ||||||||||||||||||||
| log.debug( | ||||||||||||||||||||
| "[PEER] Peer list: " + | ||||||||||||||||||||
| JSON.stringify(indexState.PeerList.map(p => p.identity)), | ||||||||||||||||||||
| JSON.stringify(indexState.PeerList.map(p => p.identity)), | ||||||||||||||||||||
| ) | ||||||||||||||||||||
| await peerBootstrap(indexState.PeerList) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Loading the peers | ||||||||||||||||||||
| //PeerList.push(ourselves) | ||||||||||||||||||||
|
|
@@ -378,8 +380,8 @@ | |||||||||||||||||||
|
|
||||||||||||||||||||
| log.info( | ||||||||||||||||||||
| "[PEER] 🌐 Peers loaded (" + | ||||||||||||||||||||
| indexState.peerManager.getPeers().length + | ||||||||||||||||||||
| ")", | ||||||||||||||||||||
| indexState.peerManager.getPeers().length + | ||||||||||||||||||||
| ")", | ||||||||||||||||||||
| ) | ||||||||||||||||||||
| // INFO: Set initial last block data | ||||||||||||||||||||
| const lastBlock = await Chain.getLastBlock() | ||||||||||||||||||||
|
|
@@ -453,29 +455,10 @@ | |||||||||||||||||||
| // Start OmniProtocol TCP server (optional) | ||||||||||||||||||||
| if (indexState.OMNI_ENABLED) { | ||||||||||||||||||||
| try { | ||||||||||||||||||||
| const omniServer = await startOmniProtocolServer({ | ||||||||||||||||||||
| enabled: true, | ||||||||||||||||||||
| port: indexState.OMNI_PORT, | ||||||||||||||||||||
| maxConnections: 1000, | ||||||||||||||||||||
| authTimeout: 5000, | ||||||||||||||||||||
| connectionTimeout: 600000, // 10 minutes | ||||||||||||||||||||
| // TLS configuration | ||||||||||||||||||||
| tls: { | ||||||||||||||||||||
| enabled: Config.getInstance().omni.tls.enabled, | ||||||||||||||||||||
| mode: (Config.getInstance().omni.tls.mode as "self-signed" | "ca") || "self-signed", | ||||||||||||||||||||
| certPath: Config.getInstance().omni.tls.certPath, | ||||||||||||||||||||
| keyPath: Config.getInstance().omni.tls.keyPath, | ||||||||||||||||||||
| caPath: Config.getInstance().omni.tls.caPath, | ||||||||||||||||||||
| minVersion: (Config.getInstance().omni.tls.minVersion as "TLSv1.2" | "TLSv1.3") || "TLSv1.3", | ||||||||||||||||||||
| }, | ||||||||||||||||||||
| // Rate limiting configuration | ||||||||||||||||||||
| rateLimit: { | ||||||||||||||||||||
| enabled: Config.getInstance().omni.rateLimit.enabled, | ||||||||||||||||||||
| maxConnectionsPerIP: Config.getInstance().omni.rateLimit.maxConnectionsPerIp, | ||||||||||||||||||||
| maxRequestsPerSecondPerIP: Config.getInstance().omni.rateLimit.maxRequestsPerSecondPerIp || 100, | ||||||||||||||||||||
| maxRequestsPerSecondPerIdentity: Config.getInstance().omni.rateLimit.maxRequestsPerSecondPerIdentity || 200, | ||||||||||||||||||||
| }, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| getSharedState.omniConfig.port = indexState.OMNI_PORT | ||||||||||||||||||||
| const omniServer = await startOmniProtocolServer( | ||||||||||||||||||||
| getSharedState.omniConfig, | ||||||||||||||||||||
| ) | ||||||||||||||||||||
| indexState.omniServer = omniServer | ||||||||||||||||||||
| log.info(`[CORE] OmniProtocol server started on port ${indexState.OMNI_PORT}`) | ||||||||||||||||||||
|
|
||||||||||||||||||||
|
|
@@ -492,6 +475,11 @@ | |||||||||||||||||||
| handleError(error, "NETWORK", { source: ErrorSource.OMNI_STARTUP }) | ||||||||||||||||||||
| // Continue without OmniProtocol (failsafe - falls back to HTTP) | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| if (!getSharedState.omniAdapter) { | ||||||||||||||||||||
| log.error("[CORE] Failed to start OmniProtocol server") | ||||||||||||||||||||
| process.exit(1) | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| log.info("[CORE] OmniProtocol server disabled (set OMNI_ENABLED=true to enable)") | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
@@ -736,7 +724,7 @@ | |||||||||||||||||||
| } else { | ||||||||||||||||||||
| // Non-TUI mode: set up Enter key listener to skip the wait | ||||||||||||||||||||
| // ONLY DO THIS IF STDIN IS TTY | ||||||||||||||||||||
| let cleanupStdin = () => { } | ||||||||||||||||||||
| let cleanupStdin = () => {} | ||||||||||||||||||||
|
|
||||||||||||||||||||
| if (process.stdin.isTTY) { | ||||||||||||||||||||
| const wasRawMode = process.stdin.isRaw | ||||||||||||||||||||
|
|
@@ -749,7 +737,9 @@ | |||||||||||||||||||
| const key = chunk.toString() | ||||||||||||||||||||
| if (key === "\r" || key === "\n" || key === "\u0003") { | ||||||||||||||||||||
| // Enter key or Ctrl+C | ||||||||||||||||||||
| if (Waiter.isWaiting(Waiter.keys.STARTUP_HELLO_PEER)) { | ||||||||||||||||||||
| if ( | ||||||||||||||||||||
| Waiter.isWaiting(Waiter.keys.STARTUP_HELLO_PEER) | ||||||||||||||||||||
| ) { | ||||||||||||||||||||
| Waiter.abort(Waiter.keys.STARTUP_HELLO_PEER) | ||||||||||||||||||||
| log.info( | ||||||||||||||||||||
| "[MAIN] Wait skipped by user, starting sync loop", | ||||||||||||||||||||
|
|
@@ -794,7 +784,9 @@ | |||||||||||||||||||
| // Start DTR relay retry service after background loop initialization | ||||||||||||||||||||
| // The service will wait for syncStatus to be true before actually processing | ||||||||||||||||||||
| if (getSharedState.PROD) { | ||||||||||||||||||||
| log.info("[CORE] [DTR] Initializing relay retry service (will start after sync)") | ||||||||||||||||||||
| log.info( | ||||||||||||||||||||
| "[CORE] [DTR] Initializing relay retry service (will start after sync)", | ||||||||||||||||||||
| ) | ||||||||||||||||||||
| // Service will check syncStatus internally before processing | ||||||||||||||||||||
| DTRManager.getInstance().start() | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
@@ -803,26 +795,37 @@ | |||||||||||||||||||
| try { | ||||||||||||||||||||
| await ParallelNetworks.getInstance().loadAllL2PS() | ||||||||||||||||||||
| } catch (error) { | ||||||||||||||||||||
| handleError(error, "CORE", { source: ErrorSource.L2PS_NETWORK_LOADING }) | ||||||||||||||||||||
| handleError(error, "CORE", { | ||||||||||||||||||||
| source: ErrorSource.L2PS_NETWORK_LOADING, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Start L2PS hash generation service (for L2PS participating nodes) | ||||||||||||||||||||
| // Note: l2psJoinedUids is populated during ParallelNetworks initialization | ||||||||||||||||||||
| if (getSharedState.l2psJoinedUids && getSharedState.l2psJoinedUids.length > 0) { | ||||||||||||||||||||
| if ( | ||||||||||||||||||||
| getSharedState.l2psJoinedUids && | ||||||||||||||||||||
| getSharedState.l2psJoinedUids.length > 0 | ||||||||||||||||||||
| ) { | ||||||||||||||||||||
| try { | ||||||||||||||||||||
| const l2psHashService = L2PSHashService.getInstance() | ||||||||||||||||||||
| await l2psHashService.start() | ||||||||||||||||||||
| log.info(`[CORE] [L2PS] Hash generation service started for ${getSharedState.l2psJoinedUids.length} L2PS networks`) | ||||||||||||||||||||
| log.info( | ||||||||||||||||||||
| `[CORE] [L2PS] Hash generation service started for ${getSharedState.l2psJoinedUids.length} L2PS networks`, | ||||||||||||||||||||
| ) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Start L2PS batch aggregator (batches transactions and submits to main mempool) | ||||||||||||||||||||
| const l2psBatchAggregator = L2PSBatchAggregator.getInstance() | ||||||||||||||||||||
| await l2psBatchAggregator.start() | ||||||||||||||||||||
| log.info("[CORE] [L2PS] Batch aggregator service started") | ||||||||||||||||||||
| } catch (error) { | ||||||||||||||||||||
| handleError(error, "CORE", { source: ErrorSource.L2PS_SERVICES_STARTUP }) | ||||||||||||||||||||
| handleError(error, "CORE", { | ||||||||||||||||||||
| source: ErrorSource.L2PS_SERVICES_STARTUP, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| log.info("[CORE] [L2PS] No L2PS networks joined, L2PS services not started") | ||||||||||||||||||||
| log.info( | ||||||||||||||||||||
| "[CORE] [L2PS] No L2PS networks joined, L2PS services not started", | ||||||||||||||||||||
| ) | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
@@ -852,7 +855,7 @@ | |||||||||||||||||||
| const forceExitTimeout = setTimeout(() => { | ||||||||||||||||||||
| log.warning("[CORE] Shutdown timeout exceeded, forcing exit...") | ||||||||||||||||||||
| process.exit(0) | ||||||||||||||||||||
| }, 5_000) | ||||||||||||||||||||
| }, 3_000) | ||||||||||||||||||||
|
Comment on lines
855
to
+858
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Force exit timeout (3s) may be too aggressive for cleanup. The timeout was reduced to 3 seconds, but the shutdown sequence includes multiple services with their own timeouts. For example, L2PS services at lines 882-883 each have a 3-second timeout ( Consider either:
Suggested fix: Increase timeout to 10 seconds const forceExitTimeout = setTimeout(() => {
log.warning("[CORE] Shutdown timeout exceeded, forcing exit...")
process.exit(0)
- }, 3_000)
+ }, 10_000)📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||
| // Don't let this timer itself keep the process alive | ||||||||||||||||||||
| if (forceExitTimeout.unref) forceExitTimeout.unref() | ||||||||||||||||||||
|
|
||||||||||||||||||||
|
|
@@ -861,7 +864,9 @@ | |||||||||||||||||||
| if (indexState.tuiManager) { | ||||||||||||||||||||
| try { | ||||||||||||||||||||
| indexState.tuiManager.stop() | ||||||||||||||||||||
| } catch (_) { /* ignore TUI errors during shutdown */ } | ||||||||||||||||||||
| } catch (_) { | ||||||||||||||||||||
| /* ignore TUI errors during shutdown */ | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
Check warning on line 869 in src/index.ts
|
||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Stop DTR manager if running (PROD only) | ||||||||||||||||||||
|
|
@@ -887,7 +892,9 @@ | |||||||||||||||||||
| try { | ||||||||||||||||||||
| await stopOmniProtocolServer() | ||||||||||||||||||||
| } catch (error) { | ||||||||||||||||||||
| handleError(error, "NETWORK", { source: ErrorSource.OMNI_SHUTDOWN }) | ||||||||||||||||||||
| handleError(error, "NETWORK", { | ||||||||||||||||||||
| source: ErrorSource.OMNI_SHUTDOWN, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
|
|
@@ -909,7 +916,9 @@ | |||||||||||||||||||
| await import("./features/tlsnotary") | ||||||||||||||||||||
| await shutdownTLSNotary() | ||||||||||||||||||||
| } catch (error) { | ||||||||||||||||||||
| handleError(error, "TLSN", { source: ErrorSource.TLSN_SHUTDOWN }) | ||||||||||||||||||||
| handleError(error, "TLSN", { | ||||||||||||||||||||
| source: ErrorSource.TLSN_SHUTDOWN, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
|
|
@@ -922,7 +931,9 @@ | |||||||||||||||||||
| getMetricsCollector().stop() | ||||||||||||||||||||
| indexState.metricsServer.stop() | ||||||||||||||||||||
| } catch (error) { | ||||||||||||||||||||
| handleError(error, "CORE", { source: ErrorSource.METRICS_SHUTDOWN }) | ||||||||||||||||||||
| handleError(error, "CORE", { | ||||||||||||||||||||
| source: ErrorSource.METRICS_SHUTDOWN, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
|
|
@@ -932,7 +943,9 @@ | |||||||||||||||||||
| try { | ||||||||||||||||||||
| indexState.rpcServer.stop() | ||||||||||||||||||||
| } catch (error) { | ||||||||||||||||||||
| handleError(error, "NETWORK", { source: ErrorSource.RPC_SHUTDOWN }) | ||||||||||||||||||||
| handleError(error, "NETWORK", { | ||||||||||||||||||||
| source: ErrorSource.RPC_SHUTDOWN, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
|
|
@@ -942,21 +955,29 @@ | |||||||||||||||||||
| try { | ||||||||||||||||||||
| indexState.signalingServer.disconnect() | ||||||||||||||||||||
| } catch (error) { | ||||||||||||||||||||
| handleError(error, "NETWORK", { source: ErrorSource.SIGNALING_SHUTDOWN }) | ||||||||||||||||||||
| handleError(error, "NETWORK", { | ||||||||||||||||||||
| source: ErrorSource.SIGNALING_SHUTDOWN, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Stop HTTP rate limiter cleanup interval | ||||||||||||||||||||
| try { | ||||||||||||||||||||
| const { RateLimiter: HttpRateLimiter } = await import("./libs/network/middleware/rateLimiter") | ||||||||||||||||||||
| const { RateLimiter: HttpRateLimiter } = | ||||||||||||||||||||
| await import("./libs/network/middleware/rateLimiter") | ||||||||||||||||||||
| HttpRateLimiter.getInstance().destroy() | ||||||||||||||||||||
| } catch (_) { /* may not be initialized */ } | ||||||||||||||||||||
| } catch (_) { | ||||||||||||||||||||
| /* may not be initialized */ | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
Check warning on line 971 in src/index.ts
|
||||||||||||||||||||
|
|
||||||||||||||||||||
| log.info("[CORE] Cleanup complete, exiting...") | ||||||||||||||||||||
| clearTimeout(forceExitTimeout) | ||||||||||||||||||||
| process.exit(0) | ||||||||||||||||||||
| } catch (error) { | ||||||||||||||||||||
| handleError(error, "CORE", { source: ErrorSource.GRACEFUL_SHUTDOWN, fatal: true }) | ||||||||||||||||||||
| handleError(error, "CORE", { | ||||||||||||||||||||
| source: ErrorSource.GRACEFUL_SHUTDOWN, | ||||||||||||||||||||
| fatal: true, | ||||||||||||||||||||
| }) | ||||||||||||||||||||
| clearTimeout(forceExitTimeout) | ||||||||||||||||||||
| process.exit(1) | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -55,9 +55,9 @@ export default class Transaction implements ITransaction { | |
| // Initialize with defaults or provided data | ||
| Object.assign(this, { | ||
| content: { | ||
| from_ed25519_address: null, | ||
| type: null, | ||
| from: "", | ||
| from_ed25519_address: "", | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
# Find all usages of from_ed25519_address with null-coalescing or equality checks
echo "=== Null coalescing patterns (will break) ==="
rg -n 'from_ed25519_address\s*\?\?' --type=ts
echo ""
echo "=== Strict equality checks (may be affected) ==="
rg -n 'from_ed25519_address\s*(===|!==)' --type=ts
echo ""
echo "=== Falsy checks (should work with both null and empty string) ==="
rg -n '(!|if\s*\()\s*\S*from_ed25519_address' --type=tsRepository: kynesyslabs/node Length of output: 699 🏁 Script executed: # 1. Read transaction.ts to see the type definition and default value
echo "=== transaction.ts around line 60 ==="
sed -n '50,70p' src/libs/blockchain/transaction.ts
# 2. Read subOperations.ts around line 60
echo ""
echo "=== subOperations.ts around line 60 ==="
sed -n '55,65p' src/libs/blockchain/routines/subOperations.ts
# 3. Read handleIdentityRequest.ts around line 63
echo ""
echo "=== handleIdentityRequest.ts around line 63 ==="
sed -n '55,75p' src/libs/network/routines/transactions/handleIdentityRequest.ts
# 4. Read consensus_rollback_smoke.ts around line 58
echo ""
echo "=== consensus_rollback_smoke.ts around line 58 ==="
sed -n '50,70p' better_testing/loadgen/src/features/consensus/consensus_rollback_smoke.tsRepository: kynesyslabs/node Length of output: 3209 Breaking change: In Additionally, in If intentional, audit all usages of 🤖 Prompt for AI Agents |
||
| to: "", | ||
| amount: null, | ||
| data: [null, null], | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Honor operator overrides for these feature defaults.
These assignments hard-force both stacks off for every run. Because they overwrite inherited env values and there is no positive CLI flag,
MONITORING_DISABLED=false ./runandTLSNOTARY_DISABLED=false ./runstill leave both features disabled.💡 Suggested fix
📝 Committable suggestion
🤖 Prompt for AI Agents