Skip to content

release: merge dev into main (2026-04-20) - #1487

Merged
shinchan-zhai merged 17 commits into
mainfrom
dev
Apr 19, 2026
Merged

shinchan-zhai merged 17 commits into
mainfrom
dev

Conversation

@shinchan-zhai

Copy link
Copy Markdown
Collaborator

Summary

Test plan

  • Reviewed Go backend changes — no regressions
  • Reviewed frontend router refactor — all routes preserved
  • OKX margin mode has 247-line test coverage

🤖 Generated with Claude Code

deanokk and others added 17 commits April 11, 2026 01:09
…tions (#1461)

Co-authored-by: Dean <afei.wuhao@gmail.com>
Users with existing wallets could not switch AI models because the
"Start Trading" button required a valid private key even when one was
already configured. Now the button is enabled when hasExistingWallet
is true, and handleSubmit passes an empty key so the backend preserves
the existing key.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…h components (#1470)

Co-authored-by: Dean <afei.wuhao@gmail.com>
…y validation

Added validation for the claw402 model's wallet key during strategy test runs. If the selected AI model is claw402, the server now checks for a valid wallet key and returns appropriate error messages if it's missing or if the model fails to load. This ensures better error handling and user feedback when working with AI models.
…ling

Refactored the strategy handling logic to encapsulate claw402 wallet key retrieval in a new method, `resolveStrategyDataWalletKey`. This improves code readability and maintains consistent error handling for missing or invalid wallet keys during strategy test runs. The changes enhance the overall robustness of the AI model integration.
Implemented a new method, `resolveTraderDataWalletKey`, to retrieve the claw402 wallet key based on the selected AI model and user ID. This enhancement allows for better integration of the claw402 model within the trader configuration, ensuring that the correct wallet key is used for trading operations. The `AutoTraderConfig` struct has been updated to include the new `Claw402WalletKey` field, improving the overall handling of wallet keys in the trading process.
* chore: ignore nofx-server build artifact

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(claw402): preflight USDC balance before AI calls

Short-circuit claw402 Call/CallWithRequestFull when the wallet balance
can't cover the estimated cost of the call, surfacing ErrInsufficientFunds
instead of letting x402 fail mid-flight after the sign step.

- wallet: cached balance lookup (30s TTL, per-address mutex) to avoid
  hammering the Base RPC; separate error-returning and display-only APIs
  so callers can distinguish zero balance from an unreachable RPC.
- claw402: 1.5× safety multiplier on the flat per-call estimate, 4.0×
  for reasoner models whose chain-of-thought cost can blow past the
  flat rate. Fail-open on RPC errors — x402 still gates actually-empty
  wallets, and we prefer availability over extra strictness.
- shortAddr redacts the wallet in error strings to avoid leaking the
  full address into telemetry bundles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix(telemetry): report token usage for SSE streaming paths

ParseSSEStream already parsed the usage block from SSE chunks but only
printed it, so claw402 streaming calls (and native streaming) never
fired TokenUsageCallback. GA4 therefore undercounted AI usage on the
streaming path.

Return the parsed usage from ParseSSEStream and have both callers fire
the callback with their own Provider/Model.

* chore: drop leftover debug Printf in ParseSSEStream

Telemetry is now wired via TokenUsageCallback, so the Printf is
redundant noise in the stream path.
Google discontinued gemini-3-pro-preview on 2026-03-26 and directs all
callers to gemini-3.1-pro / gemini-3.1-pro-preview. Users on their own
API key were getting errors from the native Gemini endpoint because the
provider default pointed at the retired ID. Claw402 was unaffected
because its route map already used gemini-3.1-pro.

Align both the native provider default and the handler's preset list
with gemini-3.1-pro so every code path sends a live model ID.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…KX margin mode tests

- Move duplicated claw402 wallet resolution logic into store.AIModelStore.ResolveClaw402WalletKey
- api/strategy.go and manager/trader_manager.go now delegate to the shared method
- Add detailed doc comment on OKX SetMarginMode explaining the local-state-only approach
  and why the legacy /api/v5/account/set-isolated-mode endpoint is not called
- Add 3 new test cases: cross mode leverage, OpenShort tdMode, SetTakeProfit tdMode
…a claw402 wallet (#1476)

Merges PR #1476 from deanokk with the following additions:
- OKX margin mode fix: cross/isolated honored end-to-end via mgnMode/tdMode
- claw402 wallet routing fix: trader path now explicitly resolves user wallet
- refactor: ResolveClaw402WalletKey extracted to store layer (no duplication)
- OKX SetMarginMode documented as local-state-only (no legacy API call)
- OKX margin mode tests expanded: cross mode, OpenShort, SetTakeProfit
…en (#1481)

After #1470 moved routing into react-router, SetupPage is rendered at two
different tree positions (top-level guard + /setup Route). When register
success flushSync-sets `user`, the top-level guard stops matching and the
Route-level SetupPage mounts as a new instance, re-running its cleanup
useEffect and removing the auth_token that handlePostAuthSuccess just wrote.
Subsequent requests 401 and bounce the user back to /login.

Redirect /setup to /welcome when user is already set so SetupPage is never
re-mounted during the auth transition.
Some RPC implementations return explicit "error": null on success.
json.RawMessage deserializes this as the 4-byte literal "null", so
len() > 0 was true, causing every balance query to fail with
"rpc error: null". Skip the null literal to avoid false positives.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs(README): add quick demo section with video link and image

* docs(README): update demo video link

* docs(i18n): add quick demo section with video link and image for multiple languages

---------

Co-authored-by: Dean <afei.wuhao@gmail.com>
@shinchan-zhai
shinchan-zhai merged commit c6d9ef4 into main Apr 19, 2026
28 checks passed
@github-actions

Copy link
Copy Markdown

⚠️ PR Title Format Suggestion

Your PR title doesn't follow the Conventional Commits format, but this won't block your PR from being merged.

Current title: release: merge dev into main (2026-04-20)

Recommended format: type(scope): description

Valid types:

feat, fix, docs, style, refactor, perf, test, chore, ci, security, build

Common scopes (optional):

exchange, trader, ai, api, ui, frontend, backend, security, deps, workflow, github, actions, config, docker, build, release

Examples:

  • feat(trader): add new trading strategy
  • fix(api): resolve authentication issue
  • docs: update README
  • chore(deps): update dependencies
  • ci(workflow): improve GitHub Actions

Note: This is a suggestion to improve consistency. Your PR can still be reviewed and merged.


This is an automated comment. You can update the PR title anytime.

@github-actions

Copy link
Copy Markdown

🚨 This PR is large (>4242 lines changed). Please consider breaking it into smaller, focused PRs for easier review.

@cla-assistant

cla-assistant Bot commented Apr 19, 2026

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.
1 out of 4 committers have signed the CLA.

✅ deanokk
❌ root
❌ Dean-afei
❌ shinchan-zhai


root seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

@github-actions

Copy link
Copy Markdown

🐳 Docker Build Check Results

AMD64 builds: ✅ success
ARM64 build (native runner): ✅ success

🎉 All Docker builds passed!

✨ Using GitHub native ARM64 runners - 3x faster than emulation!

After merge, full multi-arch builds will run in ~10-12 minutes.

Checked: Backend (amd64 + arm64 native), Frontend (amd64) | Powered by GitHub ARM64 Runners

@github-actions

Copy link
Copy Markdown

🔴 Go Test Coverage Report

Total Coverage: 10.7% (needs improvement)

Coverage

📊 Detailed Coverage Report (click to expand)

Coverage by Package

nofx/api/crypto_handler.go:18:				NewCryptoHandler			0.0%
nofx/api/crypto_handler.go:27:				HandleGetCryptoConfig			0.0%
nofx/api/crypto_handler.go:37:				HandleGetPublicKey			0.0%
nofx/api/crypto_handler.go:59:				HandleDecryptSensitiveData		0.0%
nofx/api/crypto_handler.go:86:				isValidPrivateKey			0.0%
nofx/api/errors.go:17:					writeAPIError				0.0%
nofx/api/errors.go:32:					SafeError				0.0%
nofx/api/errors.go:41:					SafeErrorWithDetails			0.0%
nofx/api/errors.go:50:					SafeInternalError			0.0%
nofx/api/errors.go:57:					SafeBadRequest				0.0%
nofx/api/errors.go:61:					SafeBadRequestWithDetails		0.0%
nofx/api/errors.go:66:					SafeNotFound				0.0%
nofx/api/errors.go:71:					SafeUnauthorized			0.0%
nofx/api/errors.go:76:					SafeForbidden				0.0%
nofx/api/errors.go:81:					IsSensitiveError			0.0%
nofx/api/errors.go:118:					SanitizeError				0.0%
nofx/api/exchange_account_state.go:61:			NewExchangeAccountStateCache		0.0%
nofx/api/exchange_account_state.go:67:			Get					0.0%
nofx/api/exchange_account_state.go:77:			Set					0.0%
nofx/api/exchange_account_state.go:86:			Invalidate				0.0%
nofx/api/exchange_account_state.go:92:			cloneExchangeAccountStates		0.0%
nofx/api/exchange_account_state.go:100:			handleGetExchangeAccountStates		0.0%
nofx/api/exchange_account_state.go:112:			getExchangeAccountStates		0.0%
nofx/api/exchange_account_state.go:148:			probeExchangeAccountState		0.0%
nofx/api/exchange_account_state.go:225:			buildExchangeProbeTrader		0.0%
nofx/api/exchange_account_state.go:266:			extractExchangeTotalEquity		0.0%
nofx/api/exchange_account_state.go:271:			extractFirstNumeric			0.0%
nofx/api/exchange_account_state.go:300:			formatDisplayBalance			0.0%
nofx/api/exchange_account_state.go:312:			accountAssetForExchange			0.0%
nofx/api/exchange_account_state.go:321:			missingExchangeCredentials		0.0%
nofx/api/exchange_account_state.go:350:			classifyExchangeProbeError		0.0%
nofx/api/exchange_account_state.go:372:			limitErrorMessage			0.0%
nofx/api/handler_ai_cost.go:10:				handleGetAICosts			0.0%
nofx/api/handler_ai_cost.go:33:				handleGetAICostsSummary			0.0%
nofx/api/handler_ai_model.go:49:			handleGetModelConfigs			0.0%
nofx/api/handler_ai_model.go:108:			handleUpdateModelConfigs		0.0%
nofx/api/handler_ai_model.go:210:			handleGetSupportedModels		0.0%
nofx/api/handler_competition.go:17:			handleDecisions				0.0%
nofx/api/handler_competition.go:41:			handleLatestDecisions			0.0%
nofx/api/handler_competition.go:81:			handleStatistics			0.0%
nofx/api/handler_competition.go:104:			handleCompetition			0.0%
nofx/api/handler_competition.go:124:			handleEquityHistory			0.0%
nofx/api/handler_competition.go:184:			handlePublicTraderList			0.0%
nofx/api/handler_competition.go:228:			handlePublicCompetition			0.0%
nofx/api/handler_competition.go:239:			handleTopTraders			0.0%
nofx/api/handler_competition.go:251:			handleEquityHistoryBatch		0.0%
nofx/api/handler_competition.go:321:			getEquityHistoryForTraders		0.0%
nofx/api/handler_competition.go:441:			handleGetPublicTraderConfig		0.0%
nofx/api/handler_exchange.go:80:			handleGetExchangeConfigs		0.0%
nofx/api/handler_exchange.go:120:			handleUpdateExchangeConfigs		0.0%
nofx/api/handler_exchange.go:215:			handleCreateExchange			0.0%
nofx/api/handler_exchange.go:299:			handleDeleteExchange			0.0%
nofx/api/handler_exchange.go:341:			handleGetSupportedExchanges		0.0%
nofx/api/handler_klines.go:23:				handleKlines				0.0%
nofx/api/handler_klines.go:84:				getKlinesFromCoinank			0.0%
nofx/api/handler_klines.go:209:				getKlinesFromAlpaca			0.0%
nofx/api/handler_klines.go:242:				getKlinesFromTwelveData			0.0%
nofx/api/handler_klines.go:284:				getKlinesFromHyperliquid		0.0%
nofx/api/handler_klines.go:324:				handleSymbols				0.0%
nofx/api/handler_onboarding.go:42:			handleBeginnerOnboarding		0.0%
nofx/api/handler_onboarding.go:95:			handleCurrentBeginnerWallet		0.0%
nofx/api/handler_onboarding.go:154:			resolveBeginnerWallet			0.0%
nofx/api/handler_onboarding.go:208:			findConfiguredClaw402ModelID		0.0%
nofx/api/handler_onboarding.go:223:			walletAddressFromPrivateKey		0.0%
nofx/api/handler_onboarding.go:240:			persistBeginnerWalletEnv		0.0%
nofx/api/handler_onboarding.go:271:			uniqueEnvPaths				0.0%
nofx/api/handler_onboarding.go:285:			upsertEnvFile				0.0%
nofx/api/handler_order.go:14:				handleTraderList			0.0%
nofx/api/handler_order.go:60:				handleGetTraderConfig			0.0%
nofx/api/handler_order.go:111:				handleStatus				0.0%
nofx/api/handler_order.go:129:				handleAccount				0.0%
nofx/api/handler_order.go:159:				handlePositions				0.0%
nofx/api/handler_order.go:182:				handlePositionHistory			0.0%
nofx/api/handler_order.go:234:				handleTrades				0.0%
nofx/api/handler_order.go:289:				handleOrders				0.0%
nofx/api/handler_order.go:334:				handleOrderFills			0.0%
nofx/api/handler_order.go:371:				handleOpenOrders			0.0%
nofx/api/handler_telegram.go:10:			handleGetTelegramConfig			0.0%
nofx/api/handler_telegram.go:44:			handleUpdateTelegramConfig		0.0%
nofx/api/handler_telegram.go:75:			handleUnbindTelegram			0.0%
nofx/api/handler_telegram.go:84:			handleUpdateTelegramModel		0.0%
nofx/api/handler_trader.go:57:				formatTraderCreationError		0.0%
nofx/api/handler_trader.go:64:				traderCreationRequestError		0.0%
nofx/api/handler_trader.go:68:				exchangeDisplayName			0.0%
nofx/api/handler_trader.go:81:				missingExchangeFields			0.0%
nofx/api/handler_trader.go:134:				mapStringPairs				0.0%
nofx/api/handler_trader.go:146:				validateExchangeForTraderCreation	0.0%
nofx/api/handler_trader.go:183:				classifyTraderSetupReason		0.0%
nofx/api/handler_trader.go:221:				humanizeTraderSetupReason		0.0%
nofx/api/handler_trader.go:226:				traderSetupReasonParams			0.0%
nofx/api/handler_trader.go:248:				describeTraderLoadError			0.0%
nofx/api/handler_trader.go:267:				describeTraderCreationWarning		0.0%
nofx/api/handler_trader.go:280:				describeTraderStartError		0.0%
nofx/api/handler_trader.go:293:				formatTraderStartError			0.0%
nofx/api/handler_trader.go:301:				handleCreateTrader			0.0%
nofx/api/handler_trader.go:547:				handleUpdateTrader			0.0%
nofx/api/handler_trader.go:711:				handleDeleteTrader			0.0%
nofx/api/handler_trader.go:739:				handleStartTrader			0.0%
nofx/api/handler_trader.go:836:				handleStopTrader			0.0%
nofx/api/handler_trader_config.go:12:			handleUpdateTraderPrompt		0.0%
nofx/api/handler_trader_config.go:45:			handleToggleCompetition			0.0%
nofx/api/handler_trader_status.go:26:			handleGetGridRiskInfo			0.0%
nofx/api/handler_trader_status.go:40:			handleSyncBalance			0.0%
nofx/api/handler_trader_status.go:123:			handleClosePosition			0.0%
nofx/api/handler_trader_status.go:282:			recordClosePositionOrder		0.0%
nofx/api/handler_trader_status.go:389:			pollAndUpdateOrderStatus		0.0%
nofx/api/handler_trader_status.go:477:			pollLighterTradeHistory			0.0%
nofx/api/handler_trader_status.go:484:			getSideFromAction			0.0%
nofx/api/handler_user.go:19:				handleLogout				0.0%
nofx/api/handler_user.go:49:				handleRegister				0.0%
nofx/api/handler_user.go:131:				handleLogin				0.0%
nofx/api/handler_user.go:171:				handleChangePassword			0.0%
nofx/api/handler_user.go:193:				handleResetPassword			0.0%
nofx/api/handler_user.go:232:				handleResetAccount			0.0%
nofx/api/handler_user.go:256:				adoptOrphanRecords			0.0%
nofx/api/handler_user.go:274:				initUserDefaultConfigs			0.0%
nofx/api/handler_user.go:283:				createDefaultStrategies			0.0%
nofx/api/handler_wallet.go:29:				handleWalletValidate			0.0%
nofx/api/handler_wallet.go:101:				handleWalletGenerate			0.0%
nofx/api/handler_wallet.go:118:				checkClaw402Health			0.0%
nofx/api/route_registry.go:22:				route					0.0%
nofx/api/route_registry.go:28:				routeWithSchema				0.0%
nofx/api/route_registry.go:50:				GetAPIDocs				0.0%
nofx/api/server.go:32:					NewServer				0.0%
nofx/api/server.go:60:					corsMiddleware				0.0%
nofx/api/server.go:76:					setupRoutes				0.0%
nofx/api/server.go:365:					handleHealth				0.0%
nofx/api/server.go:373:					handleGetSystemConfig			0.0%
nofx/api/server.go:383:					handleGetServerIP			0.0%
nofx/api/server.go:405:					getPublicIPFromAPI			0.0%
nofx/api/server.go:445:					getPublicIPFromInterface		0.0%
nofx/api/server.go:490:					isPrivateIP				0.0%
nofx/api/server.go:512:					getTraderFromQuery			0.0%
nofx/api/server.go:542:					authMiddleware				0.0%
nofx/api/server.go:585:					Start					0.0%
nofx/api/server.go:621:					Shutdown				0.0%
nofx/api/server.go:631:					SetTelegramReloadCh			0.0%
nofx/api/strategy.go:21:				validateStrategyConfig			0.0%
nofx/api/strategy.go:35:				handleEstimateTokens			0.0%
nofx/api/strategy.go:49:				handlePublicStrategies			0.0%
nofx/api/strategy.go:86:				handleGetStrategies			0.0%
nofx/api/strategy.go:125:				handleGetStrategy			0.0%
nofx/api/strategy.go:157:				handleCreateStrategy			0.0%
nofx/api/strategy.go:226:				handleUpdateStrategy			0.0%
nofx/api/strategy.go:337:				handleDeleteStrategy			0.0%
nofx/api/strategy.go:355:				handleActivateStrategy			0.0%
nofx/api/strategy.go:373:				handleDuplicateStrategy			0.0%
nofx/api/strategy.go:404:				handleGetActiveStrategy			0.0%
nofx/api/strategy.go:434:				handleGetDefaultStrategyConfig		0.0%
nofx/api/strategy.go:447:				handlePreviewPrompt			0.0%
nofx/api/strategy.go:496:				handleStrategyTestRun			0.0%
nofx/api/strategy.go:669:				runRealAITest				0.0%
nofx/api/strategy.go:710:				resolveStrategyDataWalletKey		0.0%
nofx/api/utils.go:7:					MaskSensitiveString			100.0%
nofx/api/utils.go:19:					SanitizeModelConfigForLog		100.0%
nofx/api/utils.go:38:					SanitizeExchangeConfigForLog		76.2%
nofx/api/utils.go:91:					MaskEmail				100.0%
nofx/auth/auth.go:26:					SetJWTSecret				0.0%
nofx/auth/auth.go:31:					BlacklistToken				0.0%
nofx/auth/auth.go:52:					IsTokenBlacklisted			0.0%
nofx/auth/auth.go:73:					HashPassword				0.0%
nofx/auth/auth.go:79:					CheckPassword				0.0%
nofx/auth/auth.go:85:					GenerateJWT				0.0%
nofx/auth/auth.go:102:					ValidateJWT				0.0%
nofx/config/config.go:49:				Init					0.0%
nofx/config/config.go:140:				Get					0.0%
nofx/crypto/crypto.go:56:				NewCryptoService			0.0%
nofx/crypto/crypto.go:77:				loadRSAPrivateKeyFromEnv		0.0%
nofx/crypto/crypto.go:90:				loadDataKeyFromEnv			0.0%
nofx/crypto/crypto.go:109:				ParseRSAPrivateKeyFromPEM		0.0%
nofx/crypto/crypto.go:134:				decodePossibleKey			0.0%
nofx/crypto/crypto.go:153:				normalizeAESKey				0.0%
nofx/crypto/crypto.go:167:				HasDataKey				0.0%
nofx/crypto/crypto.go:171:				GetPublicKeyPEM				0.0%
nofx/crypto/crypto.go:185:				EncryptForStorage			0.0%
nofx/crypto/crypto.go:219:				DecryptFromStorage			0.0%
nofx/crypto/crypto.go:269:				IsEncryptedStorageValue			0.0%
nofx/crypto/crypto.go:273:				composeAAD				0.0%
nofx/crypto/crypto.go:280:				isEncryptedStorageValue			0.0%
nofx/crypto/crypto.go:284:				DecryptPayload				0.0%
nofx/crypto/crypto.go:351:				DecryptSensitiveData			0.0%
nofx/crypto/crypto.go:361:				GenerateKeyPair				0.0%
nofx/crypto/crypto.go:389:				GenerateDataKey				0.0%
nofx/crypto/crypto.go:405:				SetGlobalCryptoService			0.0%
nofx/crypto/crypto.go:415:				Scan					0.0%
nofx/crypto/crypto.go:449:				Value					0.0%
nofx/crypto/crypto.go:467:				String					0.0%
nofx/hook/hooks.go:14:					HookExec				0.0%
nofx/hook/hooks.go:30:					RegisterHook				0.0%
nofx/hook/http_client_hook.go:13:			Error					0.0%
nofx/hook/http_client_hook.go:20:			GetResult				0.0%
nofx/hook/ip_hook.go:10:				Error					0.0%
nofx/hook/ip_hook.go:14:				GetResult				0.0%
nofx/hook/trader_hook.go:15:				Error					0.0%
nofx/hook/trader_hook.go:22:				GetResult				0.0%
nofx/hook/trader_hook.go:32:				Error					0.0%
nofx/hook/trader_hook.go:39:				GetResult				0.0%
nofx/kernel/engine.go:191:				NewStrategyEngine			0.0%
nofx/kernel/engine.go:228:				GetRiskControlConfig			0.0%
nofx/kernel/engine.go:233:				GetLanguage				0.0%
nofx/kernel/engine.go:246:				GetConfig				0.0%
nofx/kernel/engine.go:255:				GetCandidateCoins			0.0%
nofx/kernel/engine.go:450:				filterExcludedCoins			0.0%
nofx/kernel/engine.go:475:				getAI500Coins				0.0%
nofx/kernel/engine.go:495:				getOITopCoins				0.0%
nofx/kernel/engine.go:519:				getOILowCoins				0.0%
nofx/kernel/engine.go:544:				getHyperAllCoins			0.0%
nofx/kernel/engine.go:565:				getHyperMainCoins			0.0%
nofx/kernel/engine.go:594:				FetchMarketData				0.0%
nofx/kernel/engine.go:599:				FetchExternalData			0.0%
nofx/kernel/engine.go:614:				fetchSingleExternalSource		0.0%
nofx/kernel/engine.go:660:				extractJSONPath				0.0%
nofx/kernel/engine.go:676:				FetchQuantData				0.0%
nofx/kernel/engine.go:749:				FetchQuantDataBatch			0.0%
nofx/kernel/engine.go:771:				FetchOIRankingData			0.0%
nofx/kernel/engine.go:802:				FetchNetFlowRankingData			0.0%
nofx/kernel/engine.go:834:				FetchPriceRankingData			0.0%
nofx/kernel/engine.go:869:				detectLanguage				0.0%
nofx/kernel/engine_analysis.go:38:			GetFullDecision				0.0%
nofx/kernel/engine_analysis.go:45:			GetFullDecisionWithStrategy		0.0%
nofx/kernel/engine_analysis.go:149:			fetchMarketDataWithStrategy		0.0%
nofx/kernel/engine_analysis.go:230:			parseFullDecisionResponse		0.0%
nofx/kernel/engine_analysis.go:254:			extractCoTTrace				0.0%
nofx/kernel/engine_analysis.go:274:			extractDecisions			0.0%
nofx/kernel/engine_analysis.go:337:			fixMissingQuotes			0.0%
nofx/kernel/engine_analysis.go:361:			validateJSONFormat			0.0%
nofx/kernel/engine_analysis.go:388:			min					0.0%
nofx/kernel/engine_analysis.go:395:			removeInvisibleRunes			0.0%
nofx/kernel/engine_analysis.go:399:			compactArrayOpen			0.0%
nofx/kernel/engine_position.go:12:			validateDecisions			0.0%
nofx/kernel/engine_position.go:21:			validateDecision			79.6%
nofx/kernel/engine_prompt.go:17:			BuildSystemPrompt			0.0%
nofx/kernel/engine_prompt.go:155:			writeAvailableIndicators		0.0%
nofx/kernel/engine_prompt.go:228:			BuildUserPrompt				0.0%
nofx/kernel/engine_prompt.go:402:			formatPositionInfo			0.0%
nofx/kernel/engine_prompt.go:442:			formatCoinSourceTag			0.0%
nofx/kernel/engine_prompt.go:503:			formatMarketData			0.0%
nofx/kernel/engine_prompt.go:613:			formatTimeframeSeriesData		0.0%
nofx/kernel/engine_prompt.go:669:			formatQuantData				0.0%
nofx/kernel/engine_prompt.go:754:			formatFlowValue				0.0%
nofx/kernel/engine_prompt.go:773:			formatFloatSlice			0.0%
nofx/kernel/formatter.go:20:				FormatContextForAI			100.0%
nofx/kernel/formatter.go:34:				FormatContextDataOnly			0.0%
nofx/kernel/formatter.go:39:				formatContextData			75.9%
nofx/kernel/formatter.go:107:				formatHeaderZH				100.0%
nofx/kernel/formatter.go:113:				formatAccountZH				84.6%
nofx/kernel/formatter.go:135:				formatTradingStatsZH			0.0%
nofx/kernel/formatter.go:196:				formatRecentTradesZH			88.9%
nofx/kernel/formatter.go:227:				formatCurrentPositionsZH		82.6%
nofx/kernel/formatter.go:270:				formatCandidateCoinsZH			33.3%
nofx/kernel/formatter.go:319:				formatKlineDataZH			0.0%
nofx/kernel/formatter.go:361:				getOIInterpretationZH			0.0%
nofx/kernel/formatter.go:376:				formatHeaderEN				100.0%
nofx/kernel/formatter.go:382:				formatAccountEN				84.6%
nofx/kernel/formatter.go:404:				formatTradingStatsEN			0.0%
nofx/kernel/formatter.go:465:				formatRecentTradesEN			88.9%
nofx/kernel/formatter.go:495:				formatCurrentPositionsEN		82.6%
nofx/kernel/formatter.go:536:				formatCandidateCoinsEN			33.3%
nofx/kernel/formatter.go:581:				formatKlineDataEN			0.0%
nofx/kernel/formatter.go:626:				getOIInterpretationEN			0.0%
nofx/kernel/grid_engine.go:97:				BuildGridSystemPrompt			0.0%
nofx/kernel/grid_engine.go:104:				buildGridSystemPromptZh			0.0%
nofx/kernel/grid_engine.go:156:				buildGridSystemPromptEn			0.0%
nofx/kernel/grid_engine.go:209:				BuildGridUserPrompt			0.0%
nofx/kernel/grid_engine.go:216:				buildGridUserPromptZh			0.0%
nofx/kernel/grid_engine.go:327:				buildGridUserPromptEn			0.0%
nofx/kernel/grid_engine.go:443:				GetGridDecisions			0.0%
nofx/kernel/grid_engine.go:489:				parseGridDecisions			0.0%
nofx/kernel/grid_engine.go:516:				extractJSONArray			0.0%
nofx/kernel/grid_engine.go:533:				isValidGridAction			0.0%
nofx/kernel/grid_engine.go:557:				BuildGridContextFromMarketData		0.0%
nofx/kernel/grid_engine.go:613:				max					0.0%
nofx/kernel/prompt_builder.go:20:			NewPromptBuilder			100.0%
nofx/kernel/prompt_builder.go:25:			BuildSystemPrompt			100.0%
nofx/kernel/prompt_builder.go:33:			BuildUserPrompt				100.0%
nofx/kernel/prompt_builder.go:46:			buildSystemPromptZH			100.0%
nofx/kernel/prompt_builder.go:125:			getDecisionRequirementsZH		100.0%
nofx/kernel/prompt_builder.go:181:			buildSystemPromptEN			100.0%
nofx/kernel/prompt_builder.go:260:			getDecisionRequirementsEN		100.0%
nofx/kernel/prompt_builder.go:317:			FormatDecisionExample			100.0%
nofx/kernel/prompt_builder.go:334:			ValidateDecisionFormat			100.0%
nofx/kernel/schema.go:36:				GetName					0.0%
nofx/kernel/schema.go:44:				GetFormula				0.0%
nofx/kernel/schema.go:52:				GetDesc					0.0%
nofx/kernel/schema.go:232:				GetDesc					0.0%
nofx/kernel/schema.go:240:				GetReason				0.0%
nofx/kernel/schema.go:446:				GetSchemaPrompt				100.0%
nofx/kernel/schema.go:454:				getSchemaPromptZH			100.0%
nofx/kernel/schema.go:493:				getSchemaPromptEN			100.0%
nofx/kernel/schema.go:532:				formatFieldDefZH			100.0%
nofx/kernel/schema.go:545:				formatFieldDefEN			100.0%
nofx/logger/config.go:9:				SetDefaults				0.0%
nofx/logger/logger.go:27:				Format					0.0%
nofx/logger/logger.go:52:				init					0.0%
nofx/logger/logger.go:66:				Init					0.0%
nofx/logger/logger.go:110:				InitWithSimpleConfig			0.0%
nofx/logger/logger.go:115:				Shutdown				0.0%
nofx/logger/logger.go:127:				WithFields				0.0%
nofx/logger/logger.go:132:				WithField				0.0%
nofx/logger/logger.go:137:				Debug					0.0%
nofx/logger/logger.go:141:				Info					0.0%
nofx/logger/logger.go:145:				Warn					0.0%
nofx/logger/logger.go:149:				Debugf					0.0%
nofx/logger/logger.go:153:				Infof					0.0%
nofx/logger/logger.go:157:				Warnf					0.0%
nofx/logger/logger.go:161:				Error					0.0%
nofx/logger/logger.go:165:				Errorf					0.0%
nofx/logger/logger.go:169:				Fatal					0.0%
nofx/logger/logger.go:173:				Fatalf					0.0%
nofx/logger/logger.go:177:				Panic					0.0%
nofx/logger/logger.go:181:				Panicf					0.0%
nofx/logger/logger.go:194:				NewMCPLogger				0.0%
nofx/logger/logger.go:198:				Debugf					0.0%
nofx/logger/logger.go:202:				Infof					0.0%
nofx/logger/logger.go:206:				Warnf					0.0%
nofx/logger/logger.go:210:				Errorf					0.0%
nofx/main.go:24:					main					0.0%
nofx/main.go:164:					initInstallationID			0.0%
nofx/manager/trader_manager.go:30:			NewTraderManager			0.0%
nofx/manager/trader_manager.go:41:			GetLoadError				0.0%
nofx/manager/trader_manager.go:48:			GetTrader				0.0%
nofx/manager/trader_manager.go:60:			GetAllTraders				0.0%
nofx/manager/trader_manager.go:72:			GetTraderIDs				0.0%
nofx/manager/trader_manager.go:84:			StartAll				0.0%
nofx/manager/trader_manager.go:100:			StopAll					0.0%
nofx/manager/trader_manager.go:111:			AutoStartRunningTraders			0.0%
nofx/manager/trader_manager.go:154:			GetComparisonData			0.0%
nofx/manager/trader_manager.go:191:			GetCompetitionData			0.0%
nofx/manager/trader_manager.go:260:			getConcurrentTraderData			0.0%
nofx/manager/trader_manager.go:359:			GetTopTradersData			0.0%
nofx/manager/trader_manager.go:390:			RemoveTrader				0.0%
nofx/manager/trader_manager.go:407:			LoadUserTradersFromStore		0.0%
nofx/manager/trader_manager.go:503:			LoadTradersFromStore			0.0%
nofx/manager/trader_manager.go:605:			addTraderFromStore			0.0%
nofx/manager/trader_manager.go:746:			resolveTraderDataWalletKey		0.0%
nofx/market/api_client.go:22:				NewAPIClient				0.0%
nofx/market/api_client.go:38:				GetExchangeInfo				0.0%
nofx/market/api_client.go:59:				GetKlines				0.0%
nofx/market/api_client.go:103:				parseKline				0.0%
nofx/market/api_client.go:126:				GetCurrentPrice				0.0%
nofx/market/data.go:28:					Get					0.0%
nofx/market/data.go:33:					GetWithExchange				0.0%
nofx/market/data.go:147:				GetWithTimeframes			0.0%
nofx/market/data.go:259:				getOpenInterestData			0.0%
nofx/market/data.go:293:				getFundingRate				0.0%
nofx/market/data.go:345:				Format					0.0%
nofx/market/data.go:433:				formatTimeframeData			0.0%
nofx/market/data.go:486:				formatPriceWithDynamicPrecision		0.0%
nofx/market/data.go:516:				formatFloatSlice			0.0%
nofx/market/data.go:541:				IsXyzDexAsset				0.0%
nofx/market/data.go:557:				Normalize				0.0%
nofx/market/data.go:590:				parseFloat				0.0%
nofx/market/data.go:606:				BuildDataFromKlines			0.0%
nofx/market/data.go:636:				priceChangeFromSeries			0.0%
nofx/market/data.go:656:				isStaleData				100.0%
nofx/market/data_indicators.go:6:			calculateEMA				90.0%
nofx/market/data_indicators.go:28:			calculateMACD				80.0%
nofx/market/data_indicators.go:42:			calculateRSI				95.7%
nofx/market/data_indicators.go:86:			calculateATR				100.0%
nofx/market/data_indicators.go:121:			calculateBOLL				0.0%
nofx/market/data_indicators.go:150:			calculateDonchian			100.0%
nofx/market/data_indicators.go:184:			calculateBoxData			85.7%
nofx/market/data_indicators.go:203:			ExportCalculateEMA			0.0%
nofx/market/data_indicators.go:208:			ExportCalculateMACD			0.0%
nofx/market/data_indicators.go:213:			ExportCalculateRSI			0.0%
nofx/market/data_indicators.go:218:			ExportCalculateATR			0.0%
nofx/market/data_indicators.go:223:			ExportCalculateBOLL			0.0%
nofx/market/data_indicators.go:228:			ExportCalculateDonchian			100.0%
nofx/market/data_indicators.go:233:			ExportCalculateBoxData			100.0%
nofx/market/data_klines.go:18:				getKlinesFromCoinAnk			0.0%
nofx/market/data_klines.go:116:				getKlinesFromHyperliquid		0.0%
nofx/market/data_klines.go:157:				calculateTimeframeSeries		0.0%
nofx/market/data_klines.go:242:				calculatePriceChangeByBars		0.0%
nofx/market/data_klines.go:273:				parseTimeframeToMinutes			0.0%
nofx/market/data_klines.go:309:				calculateIntradaySeries			100.0%
nofx/market/data_klines.go:359:				calculateLongerTermData			0.0%
nofx/market/data_klines.go:405:				GetBoxData				0.0%
nofx/market/historical.go:17:				GetKlinesRange				0.0%
nofx/market/timeframe.go:26:				NormalizeTimeframe			0.0%
nofx/market/timeframe.go:38:				TFDuration				0.0%
nofx/market/timeframe.go:47:				MustNormalizeTimeframe			0.0%
nofx/market/timeframe.go:56:				SupportedTimeframes			0.0%
nofx/market/types.go:243:				GetBuySellRatio				0.0%
nofx/mcp/client.go:56:					Channel					0.0%
nofx/mcp/client.go:87:					New					0.0%
nofx/mcp/client.go:110:					NewClient				100.0%
nofx/mcp/client.go:146:					SetAPIKey				0.0%
nofx/mcp/client.go:162:					SetTimeout				100.0%
nofx/mcp/client.go:167:					CallWithMessages			100.0%
nofx/mcp/client.go:207:					SetAuthHeader				100.0%
nofx/mcp/client.go:211:					BuildMCPRequestBody			64.3%
nofx/mcp/client.go:254:					MarshalRequestBody			75.0%
nofx/mcp/client.go:262:					ParseMCPResponse			100.0%
nofx/mcp/client.go:272:					ParseMCPResponseFull			77.8%
nofx/mcp/client.go:313:					BuildUrl				100.0%
nofx/mcp/client.go:320:					BuildRequest				83.3%
nofx/mcp/client.go:336:					Call					88.5%
nofx/mcp/client.go:390:					String					100.0%
nofx/mcp/client.go:396:					BaseClient				0.0%
nofx/mcp/client.go:399:					IsRetryableError			100.0%
nofx/mcp/client.go:415:					CallWithRequest				54.5%
nofx/mcp/client.go:461:					CallWithRequestFull			0.0%
nofx/mcp/client.go:492:					callWithRequestFull			0.0%
nofx/mcp/client.go:525:					callWithRequest				75.0%
nofx/mcp/client.go:569:					BuildRequestBodyFromRequest		65.1%
nofx/mcp/client.go:666:					CallWithRequestStream			0.0%
nofx/mcp/client.go:743:					ParseSSEStream				0.0%
nofx/mcp/client.go:811:					ReportStreamUsage			0.0%
nofx/mcp/config.go:41:					DefaultConfig				100.0%
nofx/mcp/config.go:58:					getEnvInt				50.0%
nofx/mcp/config.go:68:					getEnvString				0.0%
nofx/mcp/context_guard.go:11:				estimateMessageTokens			100.0%
nofx/mcp/context_guard.go:23:				estimateMessageTokensAny		0.0%
nofx/mcp/context_guard.go:42:				truncateMessages			90.3%
nofx/mcp/context_guard.go:97:				truncateMessagesAny			0.0%
nofx/mcp/logger.go:16:					Debugf					0.0%
nofx/mcp/logger.go:17:					Infof					0.0%
nofx/mcp/logger.go:18:					Warnf					0.0%
nofx/mcp/logger.go:19:					Errorf					0.0%
nofx/mcp/logger.go:22:					NewNoopLogger				0.0%
nofx/mcp/options.go:19:					WithLogger				100.0%
nofx/mcp/options.go:34:					WithHTTPClient				100.0%
nofx/mcp/options.go:48:					WithTimeout				100.0%
nofx/mcp/options.go:59:					WithMaxRetries				100.0%
nofx/mcp/options.go:69:					WithRetryWaitBase			100.0%
nofx/mcp/options.go:83:					WithMaxTokens				100.0%
nofx/mcp/options.go:96:					WithMaxContext				0.0%
nofx/mcp/options.go:106:				WithTemperature				100.0%
nofx/mcp/options.go:117:				WithAPIKey				100.0%
nofx/mcp/options.go:124:				WithBaseURL				100.0%
nofx/mcp/options.go:131:				WithModel				100.0%
nofx/mcp/options.go:138:				WithProvider				100.0%
nofx/mcp/options.go:145:				WithUseFullURL				100.0%
nofx/mcp/options.go:159:				WithDeepSeekConfig			100.0%
nofx/mcp/options.go:172:				WithQwenConfig				100.0%
nofx/mcp/options.go:186:				WithMiniMaxConfig			0.0%
nofx/mcp/payment/claw402.go:35:				Error					0.0%
nofx/mcp/payment/claw402.go:44:				shortAddr				0.0%
nofx/mcp/payment/claw402.go:84:				init					0.0%
nofx/mcp/payment/claw402.go:99:				BaseClient				0.0%
nofx/mcp/payment/claw402.go:102:			NewClaw402Client			0.0%
nofx/mcp/payment/claw402.go:107:			NewClaw402ClientWithOptions		0.0%
nofx/mcp/payment/claw402.go:126:			SetAPIKey				0.0%
nofx/mcp/payment/claw402.go:154:			resolveEndpoint				0.0%
nofx/mcp/payment/claw402.go:165:			SetAuthHeader				0.0%
nofx/mcp/payment/claw402.go:167:			Call					0.0%
nofx/mcp/payment/claw402.go:174:			CallWithRequestFull			0.0%
nofx/mcp/payment/claw402.go:183:			walletAddress				0.0%
nofx/mcp/payment/claw402.go:193:			preflightBalance			0.0%
nofx/mcp/payment/claw402.go:220:			signPayment				0.0%
nofx/mcp/payment/claw402.go:226:			BuildMCPRequestBody			0.0%
nofx/mcp/payment/claw402.go:233:			BuildRequestBodyFromRequest		0.0%
nofx/mcp/payment/claw402.go:240:			ParseMCPResponse			0.0%
nofx/mcp/payment/claw402.go:247:			ParseMCPResponseFull			0.0%
nofx/mcp/payment/claw402.go:255:			BuildUrl				0.0%
nofx/mcp/payment/claw402.go:259:			BuildRequest				0.0%
nofx/mcp/payment/x402.go:73:				X402DecodeHeader			0.0%
nofx/mcp/payment/x402.go:85:				MakeClaw402SignFunc			0.0%
nofx/mcp/payment/x402.go:93:				SignBasePaymentHeader			0.0%
nofx/mcp/payment/x402.go:116:				DoX402Request				0.0%
nofx/mcp/payment/x402.go:251:				DoX402RequestStream			0.0%
nofx/mcp/payment/x402.go:392:				X402CallStream				0.0%
nofx/mcp/payment/x402.go:480:				X402BuildRequest			0.0%
nofx/mcp/payment/x402.go:491:				X402SetAuthHeader			0.0%
nofx/mcp/payment/x402.go:494:				X402Call				0.0%
nofx/mcp/payment/x402.go:513:				X402CallFull				0.0%
nofx/mcp/payment/x402.go:552:				keccak256String				0.0%
nofx/mcp/payment/x402.go:558:				keccak256Bytes				0.0%
nofx/mcp/payment/x402.go:567:				SignX402Payment				0.0%
nofx/mcp/payment/x402.go:678:				buildDomainSeparatorDynamic		0.0%
nofx/mcp/payment/x402.go:710:				buildTransferWithAuthHashDynamic	0.0%
nofx/mcp/payment/x402.go:739:				hexToAddress				0.0%
nofx/mcp/payment/x402.go:751:				hexToBytes32				0.0%
nofx/mcp/payment/x402.go:763:				parseBigInt				0.0%
nofx/mcp/payment/x402.go:778:				leftPad32				0.0%
nofx/mcp/provider/claude.go:32:				init					50.0%
nofx/mcp/provider/claude.go:45:				BaseClient				0.0%
nofx/mcp/provider/claude.go:48:				NewClaudeClient				0.0%
nofx/mcp/provider/claude.go:53:				NewClaudeClientWithOptions		0.0%
nofx/mcp/provider/claude.go:68:				SetAPIKey				0.0%
nofx/mcp/provider/claude.go:84:				SetAuthHeader				0.0%
nofx/mcp/provider/claude.go:90:				BuildUrl				0.0%
nofx/mcp/provider/claude.go:96:				BuildMCPRequestBody			0.0%
nofx/mcp/provider/claude.go:109:			BuildRequestBodyFromRequest		0.0%
nofx/mcp/provider/claude.go:165:			ConvertMessagesToAnthropic		0.0%
nofx/mcp/provider/claude.go:227:			ParseMCPResponse			0.0%
nofx/mcp/provider/claude.go:237:			ParseMCPResponseFull			0.0%
nofx/mcp/provider/deepseek.go:9:			init					50.0%
nofx/mcp/provider/deepseek.go:19:			BaseClient				0.0%
nofx/mcp/provider/deepseek.go:24:			NewDeepSeekClient			0.0%
nofx/mcp/provider/deepseek.go:29:			NewDeepSeekClientWithOptions		100.0%
nofx/mcp/provider/deepseek.go:47:			SetAPIKey				0.0%
nofx/mcp/provider/deepseek.go:67:			SetAuthHeader				0.0%
nofx/mcp/provider/gemini.go:14:				init					50.0%
nofx/mcp/provider/gemini.go:24:				BaseClient				0.0%
nofx/mcp/provider/gemini.go:27:				NewGeminiClient				0.0%
nofx/mcp/provider/gemini.go:32:				NewGeminiClientWithOptions		0.0%
nofx/mcp/provider/gemini.go:50:				SetAPIKey				0.0%
nofx/mcp/provider/gemini.go:71:				SetAuthHeader				0.0%
nofx/mcp/provider/grok.go:14:				init					50.0%
nofx/mcp/provider/grok.go:24:				BaseClient				0.0%
nofx/mcp/provider/grok.go:27:				NewGrokClient				0.0%
nofx/mcp/provider/grok.go:32:				NewGrokClientWithOptions		0.0%
nofx/mcp/provider/grok.go:50:				SetAPIKey				0.0%
nofx/mcp/provider/grok.go:71:				SetAuthHeader				0.0%
nofx/mcp/provider/kimi.go:14:				init					50.0%
nofx/mcp/provider/kimi.go:24:				BaseClient				0.0%
nofx/mcp/provider/kimi.go:27:				NewKimiClient				0.0%
nofx/mcp/provider/kimi.go:32:				NewKimiClientWithOptions		0.0%
nofx/mcp/provider/kimi.go:51:				SetAPIKey				0.0%
nofx/mcp/provider/kimi.go:72:				SetAuthHeader				0.0%
nofx/mcp/provider/minimax.go:14:			init					50.0%
nofx/mcp/provider/minimax.go:24:			BaseClient				0.0%
nofx/mcp/provider/minimax.go:27:			NewMiniMaxClient			0.0%
nofx/mcp/provider/minimax.go:32:			NewMiniMaxClientWithOptions		0.0%
nofx/mcp/provider/minimax.go:50:			SetAPIKey				0.0%
nofx/mcp/provider/minimax.go:71:			SetAuthHeader				0.0%
nofx/mcp/provider/openai.go:14:				init					50.0%
nofx/mcp/provider/openai.go:24:				BaseClient				0.0%
nofx/mcp/provider/openai.go:27:				NewOpenAIClient				0.0%
nofx/mcp/provider/openai.go:32:				NewOpenAIClientWithOptions		0.0%
nofx/mcp/provider/openai.go:50:				SetAPIKey				0.0%
nofx/mcp/provider/openai.go:71:				SetAuthHeader				0.0%
nofx/mcp/provider/qwen.go:14:				init					50.0%
nofx/mcp/provider/qwen.go:24:				BaseClient				0.0%
nofx/mcp/provider/qwen.go:29:				NewQwenClient				0.0%
nofx/mcp/provider/qwen.go:34:				NewQwenClientWithOptions		100.0%
nofx/mcp/provider/qwen.go:52:				SetAPIKey				0.0%
nofx/mcp/provider/qwen.go:72:				SetAuthHeader				0.0%
nofx/mcp/registry.go:8:					RegisterProvider			100.0%
nofx/mcp/registry.go:14:				NewAIClientByProvider			0.0%
nofx/mcp/request.go:68:					NewMessage				0.0%
nofx/mcp/request.go:76:					NewSystemMessage			100.0%
nofx/mcp/request.go:84:					NewUserMessage				100.0%
nofx/mcp/request.go:92:					NewAssistantMessage			100.0%
nofx/mcp/request_builder.go:30:				NewRequestBuilder			100.0%
nofx/mcp/request_builder.go:42:				WithModel				0.0%
nofx/mcp/request_builder.go:48:				WithStream				0.0%
nofx/mcp/request_builder.go:58:				WithSystemPrompt			100.0%
nofx/mcp/request_builder.go:66:				WithUserPrompt				100.0%
nofx/mcp/request_builder.go:74:				AddSystemMessage			100.0%
nofx/mcp/request_builder.go:79:				AddUserMessage				100.0%
nofx/mcp/request_builder.go:84:				AddAssistantMessage			100.0%
nofx/mcp/request_builder.go:92:				AddMessage				0.0%
nofx/mcp/request_builder.go:100:			AddMessages				0.0%
nofx/mcp/request_builder.go:106:			AddConversationHistory			100.0%
nofx/mcp/request_builder.go:112:			ClearMessages				0.0%
nofx/mcp/request_builder.go:123:			WithTemperature				42.9%
nofx/mcp/request_builder.go:138:			WithMaxTokens				100.0%
nofx/mcp/request_builder.go:147:			WithTopP				100.0%
nofx/mcp/request_builder.go:156:			WithFrequencyPenalty			100.0%
nofx/mcp/request_builder.go:165:			WithPresencePenalty			100.0%
nofx/mcp/request_builder.go:174:			WithStopSequences			100.0%
nofx/mcp/request_builder.go:180:			AddStopSequence				0.0%
nofx/mcp/request_builder.go:192:			AddTool					100.0%
nofx/mcp/request_builder.go:198:			AddFunction				100.0%
nofx/mcp/request_builder.go:215:			WithToolChoice				100.0%
nofx/mcp/request_builder.go:225:			Build					100.0%
nofx/mcp/request_builder.go:263:			MustBuild				75.0%
nofx/mcp/request_builder.go:276:			ForChat					100.0%
nofx/mcp/request_builder.go:288:			ForCodeGeneration			100.0%
nofx/mcp/request_builder.go:302:			ForCreativeWriting			100.0%
nofx/provider/alpaca/kline.go:45:			NewClient				0.0%
nofx/provider/alpaca/kline.go:57:			NewClientWithKeys			0.0%
nofx/provider/alpaca/kline.go:69:			GetBars					0.0%
nofx/provider/alpaca/kline.go:134:			MapTimeframe				0.0%
nofx/provider/coinank/base_coin.go:10:			ListCoin				0.0%
nofx/provider/coinank/base_coin.go:33:			ListSymbols				0.0%
nofx/provider/coinank/coinank_api/base_coin.go:11:	BaseCoinSymbols				76.5%
nofx/provider/coinank/coinank_api/depth_ws.go:19:	DepthWsConn				80.0%
nofx/provider/coinank/coinank_api/depth_ws.go:32:	Subscribe				77.8%
nofx/provider/coinank/coinank_api/depth_ws.go:50:	UnSubscribe				77.8%
nofx/provider/coinank/coinank_api/depth_ws.go:68:	Close					100.0%
nofx/provider/coinank/coinank_api/depth_ws.go:72:	depth_ws				77.8%
nofx/provider/coinank/coinank_api/depth_ws.go:86:	depth_read				100.0%
nofx/provider/coinank/coinank_api/kline.go:19:		Kline					89.3%
nofx/provider/coinank/coinank_api/kline.go:55:		get					80.0%
nofx/provider/coinank/coinank_api/kline_ws.go:23:	WsConn					83.3%
nofx/provider/coinank/coinank_api/kline_ws.go:38:	Subscribe				77.8%
nofx/provider/coinank/coinank_api/kline_ws.go:56:	UnSubscribe				77.8%
nofx/provider/coinank/coinank_api/kline_ws.go:74:	Close					100.0%
nofx/provider/coinank/coinank_api/kline_ws.go:78:	ws					77.8%
nofx/provider/coinank/coinank_api/kline_ws.go:92:	read					100.0%
nofx/provider/coinank/coinank_api/kline_ws.go:105:	handleResponse				94.6%
nofx/provider/coinank/coinank_api/kline_ws.go:154:	toInt64					100.0%
nofx/provider/coinank/coinank_api/kline_ws.go:159:	toFloat64				75.0%
nofx/provider/coinank/coinank_http.go:41:		NewCoinankClient			0.0%
nofx/provider/coinank/coinank_http.go:46:		Get					0.0%
nofx/provider/coinank/coinank_http.go:70:		Post					0.0%
nofx/provider/coinank/instrument_agg_rank.go:11:	VisualScreener				0.0%
nofx/provider/coinank/instrument_agg_rank.go:30:	OiRank					0.0%
nofx/provider/coinank/instrument_agg_rank.go:51:	LongShortRank				0.0%
nofx/provider/coinank/instrument_agg_rank.go:72:	LiquidationRank				0.0%
nofx/provider/coinank/instrument_agg_rank.go:93:	PriceRank				0.0%
nofx/provider/coinank/instrument_agg_rank.go:114:	VolumeRank				0.0%
nofx/provider/coinank/instrument_agg_rank.go:134:	rankParam				0.0%
nofx/provider/coinank/instruments.go:10:		GetLastPrice				0.0%
nofx/provider/coinank/instruments.go:32:		GetCoinMarketCap			0.0%
nofx/provider/coinank/kline.go:11:			Kline					0.0%
nofx/provider/coinank/liquidation.go:11:		LiquidationExchangeStatistics		0.0%
nofx/provider/coinank/liquidation.go:30:		LiquidationCoinAggHistory		0.0%
nofx/provider/coinank/liquidation.go:53:		LiquidationHistory			0.0%
nofx/provider/coinank/liquidation.go:77:		LiquidationOrders			0.0%
nofx/provider/coinank/net_positions.go:11:		NetPositions				0.0%
nofx/provider/coinank/open_interest.go:11:		OpenInterestAll				0.0%
nofx/provider/coinank/open_interest.go:30:		OpenInterestChartV2			0.0%
nofx/provider/coinank/open_interest.go:58:		OpenInterestSymbolChart			0.0%
nofx/provider/coinank/open_interest.go:85:		OpenInterestKline			0.0%
nofx/provider/coinank/open_interest.go:112:		OpenInterestAggKline			0.0%
nofx/provider/coinank/open_interest.go:138:		TickersTopOIByEx			0.0%
nofx/provider/coinank/open_interest.go:157:		InstrumentsOiVsMc			0.0%
nofx/provider/hyperliquid/coins.go:41:			GetProvider				0.0%
nofx/provider/hyperliquid/coins.go:63:			fetchCoins				0.0%
nofx/provider/hyperliquid/coins.go:142:			ensureUpdated				0.0%
nofx/provider/hyperliquid/coins.go:154:			GetAllCoins				0.0%
nofx/provider/hyperliquid/coins.go:169:			GetMainCoins				0.0%
nofx/provider/hyperliquid/coins.go:193:			GetAllCoinSymbols			0.0%
nofx/provider/hyperliquid/coins.go:207:			GetMainCoinSymbols			0.0%
nofx/provider/hyperliquid/coins.go:221:			ForceRefresh				0.0%
nofx/provider/hyperliquid/kline.go:54:			NewClient				100.0%
nofx/provider/hyperliquid/kline.go:64:			NewTestnetClient			0.0%
nofx/provider/hyperliquid/kline.go:77:			GetCandles				76.9%
nofx/provider/hyperliquid/kline.go:140:			GetAllMids				100.0%
nofx/provider/hyperliquid/kline.go:145:			GetAllMidsXYZ				100.0%
nofx/provider/hyperliquid/kline.go:150:			GetAllMidsWithDex			73.9%
nofx/provider/hyperliquid/kline.go:190:			GetMeta					71.4%
nofx/provider/hyperliquid/kline.go:244:			NormalizeCoin				100.0%
nofx/provider/hyperliquid/kline.go:249:			MapTimeframe				0.0%
nofx/provider/hyperliquid/kline.go:287:			getIntervalDuration			15.4%
nofx/provider/hyperliquid/kline.go:357:			IsStockPerp				100.0%
nofx/provider/hyperliquid/kline.go:368:			IsXYZAsset				100.0%
nofx/provider/hyperliquid/kline.go:386:			NormalizeCoinBase			100.0%
nofx/provider/hyperliquid/kline.go:408:			FormatCoinForAPI			100.0%
nofx/provider/nofxos/ai500.go:34:			GetAI500List				0.0%
nofx/provider/nofxos/ai500.go:59:			fetchAI500				0.0%
nofx/provider/nofxos/ai500.go:93:			GetTopRatedCoins			0.0%
nofx/provider/nofxos/ai500.go:137:			GetAvailableCoins			0.0%
nofx/provider/nofxos/ai500.go:156:			NormalizeSymbol				0.0%
nofx/provider/nofxos/claw402.go:29:			NewClaw402DataClient			0.0%
nofx/provider/nofxos/claw402.go:65:			mapEndpoint				0.0%
nofx/provider/nofxos/claw402.go:77:			DoRequest				0.0%
nofx/provider/nofxos/client.go:37:			DefaultClient				0.0%
nofx/provider/nofxos/client.go:49:			NewClient				0.0%
nofx/provider/nofxos/client.go:64:			SetClaw402				0.0%
nofx/provider/nofxos/client.go:71:			SetConfig				0.0%
nofx/provider/nofxos/client.go:83:			GetBaseURL				0.0%
nofx/provider/nofxos/client.go:90:			GetAuthKey				0.0%
nofx/provider/nofxos/client.go:98:			doRequest				0.0%
nofx/provider/nofxos/client.go:147:			Error					0.0%
nofx/provider/nofxos/client.go:152:			ExtractAuthKey				0.0%
nofx/provider/nofxos/coin.go:54:			GetCoinData				0.0%
nofx/provider/nofxos/coin.go:87:			GetCoinDataBatch			0.0%
nofx/provider/nofxos/coin.go:107:			FormatQuantDataForAI			0.0%
nofx/provider/nofxos/coin.go:118:			formatQuantDataZH			0.0%
nofx/provider/nofxos/coin.go:168:			formatQuantDataEN			0.0%
nofx/provider/nofxos/netflow.go:45:			GetNetFlowRanking			0.0%
nofx/provider/nofxos/netflow.go:98:			fetchNetFlowRanking			0.0%
nofx/provider/nofxos/netflow.go:120:			FormatNetFlowRankingForAI		0.0%
nofx/provider/nofxos/netflow.go:131:			formatNetFlowRankingZH			0.0%
nofx/provider/nofxos/netflow.go:198:			formatNetFlowRankingEN			0.0%
nofx/provider/nofxos/oi.go:50:				GetOIRanking				0.0%
nofx/provider/nofxos/oi.go:86:				fetchOIRanking				0.0%
nofx/provider/nofxos/oi.go:108:				GetOITopPositions			0.0%
nofx/provider/nofxos/oi.go:117:				GetOITopSymbols				0.0%
nofx/provider/nofxos/oi.go:133:				GetOILowPositions			0.0%
nofx/provider/nofxos/oi.go:142:				GetOILowSymbols				0.0%
nofx/provider/nofxos/oi.go:158:				FormatOIRankingForAI			0.0%
nofx/provider/nofxos/oi.go:169:				formatOIRankingZH			0.0%
nofx/provider/nofxos/oi.go:204:				formatOIRankingEN			0.0%
nofx/provider/nofxos/price.go:47:			GetPriceRanking				0.0%
nofx/provider/nofxos/price.go:87:			FormatPriceRankingForAI			0.0%
nofx/provider/nofxos/price.go:98:			formatPriceRankingZH			0.0%
nofx/provider/nofxos/price.go:141:			formatPriceRankingEN			0.0%
nofx/provider/nofxos/util.go:14:			formatValue				0.0%
nofx/provider/twelvedata/kline.go:78:			NewClient				0.0%
nofx/provider/twelvedata/kline.go:88:			NewClientWithKey			0.0%
nofx/provider/twelvedata/kline.go:99:			GetTimeSeries				0.0%
nofx/provider/twelvedata/kline.go:148:			GetQuote				0.0%
nofx/provider/twelvedata/kline.go:195:			MapTimeframe				0.0%
nofx/provider/twelvedata/kline.go:235:			ParseBar				0.0%
nofx/security/url_validator.go:17:			init					0.0%
nofx/security/url_validator.go:48:			Error					0.0%
nofx/security/url_validator.go:53:			isPrivateIP				0.0%
nofx/security/url_validator.go:85:			ValidateURL				0.0%
nofx/security/url_validator.go:158:			SafeHTTPClient				0.0%
nofx/security/url_validator.go:208:			SafeGet					0.0%
nofx/store/ai_charge.go:19:				TableName				0.0%
nofx/store/ai_charge.go:40:				GetModelPrice				0.0%
nofx/store/ai_charge.go:53:				NewAIChargeStore			0.0%
nofx/store/ai_charge.go:57:				initTables				0.0%
nofx/store/ai_charge.go:62:				Record					0.0%
nofx/store/ai_charge.go:74:				GetCharges				0.0%
nofx/store/ai_charge.go:90:				GetDailyCost				0.0%
nofx/store/ai_charge.go:99:				GetSummary				0.0%
nofx/store/ai_charge.go:126:				applyPeriodFilter			0.0%
nofx/store/ai_charge.go:151:				IsClaw402Config				0.0%
nofx/store/ai_charge.go:156:				EstimateRunway				0.0%
nofx/store/ai_model.go:33:				TableName				0.0%
nofx/store/ai_model.go:36:				NewAIModelStore				0.0%
nofx/store/ai_model.go:40:				initTables				0.0%
nofx/store/ai_model.go:52:				initDefaultData				0.0%
nofx/store/ai_model.go:59:				FindOrphanClaw402			0.0%
nofx/store/ai_model.go:70:				AdoptModel				0.0%
nofx/store/ai_model.go:76:				List					0.0%
nofx/store/ai_model.go:86:				Get					0.0%
nofx/store/ai_model.go:116:				GetByID					0.0%
nofx/store/ai_model.go:130:				GetDefault				0.0%
nofx/store/ai_model.go:147:				firstEnabled				0.0%
nofx/store/ai_model.go:160:				GetAnyEnabled				0.0%
nofx/store/ai_model.go:173:				Update					0.0%
nofx/store/ai_model.go:261:				ResolveClaw402WalletKey			0.0%
nofx/store/ai_model.go:293:				Create					0.0%
nofx/store/decision.go:36:				TableName				0.0%
nofx/store/decision.go:108:				NewDecisionStore			0.0%
nofx/store/decision.go:113:				initTables				0.0%
nofx/store/decision.go:126:				toRecord				0.0%
nofx/store/decision.go:148:				LogDecision				0.0%
nofx/store/decision.go:185:				GetLatestRecords			0.0%
nofx/store/decision.go:209:				GetAllLatestRecords			0.0%
nofx/store/decision.go:230:				GetRecordsByDate			0.0%
nofx/store/decision.go:250:				CleanOldRecords				0.0%
nofx/store/decision.go:262:				GetStatistics				0.0%
nofx/store/decision.go:281:				GetAllStatistics			0.0%
nofx/store/decision.go:300:				GetLastCycleNumber			0.0%
nofx/store/driver.go:41:				NewDBDriver				0.0%
nofx/store/driver.go:65:				NewDBDriverFromEnv			0.0%
nofx/store/driver.go:94:				DB					0.0%
nofx/store/driver.go:99:				Close					0.0%
nofx/store/driver.go:104:				AutoIncrement				0.0%
nofx/store/driver.go:115:				Placeholder				0.0%
nofx/store/driver.go:125:				ConvertPlaceholders			0.0%
nofx/store/driver.go:141:				TableExists				0.0%
nofx/store/driver.go:167:				UpsertSyntax				0.0%
nofx/store/driver.go:172:				openSQLite				0.0%
nofx/store/driver.go:210:				openPostgres				0.0%
nofx/store/driver.go:235:				getEnv					0.0%
nofx/store/driver.go:244:				convertQuery				0.0%
nofx/store/driver.go:270:				boolDefault				0.0%
nofx/store/equity.go:28:				TableName				0.0%
nofx/store/equity.go:31:				NewEquityStore				0.0%
nofx/store/equity.go:36:				initTables				0.0%
nofx/store/equity.go:49:				Save					0.0%
nofx/store/equity.go:65:				GetLatest				0.0%
nofx/store/equity.go:84:				GetByTimeRange				0.0%
nofx/store/equity.go:96:				GetAllTradersLatest			0.0%
nofx/store/equity.go:121:				CleanOldRecords				0.0%
nofx/store/equity.go:133:				GetCount				0.0%
nofx/store/equity.go:140:				MigrateFromDecision			0.0%
nofx/store/exchange.go:44:				TableName				0.0%
nofx/store/exchange.go:47:				NewExchangeStore			0.0%
nofx/store/exchange.go:51:				initTables				0.0%
nofx/store/exchange.go:80:				migrateToMultiAccount			0.0%
nofx/store/exchange.go:135:				initDefaultData				0.0%
nofx/store/exchange.go:141:				List					0.0%
nofx/store/exchange.go:151:				GetByID					0.0%
nofx/store/exchange.go:161:				getExchangeNameAndType			0.0%
nofx/store/exchange.go:185:				Create					0.0%
nofx/store/exchange.go:231:				Update					0.0%
nofx/store/exchange.go:280:				UpdateAccountName			0.0%
nofx/store/exchange.go:297:				Delete					0.0%
nofx/store/exchange.go:311:				CreateLegacy				0.0%
nofx/store/gorm.go:17:					DB					0.0%
nofx/store/gorm.go:22:					InitGorm				0.0%
nofx/store/gorm.go:53:					InitGormPostgres			0.0%
nofx/store/gorm.go:84:					InitGormWithConfig			0.0%
nofx/store/gorm.go:109:					ForUser					0.0%
nofx/store/gorm.go:116:					ForTrader				0.0%
nofx/store/gorm.go:123:					OpenPositions				0.0%
nofx/store/gorm.go:130:					ClosedPositions				0.0%
nofx/store/gorm.go:137:					OrderByCreatedDesc			0.0%
nofx/store/gorm.go:144:					OrderByUpdatedDesc			0.0%
nofx/store/gorm.go:151:					Paginate				0.0%
nofx/store/grid.go:72:					TableName				0.0%
nofx/store/grid.go:132:					TableName				0.0%
nofx/store/grid.go:156:					TableName				0.0%
nofx/store/grid.go:179:					TableName				0.0%
nofx/store/grid.go:205:					TableName				0.0%
nofx/store/grid.go:217:					NewGridStore				0.0%
nofx/store/grid.go:222:					InitTables				0.0%
nofx/store/grid.go:258:					SaveGridConfig				0.0%
nofx/store/grid.go:267:					LoadGridConfig				0.0%
nofx/store/grid.go:277:					LoadGridConfigByTrader			0.0%
nofx/store/grid.go:287:					ListGridConfigs				0.0%
nofx/store/grid.go:297:					DeleteGridConfig			0.0%
nofx/store/grid.go:331:					SaveGridInstance			0.0%
nofx/store/grid.go:337:					LoadGridInstance			0.0%
nofx/store/grid.go:349:					LoadGridInstanceByID			0.0%
nofx/store/grid.go:359:					ListGridInstances			0.0%
nofx/store/grid.go:373:					SaveGridLevel				0.0%
nofx/store/grid.go:379:					SaveGridLevels				0.0%
nofx/store/grid.go:391:					LoadGridLevels				0.0%
nofx/store/grid.go:403:					DeleteGridLevels			0.0%
nofx/store/grid.go:410:					SaveGridEvent				0.0%
nofx/store/grid.go:418:					LoadRecentGridEvents			0.0%
nofx/store/grid.go:433:					LoadGridEventsByType			0.0%
nofx/store/grid.go:448:					CountGridEvents				0.0%
nofx/store/grid.go:459:					SaveGridRegimeAssessment		0.0%
nofx/store/grid.go:467:					LoadLatestGridRegime			0.0%
nofx/store/grid.go:479:					LoadGridRegimeHistory			0.0%
nofx/store/grid.go:496:					GetGridInstanceStatistics		0.0%
nofx/store/grid.go:551:					GetGridPerformanceMetrics		0.0%
nofx/store/order.go:46:					TableName				0.0%
nofx/store/order.go:73:					TableName				0.0%
nofx/store/order.go:83:					NewOrderStore				0.0%
nofx/store/order.go:88:					InitTables				0.0%
nofx/store/order.go:152:				CreateOrder				0.0%
nofx/store/order.go:169:				UpdateOrderStatus			0.0%
nofx/store/order.go:186:				CreateFill				0.0%
nofx/store/order.go:202:				GetFillByExchangeTradeID		0.0%
nofx/store/order.go:215:				GetOrderByExchangeID			0.0%
nofx/store/order.go:228:				GetTraderOrders				0.0%
nofx/store/order.go:241:				GetTraderOrdersFiltered			0.0%
nofx/store/order.go:262:				GetOrderFills				0.0%
nofx/store/order.go:274:				GetTraderOrderStats			0.0%
nofx/store/order.go:306:				CleanupDuplicateOrders			0.0%
nofx/store/order.go:322:				CleanupDuplicateFills			0.0%
nofx/store/order.go:338:				GetDuplicateOrdersCount			0.0%
nofx/store/order.go:353:				GetDuplicateFillsCount			0.0%
nofx/store/order.go:367:				GetMaxTradeIDsByExchange		0.0%
nofx/store/order.go:401:				GetLastFillTimeByExchange		0.0%
nofx/store/order.go:413:				GetRecentFillSymbolsByExchange		0.0%
nofx/store/position.go:16:				adaptivePriceRound			0.0%
nofx/store/position.go:51:				getPriceDecimalPlaces			0.0%
nofx/store/position.go:64:				formatDuration				0.0%
nofx/store/position.go:69:				formatDurationMs			0.0%
nofx/store/position.go:124:				TableName				0.0%
nofx/store/position.go:134:				NewPositionStore			0.0%
nofx/store/position.go:139:				isPostgres				0.0%
nofx/store/position.go:144:				InitTables				0.0%
nofx/store/position.go:189:				Create					0.0%
nofx/store/position.go:198:				ClosePosition				0.0%
nofx/store/position.go:213:				UpdatePositionQuantityAndPrice		0.0%
nofx/store/position.go:243:				ReducePositionQuantity			0.0%
nofx/store/position.go:291:				UpdatePositionExchangeInfo		0.0%
nofx/store/position.go:302:				ClosePositionFully			0.0%
nofx/store/position.go:327:				DeleteAllOpenPositions			0.0%
nofx/store/position.go:332:				GetOpenPositions			0.0%
nofx/store/position.go:351:				GetOpenPositionBySymbol			0.0%
nofx/store/position.go:384:				GetClosedPositions			0.0%
nofx/store/position.go:403:				GetAllOpenPositions			0.0%
nofx/store/position.go:421:				ExistsWithExchangePositionID		0.0%
nofx/store/position.go:437:				GetOpenPositionByExchangePositionID	0.0%
nofx/store/position.go:459:				CreateOpenPosition			0.0%
nofx/store/position.go:507:				ClosePositionWithAccurateData		0.0%
nofx/store/position_builder.go:21:			NewPositionBuilder			0.0%
nofx/store/position_builder.go:29:			ProcessTrade				0.0%
nofx/store/position_builder.go:45:			handleOpen				0.0%
nofx/store/position_builder.go:97:			handleClose				0.0%
nofx/store/position_builder.go:178:			quantitiesMatch				0.0%
nofx/store/position_history.go:38:			GetHistorySummary			0.0%
nofx/store/position_history.go:120:			calculateStreaks			0.0%
nofx/store/position_history.go:193:			CreateFromClosedPnL			0.0%
nofx/store/position_history.go:276:			GetLastClosedPositionTime		0.0%
nofx/store/position_history.go:293:			SyncClosedPositions			0.0%
nofx/store/position_query.go:25:			GetPositionStats			0.0%
nofx/store/position_query.go:58:			GetFullStats				0.0%
nofx/store/position_query.go:131:			GetRecentTrades				0.0%
nofx/store/position_query.go:173:			calculateSharpeRatioFromPnls		0.0%
nofx/store/position_query.go:198:			calculateMaxDrawdownFromPnls		0.0%
nofx/store/position_query.go:236:			GetSymbolStats				0.0%
nofx/store/position_query.go:306:			GetHoldingTimeStats			0.0%
nofx/store/position_query.go:376:			GetDirectionStats			0.0%
nofx/store/store.go:38:					New					0.0%
nofx/store/store.go:69:					NewWithConfig				0.0%
nofx/store/store.go:104:				NewFromGorm				0.0%
nofx/store/store.go:114:				NewFromDB				0.0%
nofx/store/store.go:119:				initTables				0.0%
nofx/store/store.go:171:				initDefaultData				0.0%
nofx/store/store.go:191:				User					0.0%
nofx/store/store.go:201:				AIModel					0.0%
nofx/store/store.go:211:				Exchange				0.0%
nofx/store/store.go:221:				Trader					0.0%
nofx/store/store.go:231:				Decision				0.0%
nofx/store/store.go:241:				Position				0.0%
nofx/store/store.go:251:				Strategy				0.0%
nofx/store/store.go:261:				Equity					0.0%
nofx/store/store.go:271:				Order					0.0%
nofx/store/store.go:281:				Grid					0.0%
nofx/store/store.go:291:				AICharge				0.0%
nofx/store/store.go:301:				TelegramConfig				0.0%
nofx/store/store.go:311:				Close					0.0%
nofx/store/store.go:322:				GormDB					0.0%
nofx/store/store.go:327:				Driver					0.0%
nofx/store/store.go:332:				DBType					0.0%
nofx/store/store.go:349:				q					0.0%
nofx/store/store.go:355:				DB					0.0%
nofx/store/store.go:360:				GetSystemConfig				0.0%
nofx/store/store.go:376:				SetSystemConfig				0.0%
nofx/store/store.go:385:				Transaction				0.0%
nofx/store/store.go:391:				TransactionSQL				0.0%
nofx/store/strategy.go:23:				ClampLimits				0.0%
nofx/store/strategy.go:83:				TableName				0.0%
nofx/store/strategy.go:288:				NewStrategyStore			0.0%
nofx/store/strategy.go:292:				initTables				0.0%
nofx/store/strategy.go:297:				initDefaultData				0.0%
nofx/store/strategy.go:303:				GetDefaultStrategyConfig		100.0%
nofx/store/strategy.go:421:				Create					0.0%
nofx/store/strategy.go:426:				Update					0.0%
nofx/store/strategy.go:440:				Delete					0.0%
nofx/store/strategy.go:464:				List					0.0%
nofx/store/strategy.go:476:				ListPublic				0.0%
nofx/store/strategy.go:488:				Get					0.0%
nofx/store/strategy.go:499:				GetActive				0.0%
nofx/store/strategy.go:513:				GetDefault				0.0%
nofx/store/strategy.go:523:				SetActive				0.0%
nofx/store/strategy.go:539:				Duplicate				0.0%
nofx/store/strategy.go:561:				ParseConfig				0.0%
nofx/store/strategy.go:570:				SetConfig				0.0%
nofx/store/strategy.go:633:				GetContextLimit				100.0%
nofx/store/strategy.go:642:				GetContextLimitForClient		0.0%
nofx/store/strategy.go:670:				EstimateTokens				95.7%
nofx/store/strategy.go:842:				getEffectiveCoinCount			37.5%
nofx/store/strategy.go:873:				getEffectiveTimeframeCount		33.3%
nofx/store/telegram_config.go:26:			String					0.0%
nofx/store/telegram_config.go:54:			NewTelegramConfigStore			0.0%
nofx/store/telegram_config.go:58:			initTables				0.0%
nofx/store/telegram_config.go:62:			Get					0.0%
nofx/store/telegram_config.go:72:			SaveToken				0.0%
nofx/store/telegram_config.go:76:			Save					0.0%
nofx/store/telegram_config.go:90:			BindUser				0.0%
nofx/store/telegram_config.go:105:			IsBound					0.0%
nofx/store/telegram_config.go:118:			GetBoundChatID				0.0%
nofx/store/telegram_config.go:131:			Unbind					0.0%
nofx/store/telegram_config.go:140:			SetLanguage				0.0%
nofx/store/telegram_config.go:153:			GetLanguage				0.0%
nofx/store/trader.go:16:				NewTraderStore				0.0%
nofx/store/trader.go:48:				TableName				0.0%
nofx/store/trader.go:60:				initTables				0.0%
nofx/store/trader.go:77:				Create					0.0%
nofx/store/trader.go:82:				List					0.0%
nofx/store/trader.go:94:				UpdateStatus				0.0%
nofx/store/trader.go:101:				UpdateShowInCompetition			0.0%
nofx/store/trader.go:108:				Update					0.0%
nofx/store/trader.go:138:				UpdateInitialBalance			0.0%
nofx/store/trader.go:145:				UpdateCustomPrompt			0.0%
nofx/store/trader.go:155:				Delete					0.0%
nofx/store/trader.go:164:				GetFullConfig				0.0%
nofx/store/trader.go:204:				getStrategyByID				0.0%
nofx/store/trader.go:215:				getActiveOrDefaultStrategy		0.0%
nofx/store/trader.go:233:				GetByID					0.0%
nofx/store/trader.go:243:				ListAll					0.0%
nofx/store/trader.go:253:				ListByExchangeID			0.0%
nofx/store/trader.go:263:				ListByAIModelID				0.0%
nofx/store/user.go:23:					TableName				0.0%
nofx/store/user.go:26:					NewUserStore				0.0%
nofx/store/user.go:30:					initTables				0.0%
nofx/store/user.go:62:					Create					0.0%
nofx/store/user.go:67:					GetByEmail				0.0%
nofx/store/user.go:77:					GetByID					0.0%
nofx/store/user.go:87:					Count					0.0%
nofx/store/user.go:94:					GetAllIDs				0.0%
nofx/store/user.go:101:					GetAll					0.0%
nofx/store/user.go:108:					UpdatePassword				0.0%
nofx/store/user.go:116:					DeleteAll				0.0%
nofx/store/user.go:121:					EnsureAdmin				0.0%
nofx/telegram/agent/agent.go:57:			New					100.0%
nofx/telegram/agent/agent.go:70:			GenerateBotToken			0.0%
nofx/telegram/agent/agent.go:77:			buildAccountContext			72.2%
nofx/telegram/agent/agent.go:194:			Run					79.1%
nofx/telegram/agent/agent.go:283:			ResetMemory				0.0%
nofx/telegram/agent/apicall.go:29:			newAPICallTool				100.0%
nofx/telegram/agent/apicall.go:38:			execute					80.0%
nofx/telegram/agent/manager.go:26:			NewManager				0.0%
nofx/telegram/agent/manager.go:42:			Run					0.0%
nofx/telegram/agent/manager.go:55:			Reset					0.0%
nofx/telegram/agent/manager.go:64:			getOrCreate				0.0%
nofx/telegram/agent/prompt.go:9:			BuildAgentPrompt			0.0%
nofx/telegram/bot.go:23:				Start					0.0%
nofx/telegram/bot.go:45:				resolveToken				0.0%
nofx/telegram/bot.go:54:				runBot					0.0%
nofx/telegram/bot.go:254:				sendMsg					0.0%
nofx/telegram/bot.go:259:				sendMarkdownMsg				0.0%
nofx/telegram/bot.go:270:				newLLMClient				0.0%
nofx/telegram/bot.go:319:				isUSDCProvider				0.0%
nofx/telegram/bot.go:323:				clientForProvider			0.0%
nofx/telegram/bot.go:335:				statusMsg				0.0%
nofx/telegram/bot.go:401:				langMenuMsg				0.0%
nofx/telegram/bot.go:405:				parseLangChoice				0.0%
nofx/telegram/bot.go:417:				helpMsg					0.0%
nofx/telegram/session/memory.go:28:			NewMemory				0.0%
nofx/telegram/session/memory.go:33:			Add					0.0%
nofx/telegram/session/memory.go:41:			BuildContext				0.0%
nofx/telegram/session/memory.go:58:			Reset					0.0%
nofx/telegram/session/memory.go:63:			ResetFull				0.0%
nofx/telegram/session/memory.go:68:			estimateTokens				0.0%
nofx/telegram/session/memory.go:79:			compact					0.0%
nofx/telemetry/experience.go:60:			Init					0.0%
nofx/telemetry/experience.go:69:			SetInstallationID			0.0%
nofx/telemetry/experience.go:78:			GetInstallationID			0.0%
nofx/telemetry/experience.go:87:			SetEnabled				0.0%
nofx/telemetry/experience.go:96:			IsEnabled				0.0%
nofx/telemetry/experience.go:105:			TrackTrade				0.0%
nofx/telemetry/experience.go:117:			sendTradeEvent				0.0%
nofx/telemetry/experience.go:163:			TrackStartup				0.0%
nofx/telemetry/experience.go:200:			TrackAIUsage				0.0%
nofx/trader/aster/trader.go:52:				NewAsterTrader				87.5%
nofx/trader/aster/trader.go:83:				genNonce				100.0%
nofx/trader/aster/trader.go:88:				getPrecision				89.3%
nofx/trader/aster/trader.go:152:			roundToTickSize				80.0%
nofx/trader/aster/trader.go:165:			formatPrice				57.1%
nofx/trader/aster/trader.go:182:			formatQuantity				57.1%
nofx/trader/aster/trader.go:199:			formatFloatWithPrecision		100.0%
nofx/trader/aster/trader.go:211:			normalizeAndStringify			71.4%
nofx/trader/aster/trader.go:224:			normalize				52.0%
nofx/trader/aster/trader.go:268:			sign					86.2%
nofx/trader/aster/trader.go:329:			request					55.0%
nofx/trader/aster/trader.go:372:			doRequest				80.0%
nofx/trader/aster/trader_account.go:16:			GetBalance				86.4%
nofx/trader/aster/trader_account.go:104:		GetMarketPrice				78.6%
nofx/trader/aster/trader_account.go:133:		GetClosedPnL				0.0%
nofx/trader/aster/trader_account.go:204:		GetTrades				0.0%
nofx/trader/aster/trader_account.go:254:		GetOrderBook				0.0%
nofx/trader/aster/trader_orders.go:13:			OpenLong				66.7%
nofx/trader/aster/trader_orders.go:86:			OpenShort				66.7%
nofx/trader/aster/trader_orders.go:159:			CloseLong				71.1%
nofx/trader/aster/trader_orders.go:241:			CloseShort				71.1%
nofx/trader/aster/trader_orders.go:324:			SetStopLoss				82.4%
nofx/trader/aster/trader_orders.go:365:			SetTakeProfit				82.4%
nofx/trader/aster/trader_orders.go:406:			CancelStopLossOrders			40.0%
nofx/trader/aster/trader_orders.go:465:			CancelTakeProfitOrders			40.0%
nofx/trader/aster/trader_orders.go:524:			CancelAllOrders				100.0%
nofx/trader/aster/trader_orders.go:534:			CancelStopOrders			43.5%
nofx/trader/aster/trader_orders.go:589:			FormatQuantity				75.0%
nofx/trader/aster/trader_orders.go:598:			GetOrderStatus				0.0%
nofx/trader/aster/trader_orders.go:647:			GetOpenOrders				0.0%
nofx/trader/aster/trader_orders.go:697:			PlaceLimitOrder				0.0%
nofx/trader/aster/trader_orders.go:775:			CancelOrder				0.0%
nofx/trader/aster/trader_positions.go:12:		GetPositions				76.9%
nofx/trader/aster/trader_positions.go:66:		SetMarginMode				40.0%
nofx/trader/aster/trader_positions.go:113:		SetLeverage				100.0%
nofx/trader/aster/trader_sync.go:17:			SyncOrdersFromAster			0.0%
nofx/trader/aster/trader_sync.go:149:			deriveAsterOrderAction			0.0%
nofx/trader/aster/trader_sync.go:183:			StartOrderSync				0.0%
nofx/trader/auto_trader.go:159:				NewAutoTrader				0.0%
nofx/trader/auto_trader.go:375:				Run					0.0%
nofx/trader/auto_trader.go:522:				Stop					0.0%
nofx/trader/auto_trader.go:537:				GetID					0.0%
nofx/trader/auto_trader.go:543:				GetUnderlyingTrader			0.0%
nofx/trader/auto_trader.go:548:				GetName					0.0%
nofx/trader/auto_trader.go:553:				GetAIModel				0.0%
nofx/trader/auto_trader.go:558:				GetExchange				0.0%
nofx/trader/auto_trader.go:563:				GetShowInCompetition			0.0%
nofx/trader/auto_trader.go:568:				SetShowInCompetition			0.0%
nofx/trader/auto_trader.go:573:				SetCustomPrompt				0.0%
nofx/trader/auto_trader.go:578:				SetOverrideBasePrompt			0.0%
nofx/trader/auto_trader.go:583:				GetSystemPromptTemplate			0.0%
nofx/trader/auto_trader.go:594:				GetStore				0.0%
nofx/trader/auto_trader.go:600:				calculatePnLPercentage			0.0%
nofx/trader/auto_trader.go:608:				runPreLaunchChecks			0.0%
nofx/trader/auto_trader.go:652:				deriveWalletAddress			0.0%
nofx/trader/auto_trader_decision.go:15:			saveEquitySnapshot			0.0%
nofx/trader/auto_trader_decision.go:36:			saveDecision				0.0%
nofx/trader/auto_trader_decision.go:59:			GetStatus				0.0%
nofx/trader/auto_trader_decision.go:97:			GetAccountInfo				0.0%
nofx/trader/auto_trader_decision.go:194:		GetPositions				0.0%
nofx/trader/auto_trader_decision.go:244:		recordAndConfirmOrder			0.0%
nofx/trader/auto_trader_decision.go:360:		recordPositionChange			0.0%
nofx/trader/auto_trader_decision.go:410:		createOrderRecord			0.0%
nofx/trader/auto_trader_decision.go:459:		recordOrderFill				0.0%
nofx/trader/auto_trader_decision.go:525:		GetOpenOrders				0.0%
nofx/trader/auto_trader_grid.go:75:			NewGridState				0.0%
nofx/trader/auto_trader_grid.go:99:			checkBreakout				0.0%
nofx/trader/auto_trader_grid.go:133:			checkMaxDrawdown			0.0%
nofx/trader/auto_trader_grid.go:185:			checkDailyLossLimit			0.0%
nofx/trader/auto_trader_grid.go:212:			updateDailyPnL				0.0%
nofx/trader/auto_trader_grid.go:220:			emergencyExit				0.0%
nofx/trader/auto_trader_grid.go:255:			handleBreakout				0.0%
nofx/trader/auto_trader_grid.go:289:			InitializeGrid				0.0%
nofx/trader/auto_trader_grid.go:353:			RunGridCycle				0.0%
nofx/trader/auto_trader_grid.go:465:			buildGridContext			0.0%
nofx/trader/auto_trader_grid.go:530:			executeGridDecision			0.0%
nofx/trader/auto_trader_grid.go:563:			IsGridStrategy				0.0%
nofx/trader/auto_trader_grid.go:571:			saveGridDecisionRecord			0.0%
nofx/trader/auto_trader_grid_levels.go:16:		calculateDefaultBounds			0.0%
nofx/trader/auto_trader_grid_levels.go:24:		calculateATRBounds			0.0%
nofx/trader/auto_trader_grid_levels.go:46:		initializeGridLevels			0.0%
nofx/trader/auto_trader_grid_levels.go:98:		applyGridDirection			0.0%
nofx/trader/auto_trader_grid_levels.go:186:		checkGridSkew				0.0%
nofx/trader/auto_trader_grid_levels.go:228:		autoAdjustGrid				0.0%
nofx/trader/auto_trader_grid_levels.go:333:		calculateDefaultBoundsLocked		0.0%
nofx/trader/auto_trader_grid_levels.go:341:		calculateATRBoundsLocked		0.0%
nofx/trader/auto_trader_grid_levels.go:363:		initializeGridLevelsLocked		0.0%
nofx/trader/auto_trader_grid_levels.go:414:		applyGridDirectionLocked		0.0%
nofx/trader/auto_trader_grid_orders.go:17:		checkTotalPositionLimit			0.0%
nofx/trader/auto_trader_grid_orders.go:58:		placeGridLimitOrder			0.0%
nofx/trader/auto_trader_grid_orders.go:154:		cancelGridOrder				0.0%
nofx/trader/auto_trader_grid_orders.go:181:		cancelAllGridOrders			0.0%
nofx/trader/auto_trader_grid_orders.go:205:		pauseGrid				0.0%
nofx/trader/auto_trader_grid_orders.go:217:		resumeGrid				0.0%
nofx/trader/auto_trader_grid_orders.go:227:		adjustGrid				0.0%
nofx/trader/auto_trader_grid_orders.go:247:		syncGridState				0.0%
nofx/trader/auto_trader_grid_orders.go:324:		closeAllPositions			0.0%
nofx/trader/auto_trader_grid_orders.go:360:		checkAndExecuteStopLoss			0.0%
nofx/trader/auto_trader_grid_regime.go:16:		checkBoxBreakout			0.0%
nofx/trader/auto_trader_grid_regime.go:79:		executeBreakoutAction			0.0%
nofx/trader/auto_trader_grid_regime.go:119:		executeDirectionAdjustment		0.0%
nofx/trader/auto_trader_grid_regime.go:140:		adjustGridDirection			0.0%
nofx/trader/auto_trader_grid_regime.go:169:		checkFalseBreakoutRecovery		0.0%
nofx/trader/auto_trader_grid_regime.go:227:		GetGridRiskInfo				0.0%
nofx/trader/auto_trader_loop.go:15:			runCycle				0.0%
nofx/trader/auto_trader_loop.go:290:			buildTradingContext			0.0%
nofx/trader/auto_trader_loop.go:585:			sortDecisionsByPriority			0.0%
nofx/trader/auto_trader_loop.go:621:			checkClaw402Balance			0.0%
nofx/trader/auto_trader_orders.go:13:			executeDecisionWithRecord		0.0%
nofx/trader/auto_trader_orders.go:32:			executeOpenLongWithRecord		0.0%
nofx/trader/auto_trader_orders.go:149:			executeOpenShortWithRecord		0.0%
nofx/trader/auto_trader_orders.go:266:			executeCloseLongWithRecord		0.0%
nofx/trader/auto_trader_orders.go:330:			executeCloseShortWithRecord		0.0%
nofx/trader/auto_trader_risk.go:11:			startDrawdownMonitor			0.0%
nofx/trader/auto_trader_risk.go:34:			checkPositionDrawdown			0.0%
nofx/trader/auto_trader_risk.go:116:			emergencyClosePosition			0.0%
nofx/trader/auto_trader_risk.go:138:			GetPeakPnLCache				0.0%
nofx/trader/auto_trader_risk.go:151:			UpdatePeakPnL				0.0%
nofx/trader/auto_trader_risk.go:168:			ClearPeakPnLCache			0.0%
nofx/trader/auto_trader_risk.go:181:			isBTCETH				0.0%
nofx/trader/auto_trader_risk.go:191:			enforcePositionValueRatio		0.0%
nofx/trader/auto_trader_risk.go:226:			enforceMinPositionSize			0.0%
nofx/trader/auto_trader_risk.go:243:			enforceMaxPositions			0.0%
nofx/trader/auto_trader_risk.go:260:			getSideFromAction			0.0%
nofx/trader/binance/futures.go:21:			getBrOrderID				88.9%
nofx/trader/binance/futures.go:64:			NewFuturesTrader			88.9%
nofx/trader/binance/futures.go:89:			setDualSidePosition			44.4%
nofx/trader/binance/futures.go:111:			syncBinanceServerTime			50.0%
nofx/trader/binance/futures.go:126:			contains				100.0%
nofx/trader/binance/futures.go:130:			stringContains				75.0%
nofx/trader/binance/futures.go:140:			calculatePrecision			88.9%
nofx/trader/binance/futures.go:163:			trimTrailingZeros			57.1%
nofx/trader/binance/futures_account.go:13:		GetBalance				72.7%
nofx/trader/binance/futures_account.go:55:		GetClosedPnL				0.0%
nofx/trader/binance/futures_account.go:112:		GetTrades				0.0%
nofx/trader/binance/futures_account.go:155:		GetTradesForSymbol			0.0%
nofx/trader/binance/futures_account.go:198:		GetTradesForSymbolFromID		0.0%
nofx/trader/binance/futures_account.go:241:		GetCommissionSymbols			0.0%
nofx/trader/binance/futures_account.go:268:		GetPnLSymbols				0.0%
nofx/trader/binance/futures_orders.go:14:		OpenLong				72.7%
nofx/trader/binance/futures_orders.go:69:		OpenShort				72.7%
nofx/trader/binance/futures_orders.go:124:		CloseLong				75.0%
nofx/trader/binance/futures_orders.go:179:		CloseShort				75.0%
nofx/trader/binance/futures_orders.go:235:		CancelStopLossOrders			32.4%
nofx/trader/binance/futures_orders.go:311:		CancelTakeProfitOrders			32.4%
nofx/trader/binance/futures_orders.go:387:		CancelAllOrders				80.0%
nofx/trader/binance/futures_orders.go:418:		PlaceLimitOrder				0.0%
nofx/trader/binance/futures_orders.go:484:		CancelOrder				0.0%
nofx/trader/binance/futures_orders.go:506:		GetOrderBook				0.0%
nofx/trader/binance/futures_orders.go:537:		CancelStopOrders			52.4%
nofx/trader/binance/futures_orders.go:596:		GetOpenOrders				0.0%
nofx/trader/binance/futures_orders.go:655:		SetStopLoss				91.7%
nofx/trader/binance/futures_orders.go:689:		SetTakeProfit				91.7%
nofx/trader/binance/futures_orders.go:722:		GetOrderStatus				0.0%
nofx/trader/binance/futures_positions.go:14:		GetPositions				78.8%
nofx/trader/binance/futures_positions.go:69:		SetMarginMode				42.3%
nofx/trader/binance/futures_positions.go:120:		SetLeverage				81.0%
nofx/trader/binance/futures_positions.go:166:		GetMarketPrice				77.8%
nofx/trader/binance/futures_positions.go:185:		CalculatePositionSize			100.0%
nofx/trader/binance/futures_positions.go:193:		GetMinNotional				100.0%
nofx/trader/binance/futures_positions.go:199:		CheckMinNotional			75.0%
nofx/trader/binance/futures_positions.go:219:		GetSymbolPrecision			76.9%
nofx/trader/binance/futures_positions.go:244:		FormatQuantity				80.0%
nofx/trader/binance/futures_positions.go:256:		GetSymbolPricePrecision			0.0%
nofx/trader/binance/futures_positions.go:280:		FormatPrice				0.0%
nofx/trader/binance/order_sync.go:24:			SyncOrdersFromBinance			0.0%
nofx/trader/binance/order_sync.go:295:			getPositionSymbols			0.0%
nofx/trader/binance/order_sync.go:311:			determineOrderAction			0.0%
nofx/trader/binance/order_sync.go:352:			StartOrderSync				0.0%
nofx/trader/bitget/order_sync.go:32:			GetTrades				0.0%
nofx/trader/bitget/order_sync.go:159:			SyncOrdersFromBitget			0.0%
nofx/trader/bitget/order_sync.go:282:			StartOrderSync				0.0%
nofx/trader/bitget/trader.go:84:			NewBitgetTrader				0.0%
nofx/trader/bitget/trader.go:110:			setPositionMode				0.0%
nofx/trader/bitget/trader.go:129:			sign					0.0%
nofx/trader/bitget/trader.go:138:			doRequest				0.0%
nofx/trader/bitget/trader.go:215:			convertSymbol				0.0%
nofx/trader/bitget/trader.go:221:			getContract				0.0%
nofx/trader/bitget/trader.go:291:			FormatQuantity				0.0%
nofx/trader/bitget/trader.go:303:			clearCache				0.0%
nofx/trader/bitget/trader.go:314:			genBitgetClientOid			0.0%
nofx/trader/bitget/trader_account.go:13:		GetBalance				0.0%
nofx/trader/bitget/trader_account.go:71:		SetMarginMode				0.0%
nofx/trader/bitget/trader_account.go:103:		SetLeverage				0.0%
nofx/trader/bitget/trader_account.go:127:		GetMarketPrice				0.0%
nofx/trader/bitget/trader_account.go:162:		GetOrderBook				0.0%
nofx/trader/bitget/trader_orders.go:13:			OpenLong				0.0%
nofx/trader/bitget/trader_orders.go:67:			OpenShort				0.0%
nofx/trader/bitget/trader_orders.go:121:		CloseLong				0.0%
nofx/trader/bitget/trader_orders.go:184:		CloseShort				0.0%
nofx/trader/bitget/trader_orders.go:252:		SetStopLoss				0.0%
nofx/trader/bitget/trader_orders.go:291:		SetTakeProfit				0.0%
nofx/trader/bitget/trader_orders.go:330:		CancelStopLossOrders			0.0%
nofx/trader/bitget/trader_orders.go:335:		CancelTakeProfitOrders			0.0%
nofx/trader/bitget/trader_orders.go:340:		cancelPlanOrders			0.0%
nofx/trader/bitget/trader_orders.go:380:		CancelAllOrders				0.0%
nofx/trader/bitget/trader_orders.go:423:		CancelStopOrders			0.0%
nofx/trader/bitget/trader_orders.go:430:		GetOrderStatus				0.0%
nofx/trader/bitget/trader_orders.go:494:		GetOpenOrders				0.0%
nofx/trader/bitget/trader_orders.go:625:		PlaceLimitOrder				0.0%
nofx/trader/bitget/trader_orders.go:695:		CancelOrder				0.0%
nofx/trader/bitget/trader_positions.go:12:		GetPositions				0.0%
nofx/trader/bitget/trader_positions.go:96:		GetClosedPnL				0.0%
nofx/trader/bybit/order_sync.go:38:			GetTrades				0.0%
nofx/trader/bybit/order_sync.go:43:			getTradesViaHTTP			0.0%
nofx/trader/bybit/order_sync.go:106:			parseTradesResult			0.0%
nofx/trader/bybit/order_sync.go:178:			SyncOrdersFromBybit			0.0%
nofx/trader/bybit/order_sync.go:301:			StartOrderSync				0.0%
nofx/trader/bybit/trader.go:43:				NewBybitTrader				0.0%
nofx/trader/bybit/trader.go:80:				RoundTrip				0.0%
nofx/trader/bybit/trader.go:86:				getQtyStep				0.0%
nofx/trader/bybit/trader.go:144:			FormatQuantity				0.0%
nofx/trader/bybit/trader.go:169:			clearCache				0.0%
nofx/trader/bybit/trader.go:179:			parseOrderResult			0.0%
nofx/trader/bybit/trader_account.go:18:			GetBalance				0.0%
nofx/trader/bybit/trader_account.go:93:			GetClosedPnL				0.0%
nofx/trader/bybit/trader_account.go:99:			getClosedPnLViaHTTP			0.0%
nofx/trader/bybit/trader_account.go:160:		parseClosedPnLResult			0.0%
nofx/trader/bybit/trader_orders.go:16:			OpenLong				0.0%
nofx/trader/bybit/trader_orders.go:59:			OpenShort				0.0%
nofx/trader/bybit/trader_orders.go:102:			CloseLong				0.0%
nofx/trader/bybit/trader_orders.go:147:			CloseShort				0.0%
nofx/trader/bybit/trader_orders.go:192:			SetLeverage				0.0%
nofx/trader/bybit/trader_orders.go:217:			SetMarginMode				0.0%
nofx/trader/bybit/trader_orders.go:245:			GetMarketPrice				0.0%
nofx/trader/bybit/trader_orders.go:282:			SetStopLoss				0.0%
nofx/trader/bybit/trader_orders.go:328:			SetTakeProfit				0.0%
nofx/trader/bybit/trader_orders.go:374:			CancelStopLossOrders			0.0%
nofx/trader/bybit/trader_orders.go:379:			CancelTakeProfitOrders			0.0%
nofx/trader/bybit/trader_orders.go:384:			CancelAllOrders				0.0%
nofx/trader/bybit/trader_orders.go:399:			CancelStopOrders			0.0%
nofx/trader/bybit/trader_orders.go:409:			cancelConditionalOrders			0.0%
nofx/trader/bybit/trader_orders.go:466:			GetOrderStatus				0.0%
nofx/trader/bybit/trader_orders.go:527:			GetOpenOrders				0.0%
nofx/trader/bybit/trader_orders.go:589:			PlaceLimitOrder				0.0%
nofx/trader/bybit/trader_orders.go:664:			CancelOrder				0.0%
nofx/trader/bybit/trader_orders.go:686:			GetOrderBook				0.0%
nofx/trader/bybit/trader_positions.go:13:		GetPositions				0.0%
nofx/trader/gate/order_sync.go:34:			GetTrades				0.0%
nofx/trader/gate/order_sync.go:153:			SyncOrdersFromGate			0.0%
nofx/trader/gate/order_sync.go:294:			StartOrderSync				0.0%
nofx/trader/gate/trader.go:34:				NewGateTrader				100.0%
nofx/trader/gate/trader.go:58:				convertSymbol				83.3%
nofx/trader/gate/trader.go:72:				revertSymbol				100.0%
nofx/trader/gate/trader.go:77:				getContract				0.0%
nofx/trader/gate/trader.go:103:				clearCache				100.0%
nofx/trader/gate/trader_account.go:14:			GetBalance				0.0%
nofx/trader/gate/trader_account.go:50:			GetPositions				0.0%
nofx/trader/gate/trader_account.go:126:			GetClosedPnL				0.0%
nofx/trader/gate/trader_orders.go:16:			SetLeverage				0.0%
nofx/trader/gate/trader_orders.go:34:			SetMarginMode				0.0%
nofx/trader/gate/trader_orders.go:43:			OpenLong				0.0%
nofx/trader/gate/trader_orders.go:101:			OpenShort				0.0%
nofx/trader/gate/trader_orders.go:158:			CloseLong				0.0%
nofx/trader/gate/trader_orders.go:226:			CloseShort				0.0%
nofx/trader/gate/trader_orders.go:299:			GetMarketPrice				0.0%
nofx/trader/gate/trader_orders.go:320:			SetStopLoss				0.0%
nofx/trader/gate/trader_orders.go:372:			SetTakeProfit				0.0%
nofx/trader/gate/trader_orders.go:423:			CancelStopLossOrders			0.0%
nofx/trader/gate/trader_orders.go:428:			CancelTakeProfitOrders			0.0%
nofx/trader/gate/trader_orders.go:433:			cancelTriggerOrders			0.0%
nofx/trader/gate/trader_orders.go:458:			CancelAllOrders				0.0%
nofx/trader/gate/trader_orders.go:477:			CancelStopOrders			0.0%
nofx/trader/gate/trader_orders.go:484:			FormatQuantity				0.0%
nofx/trader/gate/trader_orders.go:502:			GetOrderStatus				0.0%
nofx/trader/gate/trader_orders.go:563:			GetOpenOrders				0.0%
nofx/trader/grid_regime.go:16:				classifyRegimeLevel			100.0%
nofx/trader/grid_regime.go:37:				getRegimeLeverageLimit			0.0%
nofx/trader/grid_regime.go:65:				getRegimePositionLimit			0.0%
nofx/trader/grid_regime.go:98:				detectBoxBreakout			75.0%
nofx/trader/grid_regime.go:147:				confirmBreakout				100.0%
nofx/trader/grid_regime.go:185:				getBreakoutAction			100.0%
nofx/trader/grid_regime.go:212:				determineGridDirection			84.6%
nofx/trader/grid_regime.go:252:				determineRecoveryDirection		100.0%
nofx/trader/grid_regime.go:282:				getBreakoutActionWithDirection		100.0%
nofx/trader/grid_regime.go:304:				shouldRecoverDirection			100.0%
nofx/trader/helpers.go:9:				SafeFloat64				0.0%
nofx/trader/helpers.go:37:				SafeString				0.0%
nofx/trader/helpers.go:54:				SafeInt					0.0%
nofx/trader/hyperliquid/order_sync.go:17:		SyncOrdersFromHyperliquid		0.0%
nofx/trader/hyperliquid/order_sync.go:139:		StartOrderSync				0.0%
nofx/trader/hyperliquid/trader.go:71:			isXyzDexAsset				0.0%
nofx/trader/hyperliquid/trader.go:88:			convertSymbolToHyperliquid		0.0%
nofx/trader/hyperliquid/trader.go:112:			absFloat				0.0%
nofx/trader/hyperliquid/trader.go:121:			NewHyperliquidTrader			0.0%
nofx/trader/hyperliquid/trader.go:233:			FormatQuantity				0.0%
nofx/trader/hyperliquid/trader.go:243:			getSzDecimals				80.0%
nofx/trader/hyperliquid/trader.go:265:			roundToSzDecimals			0.0%
nofx/trader/hyperliquid/trader.go:280:			roundPriceToSigfigs			0.0%
nofx/trader/hyperliquid/trader_account.go:17:		GetBalance				0.0%
nofx/trader/hyperliquid/trader_account.go:203:		getXYZDexBalance			0.0%
nofx/trader/hyperliquid/trader_account.go:270:		GetMarketPrice				0.0%
nofx/trader/hyperliquid/trader_account.go:297:		getXyzMarketPrice			0.0%
nofx/trader/hyperliquid/trader_account.go:358:		GetOrderStatus				0.0%
nofx/trader/hyperliquid/trader_account.go:405:		GetClosedPnL				0.0%
nofx/trader/hyperliquid/trader_account.go:456:		GetTrades				0.0%
nofx/trader/hyperliquid/trader_account.go:528:		GetOpenOrders				0.0%
nofx/trader/hyperliquid/trader_account.go:563:		GetOrderBook				0.0%
nofx/trader/hyperliquid/trader_orders.go:19:		OpenLong				0.0%
nofx/trader/hyperliquid/trader_orders.go:91:		OpenShort				0.0%
nofx/trader/hyperliquid/trader_orders.go:163:		CloseLong				0.0%
nofx/trader/hyperliquid/trader_orders.go:250:		CloseShort				0.0%
nofx/trader/hyperliquid/trader_orders.go:337:		CancelStopLossOrders			0.0%
nofx/trader/hyperliquid/trader_orders.go:345:		CancelTakeProfitOrders			0.0%
nofx/trader/hyperliquid/trader_orders.go:353:		CancelAllOrders				0.0%
nofx/trader/hyperliquid/trader_orders.go:385:		CancelStopOrders			0.0%
nofx/trader/hyperliquid/trader_orders.go:427:		cancelXyzOrders				0.0%
nofx/trader/hyperliquid/trader_orders.go:495:		cancelXyzOrder				0.0%
nofx/trader/hyperliquid/trader_orders.go:570:		floatToWireStr				0.0%
nofx/trader/hyperliquid/trader_orders.go:584:		placeXyzOrder				0.0%
nofx/trader/hyperliquid/trader_orders.go:746:		placeXyzTriggerOrder			0.0%
nofx/trader/hyperliquid/trader_orders.go:900:		SetStopLoss				0.0%
nofx/trader/hyperliquid/trader_orders.go:948:		SetTakeProfit				0.0%
nofx/trader/hyperliquid/trader_orders.go:997:		PlaceLimitOrder				0.0%
nofx/trader/hyperliquid/trader_orders.go:1059:		CancelOrder				0.0%
nofx/trader/hyperliquid/trader_positions.go:11:		GetPositions				0.0%
nofx/trader/hyperliquid/trader_positions.go:142:	SetMarginMode				0.0%
nofx/trader/hyperliquid/trader_positions.go:154:	SetLeverage				0.0%
nofx/trader/hyperliquid/trader_sync.go:15:		refreshMetaIfNeeded			0.0%
nofx/trader/hyperliquid/trader_sync.go:50:		fetchXyzMeta				0.0%
nofx/trader/hyperliquid/trader_sync.go:100:		getXyzSzDecimals			0.0%
nofx/trader/hyperliquid/trader_sync.go:127:		getXyzAssetIndex			0.0%
nofx/trader/indodax/trader.go:93:			NewIndodaxTrader			100.0%
nofx/trader/indodax/trader.go:105:			getNonce				100.0%
nofx/trader/indodax/trader.go:113:			sign					100.0%
nofx/trader/indodax/trader.go:120:			doPublicRequest				0.0%
nofx/trader/indodax/trader.go:147:			doPrivateRequest			0.0%
nofx/trader/indodax/trader.go:195:			convertSymbol				88.9%
nofx/trader/indodax/trader.go:218:			convertSymbolBack			100.0%
nofx/trader/indodax/trader.go:224:			getCoinFromSymbol			80.0%
nofx/trader/indodax/trader.go:234:			loadPairs				0.0%
nofx/trader/indodax/trader.go:269:			getPair					0.0%
nofx/trader/indodax/trader.go:293:			clearCache				100.0%
nofx/trader/indodax/trader.go:301:			parseFloat				72.7%
nofx/trader/indodax/trader_account.go:15:		GetBalance				0.0%
nofx/trader/indodax/trader_account.go:87:		GetPositions				0.0%
nofx/trader/indodax/trader_account.go:163:		GetClosedPnL				0.0%
nofx/trader/indodax/trader_orders.go:15:		OpenLong				0.0%
nofx/trader/indodax/trader_orders.go:58:		OpenShort				100.0%
nofx/trader/indodax/trader_orders.go:63:		CloseLong				0.0%
nofx/trader/indodax/trader_orders.go:119:		CloseShort				100.0%
nofx/trader/indodax/trader_orders.go:124:		SetLeverage				100.0%
nofx/trader/indodax/trader_orders.go:130:		SetMarginMode				100.0%
nofx/trader/indodax/trader_orders.go:136:		GetMarketPrice				0.0%
nofx/trader/indodax/trader_orders.go:158:		SetStopLoss				100.0%
nofx/trader/indodax/trader_orders.go:163:		SetTakeProfit				100.0%
nofx/trader/indodax/trader_orders.go:168:		CancelStopLossOrders			0.0%
nofx/trader/indodax/trader_orders.go:173:		CancelTakeProfitOrders			0.0%
nofx/trader/indodax/trader_orders.go:178:		CancelAllOrders				0.0%
nofx/trader/indodax/trader_orders.go:224:		CancelStopOrders			0.0%
nofx/trader/indodax/trader_orders.go:229:		FormatQuantity				0.0%
nofx/trader/indodax/trader_orders.go:249:		GetOrderStatus				0.0%
nofx/trader/indodax/trader_orders.go:301:		GetOpenOrders				0.0%
nofx/trader/interface.go:27:				NewGridTraderAdapter			0.0%
nofx/trader/interface.go:33:				PlaceLimitOrder				0.0%
nofx/trader/interface.go:67:				CancelOrder				0.0%
nofx/trader/interface.go:85:				GetOrderBook				0.0%
nofx/trader/kucoin/order_sync.go:30:			GetTrades				0.0%
nofx/trader/kucoin/order_sync.go:162:			GetRecentTrades				0.0%
nofx/trader/kucoin/order_sync.go:254:			ToTradeRecord				100.0%
nofx/trader/kucoin/order_sync.go:279:			SyncOrdersFromKuCoin			0.0%
nofx/trader/kucoin/order_sync.go:402:			StartOrderSync				0.0%
nofx/trader/kucoin/trader.go:98:			NewKuCoinTrader				0.0%
nofx/trader/kucoin/trader.go:123:			syncServerTime				0.0%
nofx/trader/kucoin/trader.go:161:			getTimestamp				0.0%
nofx/trader/kucoin/trader.go:172:			sign					0.0%
nofx/trader/kucoin/trader.go:181:			signPassphrase				0.0%
nofx/trader/kucoin/trader.go:188:			signPartner				0.0%
nofx/trader/kucoin/trader.go:196:			doRequest				0.0%
nofx/trader/kucoin/trader.go:261:			convertSymbol				0.0%
nofx/trader/kucoin/trader.go:273:			convertSymbolBack			0.0%
nofx/trader/kucoin/trader.go:284:			getContract				0.0%
nofx/trader/kucoin/trader.go:350:			quantityToLots				0.0%
nofx/trader/kucoin/trader_account.go:11:		GetBalance				0.0%
nofx/trader/kucoin/trader_orders.go:15:			OpenLong				0.0%
nofx/trader/kucoin/trader_orders.go:70:			OpenShort				0.0%
nofx/trader/kucoin/trader_orders.go:125:		queryOrderFillPrice			0.0%
nofx/trader/kucoin/trader_orders.go:150:		CloseLong				0.0%
nofx/trader/kucoin/trader_orders.go:231:		CloseShort				0.0%
nofx/trader/kucoin/trader_orders.go:312:		GetMarketPrice				0.0%
nofx/trader/kucoin/trader_orders.go:334:		SetStopLoss				0.0%
nofx/trader/kucoin/trader_orders.go:374:		SetTakeProfit				0.0%
nofx/trader/kucoin/trader_orders.go:414:		CancelStopLossOrders			0.0%
nofx/trader/kucoin/trader_orders.go:419:		CancelTakeProfitOrders			0.0%
nofx/trader/kucoin/trader_orders.go:424:		cancelStopOrdersByType			0.0%
nofx/trader/kucoin/trader_orders.go:476:		CancelStopOrders			0.0%
nofx/trader/kucoin/trader_orders.go:494:		CancelAllOrders				0.0%
nofx/trader/kucoin/trader_orders.go:511:		SetMarginMode				0.0%
nofx/trader/kucoin/trader_orders.go:518:		SetLeverage				0.0%
nofx/trader/kucoin/trader_orders.go:541:		FormatQuantity				0.0%
nofx/trader/kucoin/trader_orders.go:557:		GetOrderStatus				0.0%
nofx/trader/kucoin/trader_orders.go:597:		GetClosedPnL				0.0%
nofx/trader/kucoin/trader_orders.go:678:		GetOpenOrders				0.0%
nofx/trader/kucoin/trader_positions.go:10:		GetPositions				0.0%
nofx/trader/kucoin/trader_positions.go:110:		InvalidatePositionCache			0.0%
nofx/trader/lighter/account.go:15:			getFullAccountInfo			0.0%
nofx/trader/lighter/account.go:85:			GetBalance				0.0%
nofx/trader/lighter/account.go:108:			GetAccountBalance			0.0%
nofx/trader/lighter/account.go:160:			GetPositions				0.0%
nofx/trader/lighter/account.go:186:			GetPositionsRaw				0.0%
nofx/trader/lighter/account.go:267:			GetPosition				0.0%
nofx/trader/lighter/account.go:284:			GetMarketPrice				0.0%
nofx/trader/lighter/account.go:353:			FormatQuantity				0.0%
nofx/trader/lighter/account.go:361:			GetOrderBook				0.0%
nofx/trader/lighter/order_sync.go:17:			SyncOrdersFromLighter			0.0%
nofx/trader/lighter/order_sync.go:148:			StartOrderSync				0.0%
nofx/trader/lighter/orders.go:17:			SetStopLoss				0.0%
nofx/trader/lighter/orders.go:39:			SetTakeProfit				0.0%
nofx/trader/lighter/orders.go:60:			CancelAllOrders				0.0%
nofx/trader/lighter/orders.go:95:			GetOrderStatus				0.0%
nofx/trader/lighter/orders.go:159:			CancelStopLossOrders			0.0%
nofx/trader/lighter/orders.go:166:			CancelTakeProfitOrders			0.0%
nofx/trader/lighter/orders.go:173:			CancelStopOrders			0.0%
nofx/trader/lighter/orders.go:204:			GetActiveOrders				0.0%
nofx/trader/lighter/orders.go:270:			CancelOrder				0.0%
nofx/trader/lighter/orders.go:329:			getOrderIndexByTxHash			0.0%
nofx/trader/lighter/trader.go:102:			NewLighterTraderV2			0.0%
nofx/trader/lighter/trader.go:183:			initializeAccount			0.0%
nofx/trader/lighter/trader.go:200:			getAccountByL1Address			0.0%
nofx/trader/lighter/trader.go:274:			getApiKeyFromServer			0.0%
nofx/trader/lighter/trader.go:315:			checkClient				0.0%
nofx/trader/lighter/trader.go:342:			GenerateAndRegisterAPIKey		0.0%
nofx/trader/lighter/trader.go:354:			refreshAuthToken			0.0%
nofx/trader/lighter/trader.go:376:			ensureAuthToken				0.0%
nofx/trader/lighter/trader.go:390:			GetExchangeType				0.0%
nofx/trader/lighter/trader.go:395:			Cleanup					0.0%
nofx/trader/lighter/trader.go:402:			GetClosedPnL				0.0%
nofx/trader/lighter/trader.go:451:			GetTrades				0.0%
nofx/trader/lighter/trading.go:20:			OpenLong				0.0%
nofx/trader/lighter/trading.go:61:			OpenShort				0.0%
nofx/trader/lighter/trading.go:102:			CloseLong				0.0%
nofx/trader/lighter/trading.go:146:			CloseShort				0.0%
nofx/trader/lighter/trading.go:190:			CreateOrder				0.0%
nofx/trader/lighter/trading.go:352:			submitOrder				0.0%
nofx/trader/lighter/trading.go:443:			pollForOrderIndex			0.0%
nofx/trader/lighter/trading.go:471:			normalizeSymbol				0.0%
nofx/trader/lighter/trading.go:482:			getMarketInfo				0.0%
nofx/trader/lighter/trading.go:503:			getMarketIndex				0.0%
nofx/trader/lighter/trading.go:523:			fetchMarketList				0.0%
nofx/trader/lighter/trading.go:598:			getFallbackMarketIndex			0.0%
nofx/trader/lighter/trading.go:625:			SetLeverage				0.0%
nofx/trader/lighter/trading.go:687:			SetMarginMode				0.0%
nofx/trader/lighter/trading.go:752:			CreateStopOrder				0.0%
nofx/trader/lighter/trading.go:843:			boolToUint8				0.0%
nofx/trader/lighter/trading.go:851:			pow10					0.0%
nofx/trader/lighter/trading.go:860:			GetOpenOrders				0.0%
nofx/trader/lighter/trading.go:929:			PlaceLimitOrder				0.0%
nofx/trader/lighter/types.go:107:			parseFloat				0.0%
nofx/trader/lighter/types.go:118:			ToChecksumAddress			0.0%
nofx/trader/okx/order_sync.go:35:			GetTrades				0.0%
nofx/trader/okx/order_sync.go:152:			SyncOrdersFromOKX			0.0%
nofx/trader/okx/order_sync.go:275:			StartOrderSync				0.0%
nofx/trader/okx/trader.go:98:				genOkxClOrdID				100.0%
nofx/trader/okx/trader.go:112:				NewOKXTrader				0.0%
nofx/trader/okx/trader.go:148:				marginMode				100.0%
nofx/trader/okx/trader.go:156:				detectPositionMode			0.0%
nofx/trader/okx/trader.go:179:				setPositionMode				0.0%
nofx/trader/okx/trader.go:199:				sign					100.0%
nofx/trader/okx/trader.go:207:				doRequest				80.0%
nofx/trader/okx/trader.go:261:				convertSymbol				100.0%
nofx/trader/okx/trader.go:269:				convertSymbolBack			0.0%
nofx/trader/okx/trader.go:278:				FormatQuantity				0.0%
nofx/trader/okx/trader.go:290:				formatSize				20.0%
nofx/trader/okx/trader_account.go:14:			GetBalance				0.0%
nofx/trader/okx/trader_account.go:96:			SetMarginMode				100.0%
nofx/trader/okx/trader_account.go:109:			SetLeverage				72.7%
nofx/trader/okx/trader_account.go:137:			GetMarketPrice				0.0%
nofx/trader/okx/trader_account.go:168:			GetClosedPnL				0.0%
nofx/trader/okx/trader_orders.go:13:			OpenLong				63.3%
nofx/trader/okx/trader_orders.go:92:			OpenShort				63.3%
nofx/trader/okx/trader_orders.go:171:			CloseLong				0.0%
nofx/trader/okx/trader_orders.go:282:			CloseShort				0.0%
nofx/trader/okx/trader_orders.go:396:			SetStopLoss				77.8%
nofx/trader/okx/trader_orders.go:441:			SetTakeProfit				77.8%
nofx/trader/okx/trader_orders.go:486:			CancelStopLossOrders			0.0%
nofx/trader/okx/trader_orders.go:491:			CancelTakeProfitOrders			0.0%
nofx/trader/okx/trader_orders.go:496:			cancelAlgoOrders			52.6%
nofx/trader/okx/trader_orders.go:540:			CancelAllOrders				66.7%
nofx/trader/okx/trader_orders.go:579:			CancelStopOrders			0.0%
nofx/trader/okx/trader_orders.go:584:			GetOrderStatus				0.0%
nofx/trader/okx/trader_orders.go:657:			GetOpenOrders				0.0%
nofx/trader/okx/trader_orders.go:798:			PlaceLimitOrder				71.0%
nofx/trader/okx/trader_orders.go:888:			CancelOrder				0.0%
nofx/trader/okx/trader_orders.go:907:			GetOrderBook				0.0%
nofx/trader/okx/trader_positions.go:12:			GetPositions				0.0%
nofx/trader/okx/trader_positions.go:121:		InvalidatePositionCache			0.0%
nofx/trader/okx/trader_positions.go:129:		getInstrument				82.1%
nofx/trader/position_rebuild.go:42:			RebuildPositionsFromTrades		0.0%
nofx/trader/position_rebuild.go:92:			determinePositionSide			0.0%
nofx/trader/position_rebuild.go:122:			buildClosedPosition			0.0%
nofx/trader/position_snapshot.go:16:			CreatePositionSnapshot			0.0%
nofx/trader/testutil/test_suite.go:25:			NewTraderTestSuite			0.0%
nofx/trader/testutil/test_suite.go:34:			Cleanup					0.0%
nofx/trader/testutil/test_suite.go:42:			RunAllTests				0.0%
nofx/trader/testutil/test_suite.go:71:			TestGetBalance				0.0%
nofx/trader/testutil/test_suite.go:104:			TestGetPositions			0.0%
nofx/trader/testutil/test_suite.go:141:			TestGetMarketPrice			0.0%
nofx/trader/testutil/test_suite.go:180:			TestSetLeverage				0.0%
nofx/trader/testutil/test_suite.go:214:			TestSetMarginMode			0.0%
nofx/trader/testutil/test_suite.go:248:			TestFormatQuantity			0.0%
nofx/trader/testutil/test_suite.go:292:			TestCancelAllOrders			0.0%
nofx/trader/testutil/test_suite.go:322:			TestOpenLong				0.0%
nofx/trader/testutil/test_suite.go:371:			TestOpenShort				0.0%
nofx/trader/testutil/test_suite.go:420:			TestCloseLong				0.0%
nofx/trader/testutil/test_suite.go:463:			TestCloseShort				0.0%
nofx/trader/testutil/test_suite.go:510:			TestSetStopLoss				0.0%
nofx/trader/testutil/test_suite.go:550:			TestSetTakeProfit			0.0%
nofx/trader/testutil/test_suite.go:590:			TestCancelStopOrders			0.0%
nofx/trader/testutil/test_suite.go:616:			TestCancelStopLossOrders		0.0%
nofx/trader/testutil/test_suite.go:642:			TestCancelTakeProfitOrders		0.0%
nofx/trader/types/interface.go:169:			NewGridTraderAdapter			0.0%
nofx/trader/types/interface.go:175:			PlaceLimitOrder				0.0%
nofx/trader/types/interface.go:209:			CancelOrder				0.0%
nofx/trader/types/interface.go:227:			GetOrderBook				0.0%
nofx/wallet/balance_cache.go:25:			QueryUSDCBalanceCached			0.0%
nofx/wallet/balance_cache.go:61:			InvalidateBalanceCache			0.0%
nofx/wallet/usdc.go:24:					QueryUSDCBalance			0.0%
nofx/wallet/usdc.go:31:					QueryUSDCBalanceStr			0.0%
nofx/wallet/usdc.go:39:					queryUSDCBalanceRPC			0.0%
total:							(statements)				10.7%

Coverage Guidelines

  • 🟢 >= 80%: Excellent
  • 🟡 >= 60%: Good
  • 🟠 >= 40%: Fair
  • 🔴 < 40%: Needs improvement

This is an automated coverage report. The coverage requirement is advisory and does not block PR merging.

@github-actions

Copy link
Copy Markdown

🤖 Advisory Check Results

These are advisory checks to help improve code quality. They won't block your PR from being merged.

📋 PR Information

Title Format: ⚠️ Suggestion - Consider using type(scope): description

Recommended format

Valid types: feat, fix, docs, style, refactor, perf, test, chore, ci, security, build

Examples:

  • feat(trader): add new trading strategy
  • fix(api): resolve authentication issue
  • docs: update README

PR Size: 🔴 Large (4242 lines: +2792 -1450)

💡 Suggestion: This is a large PR. Consider breaking it into smaller, focused PRs for easier review.

🔧 Backend Checks

Go Formatting: ⚠️ Needs formatting

Files needing formatting
api/errors.go
api/handler_trader.go
api/handler_wallet.go
api/utils_test.go
config/config.go
kernel/engine.go
kernel/formatter.go
kernel/grid_engine.go
kernel/validate_test.go
main.go

Go Vet: ✅ Good
Tests: ✅ Passed

Fix locally:

go fmt ./...      # Format code
go vet ./...      # Check for issues
go test ./...     # Run tests

⚛️ Frontend Checks

Build & Type Check: ✅ Success

Fix locally:

cd web
npm run build  # Test build (includes type checking)

📖 Resources

Questions? Feel free to ask in the comments! 🙏


These checks are advisory and won't block your PR from being merged. This comment is automatically generated from pr-checks-run.yml.

mianmian7 pushed a commit to mianmian7/nofx that referenced this pull request Sep 2, 2026
* feat(store): prevent deletion of active strategies and update translations (NoFxAiOS#1461)

Co-authored-by: Dean <afei.wuhao@gmail.com>

* fix: allow model switching without re-entering wallet key

Users with existing wallets could not switch AI models because the
"Start Trading" button required a valid private key even when one was
already configured. Now the button is enabled when hasExistingWallet
is true, and handleSubmit passes an empty key so the backend preserves
the existing key.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: replace window.location with useNavigate for routing in auth components (NoFxAiOS#1470)

Co-authored-by: Dean <afei.wuhao@gmail.com>

* feat(trader): implement margin mode handling for order and leverage settings

* refactor(trader): update SetMarginMode to avoid legacy endpoint and improve logging

* feat(api): enhance strategy handling by integrating claw402 wallet key validation

Added validation for the claw402 model's wallet key during strategy test runs. If the selected AI model is claw402, the server now checks for a valid wallet key and returns appropriate error messages if it's missing or if the model fails to load. This ensures better error handling and user feedback when working with AI models.

* refactor(api): streamline claw402 wallet key retrieval and error handling

Refactored the strategy handling logic to encapsulate claw402 wallet key retrieval in a new method, `resolveStrategyDataWalletKey`. This improves code readability and maintains consistent error handling for missing or invalid wallet keys during strategy test runs. The changes enhance the overall robustness of the AI model integration.

* feat(trader): add claw402 wallet key resolution for trader configuration

Implemented a new method, `resolveTraderDataWalletKey`, to retrieve the claw402 wallet key based on the selected AI model and user ID. This enhancement allows for better integration of the claw402 model within the trader configuration, ensuring that the correct wallet key is used for trading operations. The `AutoTraderConfig` struct has been updated to include the new `Claw402WalletKey` field, improving the overall handling of wallet keys in the trading process.

* feat(claw402): preflight USDC balance before AI calls (NoFxAiOS#1479)

* chore: ignore nofx-server build artifact

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(claw402): preflight USDC balance before AI calls

Short-circuit claw402 Call/CallWithRequestFull when the wallet balance
can't cover the estimated cost of the call, surfacing ErrInsufficientFunds
instead of letting x402 fail mid-flight after the sign step.

- wallet: cached balance lookup (30s TTL, per-address mutex) to avoid
  hammering the Base RPC; separate error-returning and display-only APIs
  so callers can distinguish zero balance from an unreachable RPC.
- claw402: 1.5× safety multiplier on the flat per-call estimate, 4.0×
  for reasoner models whose chain-of-thought cost can blow past the
  flat rate. Fail-open on RPC errors — x402 still gates actually-empty
  wallets, and we prefer availability over extra strictness.
- shortAddr redacts the wallet in error strings to avoid leaking the
  full address into telemetry bundles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(telemetry): report token usage for SSE streaming paths (NoFxAiOS#1475)

* fix(telemetry): report token usage for SSE streaming paths

ParseSSEStream already parsed the usage block from SSE chunks but only
printed it, so claw402 streaming calls (and native streaming) never
fired TokenUsageCallback. GA4 therefore undercounted AI usage on the
streaming path.

Return the parsed usage from ParseSSEStream and have both callers fire
the callback with their own Provider/Model.

* chore: drop leftover debug Printf in ParseSSEStream

Telemetry is now wired via TokenUsageCallback, so the Printf is
redundant noise in the stream path.

* fix(gemini): update default model to gemini-3.1-pro

Google discontinued gemini-3-pro-preview on 2026-03-26 and directs all
callers to gemini-3.1-pro / gemini-3.1-pro-preview. Users on their own
API key were getting errors from the native Gemini endpoint because the
provider default pointed at the retired ID. Claw402 was unaffected
because its route map already used gemini-3.1-pro.

Align both the native provider default and the handler's preset list
with gemini-3.1-pro so every code path sends a live model ID.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: extract ResolveClaw402WalletKey to store layer and expand OKX margin mode tests

- Move duplicated claw402 wallet resolution logic into store.AIModelStore.ResolveClaw402WalletKey
- api/strategy.go and manager/trader_manager.go now delegate to the shared method
- Add detailed doc comment on OKX SetMarginMode explaining the local-state-only approach
  and why the legacy /api/v5/account/set-isolated-mode endpoint is not called
- Add 3 new test cases: cross mode leverage, OpenShort tdMode, SetTakeProfit tdMode

* fix(auth): prevent SetupPage remount from wiping freshly-set auth token (NoFxAiOS#1481)

After NoFxAiOS#1470 moved routing into react-router, SetupPage is rendered at two
different tree positions (top-level guard + /setup Route). When register
success flushSync-sets `user`, the top-level guard stops matching and the
Route-level SetupPage mounts as a new instance, re-running its cleanup
useEffect and removing the auth_token that handlePostAuthSuccess just wrote.
Subsequent requests 401 and bounce the user back to /login.

Redirect /setup to /welcome when user is already set so SetupPage is never
re-mounted during the auth transition.

* fix(wallet): handle JSON-RPC null error field in balance query

Some RPC implementations return explicit "error": null on success.
json.RawMessage deserializes this as the 4-byte literal "null", so
len() > 0 was true, causing every balance query to fail with
"rpc error: null". Skip the null literal to avoid false positives.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(readme): add quick demo video to localized READMEs (NoFxAiOS#1486)

* docs(README): add quick demo section with video link and image

* docs(README): update demo video link

* docs(i18n): add quick demo section with video link and image for multiple languages

---------

Co-authored-by: Dean <afei.wuhao@gmail.com>

---------

Co-authored-by: deanokk <wuhao@vergex.trade>
Co-authored-by: Dean <afei.wuhao@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: root <root@localhost.localdomain>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants