{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"],"owasp":"A05:2025"}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"],"owasp":"A03:2025"}},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31","relationships":[{"target":{"id":"CWE-1032","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-732","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"],"owasp":"A02:2025"}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"],"owasp":"A03:2025"}},{"id":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37","relationships":[{"target":{"id":"CWE-1059","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1059"],"owasp":"A02:2025"}},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"],"owasp":"A08:2025"}},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AX1","name":"Captive dependencies","shortDescription":{"text":"Captive dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/AX1"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AX9","name":"CQS / query purity","shortDescription":{"text":"CQS / query purity"},"helpUri":"https://codehealth.canine.dev/dimensions/AX9"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"C1","name":"Data Protection","shortDescription":{"text":"Data Protection"},"helpUri":"https://codehealth.canine.dev/dimensions/C1"},{"id":"C3","name":"Audit Trail","shortDescription":{"text":"Audit Trail"},"helpUri":"https://codehealth.canine.dev/dimensions/C3"},{"id":"DM5","name":"Encapsulated state","shortDescription":{"text":"Encapsulated state"},"helpUri":"https://codehealth.canine.dev/dimensions/DM5"},{"id":"DM6","name":"Domain \u2194 infrastructure boundary","shortDescription":{"text":"Domain \u2194 infrastructure boundary"},"helpUri":"https://codehealth.canine.dev/dimensions/DM6"},{"id":"ED1","name":"Handler temporal coupling","shortDescription":{"text":"Handler temporal coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/ED1"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"GD1","name":"Unfinished \u0026 placeholder code","shortDescription":{"text":"Unfinished \u0026 placeholder code"},"helpUri":"https://codehealth.canine.dev/dimensions/GD1"},{"id":"IC1","name":"Incompleteness \u0026 stubs","shortDescription":{"text":"Incompleteness \u0026 stubs"},"helpUri":"https://codehealth.canine.dev/dimensions/IC1"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P10","name":"Library API \u0026 versioning","shortDescription":{"text":"Library API \u0026 versioning"},"helpUri":"https://codehealth.canine.dev/dimensions/P10"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"PF2","name":"Allocation hygiene","shortDescription":{"text":"Allocation hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF2"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"S1","name":"Web-Security Posture","shortDescription":{"text":"Web-Security Posture"},"helpUri":"https://codehealth.canine.dev/dimensions/S1"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X27","name":"Collection changed while being enumerated","shortDescription":{"text":"Collection changed while being enumerated"},"helpUri":"https://codehealth.canine.dev/dimensions/X27"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X4","name":"Structured logging","shortDescription":{"text":"Structured logging"},"helpUri":"https://codehealth.canine.dev/dimensions/X4"},{"id":"X5","name":"Nullable reference types","shortDescription":{"text":"Nullable reference types"},"helpUri":"https://codehealth.canine.dev/dimensions/X5"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X7","name":"Silent fallback defaults","shortDescription":{"text":"Silent fallback defaults"},"helpUri":"https://codehealth.canine.dev/dimensions/X7"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"SolanaWalletClient._parseSwapTransaction (cyclomatic 83): SolanaWalletClient._parseSwapTransaction has cyclomatic complexity 83 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"2207e0344123094beef4b32bb7bc8b67abef31f10d99a93eec2de5488093e207"}},{"ruleId":"D1","level":"warning","message":{"text":"SendViewModelBase.createTransaction (cyclomatic 64): SendViewModelBase.createTransaction has cyclomatic complexity 64 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbbabd94f166e9b1ed8bc06752a3916498c03a934ea89041c4e5955c4fa76ac2"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsStoreBase.reload (cyclomatic 57): SettingsStoreBase.reload has cyclomatic complexity 57 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1841}}}],"partialFingerprints":{"codehealthFindingId/v1":"202479aa1821d0e6f36860745b64ce753fab52887ccf5b1fa6b38aacbe65bb2c"}},{"ruleId":"D1","level":"warning","message":{"text":"ExchangeViewModelBase._createTrade (cyclomatic 57): ExchangeViewModelBase._createTrade has cyclomatic complexity 57 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1071}}}],"partialFingerprints":{"codehealthFindingId/v1":"6319fc9a294fd474674cc640877f5fcd6db6209fcd3827a7e6a959839a0e6500"}},{"ruleId":"D1","level":"warning","message":{"text":"_NewSwapPageState.initState (cyclomatic 53): _NewSwapPageState.initState has cyclomatic complexity 53 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"95dffc8f911822b8083e4eb81547d828df6089c4e3b27c356e9afb4a1ac84903"}},{"ruleId":"D1","level":"warning","message":{"text":"SendViewModelBase.translateErrorMessage (cyclomatic 53): SendViewModelBase.translateErrorMessage has cyclomatic complexity 53 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1540}}}],"partialFingerprints":{"codehealthFindingId/v1":"02af7c087bac1f4acf985f04c7bb2fe3b9f9a9aa7794cce08b03889dc81e3f63"}},{"ruleId":"D1","level":"warning","message":{"text":"SwapAmountBoxState.build (cyclomatic 51): SwapAmountBoxState.build has cyclomatic complexity 51 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dc141024b1699484d75f614564d7c1926faa13556319589b42e3fdce01d6d60"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsStoreBase.load (cyclomatic 41): SettingsStoreBase.load has cyclomatic complexity 41 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1208}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb2d9d25ad0e9d906e36f5dc898ef34338f544d7ddb5ea8fc722ec96a65f4dc8"}},{"ruleId":"D1","level":"warning","message":{"text":"WalletKeysViewModelBase._populateKeysItems (cyclomatic 40): WalletKeysViewModelBase._populateKeysItems has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_keys_view_model.dart"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd0b613a5b5531dbf7ed8a71e18efc2665daa02c3f61f7d36b4e48c8fbb36720"}},{"ruleId":"D1","level":"warning","message":{"text":"_NewSendPageState.build (cyclomatic 38): _NewSendPageState.build has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"209ff7ce30057027915dd5e06b0c59f7ead143ccae6d34019986b9d4fb47a63f"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsStoreBase.SettingsStoreBase (cyclomatic 38): SettingsStoreBase.SettingsStoreBase has cyclomatic complexity 38 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3031ba030ccd4d95da0993d8fc4f732f1c47797fccd885262c5821f5518104b"}},{"ruleId":"D1","level":"warning","message":{"text":"_NewSwapPageState.build (cyclomatic 36): _NewSwapPageState.build has cyclomatic complexity 36 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"46140b92f8e8aace350099c941a7012250f98dfe18d308050be3fcff7e92bf5b"}},{"ruleId":"D1","level":"warning","message":{"text":"TokenUtilities.getAvailableTokensForNetwork (cyclomatic 36): TokenUtilities.getAvailableTokensForNetwork has cyclomatic complexity 36 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/token_utilities.dart"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"2011d1614e83c6565d61a4b0be52ce21de4ad3aac76006dff29b7bd394dc914b"}},{"ruleId":"D1","level":"warning","message":{"text":"WalletRestoreFromQRCode._determineWalletRestoreMode (cyclomatic 36): WalletRestoreFromQRCode._determineWalletRestoreMode has cyclomatic complexity 36 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/restore/wallet_restore_from_qr_code.dart"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f068f2f2d44b590b6b94c23354e1b51bef06702513d2cce81b799c398a6912f"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase._createUTXOS (cyclomatic 35): ElectrumWalletBase._createUTXOS has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1144}}}],"partialFingerprints":{"codehealthFindingId/v1":"91a2307ae7e8eb0972777f31731e641cf0cae04202c00cbfe96caefe04f7f90b"}},{"ruleId":"D1","level":"warning","message":{"text":"TradeFilterStoreBase.filtered (cyclomatic 34): TradeFilterStoreBase.filtered has cyclomatic complexity 34 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/dashboard/trade_filter_store.dart"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e801ad748b029f5197ab3207dc6d535a20fee5183892bf0b3b615eefa6abcb"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase.replaceByFee (cyclomatic 32): ElectrumWalletBase.replaceByFee has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2505}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f906517af18627d1cd2814a6f38639aaa1e764569b681f5f942dcdb630a0b7b"}},{"ruleId":"D1","level":"warning","message":{"text":"CakePayBuyCardPage._setEffects (cyclomatic 32): CakePayBuyCardPage._setEffects has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"60b5451d687546e29956c69608c99752786fa2a873cdd7bec55b6ab5f89f48f1"}},{"ruleId":"D1","level":"warning","message":{"text":"_NewSendPageState._handleSend (cyclomatic 32): _NewSendPageState._handleSend has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":835}}}],"partialFingerprints":{"codehealthFindingId/v1":"85edc5e8bbf125871ad639df6fed6e3c310a56c70060525b779852ad53259c3e"}},{"ruleId":"D1","level":"warning","message":{"text":"_MultiNetworkPickerBodyState.build (cyclomatic 30): _MultiNetworkPickerBodyState.build has cyclomatic complexity 30 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"aef249f028637c43ae625fba43096ffa7b9001bf69258e1a131ff24cd1ef3c77"}},{"ruleId":"D1","level":"warning","message":{"text":"LitecoinWalletBase.createTransaction (cyclomatic 29): LitecoinWalletBase.createTransaction has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"cafb3f7932c714ea863cc75798f809d87c5622667b3ac4297c700fca1ca58aa4"}},{"ruleId":"D1","level":"warning","message":{"text":"BackgroundSync._syncWallets (cyclomatic 29): BackgroundSync._syncWallets has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/background_sync.dart"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c1270d4bdf265fc7ba3e2e1fc56f7bf45abad62ad2be91a6bd24709311239b4"}},{"ruleId":"D1","level":"warning","message":{"text":"_AdvancedPrivacySettingsBodyState.build (cyclomatic 29): _AdvancedPrivacySettingsBodyState.build has cyclomatic complexity 29 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/advanced_privacy_settings_page.dart"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"e89c075c2662f78b41b6fb471e947b252cedc198cdaea1abb4686f9def0eff2c"}},{"ruleId":"D1","level":"warning","message":{"text":"OutputBase.calculateEstimatedFee (cyclomatic 29): OutputBase.calculateEstimatedFee has cyclomatic complexity 29 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/output.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d10a20561952cee00064171a05dc28a243f5a962b8b0f2bca46ed663f045ed1"}},{"ruleId":"D1","level":"warning","message":{"text":"SendViewModelBase.commitTransaction (cyclomatic 29): SendViewModelBase.commitTransaction has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cbd6758986f0a95caedf67588ebecfa371f06f706aa63a996b4cc35a9238c97"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumTransactionInfo.fromElectrumBundle (cyclomatic 28): ElectrumTransactionInfo.fromElectrumBundle has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_transaction_info.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d85de4e571585b50b7b20b0eb8f7b2e7a31ba692bb34609894d405989314fda"}},{"ruleId":"D1","level":"warning","message":{"text":"SolanaWalletClient._parseSPLTokenTransaction (cyclomatic 28): SolanaWalletClient._parseSPLTokenTransaction has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":851}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7f8aeb4b93908c614a06c6211133eddce55e05624c87709441eed0fefca59d3"}},{"ruleId":"D1","level":"warning","message":{"text":"EVMChainClient.fetchWalletTokensFromMoralis (cyclomatic 28): EVMChainClient.fetchWalletTokensFromMoralis has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"35bd280f63457909d9681c17a103d41849b58d0279051f0da946d3154157cd2a"}},{"ruleId":"D1","level":"warning","message":{"text":"BalanceCard.build (cyclomatic 28): BalanceCard.build has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/balance_card.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"466d63119da8e898d4423edd73ab19fc544783693655db0e5ee503b6b4e903ab"}},{"ruleId":"D1","level":"warning","message":{"text":"_CardsViewState._buildCard (cyclomatic 28): _CardsViewState._buildCard has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/cards_view.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3feede5c8ee72260d4ab9786d5c2942c5cb34d555325bbc4b95dfe8fa3fa285"}},{"ruleId":"D1","level":"warning","message":{"text":"TransactionDetailsViewModelBase._explorerUrl (cyclomatic 28): TransactionDetailsViewModelBase._explorerUrl has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/transaction_details_view_model.dart"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"d89195b08d314bb26852bbf379a81789b08452b853d2fc03f486e7b296b8e6bc"}},{"ruleId":"D1","level":"warning","message":{"text":"HistorySection.build (cyclomatic 27): HistorySection.build has cyclomatic complexity 27 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_section.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"d668b2358c50589c615cbed3551c721aa92921618a1caf38b81b87ea491e6958"}},{"ruleId":"D1","level":"warning","message":{"text":"ExchangeViewModelBase.isCanCreateTrade (cyclomatic 27): ExchangeViewModelBase.isCanCreateTrade has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1716}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ec643ac5a874f387be2ff555c717f1e9a9ced34ff7b3289ba3f715f708a51d0"}},{"ruleId":"D1","level":"warning","message":{"text":"LitecoinWalletBase.startSync (cyclomatic 26): LitecoinWalletBase.startSync has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d0cfbf64ff3c7b30decb66e69e25420ebd3f726f82e278a0fafc5756f75882"}},{"ruleId":"D1","level":"warning","message":{"text":"SolanaWalletClient._isSwapTransaction (cyclomatic 26): SolanaWalletClient._isSwapTransaction has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e181bba1a795154c47fdac0c0e850863a2aca7c82acf0beaafa58f17f3e83c0"}},{"ruleId":"D1","level":"warning","message":{"text":"_ScanPageState.build (cyclomatic 26): _ScanPageState.build has cyclomatic complexity 26 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/scan_page.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"07f1b6cafb0d4cf931ef9243ec79038c92dad658f7462eed4c0c39a836571c71"}},{"ruleId":"D1","level":"warning","message":{"text":"_EditTokenPageBodyState.build (cyclomatic 26): _EditTokenPageBodyState.build has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca9c4be1ffee463be4a3c0d04f2521a5c3638e75dab048016b7f2b765aee391"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase._markUsedAndSplitHistory (cyclomatic 25): ElectrumWalletBase._markUsedAndSplitHistory has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3085}}}],"partialFingerprints":{"codehealthFindingId/v1":"4373a325e35f9c8af1aed8247d6fe11f8075b643f68feaa767cc35fa55ec8b5d"}},{"ruleId":"D1","level":"warning","message":{"text":"WowneroWalletService.openWallet (cyclomatic 25): WowneroWalletService.openWallet has cyclomatic complexity 25 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e16c13b448381e2b9b7197e796fa61289659fe04c04c55276c936dadff57b54"}},{"ruleId":"D1","level":"warning","message":{"text":"CakePayBuyCardPage.isIOSUnavailable (cyclomatic 25): CakePayBuyCardPage.isIOSUnavailable has cyclomatic complexity 25 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f4f4c640d7269b8c9bc1050d3b6d691de8702084e8ae6ecc88883b29adaca4"}},{"ruleId":"D1","level":"warning","message":{"text":"WalletAddressListViewModelBase._computeAddressList (cyclomatic 25): WalletAddressListViewModelBase._computeAddressList has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c7a3a2ea0083f0248ea8577452682758796e7fbee135bca5c77f0ea875f22b"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase._setListeners (cyclomatic 24): ElectrumWalletBase._setListeners has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":741}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5b3293c436b8d747c9c2550d85bcca9f8a45623d7e447ffd63619e382384783"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase.createTransaction (cyclomatic 24): ElectrumWalletBase.createTransaction has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1721}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9ccba1bd838bb72b5b80774f5dffbcc2dc81bf0d3a541c3cfb5726a76f9e535"}},{"ruleId":"D1","level":"warning","message":{"text":"EVMChainWalletBase.createTransaction (cyclomatic 24): EVMChainWalletBase.createTransaction has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"80cdee5531bded969eda314478a1563a60a2f96bcf6b5b200d9cc0211069fa23"}},{"ruleId":"D1","level":"warning","message":{"text":"_SwapDetailsBottomSheetState._setEffects (cyclomatic 24): _SwapDetailsBottomSheetState._setEffects has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"b00664418c7be18131e80f529336ccfb8da888e6d26a1b5a4022fdb503a40331"}},{"ruleId":"D1","level":"warning","message":{"text":"SendViewModelBase._credentials (cyclomatic 24): SendViewModelBase._credentials has cyclomatic complexity 24 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1319}}}],"partialFingerprints":{"codehealthFindingId/v1":"edbb20592416e6de4280f8fe8045b508997a91b9f6cd73ec345b9dbb53e38319"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletAddressesBase.address (cyclomatic 23): ElectrumWalletAddressesBase.address has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"742645a6c5bee1b63547cf56e72e551ffa8040cf56cd8046d1fbdce3c1690a86"}},{"ruleId":"D1","level":"warning","message":{"text":"SolanaWalletClient.parseTransaction (cyclomatic 23): SolanaWalletClient.parseTransaction has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc9690e9dc1ee54f13212bc5b5b7a189415ba7d2b5f6fe90253dc838a41d7781"}},{"ruleId":"D1","level":"warning","message":{"text":"WowneroWalletBase.createTransaction (cyclomatic 23): WowneroWalletBase.createTransaction has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed3ccb3155e901137ccac5b66ea50711a394d5bcc6cab6ea477fb5797d500f12"}},{"ruleId":"D1","level":"warning","message":{"text":"AddressValidator.getAddressFromStringPattern (cyclomatic 23): AddressValidator.getAddressFromStringPattern has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: AddressValidator.getLength (cyclomatic 97) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_validator.dart"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f1bad516f028dca8339a6ba3a76dc1c7c923bcbacd4cf2aae489f98c9b76857"}},{"ruleId":"D1","level":"warning","message":{"text":"_NewReceivePageState.build (cyclomatic 23): _NewReceivePageState.build has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/receive_page.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d8b8e9ee2a65ad8098acf6d157620e7f2738dccbcededd1816b279357e6cd28"}},{"ruleId":"D1","level":"warning","message":{"text":"_ReceiveAddressTypeSelectorState.build (cyclomatic 23): _ReceiveAddressTypeSelectorState.build has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_address_type_selector.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d37e8c5b2190cf284fb75031337299869e6d46e1a5c65db4123813480f39793"}},{"ruleId":"D1","level":"warning","message":{"text":"SendTransactionDetails._buildMainContent (cyclomatic 23): SendTransactionDetails._buildMainContent has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_confirm_sheet.dart"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"390e775008e21fb8fed53e019c82444607b449d815d6ec8c69701ad13e458b44"}},{"ruleId":"D1","level":"warning","message":{"text":"BalanceViewModelBase.formattedBalances (cyclomatic 23): BalanceViewModelBase.formattedBalances has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/balance_view_model.dart"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"a070654a41a3bd9efac03d37b1b58b07829f9717fa6345b6c59f8cdcfe3f4899"}},{"ruleId":"D1","level":"warning","message":{"text":"AppDelegate.didInitializeImplicitFlutterEngine (cyclomatic 23): AppDelegate.didInitializeImplicitFlutterEngine has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ios/Runner/AppDelegate.swift"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff4a2335d3fd1cb3dd4a37a3f6240a5d22089d803023bc85f64214211181fabe"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase.getTransactionExpanded (cyclomatic 22): ElectrumWalletBase.getTransactionExpanded has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2752}}}],"partialFingerprints":{"codehealthFindingId/v1":"c112f382c1356de02708b0f4535e41239208516302a4ddaabbd03d34c4891c64"}},{"ruleId":"D1","level":"warning","message":{"text":"CakePayBuyCardPage.body (cyclomatic 22): CakePayBuyCardPage.body has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c5a327f1021fed491d3efd5b1920ccc1b79a55cc6c063fbcaca8adc58abce98"}},{"ruleId":"D1","level":"warning","message":{"text":"ConfirmSendingBottomSheet.contentWidget (cyclomatic 22): ConfirmSendingBottomSheet.contentWidget has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/confirm_sending_bottom_sheet_widget.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef464fd35657821d850471b326fde72a5707e4b9a3d12daf9725eca4051b6c5e"}},{"ruleId":"D1","level":"warning","message":{"text":"TransactionFilterStoreBase.filtered (cyclomatic 22): TransactionFilterStoreBase.filtered has cyclomatic complexity 22 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/dashboard/transaction_filter_store.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e02a4ccefca049865142d7ebd17c44418742c321acc24b399ad6706c30dbd5a"}},{"ruleId":"D1","level":"warning","message":{"text":"SolanaWalletClient._signSPLTokenTransaction (cyclomatic 21): SolanaWalletClient._signSPLTokenTransaction has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1781}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdbdc8c326be94fb34b688456ec200d09b130068741d33071f6131cfe22d39fa"}},{"ruleId":"D1","level":"warning","message":{"text":"_CardCustomizerState.build (cyclomatic 21): _CardCustomizerState.build has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/card_customizer.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"50c98d8eab517794d15f4b3d68d57e44ab6e268fdb71c361e15f6bfef1a97d39"}},{"ruleId":"D1","level":"warning","message":{"text":"TokenUtilities.getChainId (cyclomatic 21): TokenUtilities.getChainId has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/token_utilities.dart"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"4457b26c1197914f7e86b927bd41c2c208d42139037c35e840c1c500f023b4f0"}},{"ruleId":"D1","level":"warning","message":{"text":"BridgeViewModelBase._pollForConfirmation (cyclomatic 21): BridgeViewModelBase._pollForConfirmation has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"272192c84cbd7f387004619f3e955ec17ccd604203011b08abb36ecfb4833d7b"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase.startSync (cyclomatic 20): ElectrumWalletBase.startSync has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e4025bdd7a1d31e85403f82ec129b3a69a4e69e5a65260dee199965f0dec7d"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase.estimateTxForAmount (cyclomatic 20): ElectrumWalletBase.estimateTxForAmount has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1384}}}],"partialFingerprints":{"codehealthFindingId/v1":"af8153a8c0d3a15ec23b6fd4f665a4567a63cbc19de65044ee8a299a0b3a33bc"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase.fetchBalances (cyclomatic 20): ElectrumWalletBase.fetchBalances has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":4005}}}],"partialFingerprints":{"codehealthFindingId/v1":"472588fb7e7257c418c466d8b6c1cc9f63d4a2b1277f852b76749040e61d548a"}},{"ruleId":"D1","level":"warning","message":{"text":"LitecoinWalletBase.fetchBalances (cyclomatic 20): LitecoinWalletBase.fetchBalances has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":914}}}],"partialFingerprints":{"codehealthFindingId/v1":"390aed4df8e8fa6a54a51f6e8db3c129311e1aff27b5b1ed57e7cd04f66ef837"}},{"ruleId":"D1","level":"warning","message":{"text":"EVMChainWalletBase.createCallDataTransaction (cyclomatic 20): EVMChainWalletBase.createCallDataTransaction has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":989}}}],"partialFingerprints":{"codehealthFindingId/v1":"43c4374efcf6b1181799d4394bd6da5bde6c664107ea2ed6609b87f921851ed7"}},{"ruleId":"D1","level":"warning","message":{"text":"EVMChainWalletBase.fetchTransactions (cyclomatic 20): EVMChainWalletBase.fetchTransactions has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1145}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ffca49b198e2276108c39ea010c2e52b603520956b334a53e56ec6963d7b371"}},{"ruleId":"D1","level":"warning","message":{"text":"ListItemRegularRowWidget.build (cyclomatic 20): ListItemRegularRowWidget.build has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/new_list_row/list_item_regular_row_widget.dart"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca1248630ee84142e1d4d1966d145e838fe8d2e23f452c988ff30f0106edf2d8"}},{"ruleId":"D1","level":"warning","message":{"text":"ProviderOptionTile.build (cyclomatic 20): ProviderOptionTile.build has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/provider_optoin_tile.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"98783516f944c46a98ae8e4a842206614209f29ef448b9b77ee0dde1763e605d"}},{"ruleId":"D1","level":"warning","message":{"text":"PaymentRequest.fromUri (cyclomatic 20): PaymentRequest.fromUri has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/payment_request.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e6680dd5e09416a4bd3539e1520141c61cb971d8a3189decfaf3747e17ae95"}},{"ruleId":"D1","level":"warning","message":{"text":"BuySellViewModelBase.calculateBestRate (cyclomatic 20): BuySellViewModelBase.calculateBestRate has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/buy/buy_sell_view_model.dart"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"97df6182023e099b25bdf0d45a49f599914abf29312207941a50377d771e5484"}},{"ruleId":"D1","level":"warning","message":{"text":"PaymentViewModelBase.processAddress (cyclomatic 20): PaymentViewModelBase.processAddress has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/payment/payment_view_model.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"c06d9918f54a3e9f5a18169eadca56eddfe7558947fdc2b016119735dbfe28d7"}},{"ruleId":"D1","level":"warning","message":{"text":"WalletGroupsDisplayViewModelBase.updateWalletInfoSourceList (cyclomatic 20): WalletGroupsDisplayViewModelBase.updateWalletInfoSourceList has cyclomatic complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_groups_display_view_model.dart"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"f519338704ecfe680bec84b87bd36b3dc2dc7db24b63b5e9a50d98282febf38b"}},{"ruleId":"D1","level":"warning","message":{"text":"OnRamperBuyProvider.fetchQuote (cyclomatic 19): OnRamperBuyProvider.fetchQuote has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: OnRamperBuyProvider.normalizePaymentMethod (cyclomatic 23) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/onramper/onramper_buy_provider.dart"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"72540210e0c58b49c11f323559959c1f8830f5441f7344c5041c219ace9d2f57"}},{"ruleId":"D1","level":"warning","message":{"text":"SwapsXyzExchangeProvider.fetchLimits (cyclomatic 19): SwapsXyzExchangeProvider.fetchLimits has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b2096cfec21e3453f0719351538fe5a3aafb0cd1bb20a5e962336b88dbec66"}},{"ruleId":"D1","level":"warning","message":{"text":"XOSwapExchangeProvider.findTradeById (cyclomatic 19): XOSwapExchangeProvider.findTradeById has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"383da28a21e26c6d0a7157535c98e7e4637e644a380d6804f2e8a5f0ac334020"}},{"ruleId":"D1","level":"warning","message":{"text":"ModalTopBar.build (cyclomatic 19): ModalTopBar.build has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_top_bar.dart"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"3818cd57bc794afce4db8c5805c69f482192557c477c9c16eaa49cd034cc0502"}},{"ruleId":"D1","level":"warning","message":{"text":"ExchangeCardState.build (cyclomatic 19): ExchangeCardState.build has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/exchange/widgets/exchange_card.dart"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cfb81b1abd35c3ec1a545b1af6deb43b4f8bfc7131cbd7c8d30fe064d7fad36"}},{"ruleId":"D1","level":"warning","message":{"text":"WalletLoadingService.load (cyclomatic 18): WalletLoadingService.load has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/wallet_loading_service.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"b92108e56d4589750fb3e08950297518a068b4420cb5c1df2e28b54d818ab50c"}},{"ruleId":"D1","level":"warning","message":{"text":"SwapsXyzExchangeProvider.createTrade (cyclomatic 18): SwapsXyzExchangeProvider.createTrade has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"75f5551257ed4248d6e0837733da2e79081ebf843017dead8ab27b7da5f274f3"}},{"ruleId":"D1","level":"warning","message":{"text":"ContactListViewModelBase._isValidForCurrency (cyclomatic 18): ContactListViewModelBase._isValidForCurrency has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/contact_list/contact_list_view_model.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"4145406659f5f90f36dc0e233eee7c9b1b5f9c2022acd6c1ca79bae143599fef"}},{"ruleId":"D1","level":"warning","message":{"text":"ExchangeViewModelBase.calculateDepositAllAmount (cyclomatic 18): ExchangeViewModelBase.calculateDepositAllAmount has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: ExchangeViewModelBase._initialPairBasedOnWallet (cyclomatic 23) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1394}}}],"partialFingerprints":{"codehealthFindingId/v1":"9426584de843fd86e94901c5743e41503e2e8b3d37c6bf731cb1a99500ad704d"}},{"ruleId":"D1","level":"warning","message":{"text":"SolanaWalletClient._parseNativeTransaction (cyclomatic 17): SolanaWalletClient._parseNativeTransaction has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"771a652e69abbf7b9b4801960d25e2b8bd9b09c8a014b45aa6c73be2a9508132"}},{"ruleId":"D1","level":"warning","message":{"text":"DFXBuyProvider.fetchQuote (cyclomatic 17): DFXBuyProvider.fetchQuote has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/dfx/dfx_buy_provider.dart"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"531a55e6adbb5ea18470338935564e530c44feb358aff55e26dea5d85cd38f83"}},{"ruleId":"D1","level":"warning","message":{"text":"MoonPayProvider.fetchQuote (cyclomatic 17): MoonPayProvider.fetchQuote has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/moonpay/moonpay_provider.dart"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"80bc91daa3001202d04b6e430f86edf96ea47a91928328fee6fca3c6c2254436"}},{"ruleId":"D1","level":"warning","message":{"text":"EVMChainClient.fetchTransactions (cyclomatic 17): EVMChainClient.fetchTransactions has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"964eaf823653a098f742e547eed0b7d7fe56abc6c0551c16f4dc883eacfff9c5"}},{"ruleId":"D1","level":"warning","message":{"text":"LetsExchangeExchangeProvider.createTrade (cyclomatic 17): LetsExchangeExchangeProvider.createTrade has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9a3429dd1b86620cd1ff0b09e66fe6a1799bedcff03b0ad15d3ff18b632de97"}},{"ruleId":"D1","level":"warning","message":{"text":"Trade.mergeFindTradeByIdResult (cyclomatic 17): Trade.mergeFindTradeByIdResult has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade.dart"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f24b9d641d4cfce0989167ea748bd82a9d6280fc908997d165de0ae1755650f"}},{"ruleId":"D1","level":"warning","message":{"text":"DEuroSavingsPage._setReactions (cyclomatic 17): DEuroSavingsPage._setReactions has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/integrations/deuro/savings_page.dart"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2a66533c913e7560a92c8df370d5e500f7cb2db2b33c768ea8366396b3caf37"}},{"ruleId":"D1","level":"warning","message":{"text":"ConnectionSyncPage.body (cyclomatic 17): ConnectionSyncPage.body has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/connection_sync_page.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"8575cbfe8890fa53186802aa82f2fa003224f745ac52a562bbcb80bd5ecafa66"}},{"ruleId":"D1","level":"warning","message":{"text":"SwapConfirmationContentState._setUpReactions (cyclomatic 17): SwapConfirmationContentState._setUpReactions has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/swap_confirmation_bottom_sheet.dart"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf640103ab513ad028a8ba41463002378874c6af97c630e6507a2b8ee2976306"}},{"ruleId":"D1","level":"warning","message":{"text":"TransactionListItem.formattedPendingStatus (cyclomatic 17): TransactionListItem.formattedPendingStatus has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: TransactionListItem.formattedFiatAmount (cyclomatic 24) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/transaction_list_item.dart"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed1093d2dca450717512457b401eae8af1d72a95fd64d1a7682d44e8c686419"}},{"ruleId":"D1","level":"warning","message":{"text":"ExchangeTradeViewModelBase.checkIfCanSend (cyclomatic 17): ExchangeTradeViewModelBase.checkIfCanSend has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators. This is NOT this file\u0027s highest cyclomatic complexity: ExchangeTradeViewModelBase.paymentUri (cyclomatic 26) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_trade_view_model.dart"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0767abe4717bc96f2069332b988b305c54904d3e26434e337832d9dd7cf98d"}},{"ruleId":"D1","level":"warning","message":{"text":"TrezorConnectViewModelBase.connectDevice (cyclomatic 17): TrezorConnectViewModelBase.connectDevice has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"790ab21746107c867818254401de57c6149acb4d04338ecca520bc6010292264"}},{"ruleId":"D1","level":"warning","message":{"text":"NodeCreateOrEditViewModelBase.scanQRCodeForNewNode (cyclomatic 17): NodeCreateOrEditViewModelBase.scanQRCodeForNewNode has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: NodeCreateOrEditViewModelBase.hasPathSupport (cyclomatic 22) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/node_list/node_create_or_edit_view_model.dart"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb071ef4f5c612564bcd5630857fc7ccf21f0c1e41413b923e3701eb6ac75c26"}},{"ruleId":"D1","level":"warning","message":{"text":"WalletRestoreFromQRCode.scanQRCodeForRestoring (cyclomatic 17): WalletRestoreFromQRCode.scanQRCodeForRestoring has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/restore/wallet_restore_from_qr_code.dart"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"6742c8fd29bdce6018ae7918da03efa2d1ff0c872282cda4c0d0927e0a611d7c"}},{"ruleId":"D1","level":"warning","message":{"text":"TradeDetailsViewModelBase._updateItems (cyclomatic 17): TradeDetailsViewModelBase._updateItems has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/trade_details_view_model.dart"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5871471ae5d0ba6b90f34edaa661d54a980151959173afd3e0024e13899cf73"}},{"ruleId":"D1","level":"warning","message":{"text":"TransactionDetailsViewModelBase.formattedPendingStatus (cyclomatic 17): TransactionDetailsViewModelBase.formattedPendingStatus has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/transaction_details_view_model.dart"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b9bc8c8beca582599bbe9d166edb2f3047df77c2b28214b3845737b88fb2954"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletBase.fetchTransactions (cyclomatic 16): ElectrumWalletBase.fetchTransactions has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2870}}}],"partialFingerprints":{"codehealthFindingId/v1":"69dff8abc4379ca31f422264d731e0dceb176c782ffbc27d02ff5191462378ba"}},{"ruleId":"D1","level":"warning","message":{"text":"ElectrumWalletAddressesBase.addBitcoinAddressTypes (cyclomatic 16): ElectrumWalletAddressesBase.addBitcoinAddressTypes has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed652b39fbe58b0627e8ae6115c04861086cf591356cf82c42b66bbe5809720"}},{"ruleId":"D1","level":"warning","message":{"text":"LitecoinWalletAddressesBase.ensureMwebAddressUpToIndexExists (cyclomatic 16): LitecoinWalletAddressesBase.ensureMwebAddressUpToIndexExists has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_addresses.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"99100c7fd00ffe903c49687412b54d5ef2ee38b121b28601b693c5055ca43d7e"}},{"ruleId":"D1","level":"warning","message":{"text":"LitecoinWalletAddressesBase.getChangeAddress (cyclomatic 16): LitecoinWalletAddressesBase.getChangeAddress has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_addresses.dart"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a2bdecfb65d774afa4796b2f8c7805aab7304fc81cb17ed1e80a985ed597e3d"}},{"ruleId":"D1","level":"warning","message":{"text":"MoneroWalletBase._createTransaction (cyclomatic 16): MoneroWalletBase._createTransaction has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"37daa80caccd8328278b0c1887baa1f860336b209bbb9392773f8f4b12417b37"}},{"ruleId":"D1","level":"warning","message":{"text":"CWBitcoin.getDerivationsFromMnemonic (cyclomatic 16): CWBitcoin.getDerivationsFromMnemonic has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f3ed64ee484568348dbb65e49c5f0e9b65f57a8cb08c557d5c37782ed4470c"}},{"ruleId":"D1","level":"warning","message":{"text":"AnyPayRouter.route (cyclomatic 16): AnyPayRouter.route has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/anypay/anypay_router.dart"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c7cdcdb38dfe373fdfb3a46812313bd013965cff65d2754c15c94d50252e73"}},{"ruleId":"D1","level":"warning","message":{"text":"CWEVM.discoverAndAddWalletTokens (cyclomatic 16): CWEVM.discoverAndAddWalletTokens has cyclomatic complexity 16 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"874a029c39502a7594737c948eb18d6f6088dce919ba23ae04657952c196a2f5"}},{"ruleId":"D1","level":"warning","message":{"text":"SwapsXyzExchangeProvider._fetchAndCacheTokens (cyclomatic 16): SwapsXyzExchangeProvider._fetchAndCacheTokens has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"e57bfa1cdb70c98cc5ec06516718edf8a33ffb08c7cf9da7f34cd86488aa3252"}},{"ruleId":"D1","level":"warning","message":{"text":"CWNanoUtil.compareDerivationMethods (cyclomatic 16): CWNanoUtil.compareDerivationMethods has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3739aa35c327dae1297e69cbfd7dfbc8cdc34c0916bf017da916eac464f37c"}},{"ruleId":"D1","level":"warning","message":{"text":"_NewSendPageState.initState (cyclomatic 16): _NewSendPageState.initState has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eea0e943880dd36e8a05fe4b71c0ed1d03fce220b0210aaab8ef49b78f925b7"}},{"ruleId":"D1","level":"warning","message":{"text":"PSBTTransactionBuild.PSBTTransactionBuild (cyclomatic 16): PSBTTransactionBuild.PSBTTransactionBuild has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/psbt/transaction_builder.dart"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9d3c77f143e1e7a728d9b51d8062261a978500b49bf94bf28c64d94337aefb"}},{"ruleId":"D1","level":"warning","message":{"text":"ZcashTaddressRotation.createAndSweepTAddressesForAccount (cyclomatic 16): ZcashTaddressRotation.createAndSweepTAddressesForAccount has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_taddress_rotation.dart"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d1841f54cc95a7e60f718acee4660f76bf22e2bc853391810741d3529cf3e94"}},{"ruleId":"D1","level":"warning","message":{"text":"ZcashWalletBase.fetchTransactions (cyclomatic 16): ZcashWalletBase.fetchTransactions has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":809}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2503ae9810ad8412c62ef18d64b0d93ac30197540b695b33fe7bb9d649c8440"}},{"ruleId":"D1","level":"warning","message":{"text":"WalletRestorePage._confirmForm (cyclomatic 16): WalletRestorePage._confirmForm has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_page.dart"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2517acf7c721d503f95d34ca5477223cbc2add671eb923c5e715fa38cbd2003"}},{"ruleId":"D1","level":"warning","message":{"text":"_WalletRestorePageBodyState._isValidSeed (cyclomatic 16): _WalletRestorePageBodyState._isValidSeed has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_page.dart"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cf4d319caf2265f58fc9689b3e7a99a1001687b1d41a77b0ec7899900c8783a"}},{"ruleId":"D1","level":"warning","message":{"text":"RBFDetailsPage._setEffects (cyclomatic 16): RBFDetailsPage._setEffects has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/transaction_details/rbf_details_page.dart"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9f8e9c9b4b687e47e88ed008fde7a121ca830b723ee2e5caadf9e44fcc6d4c"}},{"ruleId":"D1","level":"warning","message":{"text":"ExchangeViewModelBase.calculateBestRate (cyclomatic 16): ExchangeViewModelBase.calculateBestRate has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages. This is NOT this file\u0027s highest cyclomatic complexity: ExchangeViewModelBase._initialPairBasedOnWallet (cyclomatic 23) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":911}}}],"partialFingerprints":{"codehealthFindingId/v1":"a65fb84ba841e0a0fc81b7266962203e620db0560c97d2ddeab85e1d0832dde9"}},{"ruleId":"D2","level":"warning","message":{"text":"SendViewModelBase.createTransaction (cognitive 245): SendViewModelBase.createTransaction has cognitive complexity 245 (threshold 15). Drivers by points: if/else 43 (193 pts), ternaries 4 (23 pts), error handling 4 (16 pts), boolean chains 13 (nesting depth added 181). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"1387db8f967a95b532362838993b0f089612c0be0152aa8ab5b5adad155ab414"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient._parseSwapTransaction (cognitive 212): SolanaWalletClient._parseSwapTransaction has cognitive complexity 212 (threshold 15). Drivers by points: if/else 35 (136 pts), loops 12 (35 pts), boolean chains 29, ternaries 5 (9 pts), error handling 1 (3 pts) (nesting depth added 130). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"137b55d8c7b264d3280b3a9038c5007835fee66550d696d4e255ef538330ac12"}},{"ruleId":"D2","level":"warning","message":{"text":"ExchangeViewModelBase._createTrade (cognitive 128): ExchangeViewModelBase._createTrade has cognitive complexity 128 (threshold 15). Drivers by points: if/else 38 (98 pts), boolean chains 17, error handling 2 (6 pts), ternaries 2 (5 pts), loops 1 (2 pts) (nesting depth added 68). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1071}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b8b85ec2b310a40676ccb69c0dabab0de44867a90bf1b675bb114788e53922a"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.replaceByFee (cognitive 98): ElectrumWalletBase.replaceByFee has cognitive complexity 98 (threshold 15). Drivers by points: if/else 21 (65 pts), loops 5 (13 pts), ternaries 2 (11 pts), error handling 2 (6 pts), boolean chains 3 (nesting depth added 65). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2505}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1fb9116731b5210a5475c30eee990d120830ec31e85d5ab1ade6202f0226e1f"}},{"ruleId":"D2","level":"warning","message":{"text":"TokenUtilities.getAvailableTokensForNetwork (cognitive 89): TokenUtilities.getAvailableTokensForNetwork has cognitive complexity 89 (threshold 15). Drivers by points: if/else 23 (67 pts), loops 9 (19 pts), boolean chains 3 (nesting depth added 54). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/token_utilities.dart"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"4838014b9412d47d0d8514746b79fc01ad9acf72cfce47d29ac22e4864c1f6c3"}},{"ruleId":"D2","level":"warning","message":{"text":"SendViewModelBase.translateErrorMessage (cognitive 86): SendViewModelBase.translateErrorMessage has cognitive complexity 86 (threshold 15). Drivers by points: if/else 41 (67 pts), ternaries 3 (10 pts), boolean chains 6, match/switch 1 (3 pts) (nesting depth added 35). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1540}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fd1a8db39d9d906839983fef4d2dc96527a6b2014e8e90a0e3d6335996bb0f9"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainClient.fetchWalletTokensFromMoralis (cognitive 83): EVMChainClient.fetchWalletTokensFromMoralis has cognitive complexity 83 (threshold 15). Drivers by points: ternaries 12 (47 pts), if/else 8 (26 pts), loops 2 (5 pts), boolean chains 4, error handling 1 (nesting depth added 56). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"d09d1c117be83dba32a09df333078fe06b3df65cf338d1eab9ed846b40812bd6"}},{"ruleId":"D2","level":"warning","message":{"text":"SendViewModelBase.commitTransaction (cognitive 77): SendViewModelBase.commitTransaction has cognitive complexity 77 (threshold 15). Drivers by points: if/else 16 (40 pts), error handling 7 (29 pts), boolean chains 4, ternaries 2 (4 pts) (nesting depth added 48). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea1687a2f21a31c7aeaa6bc7ea71994f2e2ac36c332c2510720b6edbfcd6fcb"}},{"ruleId":"D2","level":"warning","message":{"text":"BackgroundSync._syncWallets (cognitive 67): BackgroundSync._syncWallets has cognitive complexity 67 (threshold 15). Drivers by points: if/else 21 (45 pts), ternaries 3 (9 pts), error handling 1 (5 pts), loops 3 (5 pts), boolean chains 3 (nesting depth added 36). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/background_sync.dart"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeee2f9f258afd34dcbd81b57d9784c6b57bed8458954e25712d2ab4da11480e"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewSwapPageState.initState (cognitive 67): _NewSwapPageState.initState has cognitive complexity 67 (threshold 15). Drivers by points: if/else 42 (52 pts), boolean chains 11, error handling 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 12). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"95204cd67cc2d4360dcaf18aa9fc9f1c870551cb59d138fb6de3ce389020957e"}},{"ruleId":"D2","level":"warning","message":{"text":"LitecoinWalletBase.startSync (cognitive 66): LitecoinWalletBase.startSync has cognitive complexity 66 (threshold 15). Drivers by points: if/else 17 (47 pts), loops 2 (10 pts), error handling 4 (6 pts), boolean chains 3 (nesting depth added 40). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ebbe5fddc31b2cdbd031c91beb484d2b5a003947ff17b07d8fce2504b6b7e3"}},{"ruleId":"D2","level":"warning","message":{"text":"LitecoinWalletBase.createTransaction (cognitive 63): LitecoinWalletBase.createTransaction has cognitive complexity 63 (threshold 15). Drivers by points: if/else 17 (46 pts), boolean chains 8, loops 2 (4 pts), ternaries 2 (4 pts), error handling 1 (nesting depth added 33). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"2238f53cc75ea025e6d4190c943f366ce331f900d359c2460b0890eb832d3c5c"}},{"ruleId":"D2","level":"warning","message":{"text":"BridgeViewModelBase._pollForConfirmation (cognitive 62): BridgeViewModelBase._pollForConfirmation has cognitive complexity 62 (threshold 15). Drivers by points: if/else 9 (33 pts), ternaries 7 (23 pts), boolean chains 3, loops 1 (2 pts), error handling 1 (nesting depth added 41). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"00a2ef6233c3c7ef38533591759382110214e98b131f78cf04b47f72b968ba69"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._markUsedAndSplitHistory (cognitive 60): ElectrumWalletBase._markUsedAndSplitHistory has cognitive complexity 60 (threshold 15). Drivers by points: if/else 11 (41 pts), boolean chains 9, loops 3 (7 pts), ternaries 1 (2 pts), error handling 1 (nesting depth added 35). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3085}}}],"partialFingerprints":{"codehealthFindingId/v1":"582f35eda4d1358743e8c105b830514a982f817175219be53b72664010630eb4"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.createTransaction (cognitive 57): ElectrumWalletBase.createTransaction has cognitive complexity 57 (threshold 15). Drivers by points: if/else 21 (44 pts), ternaries 2 (5 pts), loops 2 (4 pts), boolean chains 3, error handling 1 (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1721}}}],"partialFingerprints":{"codehealthFindingId/v1":"9253c052bae84831dff21920f9438d9c2f2d10dbfbdd85c82ff16fae8f0353ab"}},{"ruleId":"D2","level":"warning","message":{"text":"SwapAmountBoxState.build (cognitive 57): SwapAmountBoxState.build has cognitive complexity 57 (threshold 15). Drivers by points: ternaries 25 (29 pts), boolean chains 15, if/else 12 (13 pts) (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f802843d8ba7ab04e07b2a07b0bf04a2e07a444dcad5f7dc4e004f56d471f9a"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsStoreBase.reload (cognitive 57): SettingsStoreBase.reload has cognitive complexity 57 (threshold 15). Drivers by points: if/else 37, boolean chains 15, ternaries 5. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1841}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ddc48be023a40ed2a25986913c9165a7e04dccd11eb0e17a87885d2aa53de9"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient.parseTransaction (cognitive 56): SolanaWalletClient.parseTransaction has cognitive complexity 56 (threshold 15). Drivers by points: if/else 15 (43 pts), loops 2 (6 pts), boolean chains 4, ternaries 1 (2 pts), error handling 1 (nesting depth added 33). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20dbce2e00be2e0fa21a2553365fa900ddf100f182dfd8d11245e6baf61c3e1"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._createUTXOS (cognitive 52): ElectrumWalletBase._createUTXOS has cognitive complexity 52 (threshold 15). Drivers by points: if/else 15 (28 pts), loops 5 (11 pts), boolean chains 10, ternaries 1 (2 pts), match/switch 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1144}}}],"partialFingerprints":{"codehealthFindingId/v1":"efe9cfb28d36289a2d77ef9e07decfdb292a01dba76cdfef1631f1bbc3a8b9da"}},{"ruleId":"D2","level":"warning","message":{"text":"CakePayBuyCardPage._setEffects (cognitive 52): CakePayBuyCardPage._setEffects has cognitive complexity 52 (threshold 15). Drivers by points: if/else 22 (36 pts), ternaries 4 (11 pts), boolean chains 5 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa415b62176be6ec493eb5c27bdf24c2fd84e89add4d5211633c79fa27f9a834"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewSendPageState._handleSend (cognitive 52): _NewSendPageState._handleSend has cognitive complexity 52 (threshold 15). Drivers by points: if/else 20 (38 pts), boolean chains 11, loops 2 (3 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":835}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0d90074ac32e591c9c38c3e8e8eb66ad56c2d9bdef6d40e2f511d13343aa31"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._setListeners (cognitive 51): ElectrumWalletBase._setListeners has cognitive complexity 51 (threshold 15). Drivers by points: if/else 18 (38 pts), ternaries 2 (7 pts), boolean chains 4, loops 1 (2 pts) (nesting depth added 26). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":741}}}],"partialFingerprints":{"codehealthFindingId/v1":"bada9bc6bd675ea72de824467421d72909a1cfad1647a92f58325ff0511dc6f3"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient._isSwapTransaction (cognitive 51): SolanaWalletClient._isSwapTransaction has cognitive complexity 51 (threshold 15). Drivers by points: if/else 13 (33 pts), loops 4 (9 pts), boolean chains 7, ternaries 1 (2 pts) (nesting depth added 26). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed471f8072ad5c7617a6b24304404ab3f975402458ab0d3157bb90fa39ffbd19"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient._parseSPLTokenTransaction (cognitive 51): SolanaWalletClient._parseSPLTokenTransaction has cognitive complexity 51 (threshold 15). Drivers by points: if/else 15 (37 pts), boolean chains 8, loops 3 (5 pts), ternaries 1 (nesting depth added 24). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":851}}}],"partialFingerprints":{"codehealthFindingId/v1":"671da10368a83e76e4c3f8c0f4db0cd27d37576f1cccd4fad29510d5a5d76a1d"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewSendPageState.build (cognitive 49): _NewSendPageState.build has cognitive complexity 49 (threshold 15). Drivers by points: if/else 20 (26 pts), ternaries 9 (14 pts), boolean chains 9 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea4f4ba271c199a9e4f6393ee082c46b4b9e2a34291d92e1d254d2c473f1db7f"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletRestoreFromQRCode._determineWalletRestoreMode (cognitive 47): WalletRestoreFromQRCode._determineWalletRestoreMode has cognitive complexity 47 (threshold 15). Drivers by points: if/else 20 (31 pts), boolean chains 14, ternaries 1 (2 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/restore/wallet_restore_from_qr_code.dart"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"87a0f4ea217d12370a284cb51fb3d2f0a71e8cd8fc66a5fb1324c4697cf17a08"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.startSync (cognitive 45): ElectrumWalletBase.startSync has cognitive complexity 45 (threshold 15). Drivers by points: if/else 12 (29 pts), boolean chains 5, loops 1 (5 pts), ternaries 2 (5 pts), error handling 1 (nesting depth added 24). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df4ba02979aab2a3e5d45e74b4492cf727009e26c0771fc5956e538d6b9bb5e"}},{"ruleId":"D2","level":"warning","message":{"text":"BalanceCard.build (cognitive 45): BalanceCard.build has cognitive complexity 45 (threshold 15). Drivers by points: ternaries 13 (22 pts), if/else 8 (15 pts), boolean chains 6, loops 1 (2 pts) (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/balance_card.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"19ae088b7cdf727819b6c0e33f7ffe4bb2c6850029b9e93a76e11b52b558e5cf"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletLoadingService.load (cognitive 44): WalletLoadingService.load has cognitive complexity 44 (threshold 15). Drivers by points: if/else 12 (30 pts), error handling 4 (10 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 25). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/wallet_loading_service.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"afbb969cf58dc8a9c25386d975655ec21020667c51395c0585e0bec80b10f4fe"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewSwapPageState.build (cognitive 43): _NewSwapPageState.build has cognitive complexity 43 (threshold 15). Drivers by points: if/else 19 (23 pts), ternaries 17, boolean chains 3 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"86f5909753ff279ae0ab606ff452d206e22c53f5d441816ab8aa23abf8aef83f"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.getTransactionExpanded (cognitive 42): ElectrumWalletBase.getTransactionExpanded has cognitive complexity 42 (threshold 15). Drivers by points: if/else 11 (25 pts), boolean chains 8, error handling 2 (5 pts), ternaries 1 (3 pts), loops 1 (nesting depth added 19). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2752}}}],"partialFingerprints":{"codehealthFindingId/v1":"5def5649c76ba0bca7412596f18cd0c4155b29971d1c444a2ccc3e032d3cb826"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainClient.fetchTransactions (cognitive 42): EVMChainClient.fetchTransactions has cognitive complexity 42 (threshold 15). Drivers by points: if/else 9 (23 pts), error handling 3 (10 pts), boolean chains 4, loops 1 (3 pts), ternaries 1 (2 pts) (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b1f70b45179c8ff138cf1d6df6ea2483682656b789610932511a534d8e6254b"}},{"ruleId":"D2","level":"warning","message":{"text":"AddressResolverService.resolve (cognitive 42): AddressResolverService.resolve has cognitive complexity 42 (threshold 15). Drivers by points: if/else 7 (25 pts), ternaries 1 (6 pts), error handling 2 (5 pts), loops 2 (5 pts), boolean chains 1 (nesting depth added 29). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/address_resolver_service.dart"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"2910191460d33c51a60d606ee2c4d3da87af2ec42a0c40a875fc7f195b79eb3d"}},{"ruleId":"D2","level":"warning","message":{"text":"_EditTokenPageBodyState.build (cognitive 40): _EditTokenPageBodyState.build has cognitive complexity 40 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 9, ternaries 5 (8 pts), error handling 2 (5 pts) (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ec241db0d4c0b2c2a5dbefb398fa36b15907bb3a3d4edcf4a1d472209bc2467"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsStoreBase.load (cognitive 40): SettingsStoreBase.load has cognitive complexity 40 (threshold 15). Drivers by points: if/else 32, ternaries 7, boolean chains 1. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1208}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d337eab779c59a02ab7e575c30d9e6d91632b28a7bae7b64b7ad88e6602fc6"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumTransactionInfo.fromElectrumBundle (cognitive 39): ElectrumTransactionInfo.fromElectrumBundle has cognitive complexity 39 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 10, ternaries 5 (6 pts), error handling 1 (4 pts), loops 2 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_transaction_info.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f2286e799893065f7c1525bca79ac1a7946765a1039acd2847378cbd5ae5dd4"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainWalletBase.createTransaction (cognitive 38): EVMChainWalletBase.createTransaction has cognitive complexity 38 (threshold 15). Drivers by points: if/else 15 (25 pts), boolean chains 7, ternaries 3 (6 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e220e89433fdf62f4a0644d325b4bed91a995d1190cf0b7d03d5a89307f824"}},{"ruleId":"D2","level":"warning","message":{"text":"XOSwapExchangeProvider.fetchRate (cognitive 38): XOSwapExchangeProvider.fetchRate has cognitive complexity 38 (threshold 15). Drivers by points: if/else 7 (23 pts), loops 2 (6 pts), ternaries 2 (6 pts), boolean chains 2, error handling 1 (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d984c3037cf106d9d1dcb55a3814b331d110595b004dec048b99589edade0a"}},{"ruleId":"D2","level":"warning","message":{"text":"_MultiNetworkPickerBodyState.build (cognitive 38): _MultiNetworkPickerBodyState.build has cognitive complexity 38 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 10, loops 5 (10 pts), ternaries 4 (6 pts) (nesting depth added 9). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"d474457113ff067ed0fecbf7cb8e930e9ba56aea018f4f4cc5e13f5f68f611c2"}},{"ruleId":"D2","level":"warning","message":{"text":"ContactListViewModelBase.loadWalletContacts (cognitive 38): ContactListViewModelBase.loadWalletContacts has cognitive complexity 38 (threshold 15). Drivers by points: if/else 7 (20 pts), ternaries 2 (9 pts), loops 2 (6 pts), boolean chains 2, error handling 1 (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/contact_list/contact_list_view_model.dart"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df531f83b4cdba54c7d7b74523e623b35159601c448552106052dcbbd818d6c"}},{"ruleId":"D2","level":"warning","message":{"text":"ExchangeViewModelBase.isCanCreateTrade (cognitive 38): ExchangeViewModelBase.isCanCreateTrade has cognitive complexity 38 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 15, ternaries 2 (6 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1716}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cb3ea7ae5586e33b27a77ecf58cadc2bd7caa74cc2da5e5ba5f77d81fc9ff54"}},{"ruleId":"D2","level":"warning","message":{"text":"PaymentRequest.fromUri (cognitive 37): PaymentRequest.fromUri has cognitive complexity 37 (threshold 15). Drivers by points: if/else 15 (30 pts), ternaries 1 (3 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 18). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/payment_request.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f544d366c604754530d7525d42bcfa17545d33677ece40baac79dfec07edd35"}},{"ruleId":"D2","level":"warning","message":{"text":"MoneroWalletBase._updateUnspent (cognitive 36): MoneroWalletBase._updateUnspent has cognitive complexity 36 (threshold 15). Drivers by points: if/else 7 (21 pts), error handling 2 (6 pts), loops 2 (5 pts), boolean chains 4 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"db239694ee6725761342e3e468afd5ed98ae5d1722860f02e1a940514e8f0e6d"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletAddressListViewModelBase._computeAddressList (cognitive 36): WalletAddressListViewModelBase._computeAddressList has cognitive complexity 36 (threshold 15). Drivers by points: if/else 18 (27 pts), loops 4 (6 pts), boolean chains 3 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86db2567f4d1b0dd0b6b3d0e4eff2bd21e6ee12227228375a9e48c4583f609a"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletKeysViewModelBase._populateKeysItems (cognitive 36): WalletKeysViewModelBase._populateKeysItems has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (33 pts), ternaries 1 (2 pts), match/switch 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_keys_view_model.dart"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f8816ede1f314006b43172107e7338b0395a7a1c66103127c47f6cd35188352"}},{"ruleId":"D2","level":"warning","message":{"text":"HistorySection.build (cognitive 35): HistorySection.build has cognitive complexity 35 (threshold 15). Drivers by points: if/else 13 (16 pts), ternaries 11 (14 pts), boolean chains 5 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_section.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a7b9765438c45ca7dff1e766346e85369bc8d7484ffc63a2a06c0673ee8122d"}},{"ruleId":"D2","level":"warning","message":{"text":"_AdvancedPrivacySettingsBodyState.build (cognitive 35): _AdvancedPrivacySettingsBodyState.build has cognitive complexity 35 (threshold 15). Drivers by points: if/else 20 (25 pts), boolean chains 10 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/advanced_privacy_settings_page.dart"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b3df7b9fb9defa03f97c98b7dfd1052a6ef0890ce1e5bbca4ff8916e51c373"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletKitServiceBase._emitEvent (cognitive 35): WalletKitServiceBase._emitEvent has cognitive complexity 35 (threshold 15). Drivers by points: error handling 3 (14 pts), if/else 4 (14 pts), loops 3 (6 pts), boolean chains 1 (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"73bfdbf900830c0beb580662ceef71ff03431b3a777cb5da926a1d3c4a4a01a0"}},{"ruleId":"D2","level":"warning","message":{"text":"OnRamperBuyProvider.fetchQuote (cognitive 34): OnRamperBuyProvider.fetchQuote has cognitive complexity 34 (threshold 15). Drivers by points: if/else 12 (25 pts), ternaries 5, loops 1 (3 pts), error handling 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/onramper/onramper_buy_provider.dart"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"8341065f802869ae1f604ff08c22aa8dcf1b130f5959b96d77ed8f1a179ed1a0"}},{"ruleId":"D2","level":"warning","message":{"text":"SwapsXyzExchangeProvider._fetchAndCacheTokens (cognitive 34): SwapsXyzExchangeProvider._fetchAndCacheTokens has cognitive complexity 34 (threshold 15). Drivers by points: if/else 10 (21 pts), error handling 2 (6 pts), loops 2 (4 pts), ternaries 1 (3 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"9acbbfcff690e642e21164f16a03c0eacf317557bc0c9581e3a2a31cc587a7fb"}},{"ruleId":"D2","level":"warning","message":{"text":"_SwapDetailsBottomSheetState._setEffects (cognitive 34): _SwapDetailsBottomSheetState._setEffects has cognitive complexity 34 (threshold 15). Drivers by points: if/else 17 (26 pts), boolean chains 8 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e12fee57c3a962bbc1f769928497d9445c8de081d4b0c3444e1e06e4fbd1f35"}},{"ruleId":"D2","level":"warning","message":{"text":"WowneroWalletBase.createTransaction (cognitive 33): WowneroWalletBase.createTransaction has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 8, ternaries 4 (8 pts), loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"12752372f251339a798b48c3fadda6aefbd01b8366ce8649f78a04eed59457b9"}},{"ruleId":"D2","level":"warning","message":{"text":"SwapsXyzExchangeProvider.fetchLimits (cognitive 33): SwapsXyzExchangeProvider.fetchLimits has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (22 pts), boolean chains 6, ternaries 2 (4 pts), error handling 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f97519229de516c8f516697c90c6bed14dd62976a5ffacc3086e348fb3fe434a"}},{"ruleId":"D2","level":"warning","message":{"text":"TradeFilterStoreBase.filtered (cognitive 33): TradeFilterStoreBase.filtered has cognitive complexity 33 (threshold 15). Drivers by points: boolean chains 31, ternaries 2. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/dashboard/trade_filter_store.dart"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"13f491826236729891c90154bd22aabc3d19c3628cc54e0d6861f6f42edf3da4"}},{"ruleId":"D2","level":"warning","message":{"text":"BalanceViewModelBase.formattedBalances (cognitive 33): BalanceViewModelBase.formattedBalances has cognitive complexity 33 (threshold 15). Drivers by points: if/else 13 (26 pts), boolean chains 6, match/switch 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/balance_view_model.dart"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f7dce247f1adc9ccabee201010835025c02508960a215337f69e6d5b598deb"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.estimateTxForAmount (cognitive 32): ElectrumWalletBase.estimateTxForAmount has cognitive complexity 32 (threshold 15). Drivers by points: if/else 16 (26 pts), ternaries 2 (3 pts), loops 2, boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1384}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81cb5d8558a4d6d8f4a472b46e6989065cb539164edcb038928241c9717224b"}},{"ruleId":"D2","level":"warning","message":{"text":"AuthService.authenticateAction (cognitive 32): AuthService.authenticateAction has cognitive complexity 32 (threshold 15). Drivers by points: if/else 14 (29 pts), boolean chains 3 (nesting depth added 15). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/auth_service.dart"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"aed73ada79c29baedccd6ba5d545412a3fcce46c97f2917876b2b442ace54327"}},{"ruleId":"D2","level":"warning","message":{"text":"_CardsViewState._buildCard (cognitive 32): _CardsViewState._buildCard has cognitive complexity 32 (threshold 15). Drivers by points: if/else 10 (13 pts), ternaries 13, boolean chains 6 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/cards_view.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"df44a1d973617418d8825070f0e9bf7887bb68a0fd326c007cf3f8df4f3144b6"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfirmSendingBottomSheet.contentWidget (cognitive 32): ConfirmSendingBottomSheet.contentWidget has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 12 (22 pts), if/else 6, boolean chains 4 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/confirm_sending_bottom_sheet_widget.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"89ae49a53f52f57eab82bac90a10cc80cedd53a467fe761c98dd882121e78d73"}},{"ruleId":"D2","level":"warning","message":{"text":"PaymentViewModelBase.processAddress (cognitive 32): PaymentViewModelBase.processAddress has cognitive complexity 32 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 6, ternaries 2 (6 pts), match/switch 1 (2 pts), error handling 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/payment/payment_view_model.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"1400d6e420781af986ee5a87154df8e89d4738b8929ed3413322cf9919861dbd"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.fetchTransactions (cognitive 31): ElectrumWalletBase.fetchTransactions has cognitive complexity 31 (threshold 15). Drivers by points: if/else 8 (14 pts), ternaries 4 (13 pts), boolean chains 3, error handling 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2870}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b3e598e0ffad1b4d9176ad9ae52772c22094295fff14a847d8c40ee886e859"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletAddressesBase.addBitcoinAddressTypes (cognitive 31): ElectrumWalletAddressesBase.addBitcoinAddressTypes has cognitive complexity 31 (threshold 15). Drivers by points: if/else 21 (28 pts), ternaries 1 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df3e92a4824b7ba66c9082a2a6c99ad1a59f9012b86d59955e80b2491793361"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient._signSPLTokenTransaction (cognitive 31): SolanaWalletClient._signSPLTokenTransaction has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (17 pts), error handling 6 (9 pts), boolean chains 3, ternaries 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1781}}}],"partialFingerprints":{"codehealthFindingId/v1":"8958b09cfdafb2316eea0c16b21bc18b1567b2216fcbe449ffc7cb5ff2b9858f"}},{"ruleId":"D2","level":"warning","message":{"text":"LetsExchangeExchangeProvider.createTrade (cognitive 31): LetsExchangeExchangeProvider.createTrade has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (20 pts), ternaries 4 (8 pts), boolean chains 2, error handling 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbab8e8d2e9b9dd9fbd6169a3fcf86ff3a7a970c553810373f33e2a22d90bca5"}},{"ruleId":"D2","level":"warning","message":{"text":"_ChartHeaderState.build (cognitive 31): _ChartHeaderState.build has cognitive complexity 31 (threshold 15). Drivers by points: if/else 7 (15 pts), ternaries 7 (15 pts), boolean chains 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/charts_page/chart_header.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6595d8e669b458b5a4eeffe14f8a4369e733c111fc76e5d66545139426c3c2a0"}},{"ruleId":"D2","level":"warning","message":{"text":"SendTransactionDetails._buildMainContent (cognitive 31): SendTransactionDetails._buildMainContent has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 7 (12 pts), if/else 8 (11 pts), boolean chains 8 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_confirm_sheet.dart"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"4deea6008a46a9ba2cad4144bd52fbb0d527f61706c65fd6af44c06cc23d5952"}},{"ruleId":"D2","level":"warning","message":{"text":"ExchangeViewModelBase.calculateDepositAllAmount (cognitive 31): ExchangeViewModelBase.calculateDepositAllAmount has cognitive complexity 31 (threshold 15). Drivers by points: if/else 8 (15 pts), ternaries 5 (11 pts), boolean chains 3, error handling 1 (2 pts) (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1394}}}],"partialFingerprints":{"codehealthFindingId/v1":"1751e985eeb4befc8f83a25e6a4bb2757fa9597f810d77b4fa77a18632a4edeb"}},{"ruleId":"D2","level":"warning","message":{"text":"LitecoinWalletBase.fetchBalances (cognitive 30): LitecoinWalletBase.fetchBalances has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 5, loops 3 (4 pts), ternaries 2 (4 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":914}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a1f32a5ceccde942d65c42e2cd37f01c83f2f20b080682da2f3242e3f300745"}},{"ruleId":"D2","level":"warning","message":{"text":"XOSwapExchangeProvider.findTradeById (cognitive 30): XOSwapExchangeProvider.findTradeById has cognitive complexity 30 (threshold 15). Drivers by points: if/else 7 (15 pts), ternaries 4 (8 pts), boolean chains 6, error handling 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"adcf3e7874f6c2974a049da40d54e2cb13b8e52d677c98e66abe8a875be47174"}},{"ruleId":"D2","level":"warning","message":{"text":"ZcashWalletBase._oneshotSync (cognitive 30): ZcashWalletBase._oneshotSync has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (21 pts), loops 2 (6 pts), error handling 2 (3 pts) (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bf40f70c3b04aa80f8b2b68ca38d46b0268be03c664deb286d56b2367a57367"}},{"ruleId":"D2","level":"warning","message":{"text":"SecurityBackupPage.body (cognitive 30): SecurityBackupPage.body has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (26 pts), boolean chains 2, ternaries 2 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/security_backup_page.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"561f09f4aab95c5629b863f673384aa642797bf0aff1397e9c778ad456641967"}},{"ruleId":"D2","level":"warning","message":{"text":"TrezorConnectViewModelBase.connectDevice (cognitive 30): TrezorConnectViewModelBase.connectDevice has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (16 pts), ternaries 3 (6 pts), error handling 2 (5 pts), boolean chains 3 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"59fecc3dd3e13f776cebfe38aeab22d07113d2df97e71b51ca3837685f32e1ae"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.fetchBalances (cognitive 29): ElectrumWalletBase.fetchBalances has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (19 pts), boolean chains 4, loops 2 (3 pts), ternaries 1 (2 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":4005}}}],"partialFingerprints":{"codehealthFindingId/v1":"c57047e0b2b6b76170862889dc0a262fdf2baf933768c140c61798577137ea7e"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._updateInputsAndOutputs (cognitive 29): ElectrumWalletBase._updateInputsAndOutputs has cognitive complexity 29 (threshold 15). Drivers by points: if/else 6 (17 pts), error handling 1 (5 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":4458}}}],"partialFingerprints":{"codehealthFindingId/v1":"143d15e6d4584fe3a986b93b5d89176b9c026316ae4d979fb71d9426d726c1ba"}},{"ruleId":"D2","level":"warning","message":{"text":"_ScanPageState.build (cognitive 29): _ScanPageState.build has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 14, if/else 11 (12 pts), boolean chains 3 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/scan_page.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"97a4ab0c38b256a343c89988ddb7c753a856ecda74465cfa147d98a7f220a0e0"}},{"ruleId":"D2","level":"warning","message":{"text":"PSBTTransactionBuild.PSBTTransactionBuild (cognitive 29): PSBTTransactionBuild.PSBTTransactionBuild has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (18 pts), boolean chains 4, error handling 1 (3 pts), loops 2, ternaries 1 (2 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/psbt/transaction_builder.dart"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b56c40769f9d6157450605e2261a11f0478949456e9f730d653a8497110c78d3"}},{"ruleId":"D2","level":"warning","message":{"text":"NodeCreateOrEditViewModelBase.scanQRCodeForNewNode (cognitive 29): NodeCreateOrEditViewModelBase.scanQRCodeForNewNode has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (20 pts), ternaries 3 (6 pts), boolean chains 2, error handling 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/node_list/node_create_or_edit_view_model.dart"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"05c7a61b319ddf6083683f21ed8005616d0cd7eb427c5adae202cf2c66c1320b"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumClient._handleResponse (cognitive 28): ElectrumClient._handleResponse has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (20 pts), error handling 3 (6 pts), ternaries 1 (2 pts) (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":789}}}],"partialFingerprints":{"codehealthFindingId/v1":"68bd687d33dd989ca334b1c4d4b6100a24c589ea746cc516ff2a3a61bcdfc596"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._resolveTransactions (cognitive 28): ElectrumWalletBase._resolveTransactions has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (14 pts), loops 3 (8 pts), error handling 2 (3 pts), ternaries 1 (3 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3221}}}],"partialFingerprints":{"codehealthFindingId/v1":"7df3bdda2d06d37ecfa8314fcbff013b806621991332dbc61d0ac648e1707938"}},{"ruleId":"D2","level":"warning","message":{"text":"WowneroWalletService.openWallet (cognitive 28): WowneroWalletService.openWallet has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 19, if/else 4 (8 pts), error handling 1 (nesting depth added 4). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d77346b085506facc487c0a8fb199f31b2b7307be48a5f6ca2702018b17f346"}},{"ruleId":"D2","level":"warning","message":{"text":"StealthExExchangeProvider.createTrade (cognitive 28): StealthExExchangeProvider.createTrade has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (17 pts), ternaries 4 (8 pts), boolean chains 2, error handling 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/stealth_ex_exchange_provider.dart"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e7b091a7218052d6467830d3de364761fe22e61a0875c32413bfd0d65ada62"}},{"ruleId":"D2","level":"warning","message":{"text":"CWNanoUtil.getInfoFromSeedOrMnemonic (cognitive 28): CWNanoUtil.getInfoFromSeedOrMnemonic has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (22 pts), error handling 2 (5 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"5280c94145c803316c931599298ac4cc55b95c2ed0dd0e34ddcf6bb3aad045ca"}},{"ruleId":"D2","level":"warning","message":{"text":"_ReceiveAddressTypeSelectorState.build (cognitive 28): _ReceiveAddressTypeSelectorState.build has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 10, if/else 8 (10 pts), ternaries 4 (8 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_address_type_selector.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c0b8c92509e4b7923d94871369abce916b64fa3a6475f850dd337ac98f3655c"}},{"ruleId":"D2","level":"warning","message":{"text":"ListItemRegularRowWidget.build (cognitive 28): ListItemRegularRowWidget.build has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (16 pts), ternaries 8 (10 pts), boolean chains 2 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/new_list_row/list_item_regular_row_widget.dart"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"1659436ed88fad5494e7d84eeb1c80632495e34825fce1ae573068a5ee0e28d3"}},{"ruleId":"D2","level":"warning","message":{"text":"TransactionFilterStoreBase.filtered (cognitive 28): TransactionFilterStoreBase.filtered has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 14, if/else 8 (14 pts) (nesting depth added 6). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/dashboard/transaction_filter_store.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"a34490d4bca5a7b79e6f43dccad1314814f7afa6a100c1443cf127fea5b72eac"}},{"ruleId":"D2","level":"warning","message":{"text":"AppDelegate.didInitializeImplicitFlutterEngine (cognitive 28): AppDelegate.didInitializeImplicitFlutterEngine has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 8, match/switch 3 (4 pts) (nesting depth added 7). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ios/Runner/AppDelegate.swift"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"189190bb833699115bb088f9d46358e43ed623ec963bf729ff78e0789cbff2b9"}},{"ruleId":"D2","level":"warning","message":{"text":"MoonPayProvider.fetchQuote (cognitive 27): MoonPayProvider.fetchQuote has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (16 pts), ternaries 5, boolean chains 3, error handling 2 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/moonpay/moonpay_provider.dart"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"762e124e91b578fef1170344111d0253877ad56d9c61ab818b47a2c08f836e0b"}},{"ruleId":"D2","level":"warning","message":{"text":"_L2ActionWalletSelectorState.build (cognitive 27): _L2ActionWalletSelectorState.build has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (18 pts), ternaries 2 (6 pts), boolean chains 3 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/l2_action_wallet_selector.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d80af5f3a8e72b2cb00aae32a06b538876293251ccf77409bf89d3f2dd35cf"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletListBodyState._loadWallet (cognitive 27): WalletListBodyState._loadWallet has cognitive complexity 27 (threshold 15). Drivers by points: if/else 12 (26 pts), error handling 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_list/wallet_list_page.dart"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"42af9a40ce0301fca13e93718224f7e6c6a1a0bf10f5e9305573d0672db4e6a1"}},{"ruleId":"D2","level":"warning","message":{"text":"BuySellViewModelBase.calculateBestRate (cognitive 27): BuySellViewModelBase.calculateBestRate has cognitive complexity 27 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 6, ternaries 3 (6 pts), loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/buy/buy_sell_view_model.dart"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"28dcdb3212a3688b170a8ecef3e4d8dcab7808fe0eb044e81b0b48fca707c919"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient.fetchTransactions (cognitive 26): SolanaWalletClient.fetchTransactions has cognitive complexity 26 (threshold 15). Drivers by points: if/else 5 (15 pts), loops 2 (5 pts), error handling 2 (4 pts), ternaries 1 (2 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1079}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2bbb21b6c4b363a73222840e9595fcb4242fd879c4d243d999e5ad86772f382"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient.fetchWalletTokensFromMoralis (cognitive 26): SolanaWalletClient.fetchWalletTokensFromMoralis has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (18 pts), error handling 2 (4 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":2030}}}],"partialFingerprints":{"codehealthFindingId/v1":"baee09154942f5e8000a814a299bf9c038e99c59ea1805a0d4558727d0b85299"}},{"ruleId":"D2","level":"warning","message":{"text":"DFXBuyProvider.fetchQuote (cognitive 26): DFXBuyProvider.fetchQuote has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (18 pts), boolean chains 4, ternaries 3, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/dfx/dfx_buy_provider.dart"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"64c57554db946009f3288b1fd51dff947d948d2504c59fe7ec92de570127b875"}},{"ruleId":"D2","level":"warning","message":{"text":"SwapsXyzExchangeProvider.createTrade (cognitive 26): SwapsXyzExchangeProvider.createTrade has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 7, ternaries 3 (6 pts), error handling 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08c967483b3e7d9f67adbd52aef6ccd092b96d67843eef22afa3690df8aa5a9"}},{"ruleId":"D2","level":"warning","message":{"text":"LightningWallet.createTransaction (cognitive 26): LightningWallet.createTransaction has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (15 pts), ternaries 2 (4 pts), error handling 1 (3 pts), match/switch 1 (3 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_wallet.dart"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b3a3634924d411adbf4b6bb81233ad156304fda8edfa28fa48e6d477e0b7a6a"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewReceivePageState.build (cognitive 26): _NewReceivePageState.build has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 10 (12 pts), if/else 7 (8 pts), boolean chains 6 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/receive_page.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a22552fc9b2c6d7fc50d2175bdf2f1a1c703649cae02bb782d3cd78510a66e"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletRestorePage._confirmForm (cognitive 26): WalletRestorePage._confirmForm has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 3, loops 1 (2 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_page.dart"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"8797c0510cdc99edc241fc198dbfb3ee43e4e22182bfd69a810d061211df4dc6"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletListBodyState.build (cognitive 26): WalletListBodyState.build has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 7 (14 pts), if/else 10 (12 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_list/wallet_list_page.dart"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e87e8ff2b8065df4fa4dd01b12c5bbcd7738b72e7d6af215249bbeba930758e"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.fetchBitcoinTransactionsForInitialRestore (cognitive 25): ElectrumWalletBase.fetchBitcoinTransactionsForInitialRestore has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (16 pts), ternaries 2 (5 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3316}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b926c6a9813e5d2abeacd61776508bccae22d4942c33ce7830946e4462f351"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._buildTransactionBundlesBatch (cognitive 25): ElectrumWalletBase._buildTransactionBundlesBatch has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (16 pts), boolean chains 5, loops 3 (4 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3735}}}],"partialFingerprints":{"codehealthFindingId/v1":"b124777f8678aa7fb7db781132e0ae903127ba4452b8e8f0aac201f552137361"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletAddressesBase.address (cognitive 25): ElectrumWalletAddressesBase.address has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 11, ternaries 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e9e5c12827f7578540975e6424ece1ff4f198a002ad3c45bad83efec01aad55"}},{"ruleId":"D2","level":"warning","message":{"text":"MoneroWalletBase._createTransaction (cognitive 25): MoneroWalletBase._createTransaction has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (16 pts), ternaries 3 (6 pts), boolean chains 2, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a423971277fb3a9cbe18880e56c217d5e29fcba109ff08bdd2ba3a7614a82a0"}},{"ruleId":"D2","level":"warning","message":{"text":"ZanoWalletBase.createTransaction (cognitive 25): ZanoWalletBase.createTransaction has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (19 pts), ternaries 3 (5 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f6adb2dc0738669e9a7dd949005d0bd4260d4808ffdba56eefd1921be5adf8"}},{"ruleId":"D2","level":"warning","message":{"text":"CakePayBuyCardPage.body (cognitive 25): CakePayBuyCardPage.body has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 9, ternaries 4 (5 pts) (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"921f90166ee88a709be5f1c52b5a796d86e7c7b91e13dc2cccb269749e78effe"}},{"ruleId":"D2","level":"warning","message":{"text":"RBFDetailsPage._setEffects (cognitive 25): RBFDetailsPage._setEffects has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (20 pts), error handling 1 (3 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/transaction_details/rbf_details_page.dart"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"a555dcca2207d82c962d2d04f9d712991cec037ab9fbf4121ee33aa7d1042fe8"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletEditPage.body (cognitive 25): WalletEditPage.body has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (19 pts), boolean chains 3, error handling 1 (3 pts) (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet/wallet_edit_page.dart"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"1650269a79ec009c077da97e1b4236dedcb11aa7c5569536cc40b498a1918809"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsStoreBase.SettingsStoreBase (cognitive 25): SettingsStoreBase.SettingsStoreBase has cognitive complexity 25 (threshold 15). Drivers by points: if/else 21, boolean chains 3, match/switch 1. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6fee60c0ed467e5ca5884eaba0648a9a88f6a05bdfbc4ac1931b0531d44c538"}},{"ruleId":"D2","level":"warning","message":{"text":"CakeTorInstance.getInstance (cognitive 25): CakeTorInstance.getInstance has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (22 pts), error handling 2 (3 pts) (nesting depth added 15). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/tor/abstract.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"1708385b64efc22e528b2e49ac4ea9d1519b2b705e3e57c7b29a00c2d0ffbc87"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainWalletBase.fetchTransactions (cognitive 24): EVMChainWalletBase.fetchTransactions has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 7, loops 3 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1145}}}],"partialFingerprints":{"codehealthFindingId/v1":"e86683c574ac7d1769afdcf9335c45c92a32fd31ae893e5cf751bd5b54c2f577"}},{"ruleId":"D2","level":"warning","message":{"text":"CakePayBuyCardPage.isIOSUnavailable (cognitive 24): CakePayBuyCardPage.isIOSUnavailable has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 23, if/else 1. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa37ad1aba1652bd28c5297d23d617e066d13a30c57cf1431cc29263315cbeca"}},{"ruleId":"D2","level":"warning","message":{"text":"CWNanoUtil.compareDerivationMethods (cognitive 24): CWNanoUtil.compareDerivationMethods has cognitive complexity 24 (threshold 15). Drivers by points: error handling 6 (13 pts), if/else 7 (9 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"fafdcd4e391a2a10b11effd1988f5f1401526424e22c96f64f4df1c6bdea9d25"}},{"ruleId":"D2","level":"warning","message":{"text":"TokenUtilities.getChainId (cognitive 24): TokenUtilities.getChainId has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 13, if/else 7 (11 pts) (nesting depth added 4). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/token_utilities.dart"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8afce896b11bcd019e02d73ff8921a079d20b007300b43acaf3ed9efb8f0067"}},{"ruleId":"D2","level":"warning","message":{"text":"CWBitcoin.getDerivationsFromMnemonic (cognitive 23): CWBitcoin.getDerivationsFromMnemonic has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (10 pts), match/switch 2 (5 pts), error handling 1 (3 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fde9450399266b9b827f31b6e7f61e3d71b39d7f0514bcb87a97007a66ed789"}},{"ruleId":"D2","level":"warning","message":{"text":"BackupServiceV3.importBackupFileV3 (cognitive 23): BackupServiceV3.importBackupFileV3 has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (18 pts), loops 3 (4 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service_v3.dart"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ef6149caf04f062f271ac764104ea8146307b90ed9a0c3ab33f16ae7e80a55"}},{"ruleId":"D2","level":"warning","message":{"text":"ModalTopBar.build (cognitive 23): ModalTopBar.build has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 9 (11 pts), if/else 8, boolean chains 4 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_top_bar.dart"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb676cfc352a7ba6799bd109c587989279696de0745fd9f29af90e8eb494e7df"}},{"ruleId":"D2","level":"warning","message":{"text":"SendViewModelBase._waitForApprovalUpdate (cognitive 23): SendViewModelBase._waitForApprovalUpdate has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (19 pts), error handling 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1461}}}],"partialFingerprints":{"codehealthFindingId/v1":"04edf650ec42f67121786ce0f568c7b9d506fab8ea06f2af0a47c6b3b1515d69"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletGroupsDisplayViewModelBase.updateWalletInfoSourceList (cognitive 23): WalletGroupsDisplayViewModelBase.updateWalletInfoSourceList has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 14, if/else 3 (5 pts), loops 3 (4 pts) (nesting depth added 3). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_groups_display_view_model.dart"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"740e0bd3f9db85df4996a8c1bc508c70bfd23d030a679b13bbf4f07efc465e04"}},{"ruleId":"D2","level":"warning","message":{"text":"LitecoinWalletAddressesBase.getChangeAddress (cognitive 22): LitecoinWalletAddressesBase.getChangeAddress has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 6, loops 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_addresses.dart"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"32754a08c1db8fedd9a5a80b09b6f3a35015c4e9124eea683b1742698b2ffaf9"}},{"ruleId":"D2","level":"warning","message":{"text":"Erc20Token.migrateAllToSqlite (cognitive 22): Erc20Token.migrateAllToSqlite has cognitive complexity 22 (threshold 15). Drivers by points: loops 5 (13 pts), if/else 2 (6 pts), error handling 1 (3 pts) (nesting depth added 14). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/erc20_token_legacy.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20a62a91eb6d756c588fd2a62fdc2ad32651719818cd4b42e9a4b83d3c85a8e"}},{"ruleId":"D2","level":"warning","message":{"text":"ThorchainAddressProvider.resolve (cognitive 22): ThorchainAddressProvider.resolve has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (13 pts), boolean chains 3, ternaries 1 (3 pts), loops 1 (2 pts), error handling 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/thorchain/thorchain_address_provider.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f4d60c113b885ab6a23c75c4fa4076531135bff3fa6cad08cb34220c21c6f9"}},{"ruleId":"D2","level":"warning","message":{"text":"RootState.didChangeAppLifecycleState (cognitive 22): RootState.didChangeAppLifecycleState has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 5, match/switch 1 (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/root/root.dart"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"42c869a37cb7c409067589a96460c126409803f3bcf6477d6d0addb59e1c589e"}},{"ruleId":"D2","level":"warning","message":{"text":"RestoreFromBackupViewModelBase.import (cognitive 22): RestoreFromBackupViewModelBase.import has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (12 pts), error handling 6 (10 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/restore_from_backup_view_model.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeff043e006ebebf8e8d6c3ed29bb27cc069a949e630429254a73511f980fc30"}},{"ruleId":"D2","level":"warning","message":{"text":"PendingBitcoinTransaction._commit (cognitive 21): PendingBitcoinTransaction._commit has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (21 pts) (nesting depth added 12). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/pending_bitcoin_transaction.dart"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e269b6ba868a8d423a9aacfba874d4f14c7b8a5904f35d6f4903e9aabd6562f"}},{"ruleId":"D2","level":"warning","message":{"text":"ERC681URI.fromUri (cognitive 21): ERC681URI.fromUri has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (15 pts), ternaries 3 (5 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/payment_uris.dart"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b0f3a9f3c60c8e0ef7e64753399f3609fa05ba6ed22795a64ba94e3c0f955ca"}},{"ruleId":"D2","level":"warning","message":{"text":"ZanoWalletBase._updateSyncInfo (cognitive 21): ZanoWalletBase._updateSyncInfo has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 2, loops 1 (2 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":767}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ed4fe2d267ee4ce5f645651107120e5a609bd74d3957200426c938ebc4b857d"}},{"ruleId":"D2","level":"warning","message":{"text":"NostrProfileHandler._fetchInfoFromRelay (cognitive 21): NostrProfileHandler._fetchInfoFromRelay has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (16 pts), error handling 2 (4 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/nostr/nostr_api.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"47b16e3fb19956797154ab16e71c51167aa9e0d25bd3e6cce44e079be2a73e37"}},{"ruleId":"D2","level":"warning","message":{"text":"$BackupService.importPreferencesDump (cognitive 21): $BackupService.importPreferencesDump has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (16 pts), error handling 2, loops 1 (2 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"f550cededd32e1258e69878e1839dc826d376a0d385aa0eb2715240bc6d37856"}},{"ruleId":"D2","level":"warning","message":{"text":"JupiterExchangeProvider.createTrade (cognitive 21): JupiterExchangeProvider.createTrade has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 4, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/jupiter_exchange_provider.dart"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4cbe939bc8a5798fd6e0ca98217ba288240548aeaf516986e3f234d672aefd"}},{"ruleId":"D2","level":"warning","message":{"text":"TrocadorExchangeProvider.fetchRate (cognitive 21): TrocadorExchangeProvider.fetchRate has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (14 pts), ternaries 2 (4 pts), boolean chains 2, error handling 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/trocador_exchange_provider.dart"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"f37ee4a4ce5c985bec1b6aaf866b2db205bccbf78555723ffe066c557bc58ab3"}},{"ruleId":"D2","level":"warning","message":{"text":"_TokenImageWidgetState._analyzeShape (cognitive 21): _TokenImageWidgetState._analyzeShape has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (17 pts), loops 1 (2 pts), boolean chains 1, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/token_image_widget.dart"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"34109c10c4072d1f79ca4488ac47e1c28749c9868f1b75aa06022dc5adde696e"}},{"ruleId":"D2","level":"warning","message":{"text":"ZcashWalletBase.fetchTransactions (cognitive 21): ZcashWalletBase.fetchTransactions has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 8, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":809}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee2be2ef5e178b41a78638abcd41977ea0b1dcac31d357c307633f4ddf7194b9"}},{"ruleId":"D2","level":"warning","message":{"text":"SwapConfirmationContentState._setUpReactions (cognitive 21): SwapConfirmationContentState._setUpReactions has cognitive complexity 21 (threshold 15). Drivers by points: if/else 14 (18 pts), boolean chains 3 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/swap_confirmation_bottom_sheet.dart"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f6760b576577dba3ad33dd2cac91c6ef32ea243f6c6036b243b650a05383db4"}},{"ruleId":"D2","level":"warning","message":{"text":"BuySellViewModelBase._getAvailablePaymentTypes (cognitive 21): BuySellViewModelBase._getAvailablePaymentTypes has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (15 pts), loops 2 (5 pts), error handling 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/buy/buy_sell_view_model.dart"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f12af601a7c984bd91196e598c33c6c1cdbd6bd3412f1c71b85a13ee23a7b74"}},{"ruleId":"D2","level":"warning","message":{"text":"SPLToken.migrateAllToSqlite (cognitive 20): SPLToken.migrateAllToSqlite has cognitive complexity 20 (threshold 15). Drivers by points: if/else 3 (9 pts), loops 4 (9 pts), error handling 1 (2 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/spl_token_legacy.dart"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b9601efbb6d066c66568a191c3e78361b66bbd36b436f849071bbc984fd9d1"}},{"ruleId":"D2","level":"warning","message":{"text":"TronToken.migrateAllToSqlite (cognitive 20): TronToken.migrateAllToSqlite has cognitive complexity 20 (threshold 15). Drivers by points: if/else 3 (9 pts), loops 4 (9 pts), error handling 1 (2 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/tron_token_legacy.dart"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"12ce25a9e453a525c789f6ef7910ded60486d4cdf308d1a8c03e29cd0f673f2e"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletBase.discoverTokensFromMoralis (cognitive 20): SolanaWalletBase.discoverTokensFromMoralis has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 2 (4 pts), boolean chains 1, error handling 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet.dart"},"region":{"startLine":809}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20b90df5ab9203658bbcc80ab7b62d2f26fb16047dd1a829f6c460dfec67ca8"}},{"ruleId":"D2","level":"warning","message":{"text":"WowneroWalletBase.updateUnspent (cognitive 20): WowneroWalletBase.updateUnspent has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (15 pts), boolean chains 2, loops 1 (2 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ca54bc9d9911c17f9868eea1a69be822bcae11a06d366138e3b1c5a1d6372f"}},{"ruleId":"D2","level":"warning","message":{"text":"NodeSwitchingService._switchToNextTrustedNode (cognitive 20): NodeSwitchingService._switchToNextTrustedNode has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (18 pts), boolean chains 1, error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/node_switching_service.dart"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d512e6f93d39f44690cc54c993b2cda8bb6e8a04ae91aaf6045205bf1555dab"}},{"ruleId":"D2","level":"warning","message":{"text":"_CardCustomizerState.build (cognitive 20): _CardCustomizerState.build has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 16, if/else 4. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/card_customizer.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8a60330fe3b4a72631c058ee54ad66e92a29e62e54affe6d8de3fd83102fb1"}},{"ruleId":"D2","level":"warning","message":{"text":"CWSolana.signAndPrepareJupiterSwapTransaction (cognitive 20): CWSolana.signAndPrepareJupiterSwapTransaction has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 3, error handling 2, match/switch 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/solana/cw_solana.dart"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"703328635d6c696a91cf5f6d897d114b92db41ccaf7b1bb2b4405280fd4805da"}},{"ruleId":"D2","level":"warning","message":{"text":"ZcashWalletBase._refreshBalance (cognitive 20): ZcashWalletBase._refreshBalance has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 4 (10 pts), if/else 4 (7 pts), boolean chains 2, error handling 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1408}}}],"partialFingerprints":{"codehealthFindingId/v1":"b956d5648ebdcdb64fb017578d2c7ec960bd3fd7a3725ebf3f586b5d87837d58"}},{"ruleId":"D2","level":"warning","message":{"text":"_EditTokenPageBodyState._getTokenInfo (cognitive 20): _EditTokenPageBodyState._getTokenInfo has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (17 pts), boolean chains 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"214f01f82c9aca2fe719094333ea5e14764e7ff6fe6e895b0b421ce435aabb34"}},{"ruleId":"D2","level":"warning","message":{"text":"ContactListViewModelBase._isValidForCurrency (cognitive 20): ContactListViewModelBase._isValidForCurrency has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 12, if/else 5 (8 pts) (nesting depth added 3). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/contact_list/contact_list_view_model.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a276ee823afe20b5aa1d44f0554fbc4bfd645b0d0ff23b2bd5a35cb12a0d314"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletRestoreFromQRCode.scanQRCodeForRestoring (cognitive 20): WalletRestoreFromQRCode.scanQRCodeForRestoring has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 5 (8 pts), match/switch 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/restore/wallet_restore_from_qr_code.dart"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e615e439645f6d120a2e577264ea5805de49a672af5848b523263a9572c181"}},{"ruleId":"D2","level":"warning","message":{"text":"OutputBase.calculateEstimatedFee (cognitive 20): OutputBase.calculateEstimatedFee has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (14 pts), ternaries 1 (3 pts), match/switch 1 (2 pts), error handling 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/output.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"073377e797ae7422284327ef55afbdfd0224def080e854fe735636f9685a3bab"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.setCurrentAccount (cognitive 19): ElectrumWalletBase.setCurrentAccount has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (9 pts), ternaries 2 (5 pts), loops 1 (3 pts), boolean chains 1, error handling 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9ad966b3e047ba23a5ed02969dc225a98af6efd0bc3a9694dd813c9489e03d"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.calculateEstimatedFeeWithFeeRate (cognitive 19): ElectrumWalletBase.calculateEstimatedFeeWithFeeRate has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 2 (4 pts), ternaries 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2034}}}],"partialFingerprints":{"codehealthFindingId/v1":"44d7fe89179ece9f63b1e391f1ea142b950e423dde030f9d8afdcb957175c55d"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._fetchUnspentsBatch (cognitive 19): ElectrumWalletBase._fetchUnspentsBatch has cognitive complexity 19 (threshold 15). Drivers by points: loops 5 (11 pts), if/else 3 (7 pts), error handling 1 (nesting depth added 10). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2186}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9cd9ba1a37058f82e9f0b08c5c6ebf20c7c7238c2d1c07578daafdc3a84a515"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainWalletBase.discoverTokensFromMoralis (cognitive 19): EVMChainWalletBase.discoverTokensFromMoralis has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 2 (4 pts), boolean chains 1, error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b72405759e1ef258f2cd4955221bf11bec6a1518d4e94b80479379aaa350878"}},{"ruleId":"D2","level":"warning","message":{"text":"MoneroWalletBase.renameWalletFiles (cognitive 19): MoneroWalletBase.renameWalletFiles has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (18 pts), error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"c311e253f27fa6a97c7515346b1d35630aa9b180f4bd5a1a7527006b51cb105f"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient._parseNativeTransaction (cognitive 19): SolanaWalletClient._parseNativeTransaction has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 4, boolean chains 3, loops 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f0bfae5c057b5492d2a0766f30bbd42f972c6ded630dd18543b1f5aec21f86"}},{"ruleId":"D2","level":"warning","message":{"text":"TronWalletBase.fetchTransactions (cognitive 19): TronWalletBase.fetchTransactions has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (10 pts), ternaries 2 (6 pts), error handling 1 (2 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet.dart"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6614ed5bac56acdbca32a8af6b6aaa5e34ad43155d42442cdbc5295273a071"}},{"ruleId":"D2","level":"warning","message":{"text":"DFXBuyProvider.fetchAssetCredential (cognitive 19): DFXBuyProvider.fetchAssetCredential has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 1 (4 pts), boolean chains 1, error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/dfx/dfx_buy_provider.dart"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"439c12e882bc14e3d5731c008f83c78f885d1a068782f29265b387822c2dbf8f"}},{"ruleId":"D2","level":"warning","message":{"text":"DFXBuyProvider.getAvailablePaymentTypes (cognitive 19): DFXBuyProvider.getAvailablePaymentTypes has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 3 (nesting depth added 9). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/dfx/dfx_buy_provider.dart"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"35737a4e354e98f85b3a57c87224144793948a19e685fc764ab1c8e2b7240779"}},{"ruleId":"D2","level":"warning","message":{"text":"RobinhoodBuyProvider.fetchQuote (cognitive 19): RobinhoodBuyProvider.fetchQuote has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 3, boolean chains 2, error handling 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/robinhood/robinhood_buy_provider.dart"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"8beac3014b690dd0eea2f15d43a66c6243d384e0c87f47d20d02361063a86f66"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewSendPageState.initState (cognitive 19): _NewSendPageState.initState has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 5 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc8abe7bf1aca22538de03da81f381b5985a45e267dc3b0963c35bb69839c35"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewSendPageState._addInputControllers (cognitive 19): _NewSendPageState._addInputControllers has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 4 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":759}}}],"partialFingerprints":{"codehealthFindingId/v1":"826a702d322d6962046e52e3d32e6d0cf7a205fbcbaa9385de5eaa2e75620b01"}},{"ruleId":"D2","level":"warning","message":{"text":"ExchangeCardState.build (cognitive 19): ExchangeCardState.build has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 12, if/else 4 (5 pts), boolean chains 2 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/exchange/widgets/exchange_card.dart"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c898feebed32c38e0bdc88babb578925b375a198ac2e3570043c319a4be02f2"}},{"ruleId":"D2","level":"warning","message":{"text":"BackgroundSyncPage.body (cognitive 19): BackgroundSyncPage.body has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (13 pts), loops 1 (3 pts), boolean chains 1, error handling 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/background_sync_page.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8155dc8d74aa4e12258fca0076aad34a379ad778c23b94829ea0c56e0998cbd"}},{"ruleId":"D2","level":"warning","message":{"text":"ConnectionSyncPage.body (cognitive 19): ConnectionSyncPage.body has cognitive complexity 19 (threshold 15). Drivers by points: if/else 15 (18 pts), boolean chains 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/connection_sync_page.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83136f2f81058ae63e45b46363c1992410680ff91a72e8b7575d7b9f566f0fc"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimatedURPage._continue (cognitive 19): AnimatedURPage._continue has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (16 pts), match/switch 1 (2 pts), error handling 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/ur/animated_ur_page.dart"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"73dc2abd17b88506585b3e8cf7f0c4326f34eaf6f2ee5ea1c3cd00211fc228a8"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletKitServiceBase._onSessionAuthRequest (cognitive 19): WalletKitServiceBase._onSessionAuthRequest has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 3 (7 pts), loops 2 (5 pts), if/else 3 (4 pts), error handling 1 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"a30d361e6dee7a41962d49afe1f90e3225aafeed5589c367e45f5743fa5b6ff8"}},{"ruleId":"D2","level":"warning","message":{"text":"ProviderOptionTile.build (cognitive 19): ProviderOptionTile.build has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 11, boolean chains 4, if/else 4. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/provider_optoin_tile.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"0790e154efa3781b0eb0507b6a53bc123b4ff423794606cb3a35ad3f7db40bd3"}},{"ruleId":"D2","level":"warning","message":{"text":"ProxyWrapper.post (cognitive 19): ProxyWrapper.post has cognitive complexity 19 (threshold 15). Drivers by points: error handling 4 (10 pts), if/else 6 (9 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_wrapper.dart"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"631a987f65d388fc26d4814b457195955acb627e5a0851153686b669ef14e6a3"}},{"ruleId":"D2","level":"warning","message":{"text":"TransactionListItem.formattedPendingStatus (cognitive 19): TransactionListItem.formattedPendingStatus has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 5, match/switch 1 (nesting depth added 6). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/transaction_list_item.dart"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ccdb92226ff387c360a51ad39b6402df33baac19e7c5fce9232ef0453f0873"}},{"ruleId":"D2","level":"warning","message":{"text":"ExchangeViewModelBase.calculateBestRate (cognitive 19): ExchangeViewModelBase.calculateBestRate has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 3, error handling 1 (3 pts), ternaries 2, loops 1 (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":911}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb82a75a9b733cb4941291e47dedfcd96d117c4af19aa268b029f0bb1ccbb4c9"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkViewModel.handleLink (cognitive 19): LinkViewModel.handleLink has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/link_view_model.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d1c45385a3043fe10bc570068034cb0124c232ccb5b9dc2b67d980cebc50738"}},{"ruleId":"D2","level":"warning","message":{"text":"TradeDetailsViewModelBase._updateItems (cognitive 19): TradeDetailsViewModelBase._updateItems has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 6, ternaries 2 (4 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/trade_details_view_model.dart"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2584d5fc44beccda09f99954ab1e5dcf75c724cbfde551d6a3d8a6cdc078a6e"}},{"ruleId":"D2","level":"warning","message":{"text":"TransactionDetailsViewModelBase.formattedPendingStatus (cognitive 19): TransactionDetailsViewModelBase.formattedPendingStatus has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 5, match/switch 1 (nesting depth added 6). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/transaction_details_view_model.dart"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"368193a60f9bb1e746f2e65de8b3a524fd559e48f6cdc39d65bc31954e31cf7c"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumClient.connect (cognitive 18): ElectrumClient.connect has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), error handling 4, boolean chains 2, loops 1 (2 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"b00947f73b3a09c036cd0110042f1a1acf16aac42ec4f872b034e738848e7363"}},{"ruleId":"D2","level":"warning","message":{"text":"Node.requestMoneroNode (cognitive 18): Node.requestMoneroNode has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (9 pts), boolean chains 4, error handling 2 (4 pts), ternaries 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d34b3e0024711a56b88ad6a11b1fe4b124200386516dac5ac1a07fd60d34dc"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient.fetchSPLTokenInfo (cognitive 18): SolanaWalletClient.fetchSPLTokenInfo has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (10 pts), ternaries 2 (4 pts), error handling 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1262}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2fc4d49866cec9a4b872e511725c3254634969a80f99f1de61df25142a09800"}},{"ruleId":"D2","level":"warning","message":{"text":"Bip353AddressProvider.resolve (cognitive 18): Bip353AddressProvider.resolve has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (8 pts), error handling 2 (3 pts), ternaries 1 (3 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/bip_353/bip_353_address_provider.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d85ca4f4a6e4e5c85251566ca1f135547d1ccb850524fa921f1a688ceb5c6ae"}},{"ruleId":"D2","level":"warning","message":{"text":"AnyPayRouter.route (cognitive 18): AnyPayRouter.route has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (9 pts), ternaries 4 (6 pts), boolean chains 3 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/anypay/anypay_router.dart"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d1cd9f11d9c95a860992e583bea610e38e4d4cd557918ad35140224a40e0b08"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerZeroScanService.getMessageStatus (cognitive 18): LayerZeroScanService.getMessageStatus has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 2, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/layerzero_scan_service.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d9f78e51ac3469ae8aaeea08bc30d327fa98865e895181529b77b3a14941fc9"}},{"ruleId":"D2","level":"warning","message":{"text":"NearIntentsExchangeProvider.createTrade (cognitive 18): NearIntentsExchangeProvider.createTrade has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 3 (6 pts), boolean chains 1, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/near_Intents_exchange_provider.dart"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"7acebbd022ce6c21924414d5feb1b6e2bc36158f9807736578dff0b88f93ce23"}},{"ruleId":"D2","level":"warning","message":{"text":"SwapsXyzExchangeProvider.fetchRate (cognitive 18): SwapsXyzExchangeProvider.fetchRate has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (11 pts), ternaries 2 (4 pts), boolean chains 2, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ac84a2140bee6e27fd972e4fd4592ffde216e86a3c47cb1037100d778ae885d"}},{"ruleId":"D2","level":"warning","message":{"text":"ZcashMempoolService._runLoop (cognitive 18): ZcashMempoolService._runLoop has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (11 pts), match/switch 1 (3 pts), error handling 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_mempool.dart"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad52b96c896afc4af3f09b757ab8ba7f13fad62b7970be11633de66a062ba7e"}},{"ruleId":"D2","level":"warning","message":{"text":"ZcashTaddressRotation.createAndSweepTAddressesForAccount (cognitive 18): ZcashTaddressRotation.createAndSweepTAddressesForAccount has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 2, error handling 1, loops 1, ternaries 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_taddress_rotation.dart"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"87de95e0b4a22a00c1bc52b676d34fe3bfdfc30d606a95bf1f1ed19cff53c619"}},{"ruleId":"D2","level":"warning","message":{"text":"ZcashWalletBase._createTransaction (cognitive 18): ZcashWalletBase._createTransaction has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 2 (4 pts), boolean chains 2, error handling 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"3704a343c57fc9c1ed7463b43b46bb130dcce591a2d76cb9313b73ec7f27ee79"}},{"ruleId":"D2","level":"warning","message":{"text":"OtherSettingsPage.body (cognitive 18): OtherSettingsPage.body has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12 (15 pts), ternaries 2 (3 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/other_settings_page.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"c333d5aa5075520a14973c12c3c2a676125dc1dc2a3aa142b01ee04c33be851d"}},{"ruleId":"D2","level":"warning","message":{"text":"ProxyWrapper.get (cognitive 18): ProxyWrapper.get has cognitive complexity 18 (threshold 15). Drivers by points: error handling 4 (10 pts), if/else 6 (8 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (ProxyWrapper.delete) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_wrapper.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6791ac96da9528d03ae6e7a7e012f144e99474abd7111563f35c5656dcee909"}},{"ruleId":"D2","level":"warning","message":{"text":"ProxyWrapper.delete (cognitive 18): ProxyWrapper.delete has cognitive complexity 18 (threshold 15). Drivers by points: error handling 4 (10 pts), if/else 6 (8 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (ProxyWrapper.get) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_wrapper.dart"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"78706907f93fd5c251de0b488a1f2b0906015e93a56fec11d7ff726a460b503f"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._fetchBlockTimestampsFromMempoolByHeights (cognitive 17): ElectrumWalletBase._fetchBlockTimestampsFromMempoolByHeights has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 2, ternaries 1 (2 pts), error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3798}}}],"partialFingerprints":{"codehealthFindingId/v1":"1422d0f1c768cf39832f4ca33822ec9bc53bc5ea7d38466121fe5b4d89a8535e"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletAddressesBase.init (cognitive 17): ElectrumWalletAddressesBase.init has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (9 pts), ternaries 2 (4 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"903998623d17510a9de3088e5afb428bb58b9790c8c7f070895d27c08179b678"}},{"ruleId":"D2","level":"warning","message":{"text":"LitecoinWalletBase.LitecoinWalletBase (cognitive 17): LitecoinWalletBase.LitecoinWalletBase has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (14 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b18d461eec88a722b713291486219b9debab8a76a187f9e1000a5d4fa1e6a3a"}},{"ruleId":"D2","level":"warning","message":{"text":"SolanaWalletClient.getNFTOnChainMetadata (cognitive 17): SolanaWalletClient.getNFTOnChainMetadata has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (8 pts), error handling 2 (4 pts), ternaries 2 (4 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1398}}}],"partialFingerprints":{"codehealthFindingId/v1":"be1910dec0f5ceaaa4c7e1214d5b3050c3c2bf1e32aa55a00dbfc8d9bf79196e"}},{"ruleId":"D2","level":"warning","message":{"text":"Transfer.makeMap (cognitive 17): Transfer.makeMap has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 5 (8 pts), if/else 5 (7 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/api/model/transfer.dart"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b8ffed9f9975de60595979547f6d488c9cff449452e1c81140fc04ec5dd72e3"}},{"ruleId":"D2","level":"warning","message":{"text":"Quote.fromOnramperJson (cognitive 17): Quote.fromOnramperJson has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (14 pts), boolean chains 1, loops 1, ternaries 1 (nesting depth added 10). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/buy_quote.dart"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8d37f20ed6edf07ae98dc082415c018d640e9a5bc2700cac65b03dd27491944"}},{"ruleId":"D2","level":"warning","message":{"text":"DFXBuyProvider.launchProvider (cognitive 17): DFXBuyProvider.launchProvider has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (10 pts), ternaries 3 (6 pts), error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/dfx/dfx_buy_provider.dart"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"f60d84dd5de07dc440ccf048da3116ed4253a81465957189dec74e44d56f6a52"}},{"ruleId":"D2","level":"warning","message":{"text":"YatService.fetchYatAddress (cognitive 17): YatService.fetchYatAddress has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 1 (3 pts), error handling 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/yat/yat_service.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e1f269c8b581176ee8c2611605ac4b071011329e7d9c286f5609d5fbea956ba"}},{"ruleId":"D2","level":"warning","message":{"text":"BackupServiceV3.exportBackupFileV3 (cognitive 17): BackupServiceV3.exportBackupFileV3 has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 3 (4 pts), boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service_v3.dart"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"273a9e53136464c0d013566b355f87040e76369096de7e279a7d50a99afb5e24"}},{"ruleId":"D2","level":"warning","message":{"text":"CWEVM.discoverAndAddWalletTokens (cognitive 17): CWEVM.discoverAndAddWalletTokens has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 11, if/else 2 (3 pts), loops 1 (2 pts), error handling 1 (nesting depth added 2). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"b07981bd4d3fc9f87e260be7f89c62c30d468068e17e85ce4eb687250de1ea66"}},{"ruleId":"D2","level":"warning","message":{"text":"SwapTradeExchangeProvider.fetchRate (cognitive 17): SwapTradeExchangeProvider.fetchRate has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 2 (4 pts), boolean chains 2, error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swaptrade_exchange_provider.dart"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bfe4619455286eb68e5ec1defca790d7e30614495446d86ce7a8f57703ebc81"}},{"ruleId":"D2","level":"warning","message":{"text":"AnyPayFlow._handleCrossChain (cognitive 17): AnyPayFlow._handleCrossChain has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 9 (12 pts), if/else 3, boolean chains 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/anypay/anypay_flow.dart"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"10b0f3acc0eee53381afe7f56e2f7db4d31bffb13fdc29b298a526bcaea55ef7"}},{"ruleId":"D2","level":"warning","message":{"text":"HistoryTileBase.build (cognitive 17): HistoryTileBase.build has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (13 pts), ternaries 4 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_tile_base.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"83832a25837dbd86a34dab7cf54739470719c68f2e898ade8b01b85be5723520"}},{"ruleId":"D2","level":"warning","message":{"text":"ZcashTaddressRotation.getRotationAccountForMainAccount (cognitive 17): ZcashTaddressRotation.getRotationAccountForMainAccount has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (4 pts), boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_taddress_rotation.dart"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"428481c06323bcb45d28f8dd2f97c6efff8b255b8d5c7115b24acbf022e99009"}},{"ruleId":"D2","level":"warning","message":{"text":"DEuroSavingsPage._setReactions (cognitive 17): DEuroSavingsPage._setReactions has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12 (14 pts), ternaries 2, match/switch 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/integrations/deuro/savings_page.dart"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"11cc36d3d456e83757f82580ba0ad9baf7148b1cfd1ec0771da0775fe812d07b"}},{"ruleId":"D2","level":"warning","message":{"text":"_WalletRestorePageBodyState._isValidSeed (cognitive 17): _WalletRestorePageBodyState._isValidSeed has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 6 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_page.dart"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"07057359d89739248ed84c63bf98d360cbbaf217b7d4ca04093f028eb21a288a"}},{"ruleId":"D2","level":"warning","message":{"text":"TransactionDetailsPage.getFormattedAddress (cognitive 17): TransactionDetailsPage.getFormattedAddress has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (8 pts), loops 3 (8 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/transaction_details/transaction_details_page.dart"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"be9776115fd3dec3d5abb15d4f99b759d758fc6569eb4f42f654633eed6685c7"}},{"ruleId":"D2","level":"warning","message":{"text":"BottomSheetListenerState._showBottomSheet (cognitive 17): BottomSheetListenerState._showBottomSheet has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (11 pts), error handling 2 (6 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/widgets/bottom_sheet/bottom_sheet_listener_widget.dart"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"84f1edf9886d78f6258f40be3d80207040baf433301b74459cd282ab3914af26"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageUtil.getImageFromPath (cognitive 17): ImageUtil.getImageFromPath has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 6 (10 pts), if/else 4, boolean chains 3 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/image_utill.dart"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ed65068a7966a584776864466205dc380171ad083ce66f0e32a7a8c38fa23f9"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletListViewModelBase.reorderAccordingToWalletList (cognitive 17): WalletListViewModelBase.reorderAccordingToWalletList has cognitive complexity 17 (threshold 15). Drivers by points: loops 5 (9 pts), if/else 3 (8 pts) (nesting depth added 9). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_list/wallet_list_view_model.dart"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"40ece7b42d0158b2c748ddf8bd9717a6899631d769bfcfc185379813ee8276f8"}},{"ruleId":"D2","level":"warning","message":{"text":"BitcoinWalletBase.open (cognitive 16): BitcoinWalletBase.open has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), match/switch 1 (2 pts), ternaries 2, boolean chains 1, error handling 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"4800ae90b61843710b9e7ef8299c204216d88d95687e401df37d6e8a2945fa07"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase.updateAllUnspents (cognitive 16): ElectrumWalletBase.updateAllUnspents has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (11 pts), loops 2 (3 pts), boolean chains 1, ternaries 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2111}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd0d91107d8f6e0496078e18071fdb2585c9fa26d87e50638996cadc92d926c"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletBase._processTransactionInfoBatch (cognitive 16): ElectrumWalletBase._processTransactionInfoBatch has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 2 (6 pts), if/else 1 (4 pts), error handling 1 (3 pts), loops 2 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3580}}}],"partialFingerprints":{"codehealthFindingId/v1":"74f7bb7ae44a10b4e86fb34f9ea6f844f9053858cc5171c3607d47f1e5415d0f"}},{"ruleId":"D2","level":"warning","message":{"text":"ElectrumWalletAddressesBase.setLightningAddress (cognitive 16): ElectrumWalletAddressesBase.setLightningAddress has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (11 pts), error handling 3 (4 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":1185}}}],"partialFingerprints":{"codehealthFindingId/v1":"37dcd4c62ea50bccab85a6125c0539fb2ff51ca9a4d1884a2a83b0d8c17ef608"}},{"ruleId":"D2","level":"warning","message":{"text":"LitecoinWalletBase.checkMwebUtxosSpent (cognitive 16): LitecoinWalletBase.checkMwebUtxosSpent has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 4, loops 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":737}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f05ccd717ce96c08ccd919598a48cfae300d3eafee527d80ec15c372cad62b"}},{"ruleId":"D2","level":"warning","message":{"text":"LitecoinWalletBase.commitPsbtUR (cognitive 16): LitecoinWalletBase.commitPsbtUR has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), boolean chains 3, error handling 2 (3 pts), loops 3 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1325}}}],"partialFingerprints":{"codehealthFindingId/v1":"e47b854fd69845329296dca001538125bd9d5b3b2d31bfb25271caddd52335a7"}},{"ruleId":"D2","level":"warning","message":{"text":"LitecoinWalletAddressesBase.ensureMwebAddressUpToIndexExists (cognitive 16): LitecoinWalletAddressesBase.ensureMwebAddressUpToIndexExists has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 7, if/else 5, loops 2 (3 pts), error handling 1 (nesting depth added 1). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_addresses.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f687e510cf7819c02c10cd20fe723e54fef2bfeb78e64567a5924c32b18285"}},{"ruleId":"D2","level":"warning","message":{"text":"BalanceCardLayout.resolve (cognitive 16): BalanceCardLayout.resolve has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 5, boolean chains 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/balance_card_layout.dart"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"9577771cea4b85c1824476835fb7ea0fadc766d8cd5a7740c83b520644f7d049"}},{"ruleId":"D2","level":"warning","message":{"text":"ERC681URI._expandDecimal (cognitive 16): ERC681URI._expandDecimal has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 6 (10 pts), if/else 4 (5 pts), boolean chains 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/payment_uris.dart"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a36a2d1d817b34e2c915a71fd34a34afefd96f1fb8fb185698a644efdc9f9b5"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainWalletBase._checkForExistingScamTokens (cognitive 16): EVMChainWalletBase._checkForExistingScamTokens has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), error handling 1 (4 pts), boolean chains 3, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"65ab41ace43d50f228398073a6e7818b425667e735cbe20cc90fe992d54e3717"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainWalletBase.createCallDataTransaction (cognitive 16): EVMChainWalletBase.createCallDataTransaction has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), boolean chains 5, error handling 2, match/switch 1, ternaries 1 (nesting depth added 2). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":989}}}],"partialFingerprints":{"codehealthFindingId/v1":"17046446a1d9593cb0982a83c13fe02bc8bc8f8c18ad52f3154de73f52584882"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainWalletBase._fetchErc20Balances (cognitive 16): EVMChainWalletBase._fetchErc20Balances has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), error handling 2 (5 pts), loops 2, boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1308}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceea74e04fca6d2714a4e24d67f4f762fe3f96078a2c7258f9826ff9dbc09eae"}},{"ruleId":"D2","level":"warning","message":{"text":"EVMChainClient.connect (cognitive 16): EVMChainClient.connect has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (9 pts), boolean chains 4, ternaries 1 (2 pts), error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dad95e511c61a31bf207c3df302f0233c719af2b1b13a16f8c0b1a400aa67ab"}},{"ruleId":"D2","level":"warning","message":{"text":"Bip353Record.fetchUriByCryptoCurrency (cognitive 16): Bip353Record.fetchUriByCryptoCurrency has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 1 (2 pts), error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/bip_353/bip_353_record.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a18f81717df92181ad17cb00711da52f38b5ba3654209516d697ef9f606968"}},{"ruleId":"D2","level":"warning","message":{"text":"LNUrlPayAddressProvider.resolve (cognitive 16): LNUrlPayAddressProvider.resolve has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 1 (2 pts), boolean chains 1, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/lnurl_pay/lnurl_pay_address_provider.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"2de924234662c33aeac5249f0655ae8620765f5ced9434be1e1d9e0bcac70a6b"}},{"ruleId":"D2","level":"warning","message":{"text":"NodeSwitchingService.performHealthCheck (cognitive 16): NodeSwitchingService.performHealthCheck has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 2, error handling 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/node_switching_service.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bc87b9bb2b7c69962dc5de7beb9f43f77b6b4785596cc0b0d98f08b436fa989"}},{"ruleId":"D2","level":"warning","message":{"text":"_BarcodeScannerSimpleState._handleBarcodeInternal (cognitive 16): _BarcodeScannerSimpleState._handleBarcodeInternal has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/qr_scanner.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe15f6a5f114c46c392ee403f4af6e6957fe6d905c3cab8b9761ed52ac8098d2"}},{"ruleId":"D2","level":"warning","message":{"text":"Trade.mergeFindTradeByIdResult (cognitive 16): Trade.mergeFindTradeByIdResult has cognitive complexity 16 (threshold 15). Drivers by points: if/else 15, boolean chains 1. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade.dart"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a80e25a11ac02f8e6e78cd5902c4a8f55f8871609584cfdb3e416c2b240cc9"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewAddressesPageState.build (cognitive 16): _NewAddressesPageState.build has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 3, ternaries 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/addresses_page.dart"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39b0ed4f738732a88572e6a776bc52575a909a223e1fc276a8d41095a1b87f6"}},{"ruleId":"D2","level":"warning","message":{"text":"_ScanPageState._handleBarcodeInternal (cognitive 16): _ScanPageState._handleBarcodeInternal has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/scan_page.dart"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"d220dbe91f5e0ee1aa77a77e7db8c96d569cdf10a99094dc20926769beef9c76"}},{"ruleId":"D2","level":"warning","message":{"text":"SwapAmountBoxState._presentCurrencyPicker (cognitive 16): SwapAmountBoxState._presentCurrencyPicker has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 3, loops 1 (2 pts), ternaries 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cc0202e34dc07fd59ed2f12075c08c813fa1ca54728e7433c26055caaed158d"}},{"ruleId":"D2","level":"warning","message":{"text":"PayjoinManager.spawnReceiver (cognitive 16): PayjoinManager.spawnReceiver has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (11 pts), match/switch 1 (3 pts), error handling 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/payjoin/manager.dart"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"977bc2639f2eca43b176c20fdd2e3ff86bc3d9e50c63f43e8649ffd9aea58b5c"}},{"ruleId":"D2","level":"warning","message":{"text":"PinCodeState.body (cognitive 16): PinCodeState.body has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), ternaries 5 (6 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/pin_code/pin_code_widget.dart"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f296cb6c8297e27c0cb1bc6f332553dba90cb2960c11ad174632c3e6c7522d0"}},{"ruleId":"D2","level":"warning","message":{"text":"EvmChainServiceImpl._mergeWCBufferedFees (cognitive 16): EvmChainServiceImpl._mergeWCBufferedFees has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (11 pts), ternaries 3 (5 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":741}}}],"partialFingerprints":{"codehealthFindingId/v1":"611bdc1a6d8e67c0b69dfd52f60cb8d1f447f5a20d0027ae51083b32569a7a52"}},{"ruleId":"D2","level":"warning","message":{"text":"MethodsUtils.requestApproval (cognitive 16): MethodsUtils.requestApproval has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 4 (5 pts), boolean chains 3, loops 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/utils/method_utils.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0b28a55b77c3fed8f82e5b7e47704c99e60e10cf1a3cc975b12b03b0997ee44"}},{"ruleId":"D2","level":"warning","message":{"text":"ProxyWrapper.put (cognitive 16): ProxyWrapper.put has cognitive complexity 16 (threshold 15). Drivers by points: error handling 4 (10 pts), if/else 4 (6 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_wrapper.dart"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea77f0d61dc68439ce856d0df51c9341dfcf11acf0e2811399e98fa467d480ff"}},{"ruleId":"D2","level":"warning","message":{"text":"ExchangeTradeViewModelBase.checkIfCanSend (cognitive 16): ExchangeTradeViewModelBase.checkIfCanSend has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 13, if/else 3. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_trade_view_model.dart"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7dbf724a2a565de20170b4adec01fde3d96a06e6551af4b0d5b5ce6ba89974f"}},{"ruleId":"D2","level":"warning","message":{"text":"ExchangeViewModelBase.updateDepositAvailableAmount (cognitive 16): ExchangeViewModelBase.updateDepositAvailableAmount has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 3, ternaries 1 (2 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bb767a0a4dcc0d3620f38dbf01704c37c5e461c900b841f566e160183171641"}},{"ruleId":"D2","level":"warning","message":{"text":"WalletCreationVMBase._create (cognitive 16): WalletCreationVMBase._create has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), ternaries 2 (4 pts), boolean chains 3, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_creation_vm.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd9e938f512d97dfdc52b2b5eba9037ef7d4cfe2c00b607305da98e91abb4a8f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/electrum_wallet.dart: FileTooLong \u2014 3497 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2997 over it, 6.99\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6be7717cd3515e56e622551dee374dc7752c94297586d3cfa9e0b28b75f0d4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SettingsStoreBase.load: MethodTooLong \u2014 load runs 543 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 443 over it, 5.43\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1208}}}],"partialFingerprints":{"codehealthFindingId/v1":"5209da6cab3fac1b81e4fb4bd921ea2fa468a51e6592abdc4866bac91787ff9e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: HaMaterialLocalizations: TooManyMethods \u2014 157 methods. The bar is 30 methods; this is 127 over it, 5.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"659a8e02a2ceb356480f1e212591d803d1c46e23bfa3b3e75b3f2cea5d96297b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: YoMaterialLocalizations: TooManyMethods \u2014 157 methods. The bar is 30 methods; this is 127 over it, 5.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09775a0c7221f49649305d2f62fc0cf3a39f1ef11e69797342ed3da6ba3db01"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ElectrumWalletBase: TooManyMethods \u2014 145 methods. The bar is 30 methods; this is 115 over it, 4.83\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"a004944f46406c516395ee4fcc2bbf88c3c17ae80f3a25479a12a65db68ee750"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SettingsStoreBase: ClassTooLong \u2014 1877 significant lines (blank, comment-only and punctuation-only lines excluded), 20 methods. The bar is 400 significant lines; this is 1477 over it, 4.69\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"66a1a6f2061c7fab629bf4e6210e72d8209ad7901ddccf25f9d6c240a40b8a0e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DashboardViewModelBase: TooManyMethods \u2014 118 methods. The bar is 30 methods; this is 88 over it, 3.93\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"20af3ccc4e73ad4d2b7cb8b56a94f2ffa99d7edfff3cf30f3e1166b965b5a89f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/settings_store.dart: FileTooLong \u2014 1879 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: SettingsStoreBase (57-2418). The bar is 500 significant lines; this is 1379 over it, 3.76\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2036bf5467f43bb73efbad57668c8df1b5ee50d64047a34e47e1ef368e8d3b74"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: RobinhoodTokens.tokens: MethodTooLong \u2014 tokens runs 355 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 255 over it, 3.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/robinhood_tokens.dart"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"478f8a975e37f26acd691cd9b6d76ad2a5b1cf7a3def76543cf1a8daa4da5467"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CWBitcoin: TooManyMethods \u2014 101 methods. The bar is 30 methods; this is 71 over it, 3.37\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d8fb1df2679e128f9783ab4fd0ea4952b7d75cc4209f414e478a4fe12b5bf8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SettingsStoreBase.reload: MethodTooLong \u2014 reload runs 334 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 234 over it, 3.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1841}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc14bf1cc1927eab60eee810b1a4bc078a15b1d5d0ddc281ae7beca573e2e59a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SolanaWalletClient: ClassTooLong \u2014 1325 significant lines (blank, comment-only and punctuation-only lines excluded), 45 methods. The bar is 400 significant lines; this is 925 over it, 3.31\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"554414a28e91f2325a42b950b0eba3d25fe7259adfbb1a2b3c440aa039e2e5e7"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ExchangeViewModelBase: ClassTooLong \u2014 1272 significant lines (blank, comment-only and punctuation-only lines excluded), 90 methods. The bar is 400 significant lines; this is 872 over it, 3.18\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0328954f5a0d2530a1f3a153c37cc9d6ab46905a55cdeb688ed059b9b4857e9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SwapAmountBoxState.build: MethodTooLong \u2014 build runs 310 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 210 over it, 3.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80fa590735749752c13353e86561d40bc162f2595d2f04916f266ee1bf40294"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ZcashWalletBase: ClassTooLong \u2014 1222 significant lines (blank, comment-only and punctuation-only lines excluded), 89 methods. The bar is 400 significant lines; this is 822 over it, 3.06\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"52e304220a573d29a175dd535411b23a1fe7728a178871f70fb3f494dc8a3177"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SendViewModelBase: TooManyMethods \u2014 91 methods. The bar is 30 methods; this is 61 over it, 3.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3a3f506b7840bd3c8201847362f6f3fceed9ee85e103cb2714bafeef14d826"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ExchangeViewModelBase: TooManyMethods \u2014 90 methods. The bar is 30 methods; this is 60 over it, 3.00\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1fd650ffcbba89ca91a922a2e6e37a33e759ac70e83e25d6c09e653a3b33600"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ZcashWalletBase: TooManyMethods \u2014 89 methods. The bar is 30 methods; this is 59 over it, 2.97\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"77b6a8e1f5e6cbb3d6d0f34bbfa6aa6b44706dbf1955950774079aabdc4158a9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _NewSendPageState.build: MethodTooLong \u2014 build runs 293 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 193 over it, 2.93\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c8bd685a8c1cac7bbf2a6c476c0b0d224240c46c8d08b965f426c4650b7019"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DashboardViewModelBase: ClassTooLong \u2014 1151 significant lines (blank, comment-only and punctuation-only lines excluded), 118 methods. The bar is 400 significant lines; this is 751 over it, 2.88\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd73c6583ada613b71d61102f0eebf32753d5d3d5b1dc526c31034eb885ce6c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SendViewModelBase: ClassTooLong \u2014 1145 significant lines (blank, comment-only and punctuation-only lines excluded), 91 methods. The bar is 400 significant lines; this is 745 over it, 2.86\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"6682ee83dea582a697cf64ed1856f39d47c8c7ac2acebe18aad3deb05ae94276"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LitecoinWalletBase: ClassTooLong \u2014 1112 significant lines (blank, comment-only and punctuation-only lines excluded), 40 methods. The bar is 400 significant lines; this is 712 over it, 2.78\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0f096ed0ae4b61190d0014752b67e56b601d372e6e56acb2a3b00c3ae36f02e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/solana_client.dart: FileTooLong \u2014 1376 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: SolanaWalletClient (45-2149). The bar is 500 significant lines; this is 876 over it, 2.75\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc0a80ca856815ac64f3dca4168816334d38f0f4defce372f2d2f68a1b5b3cc"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CryptoCurrency: ClassTooLong \u2014 1097 significant lines (blank, comment-only and punctuation-only lines excluded), 16 methods. The bar is 400 significant lines; this is 697 over it, 2.74\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"193db409c3ccba0ed0d6c2f76e813c35d2c6c3324dcff5c73fbb1747f8859bb2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _NewSwapPageState.build: MethodTooLong \u2014 build runs 274 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 174 over it, 2.74\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"88dc4553877e0e5e501c47245c8687a59b09560e07f5e10fb363064d8b8f5caf"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: EVMChainWalletBase: ClassTooLong \u2014 1040 significant lines (blank, comment-only and punctuation-only lines excluded), 75 methods. The bar is 400 significant lines; this is 640 over it, 2.60\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"a44eee4ee80761b162eb0ecc84b57cf26ea5fca7580cda8a1c33022f5e86935a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exchange/exchange_view_model.dart: FileTooLong \u2014 1280 significant lines (blank, comment-only and punctuation-only lines excluded), about 99% of them inside a single declaration: ExchangeViewModelBase (79-1965). The bar is 500 significant lines; this is 780 over it, 2.56\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5bec5ad94f3ba94e7c182ac024688330329853f7db5b9276533d7b888244abe"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/zcash_wallet.dart: FileTooLong \u2014 1264 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: ZcashWalletBase (47-1806). The bar is 500 significant lines; this is 764 over it, 2.53\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02e996993c426d81b86f70355e46557b0bbfe31fbc67925e03087d6010645e31"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _ScanPageState.build: MethodTooLong \u2014 build runs 252 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 152 over it, 2.52\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/scan_page.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4c6a9b73bf76854eb4a177068245b595387d8c047c60e1d200d2b534b485a92"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: EVMChainWalletBase: TooManyMethods \u2014 75 methods. The bar is 30 methods; this is 45 over it, 2.50\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d4f30591f799f100bc5d23e5dbd258b3606b2fe688eb9a9bffd6e018109e119"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CWEVM: TooManyMethods \u2014 75 methods. The bar is 30 methods; this is 45 over it, 2.50\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4e1884deb56cbad7babd984d3eed13cafa7ec64085c844c8a0607e49a7d359f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: dashboard/dashboard_view_model.dart: FileTooLong \u2014 1227 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: DashboardViewModelBase (82-1748). The bar is 500 significant lines; this is 727 over it, 2.45\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dbcb3a6476ca5ddfe520d34781d1dcafeaca4dcb7d0b5d21e81626193300855"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WalletListBodyState.build: MethodTooLong \u2014 build runs 238 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 138 over it, 2.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_list/wallet_list_page.dart"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc35013bf9e067ddfe0ed07bcd88f7298cdd17656ac5203af667aced6b7f866"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/litecoin_wallet.dart: FileTooLong \u2014 1174 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: LitecoinWalletBase (66-1621). The bar is 500 significant lines; this is 674 over it, 2.35\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f52a7cabe722fe1e25e4de6dee7214d2ed6daceae363d691959db5084a2ead7a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: send/send_view_model.dart: FileTooLong \u2014 1147 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: SendViewModelBase (82-1821). The bar is 500 significant lines; this is 647 over it, 2.29\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4da0c3d60d8590686c1e0e78cec6b5138ae9f177b259a3312d693b97405005f9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/evm_chain_wallet.dart: FileTooLong \u2014 1144 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: EVMChainWalletBase (77-1640). The bar is 500 significant lines; this is 644 over it, 2.29\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6497536518c909e3acd334cf486723d31c8afc3275a2cb8a34370b08a744c3f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SendViewModelBase.createTransaction: MethodTooLong \u2014 createTransaction runs 227 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 127 over it, 2.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"002c1593ffb11c8f25aeecb5e314a66777fdc304eb3d0eb6385021df089e7837"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Libwallet._handleCommandsToIsolate: MethodTooLong \u2014 _handleCommandsToIsolate runs 226 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 126 over it, 2.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"9598d2071827d34314aef42afd5df568be34ed89885c684b305e82416a0ba182"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _NewSwapPageState.initState: MethodTooLong \u2014 initState runs 221 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 121 over it, 2.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"930e58f3431d162ab68f7c2b83a6ebcf9e7d08f546e2f5c0b594cde27a800cdf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/crypto_currency.dart: FileTooLong \u2014 1103 significant lines (blank, comment-only and punctuation-only lines excluded), about 99% of them inside a single declaration: CryptoCurrency (8-1182). The bar is 500 significant lines; this is 603 over it, 2.21\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"08165190da464e07963e52e0ecbeb0482670b59598be63f68a18a1b9f7d25fb6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SolanaWalletBase: TooManyMethods \u2014 66 methods. The bar is 30 methods; this is 36 over it, 2.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39b292d9a93ba60866233a652dcb4426ce896e5b838dfed21b6bd7ed7c645d6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CakePayBuyCardPage.body: MethodTooLong \u2014 body runs 218 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 118 over it, 2.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"d77799c195d262222cdf2e20eeccb9d15a92d89d54a1e7d893d467d764c84a79"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MoneroWalletBase: TooManyMethods \u2014 63 methods. The bar is 30 methods; this is 33 over it, 2.10\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"f559ea3adbb107ce2702f37d197836de39cc452b62153102c09f58adb35a7794"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ExchangeCardState.build: MethodTooLong \u2014 build runs 208 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 108 over it, 2.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/exchange/widgets/exchange_card.dart"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"80ef2bf72506b01074f99072bc423fa5d5f402a441fa56c8ff88341a853b3f9b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SendTransactionDetails._buildMainContent: MethodTooLong \u2014 _buildMainContent runs 206 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 106 over it, 2.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_confirm_sheet.dart"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"388369ed95cadd5a52403500b6b1f0aa6056c2c1eab40961533f7bae90da7132"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ElectrumWalletAddressesBase: ClassTooLong \u2014 823 significant lines (blank, comment-only and punctuation-only lines excluded), 53 methods. The bar is 400 significant lines; this is 423 over it, 2.06\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f571e6aa282f100f82c2fc67ff830bd2f9e4f792832396639307893b49d4b5b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SolanaWalletClient._parseSwapTransaction: MethodTooLong \u2014 _parseSwapTransaction runs 205 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 105 over it, 2.05\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"c64565c9035965ca365811053b5160fdb53a7e7b5847b1259af633c0c2a3aaa1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pages/send_page.dart: FileTooLong \u2014 1015 significant lines (blank, comment-only and punctuation-only lines excluded), about 77% of them inside a single declaration: _NewSendPageState (209-1349). The bar is 500 significant lines; this is 515 over it, 2.03\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82fa2f0db987b92982c47d8c596820a030d7bb1e3d8f712e78431596eb6e12fa"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BalanceCard.build: MethodTooLong \u2014 build runs 199 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 99 over it, 1.99\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/balance_card.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6426887ac77d2fb96a268db868bff1f935d5bd0a1d1ccd1455d2edb7a5430c9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ExchangeViewModelBase._createTrade: MethodTooLong \u2014 _createTrade runs 195 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 95 over it, 1.95\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1071}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1c372994e1c3fd0a52b9313b08ef2b8e43227759edc0cb3d0213b3c6b67106b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: _NewSendPageState: ClassTooLong \u2014 777 significant lines (blank, comment-only and punctuation-only lines excluded), 26 methods. The bar is 400 significant lines; this is 377 over it, 1.94\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"170d67a7c08767eed501d55379c2dd91970507d361228e1bfce82de014207b4d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: HaCupertinoLocalizations: TooManyMethods \u2014 58 methods. The bar is 30 methods; this is 28 over it, 1.93\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"74f9c5c6b881151c9133a0db51315af97bccfbafeae82b0d40fa6784548310ee"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: YoCupertinoLocalizations: TooManyMethods \u2014 58 methods. The bar is 30 methods; this is 28 over it, 1.93\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fdd189bfa2492fc1a64f4703633ece9f16bdf7cca84c3375e707854e77b2d5b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: WalletAddressListViewModelBase: TooManyMethods \u2014 58 methods. The bar is 30 methods; this is 28 over it, 1.93\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fa2b4ce838a813a4f2e465467a7972b50ad2b4b8c839e37039fff2719ffca26"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CWMonero: TooManyMethods \u2014 57 methods. The bar is 30 methods; this is 27 over it, 1.90\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"624d59a0d3411285ede77ad5097b8f56cbc82dc4521cbee69765f4878d9cec33"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ConnectionSyncViewModelBase: TooManyMethods \u2014 56 methods. The bar is 30 methods; this is 26 over it, 1.87\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/connection_sync_view_model.dart"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b3c4373543ecca2a0adfab61e90b32235a06d699ad2881826fa039060e71dd4"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: WalletBase: TooManyMethods \u2014 55 methods. The bar is 30 methods; this is 25 over it, 1.83\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_base.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc011e9821b1ee9a7fdc02db2ea9976caf93f53a98411071b40282793b3e4950"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _AdvancedPrivacySettingsBodyState.build: MethodTooLong \u2014 build runs 182 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 82 over it, 1.82\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/advanced_privacy_settings_page.dart"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eddc79dd125468f66a0ed80a3570d0dd83a2e85fa9d53e71573b5ff72938020"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WalletRestoreViewModelBase.getCredentials: MethodTooLong \u2014 getCredentials runs 182 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 82 over it, 1.82\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_restore_view_model.dart"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"784395e831b5d2b2d96a0d84252debb025b8e992804075d3a1dceb47e65cf74a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: OtherSettingsPage.body: MethodTooLong \u2014 body runs 179 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 79 over it, 1.79\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/other_settings_page.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f18a699f1ce883934468e8c392f997be59e1f60953b8f6c5882542084f1e83b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ElectrumWalletAddressesBase: TooManyMethods \u2014 53 methods. The bar is 30 methods; this is 23 over it, 1.77\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"86ae0aa754de3e34e7cd64c89ba04cd011d292e5668533538f96c9bf0256bc6a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/electrum_wallet_addresses.dart: FileTooLong \u2014 866 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: ElectrumWalletAddressesBase (61-1227). The bar is 500 significant lines; this is 366 over it, 1.73\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c895a70e1143e118a0c612567690c53b39eb34fca7b456db1b31e4d972717b7c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DefaultSPLTokens: ClassTooLong \u2014 692 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 292 over it, 1.73\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/default_spl_tokens.dart"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4163c91f3b2434a4d0495007712870f48b66f987ed3c60ab8668ca9206fdc8a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CakePayBuyCardPage._setEffects: MethodTooLong \u2014 _setEffects runs 173 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 73 over it, 1.73\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac4049e9728cdeae0495f8831f8e13df3f8e730aca1fd07cdcdf4e2d49e74e6"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CWBitcoin: ClassTooLong \u2014 685 significant lines (blank, comment-only and punctuation-only lines excluded), 101 methods. The bar is 400 significant lines; this is 285 over it, 1.71\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"41397774a75c72b8455d7e90e9c2d1a07f112c3199a6a455291be1e6ef66d055"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: WowneroWalletBase: TooManyMethods \u2014 50 methods. The bar is 30 methods; this is 20 over it, 1.67\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"8396fa8894a5d41a85fe2c914aa9c00af053704e6fbefeb4a0190f871d87ef3a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ConnectionSyncPage.body: MethodTooLong \u2014 body runs 165 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/connection_sync_page.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"4de178d594445856a1c18f97209258aa8deea9e9d81f4806702c52a89849e589"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MoneroWalletBase: ClassTooLong \u2014 655 significant lines (blank, comment-only and punctuation-only lines excluded), 63 methods. The bar is 400 significant lines; this is 255 over it, 1.64\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"6674ef5050678d971c48312cd901bf0d3d2728e6928930eeba81f2fefd1e37d6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ElectrumClient: TooManyMethods \u2014 48 methods. The bar is 30 methods; this is 18 over it, 1.60\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cd7bb63c191c0e711795ee0a033f0fd4d2466e302a5b382fce774650a359616"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TronWalletBase: TooManyMethods \u2014 48 methods. The bar is 30 methods; this is 18 over it, 1.60\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ce2a3203738f470d8340a6eb74f51389b8f291fc54cd6e9880192547296af92"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _ReceiveAddressTypeSelectorState.build: MethodTooLong \u2014 build runs 159 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 59 over it, 1.59\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_address_type_selector.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"59b7ca2d70d021c50436be98798701efcc169d9fce5240e1c9707781ce9b6a14"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: HistorySection.build: MethodTooLong \u2014 build runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_section.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e7dcc23e44b85558a604f1be4cd815727f5291c8a9d37e65090f35c2de35951"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _MultiNetworkPickerBodyState.build: MethodTooLong \u2014 build runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc32ca893f6c43a45fac1d8f7ed4857fec9e5f8c1d6e745d5abcb8236d58f77a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _ReceiveAmountModalState.build: MethodTooLong \u2014 build runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_amount_modal.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"8211471e60628fd80b94d502f7067f17fc7262ea611752c70f19df76e6705ed7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _SwapSendExternalModalState.build: MethodTooLong \u2014 build runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_send_external_modal.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc6583513faab39d5021c6d72ea9142b18411403d8dcdf5d4425a1d1687ae0a8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AssetDetailsModal.build: MethodTooLong \u2014 build runs 155 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 55 over it, 1.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e50d5e366514ed069cfd62cd56a61af7643c500bb55a84d3fbf7784510fd0c8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: EvmChainRegistry.initialize: MethodTooLong \u2014 initialize runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_registry.dart"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb9ba405fbdc0a0eac4e3224c53da9c711e29fe5ddbee011e635cc16f7de3edc"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: LetsExchangeExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae7b1f318214aa05013bdedd5ed2a04030f26fad3d5a6c2db3bad950b0a58c69"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _WalletNameFormState.build: MethodTooLong \u2014 build runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/new_wallet_page.dart"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dd20341951d67934cde575e1c43af6221951f751d8232db11919923d7926f3c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SolanaWalletClient: TooManyMethods \u2014 45 methods. The bar is 30 methods; this is 15 over it, 1.50\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ab9307addaa06099c9088bc31e1cdab5ff747801903777fcd6503fa317e17bd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: _NewSwapPageState: ClassTooLong \u2014 597 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. The bar is 400 significant lines; this is 197 over it, 1.49\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"6011419e37a0e8c5ed2fe5d66b19314b066b185c0c25beeb0f94d3710acd3661"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TrocadorExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.49\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/trocador_exchange_provider.dart"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"779ae15c586eb36bc4286b8440f476d628039462cd1f649d066688c01a34d17c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _BridgeAmountPageState.build: MethodTooLong \u2014 build runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.49\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/bridge/bridge_amount_page.dart"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cb8ff1e54cbed09c600648f8506a1d77371b7354f30cd4c8a6e06da75a2e2b6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _NewReceivePageState.build: MethodTooLong \u2014 build runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.49\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/receive_page.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"afdabab7ccd0fdf156c8c54123adfec40d477398bb41a61cf678d362eea58a47"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pages/swap_page.dart: FileTooLong \u2014 735 significant lines (blank, comment-only and punctuation-only lines excluded), about 81% of them inside a single declaration: _NewSwapPageState (83-942). The bar is 500 significant lines; this is 235 over it, 1.47\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ff55689d601506d3159c69f954784672b5519961d82cb753d936f27bbaf3435"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DisplaySettingsPage.build: MethodTooLong \u2014 build runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/display_settings_page.dart"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fd43b5b880fb03d877a11af3fd458f489123bab66857b6984db1441f0c23b53"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BridgeViewModelBase: TooManyMethods \u2014 44 methods. The bar is 30 methods; this is 14 over it, 1.47\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"84bd65cfb8427ee76724b2aedebf6f6b32669b1b5870aca3f8e833e75ec48da5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: locales/hausa_intl.dart: FileTooLong \u2014 725 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 225 over it, 1.45\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59ed3b9498f7ff2b8393c29565980e9e866d03ee4ebcf617cb161d8df5c79ed1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: locales/yoruba_intl.dart: FileTooLong \u2014 725 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 225 over it, 1.45\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee6bcd3bc310fe5cde87466b0276028adf1f5ec39f2d04263f97e05f3b3f6afa"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: EvmChainServiceImpl: ClassTooLong \u2014 579 significant lines (blank, comment-only and punctuation-only lines excluded), 29 methods. The bar is 400 significant lines; this is 179 over it, 1.45\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"b42f4965dd7691a952a02e3431ff7e6634f8a74da424254be17b7674f352bcb4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: StealthExExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/stealth_ex_exchange_provider.dart"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"e87db7623002bb19328aabab7f6db1917fd6d26eea556150c6f00f8ed6889b4e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ZanoWalletBase: TooManyMethods \u2014 43 methods. The bar is 30 methods; this is 13 over it, 1.43\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8a551f05d0fc49b671e8914ffc77adf526ba91b6b66f8fa4d1fcda2d11b6259"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ZanoWalletBase: ClassTooLong \u2014 565 significant lines (blank, comment-only and punctuation-only lines excluded), 43 methods. The bar is 400 significant lines; this is 165 over it, 1.41\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff3d0fd2b0d8ea225d08c4e16872934c8f359704b7e778f4e34cdf252ff7b01f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/monero_wallet.dart: FileTooLong \u2014 705 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: MoneroWalletBase (57-1038). The bar is 500 significant lines; this is 205 over it, 1.41\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a2fda1305c604cee4de828fec9467bf69b41e1552526364ee8bdaa9dcdaf72f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/solana_wallet.dart: FileTooLong \u2014 701 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 201 over it, 1.40\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad44fc746e82c67f5d43ec4bcdf9d532dbde4346da053fce2f8af8f9004e1cf1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/default_spl_tokens.dart: FileTooLong \u2014 695 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: DefaultSPLTokens (5-779). The bar is 500 significant lines; this is 195 over it, 1.39\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/default_spl_tokens.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75445ef27f8714309986cda4baa342efb2389d636784876fdf2e939e9d633b43"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SolanaWalletClient._signSPLTokenTransaction: MethodTooLong \u2014 _signSPLTokenTransaction runs 139 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 39 over it, 1.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1781}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a44acca1dd03c3286322c64a836e560c01fa80befb098843c1b51f5c2c7b374"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Libwallet: ClassTooLong \u2014 555 significant lines (blank, comment-only and punctuation-only lines excluded), 30 methods. The bar is 400 significant lines; this is 155 over it, 1.39\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c21cee2342d2c8bd261678cb242e125e36441e91127245c38091cafbe1b9651"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Setup2FAQRPage.body: MethodTooLong \u2014 body runs 138 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 38 over it, 1.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/setup_2fa/setup_2fa_qr_page.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"95c187f57c806ead797f11b394259a4f5c2cf8e7b413900418ce2e0dc53ca997"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bitcoin/cw_bitcoin.dart: FileTooLong \u2014 686 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: CWBitcoin (3-958). The bar is 500 significant lines; this is 186 over it, 1.37\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c739d58ade37ba0626ef41e000bb0738ba383cd36a5ec670c40300568ca9af"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AddressValidator.getPattern: MethodTooLong \u2014 getPattern runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_validator.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e890c5e44cc00b36abdc9f2dec3196298ec805ea7333a3edf6ae1b1eb1c4a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: XOSwapExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4201c7cec72f7847fd46cbdb523ca184fd2a448c4f09275d34fd83407b228d1"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Setup2FAViewModelBase: TooManyMethods \u2014 41 methods. The bar is 30 methods; this is 11 over it, 1.37\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/set_up_2fa_viewmodel.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"33d6ea2569d869b54bbbd978e67336371fce07231054c8ad6c23a0e1ebbe815b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DisplaySettingsViewModelBase: TooManyMethods \u2014 41 methods. The bar is 30 methods; this is 11 over it, 1.37\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/display_settings_view_model.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d46d2e46cdd77e001c3ccbad22acaee324d492476d905aa33680cacdb9f9f6a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CWEVM: ClassTooLong \u2014 544 significant lines (blank, comment-only and punctuation-only lines excluded), 75 methods. The bar is 400 significant lines; this is 144 over it, 1.36\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebbc6ca4d8a9e6a6d3d72133d329644662ecd475fa0124fffcd13005837578d6"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CakePayBuyCardPage: ClassTooLong \u2014 542 significant lines (blank, comment-only and punctuation-only lines excluded), 17 methods. The bar is 400 significant lines; this is 142 over it, 1.36\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"03da99268404e5cb7c3d791cf84ec192b8ab6577e95baea02ef3886cf582e195"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ElectrumClient: ClassTooLong \u2014 534 significant lines (blank, comment-only and punctuation-only lines excluded), 48 methods. The bar is 400 significant lines; this is 134 over it, 1.34\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eac2194db91a96d99f040aa7ca3435110302c48d6438ebfe97931a3ce78f908"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: LitecoinWalletBase: TooManyMethods \u2014 40 methods. The bar is 30 methods; this is 10 over it, 1.33\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3bcd5feecb3c828c8ccde2b7a5d6e9a6e9834d9e9f3e6d69299c484d8b36048"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Node: TooManyMethods \u2014 40 methods. The bar is 30 methods; this is 10 over it, 1.33\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dcac25759c8edc62542ec195a771b1edcfca5f6e6a42959d85d55b17af70fe7"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SwapsXyzExchangeProvider: ClassTooLong \u2014 532 significant lines (blank, comment-only and punctuation-only lines excluded), 27 methods. The bar is 400 significant lines; this is 132 over it, 1.33\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"35d8cac67517457835c5193117ad13b7fefcfe049454345580b4eb6d65727ac3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CurrencyAmountTextField.build: MethodTooLong \u2014 build runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 33 over it, 1.33\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/receive/widgets/currency_input_field.dart"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"5719bcce58c358ad91000f948cdfdad6192d9c8c7516f224400dcd9f42ef0adf"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AddressValidator.getLength: MethodTooLong \u2014 getLength runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_validator.dart"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"b76bfeb7e79270b5b91304d93a9fd1a0815f6898a97ab94eed37d33be16f2b07"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ProviderOptionsPage.build: MethodTooLong \u2014 build runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/provider_options_page.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b394fd4fe970564e8c7565c926a2773ed1801d0edde7091bbbaaad1b5ec48b18"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SwapConfirmationContentState.build: MethodTooLong \u2014 build runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/swap_confirmation_bottom_sheet.dart"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"19bb08035c9cb70ad4fc736c3886ba014fb5440c0435c45703958d57c0b38d13"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BitcoinWalletBase: ClassTooLong \u2014 527 significant lines (blank, comment-only and punctuation-only lines excluded), 21 methods. The bar is 400 significant lines; this is 127 over it, 1.32\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"89ca2b42c65e531c40d08c6a99a3ee4f39b05bbcb75d912b35d33f542e2d4da3"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WowneroWalletBase: ClassTooLong \u2014 526 significant lines (blank, comment-only and punctuation-only lines excluded), 50 methods. The bar is 400 significant lines; this is 126 over it, 1.32\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"0be48a095d22629950fb604210dbad49b55c3664e26f1aa5d508732ea4850824"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: JupiterExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/jupiter_exchange_provider.dart"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dfbfce62ed5a91dcada40d0cb8ffda7f65166bb1dce5cb24b79a879348ec14b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _L2ActionWalletSelectorState.build: MethodTooLong \u2014 build runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/l2_action_wallet_selector.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1fc4593b40b551ab9ee59c5baafdb323431396ba74d0ff9dd0d1cf2042e9283"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _LogEntryCard.build: MethodTooLong \u2014 build runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/exchange_provider_logs_page.dart"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"283a27f5d2ab0e09ff78472e782a5369f0b2e84e60e014e6f835bf14aa213574"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _NewCoinControlPageState.build: MethodTooLong \u2014 build runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 30 over it, 1.30\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/coin_control_page.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"620f8327ca7e4320495deac4e7f7f027a3f072545288aeaa04b3b2d982e473cb"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: EVMChainClient: ClassTooLong \u2014 514 significant lines (blank, comment-only and punctuation-only lines excluded), 27 methods. The bar is 400 significant lines; this is 114 over it, 1.29\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0603b15f6440e7e7de01ff9e221920c0d3ccf7e285962144ba5b21d16f86d96"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WalletAddressListViewModelBase: ClassTooLong \u2014 513 significant lines (blank, comment-only and punctuation-only lines excluded), 58 methods. The bar is 400 significant lines; this is 113 over it, 1.28\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"de61933c0251b64196ec788f11a8a06911e83a3c69cf7cfd14aeae09d7e2f355"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ConfirmSendingBottomSheet.contentWidget: MethodTooLong \u2014 contentWidget runs 127 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/confirm_sending_bottom_sheet_widget.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"161ccfa089fe0a6dadd17a6cc0221f14e592bf418bd65cb48769fb1ab6ab24c6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: WalletInfo: TooManyMethods \u2014 38 methods. The bar is 30 methods; this is 8 over it, 1.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_info.dart"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86b3d5ed061bd29eb772c8967c0b95a7ed80d8a33ad2585453f098a8e2efb57"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DecredWalletBase: TooManyMethods \u2014 38 methods. The bar is 30 methods; this is 8 over it, 1.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c5042c4913737bfce43129fc06f50ccb28a37fdc45e6cd09555495b4acd8247"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SettingsThemeChoicesCell.build: MethodTooLong \u2014 build runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/widgets/settings_theme_choice.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b3da83cc0cba7948d75700b5615395608c8246d9bdc12155aaa790ab4444708"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _AddPassphraseBottomSheetState.build: MethodTooLong \u2014 build runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/add_passphrase_bottom_sheet_widget.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"6290b68d261ebc19ef5cc1c226b9eadf116cfbdfa982e42bc244750814cf8e3f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DecredWalletBase: ClassTooLong \u2014 497 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. The bar is 400 significant lines; this is 97 over it, 1.24\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"819457f3c51ff10807ae8d949cbd5b6cc21eec3b4bf16c741912cbc106c96ba9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _L2SendExternalModalState.build: MethodTooLong \u2014 build runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/l2_send_external_modal.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"60b12519a77511e186badd5ab6d9e97d215d88a466239a9a2f9e1f27eaf66fe9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ListItemRegularRowWidget.build: MethodTooLong \u2014 build runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/new_list_row/list_item_regular_row_widget.dart"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bfc026d8d25b1161ae321aaa0f223e9089d723a7d0c13be28b9b58ea09ab8e7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CWWownero: TooManyMethods \u2014 37 methods. The bar is 30 methods; this is 7 over it, 1.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/wownero/cw_wownero.dart"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"458900be0ba41383c810d2f7490501021822fa678bb468d5a17cc90481a8d3ad"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/wallet_info.dart: FileTooLong \u2014 615 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 115 over it, 1.23\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_info.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0630618a2b9e0388b3f876cfc18bdd0200402907ee4897c146904d67dbee461b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: cards/cake_pay_buy_card_page.dart: FileTooLong \u2014 615 significant lines (blank, comment-only and punctuation-only lines excluded), about 88% of them inside a single declaration: CakePayBuyCardPage (42-790). The bar is 500 significant lines; this is 115 over it, 1.23\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83218997c267b6e003ec1afec4a2c1903315fbd804657f8a31cf2441549b892c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CreatePinWelcomePage.body: MethodTooLong \u2014 body runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/welcome/create_pin_welcome_page.dart"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"2021f932215e4aad27c246ce89a01b70e5fb06620d59dfa6e8df4fc8fdb0a1dd"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WalletRestoreFromSeedFormState.build: MethodTooLong \u2014 build runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 22 over it, 1.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_from_seed_form.dart"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b933bfc678a2bbb389c65c7debb1a5167651e9952d9d00a871f1180fcea5f57"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/zano_wallet.dart: FileTooLong \u2014 608 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: ZanoWalletBase (49-832). The bar is 500 significant lines; this is 108 over it, 1.22\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e09ca0115719e96c5bca31ef5f852fbef4f1884a1c2abd73949109832ad391"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SwapAmountBoxState: ClassTooLong \u2014 484 significant lines (blank, comment-only and punctuation-only lines excluded), 16 methods. The bar is 400 significant lines; this is 84 over it, 1.21\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"b680f88d948a744d633dc4679b9b3b434d802425db9a22fdf76026e762116a2f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _BridgeConfirmSheetState.build: MethodTooLong \u2014 build runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/bridge/bridge_confirm_sheet.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3c17ebb4d4e360c5665e75b52fc2c1b76b76187cedbcba38b92bfe7124701fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: eth/evm_chain_service.dart: FileTooLong \u2014 604 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: EvmChainServiceImpl (29-917). The bar is 500 significant lines; this is 104 over it, 1.21\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"69b9cadce5186c3e1b0d9bb5c8d79051eb1f7ac417f32d70f2a4205b5b1971eb"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PrivacySettingsViewModelBase: TooManyMethods \u2014 36 methods. The bar is 30 methods; this is 6 over it, 1.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/privacy_settings_view_model.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"235c5959e76eeb8b53069607f979720bbecd4a97eb4856830cdc32f35de2477a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: HomeSettingsPage.body: MethodTooLong \u2014 body runs 120 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 20 over it, 1.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/home_settings_page.dart"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a5a364cb8578653ed82e5e89012439ee048cc5203f463c32ae082ba84376dd1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WalletAddressListViewModelBase._computeAddressList: MethodTooLong \u2014 _computeAddressList runs 120 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 20 over it, 1.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d7106a2e46ff6fde85a5c7133ed1e43940c7d5936dcc71b83518c4b72146f5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _SwapAddressSelectionModalState.build: MethodTooLong \u2014 build runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 19 over it, 1.19\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_address_selection_modal.dart"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"a12610a0b11f9066788918cdcbea510701f1ef64f8c09060ef39eab37bb0659c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SettingsStoreBase.SettingsStoreBase: MethodTooLong \u2014 SettingsStoreBase runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 19 over it, 1.19\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"884b2cfef0ddc3674e4e532a7c1fa2f320539b1cd8768e7bcbb6e6d3df7a74f5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _CardsViewState._buildCard: MethodTooLong \u2014 _buildCard runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/cards_view.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"176684b59e35c655ed7ecccde7b48a1c60b501e457bd560722df3fbc817cea54"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NanoWalletBase: TooManyMethods \u2014 35 methods. The bar is 30 methods; this is 5 over it, 1.17\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_wallet.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"686c403e71ec0aac0aa5c31225c1f19ee42dd8dff44baa35bf01abafc1196cfd"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BalanceViewModelBase: TooManyMethods \u2014 35 methods. The bar is 30 methods; this is 5 over it, 1.17\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/balance_view_model.dart"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"a318bb8c0ae6f4e4fe2efdb06f96f5b6b5e7174a228cf80a08b7bb52b1116e68"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: provider/swapsxyz_exchange_provider.dart: FileTooLong \u2014 582 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: SwapsXyzExchangeProvider (18-790). The bar is 500 significant lines; this is 82 over it, 1.16\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46535f361b2b5c0dfecf75967cf5fe648cb20b9136181be2ff6661a473a16515"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/bitcoin_wallet.dart: FileTooLong \u2014 580 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: BitcoinWalletBase (58-751). The bar is 500 significant lines; this is 80 over it, 1.16\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd4859443223b6f1dda974b4ee8601446b7c8a7606ea7d3ebbda1969b067dd5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TronWalletBase: ClassTooLong \u2014 458 significant lines (blank, comment-only and punctuation-only lines excluded), 48 methods. The bar is 400 significant lines; this is 58 over it, 1.15\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"347d66e2493eff15baa55a56452afa5f480fc05b95aaa2828e30e5bb9e5417fc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/wownero_wallet.dart: FileTooLong \u2014 572 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: WowneroWalletBase (53-824). The bar is 500 significant lines; this is 72 over it, 1.14\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e7fd829d8e84570441dff2fd1d8f3649e49d2e88ed4fd863cc8a6d5d1e315d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/electrum.dart: FileTooLong \u2014 571 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: ElectrumClient (36-861). The bar is 500 significant lines; this is 71 over it, 1.14\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83bf7b9473d971edad3e6199bf317eec3bba86e48fc2e95f7d1715ecbd8ef74c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SwapTransactionDetails.build: MethodTooLong \u2014 build runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_confirm_sheet.dart"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"a39e4918bf46a8efb9dd5fea66945f84e92cc11b7d09707c6abb51108d352219"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AddressTextField.build: MethodTooLong \u2014 build runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/address_text_field.dart"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"3058530cbd4560fcfaf7122f6ab95b033d6a439bdc9b729453dfdc850a42f562"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SendViewModelBase.commitTransaction: MethodTooLong \u2014 commitTransaction runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f8e796e8f51c2ec2e17441abf51f6ae3b09a285dbc3877bbf52fa2745ac8465"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/libdcrwallet.dart: FileTooLong \u2014 567 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: Libwallet (16-706). The bar is 500 significant lines; this is 67 over it, 1.13\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"058664e2053879b453180fdda06fce457eed5ea26668e2ee4794a259afbaf809"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WalletKitServiceBase: ClassTooLong \u2014 452 significant lines (blank, comment-only and punctuation-only lines excluded), 28 methods. The bar is 400 significant lines; this is 52 over it, 1.13\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b49387113f1df770a934be12bb093e642eb83dbb70200b6de67410d54cd2c1ab"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ExolixExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"22912e7dee93aff791691425f9f1fa65e94b19c5536c4588f474c623df2611f0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SecurityBackupPage.body: MethodTooLong \u2014 body runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/security_backup_page.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"b026b1d9ba95f21fa60ddc285a7dea21bb1bf591d2e777b3d8fbc6d37af60521"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SendViewModelBase.translateErrorMessage: MethodTooLong \u2014 translateErrorMessage runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1540}}}],"partialFingerprints":{"codehealthFindingId/v1":"b924ca9e2aeac0154ba3e82a654837ff765837c86564a3eb47e7b004dafcf7b2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WalletKeysViewModelBase._populateKeysItems: MethodTooLong \u2014 _populateKeysItems runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_keys_view_model.dart"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"357da6892f466c72d5c55c0c1fecb49977c286c2be20d3bda7dc4558c59dceea"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BridgeViewModelBase: ClassTooLong \u2014 450 significant lines (blank, comment-only and punctuation-only lines excluded), 44 methods. The bar is 400 significant lines; this is 50 over it, 1.13\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef3f66c891109bd12eba987bcdd18e6ad708ce41f98bfed7630b3a437a5d61c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: clients/evm_chain_client.dart: FileTooLong \u2014 558 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: EVMChainClient (24-794). The bar is 500 significant lines; this is 58 over it, 1.12\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99b839e92147ff01fbf6ff8d81aab71ef9d477b7ade301bc3d75496957664839"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: swap_page/swap_amount_box.dart: FileTooLong \u2014 557 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: SwapAmountBoxState (80-747). The bar is 500 significant lines; this is 57 over it, 1.11\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47469c6afaf1ff61bbade54ab47af2eba7a6c8e53784c923791378051a723e50"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PinCodeState.body: MethodTooLong \u2014 body runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/pin_code/pin_code_widget.dart"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"185c9830a1e5d88c6afb80bf70162bde5ab8688bd77132f34cae7e0b2745d67b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: wallet_address_list/wallet_address_list_view_model.dart: FileTooLong \u2014 553 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: WalletAddressListViewModelBase (45-789). The bar is 500 significant lines; this is 53 over it, 1.11\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f74240287acca5ceabd90ad07800f960d59498adfe9c1565031066407b0992a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CWSolana: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/solana/cw_solana.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6fb611ab7b4416ffec5441439d29c0f3dd11f91c3fb6250792d86fcd77e866d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _NEWNewMainNavBarState.build: MethodTooLong \u2014 build runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"923c61b22d32de42effeea8ec6aa05a283484636f1b6e35aab090944101d618c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: evm/cw_evm.dart: FileTooLong \u2014 545 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: CWEVM (3-764). The bar is 500 significant lines; this is 45 over it, 1.09\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b24315770442534eaf8b52fbd840a9aa9dc9dcbc6c5a5bb33358bb4dc3086a2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BackupServiceV3.exportBackupFileV3: MethodTooLong \u2014 exportBackupFileV3 runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service_v3.dart"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d8bd40e05815a0606cd7f319f5b685314823984ba356c85cb48398c7981f6d1"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TrocadorExchangeProvider: ClassTooLong \u2014 433 significant lines (blank, comment-only and punctuation-only lines excluded), 19 methods. The bar is 400 significant lines; this is 33 over it, 1.08\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/trocador_exchange_provider.dart"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"19ea84651a1d5271a6aec0757921557543c4e46452cc634471473620598064ef"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SideShiftExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ff568bf77c7a3c7bae9fed865616c49587bcdd27eeb9c4bf8fedc0e0e6e2a52"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _OptionTilePlaceholderState.build: MethodTooLong \u2014 build runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/provider_optoin_tile.dart"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a3bb2c67c4f4dc11a23178c4af2377aba1893d97d244839434eb1a6bd6078d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CardDesign: ClassTooLong \u2014 428 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. The bar is 400 significant lines; this is 28 over it, 1.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/card_design.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a8066a16d9bac66b87739902f3fd6e384201e7c3bec32d9ba46e0faf7b1632"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DisclaimerBodyState.build: MethodTooLong \u2014 build runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/disclaimer/disclaimer_page.dart"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"12974bf190811aff77388610b396f5864017a433d19c1de377e0b6a5213fcd43"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Money: TooManyMethods \u2014 32 methods. The bar is 30 methods; this is 2 over it, 1.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/amount/money.dart"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c67a3d35a73678ba18d80d3168a62f3e935a24d1da2cb3916c0a11d8f5121f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BuySellViewModelBase: TooManyMethods \u2014 32 methods. The bar is 30 methods; this is 2 over it, 1.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/buy/buy_sell_view_model.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"4427a4b290f4e135723aef968d173acf52086626bc847aceeae8e4b6063d826d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/wallet.dart: FileTooLong \u2014 532 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: DecredWalletBase (40-793). The bar is 500 significant lines; this is 32 over it, 1.06\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c43bbd7cd167eb4f00d8a0d33f87c8da1d6426e1028f5cadc9ac9eb5117ef25f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: XOSwapExchangeProvider: ClassTooLong \u2014 424 significant lines (blank, comment-only and punctuation-only lines excluded), 17 methods. The bar is 400 significant lines; this is 24 over it, 1.06\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0b89db6256c319d48deb40fb715e2ec7a5bd81c059c4c0cee04742615ebbc8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: send_page/send_confirm_sheet.dart: FileTooLong \u2014 528 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 28 over it, 1.06\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_confirm_sheet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2986d41caa3f60ee1eb5f62cde60b282fd815de6f3115b0cdb286022ba4bfd3a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SimpleSwapExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/simpleswap_exchange_provider.dart"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"089ee3312de5b0c5e295fb0f133b251147caaba2d84f94edbbad6e9f3a0cdb2d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AddressRow.build: MethodTooLong \u2014 build runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/addresses_page.dart"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"48debe0efa63d5d28a1ea4c8ca5ac81bd0b0601e4ef70da0e27cb2453ef033ea"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _2FAControlsWidget.build: MethodTooLong \u2014 build runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/setup_2fa/modify_2fa_page.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf89aafec795a2c17716408afe1efb80f46ac5364ad21bec55c66f02704dfbae"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BasePage: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/base_page.dart"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb73e65e9e8d5b77346a8fe616e0476e1ee594a8693ba2b6795af32a62697863"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BuySellViewModelBase: ClassTooLong \u2014 411 significant lines (blank, comment-only and punctuation-only lines excluded), 32 methods. The bar is 400 significant lines; this is 11 over it, 1.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/buy/buy_sell_view_model.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bfbf016dedf88f6ce63dfc0829a42122a318c5917e3f54ca9724fa16f8a9e24"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NearIntentsExchangeProvider: ClassTooLong \u2014 408 significant lines (blank, comment-only and punctuation-only lines excluded), 21 methods. The bar is 400 significant lines; this is 8 over it, 1.02\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/near_Intents_exchange_provider.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f631cfa3d4dfd6e1c4ac6c4704ea8873c68154056ba70cc3966b28779c937a1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SwapTradeExchangeProvider.createTrade: MethodTooLong \u2014 createTrade runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swaptrade_exchange_provider.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d7e623e5af4227647c4110885c92a1d470422614e2393356d37930f92141fa"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ZcashWalletBase._oneshotSync: MethodTooLong \u2014 _oneshotSync runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"43355a7558c3bcb71f1dc53821901d690d4c10252bf7fa21bb8a8ab898be874a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BackgroundSync._syncWallets: MethodTooLong \u2014 _syncWallets runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/background_sync.dart"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"669cdf2cc403fb374649d2ddc88309f960aee88a12389c42f90c54c38f7182b9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AssetTile.build: MethodTooLong \u2014 build runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24769e84b2fe208bde68947f6d5ada73cc1613f875b30454d5c5c38905799c5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _SelectHardwareWalletAccountFormState.build: MethodTooLong \u2014 build runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/select_hardware_wallet_account_page.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd8679761775f4668f3ca954d72df85f7476b29f11c7dc6f20a5eb794662927f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/node.dart: FileTooLong \u2014 501 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1 over it, 1.00\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a11d4d0deabcea12f89a750abde071aa9dead7e6cbf9f140dbd50edd19ace7c"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 60 shared lines): lib/themes/theme_classes/black_theme.dart:178-255 | lib/themes/theme_classes/dark_theme.dart:153-227 | lib/themes/theme_classes/light_theme.dart:155-225 \u2014 These 3 members are variants of one another: a block of 60 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/theme_classes/black_theme.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1f1f0922dff28f8047e2e0ddb765f315407b5cf755dc75229864ead42a29281"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 15 shared lines): lib/new-ui/pages/home_page.dart:98-276 | lib/new-ui/widgets/coins_page/assets_history/history_modal.dart:18-130 | lib/new-ui/widgets/modal_page_wrapper.dart:25-85 \u2014 These 3 members are variants of one another: a block of 15 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/home_page.dart"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ca16850030a8da25f373ad2ac65e92b712d86eb974065e5aaa1498fecf2147"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (61 shared lines): lib/exchange/provider/sideshift_exchange_provider.dart:208-340 | lib/exchange/provider/simpleswap_exchange_provider.dart:166-291 \u2014 These two members are variants of one another: 61 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83674326ad0efd86d653e4f5f9570ff177927e177bf4d7ec18f123bbd337985"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (61 shared lines): lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart:16-106 | lib/new-ui/widgets/receive_page/receive_amount_modal.dart:40-261 \u2014 These two members are variants of one another: 61 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe55dba1eb311b5515c349fc6bb0213b7f7ed1ecd7b3500ade92f28f6ad59419"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (54 shared lines): lib/exchange/provider/letsexchange_exchange_provider.dart:148-330 | lib/exchange/provider/stealth_ex_exchange_provider.dart:155-326 \u2014 These two members are variants of one another: 54 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f06a88217cf00101fed69d44e32b2759eb78803c0e115e116e1e05168dc5eca"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (53 shared lines): lib/exchange/provider/exolix_exchange_provider.dart:187-321 | lib/exchange/provider/trocador_exchange_provider.dart:221-398 \u2014 These two members are variants of one another: 53 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"137761c779fcd1eb8340981fb33ba23c7e06210ca1ad5242cb5ba0702d11473a"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (48 shared lines): lib/src/widgets/picker.dart:307-394 | lib/src/widgets/picker.dart:396-482 \u2014 These two members are variants of one another: 48 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/picker.dart"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb5f7fdeb8368c4484e7511a18775ed64938a3dd3e12d663759f864bb3067a27"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (44 shared lines): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:329-394 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:396-454 \u2014 These two members are variants of one another: 44 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"562ef06d8aa30e88dca4690d86c8cb426cd6120f0e776d870f21473145f672bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (36 shared lines): lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart:25-86 | lib/new-ui/widgets/anypay/select_recipient_network_sheet.dart:50-153 \u2014 These two members are variants of one another: 36 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"342e2539e90e237249e33ecf23ac90decb5b65b3a579030fe16efca8abc28b0c"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (23 corresponding lines): lib/src/screens/welcome/create_pin_welcome_page.dart:76-243 | lib/src/widgets/bottom_sheet/info_bottom_sheet_widget.dart:85-166 \u2014 These two members are one piece of code written twice and then edited apart: 23 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/welcome/create_pin_welcome_page.dart"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"46e0b7a9bc892e560c346c4a2a60a5e1d5261fb933d1bdbfde4f7accb8fd97c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (34 corresponding lines): lib/exchange/trade.dart:13-54 | lib/exchange/trade_legacy.dart:29-71 \u2014 These two members are one piece of code written twice and then edited apart: 34 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade.dart"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3eb3d3e995993b346e55f7d0d87d4616ef9e52083455cf2327edf72d15f9c82"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (14 corresponding lines): lib/new-ui/new_dashboard.dart:71-137 | lib/src/screens/wallet_list/wallet_list_page.dart:143-460 \u2014 These two members are one piece of code written twice and then edited apart: 14 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/new_dashboard.dart"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc34fd88feaf7cc274bcce1e46d46871b60666944b163c60802cd9064448473f"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (12 members, 50\u002B identical tokens): lib/exchange/provider/chainflip_exchange_provider.dart:97-161 | lib/exchange/provider/changenow_exchange_provider.dart:89-167 | lib/exchange/provider/exolix_exchange_provider.dart:94-185 | lib/exchange/provider/jupiter_exchange_provider.dart:130-225 | lib/exchange/provider/letsexchange_exchange_provider.dart:78-146 | lib/exchange/provider/near_Intents_exchange_provider.dart:120-206 | lib/exchange/provider/simpleswap_exchange_provider.dart:85-164 | lib/exchange/provider/stealth_ex_exchange_provider.dart:84-153 | lib/exchange/provider/swaptrade_exchange_provider.dart:79-176 | lib/exchange/provider/thorchain_exchange.provider.dart:50-109 | lib/exchange/provider/trocador_exchange_provider.dart:112-219 | lib/exchange/provider/xoswap_exchange_provider.dart:194-288 \u2014 These 12 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 12 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 12 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"e76c45d05ff6e2f652d96d6f98f3409a48f06d18d77affbf45e3345a4d2c742d"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (11 members, 50\u002B identical tokens): cw_decred/lib/api/libdcrwallet.dart:331-343 | cw_decred/lib/api/libdcrwallet.dart:384-396 | cw_decred/lib/api/libdcrwallet.dart:411-426 | cw_decred/lib/api/libdcrwallet.dart:428-441 | cw_decred/lib/api/libdcrwallet.dart:495-509 | cw_decred/lib/api/libdcrwallet.dart:511-524 | cw_decred/lib/api/libdcrwallet.dart:526-540 | cw_decred/lib/api/libdcrwallet.dart:570-583 | cw_decred/lib/api/libdcrwallet.dart:585-601 | cw_decred/lib/api/libdcrwallet.dart:603-619 | cw_decred/lib/api/libdcrwallet.dart:657-671 \u2014 These 11 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 11 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 11 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf8211a429f0d51da702dda93ad209b9014ff66e125abec476dc81af4dd1378b"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (11 members, 50\u002B identical tokens): cw_decred/lib/api/libdcrwallet.dart:345-356 | cw_decred/lib/api/libdcrwallet.dart:358-369 | cw_decred/lib/api/libdcrwallet.dart:371-382 | cw_decred/lib/api/libdcrwallet.dart:398-409 | cw_decred/lib/api/libdcrwallet.dart:443-457 | cw_decred/lib/api/libdcrwallet.dart:459-478 | cw_decred/lib/api/libdcrwallet.dart:542-554 | cw_decred/lib/api/libdcrwallet.dart:556-568 | cw_decred/lib/api/libdcrwallet.dart:621-641 | cw_decred/lib/api/libdcrwallet.dart:643-655 | cw_decred/lib/api/libdcrwallet.dart:673-685 \u2014 These 11 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 11 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 11 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"2337d055fdd58426832dc4e16a4ec6cb8d39c651bdbd1b67edb1612140eab0e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (7 members, 50\u002B identical tokens): cw_bitcoin/lib/bitcoin_wallet_service.dart:116-134 | cw_bitcoin/lib/litecoin_wallet_service.dart:99-138 | cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart:82-100 | cw_decred/lib/wallet_service.dart:181-189 | cw_dogecoin/lib/src/dogecoin_wallet_service.dart:82-100 | cw_solana/lib/solana_wallet_service.dart:95-114 | cw_tron/lib/tron_wallet_service.dart:142-154 \u2014 These 7 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 7 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 7 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet_service.dart"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ddb5b3b05feaa9df1d047310e2dd07e2974c6c5d4dbd17ec2d4829f87b644d"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (7 members, 50\u002B identical tokens): cw_evm/lib/tokens/arbitrum_tokens.dart:6-87 | cw_evm/lib/tokens/base_tokens.dart:6-73 | cw_evm/lib/tokens/bsc_tokens.dart:6-87 | cw_evm/lib/tokens/ethereum_tokens.dart:6-109 | cw_evm/lib/tokens/polygon_tokens.dart:6-87 | cw_evm/lib/tokens/robinhood_tokens.dart:6-408 | cw_solana/lib/default_spl_tokens.dart:763-776 \u2014 These 7 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 7 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 7 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/arbitrum_tokens.dart"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cd8e5db3d24e15d6c29e4476672a34bac7e27b139bf78068b82a8e6bca5f7bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): cw_monero/lib/monero_wallet_service.dart:220-246 | cw_nano/lib/nano_wallet_service.dart:61-76 | cw_wownero/lib/wownero_wallet_service.dart:210-238 | cw_zano/lib/zano_wallet_service.dart:114-130 | cw_zcash/lib/src/zcash_wallet_service.dart:129-144 | lib/haven/cw_haven.dart:20-36 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bdeaee7dc4d670281461d4587e9441a8d936749be47f3eca76ad1635cf300ed"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): lib/decred/cw_decred.dart:51-66 | lib/monero/cw_monero.dart:324-339 | lib/nano/cw_nano.dart:147-162 | lib/solana/cw_solana.dart:57-75 | lib/wownero/cw_wownero.dart:278-293 | lib/zano/cw_zano.dart:90-109 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/decred/cw_decred.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"d61fbf5c445877e32ff472d3ecb26db628508785a94521cbba31cef9d4fbb83a"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart:75-164 | lib/new-ui/pages/buy_sell/buy_sell_confirmation_page.dart:19-137 | lib/new-ui/pages/buy_sell/buy_sell_payment_method_page.dart:17-80 | lib/new-ui/pages/buy_sell/buy_sell_provider_page.dart:30-149 | lib/new-ui/pages/buy_sell/buy_sell_redirecting_page.dart:33-128 | lib/new-ui/widgets/buy_sell/buy_sell_selector_modal.dart:15-68 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"944cd5434a5cb34470441673e1fb4b40c950e2c458f847a1bda90ada6006097d"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): cw_evm/lib/clients/arbitrum_client.dart:8-38 | cw_evm/lib/clients/base_client.dart:8-38 | cw_evm/lib/clients/bsc_client.dart:8-39 | cw_evm/lib/clients/polygon_client.dart:8-38 | cw_evm/lib/clients/robinhood_client.dart:8-35 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/arbitrum_client.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f823812e72287567c77077beb91230163c21d77a19a269bb66df9de3ff8478a8"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): lib/new-ui/pages/bridge/bridge_detail_page.dart:21-104 | lib/new-ui/pages/bridge/bridge_history_page.dart:15-118 | lib/new-ui/pages/bridge/bridge_network_page.dart:18-101 | lib/new-ui/pages/bridge/bridge_receive_address_input_page.dart:42-160 | lib/new-ui/pages/bridge/bridge_receiving_wallet_page.dart:32-111 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/bridge/bridge_detail_page.dart"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"deeaf502a8475b1ef0254340a6527bae0de318c9dac7a446cdcfad131e94a76e"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): cw_evm/lib/evm_chain_wallet_service.dart:96-137 | cw_evm/lib/evm_chain_wallet_service.dart:221-264 | cw_evm/lib/evm_chain_wallet_service.dart:266-304 | cw_evm/lib/evm_chain_wallet_service.dart:306-342 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet_service.dart"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ac778e006caeae3f06c63fe226f2eb12cd30bf733aaff028920e1a18c3ae57e"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): cw_monero/lib/monero_wallet_service.dart:270-296 | cw_monero/lib/monero_wallet_service.dart:349-402 | cw_wownero/lib/wownero_wallet_service.dart:261-287 | cw_wownero/lib/wownero_wallet_service.dart:295-324 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb105b9c3ee9962f276ca05defd6058c88b09ba17daa34b6e7dce437a5025e58"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): lib/src/screens/anonpay_details/anonpay_details_page.dart:42-72 | lib/src/screens/payjoin_details/payjoin_details_page.dart:45-79 | lib/src/screens/transaction_details/rbf_details_page.dart:44-117 | lib/src/screens/unspent_coins/unspent_coins_details_page.dart:25-70 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/anonpay_details/anonpay_details_page.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e3fbb93f725a7d8df3d77f252756d6ef06b13a3daba97b64de5ad72110b3b19"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): lib/src/screens/dashboard/pages/nft_details_page.dart:67-111 | lib/src/screens/dashboard/pages/nft_details_page.dart:119-136 | lib/src/screens/dashboard/widgets/nft_tile_widget.dart:11-80 | lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart:19-105 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_details_page.dart"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a4fc47cce31174a497560332afa1fb8a91814aa9719086064d5d073ab49e933"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart:19-69 | lib/src/screens/dashboard/widgets/payjoin_transaction_row.dart:22-75 | lib/src/screens/dashboard/widgets/trade_row.dart:31-123 | lib/src/screens/dashboard/widgets/transaction_raw.dart:27-114 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6e3085ff43fdb3717b354e848b6d396a73f28049f01f9ca733b86c6a70f47c"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): lib/src/screens/dev/background_sync_logs_page.dart:26-78 | lib/src/screens/dev/exchange_provider_logs_page.dart:28-69 | lib/src/screens/dev/network_requests.dart:34-99 | lib/src/screens/dev/socket_health_logs_page.dart:22-53 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/background_sync_logs_page.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"da6c387d4745ec5bb537160ec0d45d196a084b2c9923b87c2f3a44fc1013ce9c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (93 lines \u00D7 3): lib/themes/theme_classes/black_theme.dart:84-176 | lib/themes/theme_classes/dark_theme.dart:59-151 | lib/themes/theme_classes/light_theme.dart:60-152 \u2014 before extracting anything, compare \u0060lib/themes/theme_classes/black_theme.dart\u0060 and \u0060lib/themes/theme_classes/dark_theme.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 170 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/theme_classes/black_theme.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7b5b0bbb4a400adb9bf76179197d3ff5747428c096d3e7a3d3e93d4df0dfbaf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (60 lines \u00D7 3): lib/themes/theme_classes/black_theme.dart:190-249 | lib/themes/theme_classes/dark_theme.dart:162-221 | lib/themes/theme_classes/light_theme.dart:164-223 \u2014 before extracting anything, compare \u0060lib/themes/theme_classes/black_theme.dart\u0060 and \u0060lib/themes/theme_classes/dark_theme.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 170 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/theme_classes/black_theme.dart"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"2022ec8a58a69187141f7eeddeab4f466acdf6c5bcd5d80c4891099b2c94fce3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (46 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:102-147 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:161-206 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f993f71c9de16f0a5cc9514303ce21185cf6b04574def76e9ba000b50fb35d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (43 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:220-262 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:278-320 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"70c76586d9d8a74d2823a6390720c705b5ac56fcc4661a7f279048b0ae6b785d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2): lib/src/screens/disclaimer/disclaimer_page.dart:101-139 | lib/src/screens/disclaimer/third_party_disclaimer_page.dart:53-91 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/disclaimer/disclaimer_page.dart"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a1ce4476fe14739b7034781548e63b2b65d5ef44f85dc6e7efa326d234399d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2): cw_core/lib/utils/print_verbose.dart:70-106 | cw_mweb/lib/print_verbose.dart:70-106 \u2014 before extracting anything, compare \u0060cw_core/lib/utils/print_verbose.dart\u0060 and \u0060cw_mweb/lib/print_verbose.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/print_verbose.dart"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"17599b8b9e7e2119d6c22909240b4d4400de5c351c8aa87e85d824ef83733860"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 3): cw_core/lib/get_height_by_date_xmr.dart:370-402 | cw_core/lib/get_height_by_date_zec.dart:337-369 | cw_zano/lib/get_height_by_date.dart:388-420 \u2014 before extracting anything, compare \u0060cw_core/lib/get_height_by_date_zec.dart\u0060 and \u0060cw_zano/lib/get_height_by_date.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/get_height_by_date_xmr.dart"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7631117c1bb747ecd27949090c5a14c6ffd6e877bc8ad2ec48733ba571aeb54"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201333 lines \u00D7 2): lib/store/settings_store.dart:550-572 | lib/store/settings_store.dart:756-788 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"1803642f1989dc78f79c48ab3b845fda8f5d6cd36a124fbe0699b579c0c7db2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28\u201332 lines \u00D7 5): cw_evm/lib/clients/arbitrum_client.dart:8-38 | cw_evm/lib/clients/base_client.dart:8-38 | cw_evm/lib/clients/bsc_client.dart:8-39 | cw_evm/lib/clients/polygon_client.dart:8-38 | cw_evm/lib/clients/robinhood_client.dart:8-35 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 5 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/arbitrum_client.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"74b3eb0822a9879f7536db5073c8ec839aeecec4d2fd0024e7f4337166f538be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31\u201332 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet.dart:4334-4365 | cw_bitcoin/lib/litecoin_wallet.dart:1530-1560 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/electrum_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 78 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":4334}}}],"partialFingerprints":{"codehealthFindingId/v1":"79a5de90734882609e539ea8ce0439ff171a95e7fd21ff41103feb4ee8427f46"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2): lib/entities/qr_scanner.dart:86-117 | lib/new-ui/pages/scan_page.dart:445-476 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/qr_scanner.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d4060a485f66e1e9928dffd979be53d6b08609f2dcc950469a95bd036438a6a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 5): cw_evm/lib/tokens/arbitrum_tokens.dart:39-68 | cw_evm/lib/tokens/base_tokens.dart:25-54 | cw_evm/lib/tokens/bsc_tokens.dart:25-54 | cw_evm/lib/tokens/ethereum_tokens.dart:25-54 | cw_evm/lib/tokens/polygon_tokens.dart:32-61 \u2014 before extracting anything, compare \u0060cw_evm/lib/tokens/arbitrum_tokens.dart\u0060 and \u0060cw_evm/lib/tokens/base_tokens.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 82 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/arbitrum_tokens.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e3ed3620bc538bf258f66f8df1c388729d013edf388a621f8005e06b5926a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28\u201330 lines \u00D7 2): lib/buy/dfx/dfx_buy_provider.dart:333-362 | lib/buy/robinhood/robinhood_buy_provider.dart:171-198 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/dfx/dfx_buy_provider.dart"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbde3688252dc87ae5741bd2b7714c5841b042903cc61bfb94ea4b9ac1d344b8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): lib/monero/cw_monero.dart:187-215 | lib/wownero/cw_wownero.dart:183-211 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c2ac75d85f7af02aacb39485ee179e07015bb0d900b71cedef63aa5d1e656e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201328 lines \u00D7 2): lib/new-ui/widgets/swap_page/provider_options_page.dart:70-97 | lib/new-ui/widgets/swap_page/provider_options_page.dart:123-149 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/provider_options_page.dart"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c5333361a04ff0e3238cd39e2461c8f9f678b34a73243f88406d29a8159b0e4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): cw_core/lib/node.dart:278-304 | cw_core/lib/node_legacy.dart:168-194 \u2014 before extracting anything, compare \u0060cw_core/lib/node.dart\u0060 and \u0060cw_core/lib/node_legacy.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 50 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"195fcf531f3c12241ac61ca35f003983f791b13341542dc0dd8bf0c1d99a4ed9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): cw_core/lib/utils/proxy_wrapper.dart:149-174 | cw_core/lib/utils/proxy_wrapper.dart:368-393 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_wrapper.dart"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"241172367abcb711904fabc0c077e2e4a027b2c68059f7c6844bb2e4591b474a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): cw_monero/lib/monero_subaddress_list.dart:97-122 | cw_wownero/lib/wownero_subaddress_list.dart:103-128 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_subaddress_list.dart\u0060 and \u0060cw_wownero/lib/wownero_subaddress_list.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_subaddress_list.dart"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2ee8cb8698f19df11f00cad27ae2ac8fa40c73986a623683bcd8705edc65606"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): lib/src/screens/restore/wallet_restore_from_keys_form.dart:157-182 | lib/src/screens/restore/wallet_restore_from_seed_form.dart:159-184 \u2014 before extracting anything, compare \u0060lib/src/screens/restore/wallet_restore_from_keys_form.dart\u0060 and \u0060lib/src/screens/restore/wallet_restore_from_seed_form.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 48 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_from_keys_form.dart"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"f421a1a43449837183ecaa0a4cf97233a95d940d3754749b04d349d2ab419566"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): lib/src/screens/settings/mweb_logs_page.dart:74-99 | lib/src/screens/settings/silent_payments_logs_page.dart:75-100 \u2014 before extracting anything, compare \u0060lib/src/screens/settings/mweb_logs_page.dart\u0060 and \u0060lib/src/screens/settings/silent_payments_logs_page.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/mweb_logs_page.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"697cc2e16da72cc94102f2366fcbca804e561669e03b16b5e1d7747a2ba8867c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:500-525 | lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:283-308 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"234245c48dbf6d00f745843f6a18483014ded4cbcff298d68d1fdc6f5803fd24"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:612-636 | cw_wownero/lib/wownero_wallet.dart:455-479 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"fed04d035eae09b0bf4031d38ae6abf051557db82d6752ab585509747f953587"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 5): cw_evm/lib/tokens/arbitrum_tokens.dart:8-31 | cw_evm/lib/tokens/base_tokens.dart:8-31 | cw_evm/lib/tokens/bsc_tokens.dart:8-31 | cw_evm/lib/tokens/ethereum_tokens.dart:8-31 | cw_evm/lib/tokens/polygon_tokens.dart:14-37 \u2014 before extracting anything, compare \u0060cw_evm/lib/tokens/arbitrum_tokens.dart\u0060 and \u0060cw_evm/lib/tokens/base_tokens.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 82 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/arbitrum_tokens.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b716f7486b815e2f3129beb4bc65546f0441913e3bb8fba3285b3dfbb84c4eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201324 lines \u00D7 2): cw_bitcoin/lib/bitcoin_wallet.dart:274-297 | cw_bitcoin/lib/litecoin_wallet.dart:274-295 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/bitcoin_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc1c97fefd75877a872c148bc15d5a8b1135070cfa4e827e7a740759900907d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): cw_bitcoin/lib/electrum.dart:310-333 | cw_bitcoin/lib/electrum.dart:348-371 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"858009399807fa65e3ffc1ad187655e6f7a1e8c60d3dc76a6a2c7bfac52fa4cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201324 lines \u00D7 2): lib/exchange/provider/sideshift_exchange_provider.dart:286-308 | lib/exchange/provider/simpleswap_exchange_provider.dart:234-257 \u2014 before extracting anything, compare \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 107 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc6e67bcd7e765ad581028056da82d28cc4ca74c00d011592473cf7028c56116"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201324 lines \u00D7 2): lib/new-ui/widgets/receive_page/receive_address_type_selector.dart:98-120 | lib/new-ui/widgets/receive_page/receive_address_type_selector.dart:211-234 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_address_type_selector.dart"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bfdcc902de23e957460c095546ee4c024fd3719ff3bed2253ea3ad416da2f1f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): cw_core/lib/get_height_by_date_zec.dart:371-393 | cw_zano/lib/get_height_by_date.dart:422-444 \u2014 before extracting anything, compare \u0060cw_core/lib/get_height_by_date_zec.dart\u0060 and \u0060cw_zano/lib/get_height_by_date.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/get_height_by_date_zec.dart"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfcc387fbc829dc92b8e129c2456555b4a8984856312ec26259e1004afc17d3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): lib/locales/hausa_intl.dart:274-296 | lib/locales/yoruba_intl.dart:274-296 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"27265e4a7b44d517b7a95c4d5c61d6c427a002ec9dd7f876abb404a370043b0c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): lib/locales/hausa_intl.dart:830-852 | lib/locales/yoruba_intl.dart:830-852 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"38cc76f1819007e60f61b3d8457b904dc193ac382d9685a0a7058f34066c3104"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): lib/new-ui/pages/bridge/bridge_history_page.dart:56-78 | lib/new-ui/pages/bridge/bridge_history_page.dart:84-106 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/bridge/bridge_history_page.dart"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe831e24036b833e6483fb2d141590193f62174949a41c8f58df3959abb3b9fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): cw_core/lib/utils/print_verbose.dart:47-68 | cw_mweb/lib/print_verbose.dart:47-68 \u2014 before extracting anything, compare \u0060cw_core/lib/utils/print_verbose.dart\u0060 and \u0060cw_mweb/lib/print_verbose.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/print_verbose.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"05a32aad17a882dfe735e5fba20632527c092ab5f2f3a4d2dd7217e03c8b9ff6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:314-335 | cw_wownero/lib/wownero_wallet.dart:252-273 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"535dce9cbe4bceeed8d87c628a82a949505f05d1767da27a49b948d6a40f6a1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): cw_zano/lib/zano_wallet_api.dart:368-389 | cw_zano/lib/zano_wallet_api.dart:405-426 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet_api.dart"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6dacc4c6328d69c15119e76c3cb1c829287ff49110fb7c475e55d02dad0c678"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): lib/exchange/provider/chainflip_exchange_provider.dart:125-146 | lib/exchange/provider/thorchain_exchange.provider.dart:73-94 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/thorchain_exchange.provider.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 86 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"5837de7bdda9e2292c7cdfd894bb492881136de44353ea14c07c6d351971c113"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): lib/exchange/provider/letsexchange_exchange_provider.dart:301-322 | lib/exchange/provider/stealth_ex_exchange_provider.dart:299-320 \u2014 before extracting anything, compare \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/stealth_ex_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 131 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"868563f85c6f57fa9077a54602c47dc73ed21c3cc4539ecde9a954d4fa59f4db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): lib/src/screens/welcome/create_pin_welcome_page.dart:199-220 | lib/src/widgets/bottom_sheet/info_bottom_sheet_widget.dart:135-156 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/welcome/create_pin_welcome_page.dart"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3cfedd25c772d99c09420f693b595a1f8b25be328503c3ad69a9deb46dc48a8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201321 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet.dart:4309-4329 | cw_bitcoin/lib/litecoin_wallet.dart:1506-1525 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/electrum_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 78 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":4309}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae053745fed633659f5914afa6c5a4aca6c55d49a5816b4fb9e3f7cd8eaff8fc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): cw_monero/lib/monero_account_list.dart:26-46 | cw_wownero/lib/wownero_account_list.dart:25-45 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_account_list.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"0999b7a57bf36fc952b39bb0324455669435a63a76f2b9c050f9fc967a164d3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201321 lines \u00D7 2): cw_monero/lib/monero_subaddress_list.dart:129-149 | cw_wownero/lib/wownero_subaddress_list.dart:135-152 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_subaddress_list.dart\u0060 and \u0060cw_wownero/lib/wownero_subaddress_list.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_subaddress_list.dart"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"9789bfa38fc79858973f8afd7af9428e56abc39f9b1b99e39212cb9047ac5edb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:513-533 | cw_wownero/lib/wownero_wallet.dart:373-393 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"b291fcd4d5364efef1e7ab83be1f9824b7bfebb606d32c13f74ee4f69ff7b60e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): cw_tron/lib/tron_client.dart:35-55 | cw_tron/lib/tron_client.dart:68-88 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_client.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"85a4278e879393ef66fb481e04584d08b1a689ed93be69af0eaf901d01c57ad4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): lib/core/address_validator.dart:124-144 | lib/core/address_validator.dart:251-271 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_validator.dart"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa9b177b7d00039ac64f140bcd60a4ec9dd9ffbb6dffe6a5eb28bc293fc4fb19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): lib/exchange/provider/exolix_exchange_provider.dart:277-297 | lib/exchange/provider/trocador_exchange_provider.dart:343-363 \u2014 before extracting anything, compare \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 118 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"d096f3471ca22c2feef40edebde444b282fc9aff328e4e0307fb8d793754f8d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart:100-120 | lib/src/screens/connect_device/select_hardware_wallet_account_page.dart:110-130 \u2014 before extracting anything, compare \u0060lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart\u0060 and \u0060lib/src/screens/connect_device/select_hardware_wallet_account_page.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a6b597b950ad0c7c4b21e3a8d2a78b60e5f515ebb104d77a6ad7bc24fdef4c6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201321 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:376-394 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:434-454 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bcf973293902b0672a8b8c635c898da8653447a61e01bbcd730907e9762767b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): cw_monero/lib/api/transaction_history.dart:346-365 | cw_wownero/lib/api/transaction_history.dart:305-324 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/transaction_history.dart"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"14bb1a53c0d43bebb465224cbe1173c003440fb83fb71f7afcbbf49869fd0a0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): lib/exchange/provider/sideshift_exchange_provider.dart:264-283 | lib/exchange/provider/simpleswap_exchange_provider.dart:212-231 \u2014 before extracting anything, compare \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 107 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"af45e595a14a7bd840aea9282abfa4d059f265f4be645c263e092fa75fc5a82b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): lib/new-ui/pages/bridge/bridge_network_page.dart:18-37 | lib/new-ui/pages/bridge/bridge_receive_address_input_page.dart:42-61 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/bridge/bridge_network_page.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"06817799f3fbaf634632c5a9e1072e46089d9f56367efda177994c529f747788"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): lib/new-ui/widgets/currency_picker/fiat_currency_picker_sheet.dart:295-314 | lib/new-ui/widgets/currency_picker/fiat_currency_row.dart:47-66 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/fiat_currency_picker_sheet.dart"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b1d3ef93e732cfd07f04228d99541651adff67033748005f1ea35daf4b5e257"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): lib/src/screens/dev/secure_preferences_page.dart:20-39 | lib/src/screens/dev/shared_preferences_page.dart:29-48 \u2014 before extracting anything, compare \u0060lib/src/screens/dev/secure_preferences_page.dart\u0060 and \u0060lib/src/screens/dev/shared_preferences_page.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/secure_preferences_page.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"098a80ac8a839b616ab83461b8298aa75648befa0b456cec2229beafbe4d9298"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): lib/src/screens/settings/mweb_logs_page.dart:106-125 | lib/src/screens/settings/silent_payments_logs_page.dart:107-126 \u2014 before extracting anything, compare \u0060lib/src/screens/settings/mweb_logs_page.dart\u0060 and \u0060lib/src/screens/settings/silent_payments_logs_page.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/mweb_logs_page.dart"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c81c6090a253033b50dc8bb4a19554672eef36132c2d74f1106ba7302646ff8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 4): lib/exchange/provider/chainflip_exchange_provider.dart:132-150 | lib/exchange/provider/letsexchange_exchange_provider.dart:115-133 | lib/exchange/provider/stealth_ex_exchange_provider.dart:125-143 | lib/exchange/provider/thorchain_exchange.provider.dart:80-98 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 52 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba1a8b0428e48d2d9930670d8cb59529caa7711d5921b7536376d966cd9de6e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart:28-46 | cw_dogecoin/lib/src/dogecoin_wallet.dart:26-44 \u2014 before extracting anything, compare \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart\u0060 and \u0060cw_dogecoin/lib/src/dogecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 86 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd9084f11b23085a64fe7aa0ad8bb94dba07bc0e869fd72357c9357f1f8a29e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): cw_evm/lib/tokens/polygon_tokens.dart:8-26 | cw_evm/lib/tokens/polygon_tokens.dart:50-68 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/polygon_tokens.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ca7681f493eea01afbc590acaff87e2c1397839f0c6a87da26d8cc8bec980f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201319 lines \u00D7 2): cw_monero/lib/api/wallet.dart:361-379 | cw_wownero/lib/api/wallet.dart:270-286 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/wallet.dart"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d001785d62343e18656d0f5344340c4b277c78ddb36ad991b6bcc4846d0871"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:978-996 | cw_wownero/lib/wownero_wallet.dart:763-781 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":978}}}],"partialFingerprints":{"codehealthFindingId/v1":"0adda59e96dce94b00041b8f435c894ac2ff40f9bd805b87a6ca95002043a244"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): cw_solana/lib/solana_client.dart:1803-1821 | cw_solana/lib/solana_client.dart:1831-1848 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1803}}}],"partialFingerprints":{"codehealthFindingId/v1":"459d22e4b07a3b5bf6e98cf17de371107fc5129fe7713d648f69e0f220a1af6e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201319 lines \u00D7 2): lib/exchange/provider/xoswap_exchange_provider.dart:479-495 | lib/exchange/provider/xoswap_exchange_provider.dart:498-516 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d4a62217d17cf9034fa527044d6ea7af1abbe89406d1cdb8427604bac4dd8f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): lib/new-ui/pages/buy_sell/buy_sell_confirmation_page.dart:24-42 | lib/new-ui/pages/buy_sell/buy_sell_provider_page.dart:35-53 \u2014 before extracting anything, compare \u0060lib/new-ui/pages/buy_sell/buy_sell_confirmation_page.dart\u0060 and \u0060lib/new-ui/pages/buy_sell/buy_sell_provider_page.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 44 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/buy_sell/buy_sell_confirmation_page.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"4417182fd224c59d21a9fc7998cdb46f5ff5bf91fc4c67447b5963f2653903fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart:45-63 | lib/new-ui/widgets/receive_page/receive_amount_modal.dart:131-149 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart\u0060 and \u0060lib/new-ui/widgets/receive_page/receive_amount_modal.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 62 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aaddaf2159781950b0fdf20cb5f786e2d7dca31c21de7b2325a1ef9ce6919e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 6): cw_evm/lib/tokens/arbitrum_tokens.dart:70-87 | cw_evm/lib/tokens/base_tokens.dart:56-73 | cw_evm/lib/tokens/bsc_tokens.dart:70-87 | cw_evm/lib/tokens/ethereum_tokens.dart:92-109 | cw_evm/lib/tokens/polygon_tokens.dart:70-87 | cw_evm/lib/tokens/robinhood_tokens.dart:391-408 \u2014 before extracting anything, compare \u0060cw_evm/lib/tokens/arbitrum_tokens.dart\u0060 and \u0060cw_evm/lib/tokens/base_tokens.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 82 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/arbitrum_tokens.dart"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"a25ffdd291aa14ad813d9b988cdadf029dc53ada93bd6c8b5645e8123537dc47"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): cw_bitcoin/lib/bitcoin_wallet.dart:451-466 | cw_bitcoin/lib/litecoin_wallet.dart:1578-1595 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/bitcoin_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d0d5cf01ee973dc1f7657ec5b522b012dcd8370b8a274665f31fd203bf7b6dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart:55-72 | cw_dogecoin/lib/src/dogecoin_wallet.dart:53-70 \u2014 before extracting anything, compare \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart\u0060 and \u0060cw_dogecoin/lib/src/dogecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 86 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d132d2fcf7730a6454dd60ecb10c8e98fad35b3c0b04a5ed566e2e60e90d0bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart:121-138 | cw_dogecoin/lib/src/dogecoin_wallet.dart:135-152 \u2014 before extracting anything, compare \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart\u0060 and \u0060cw_dogecoin/lib/src/dogecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 86 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4f3cbd7955f6bed675fe03457f5bc95e3c9428e3d1124fdf4a79616b35e20d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): cw_core/lib/spl_token_legacy.dart:94-111 | cw_core/lib/tron_token_legacy.dart:90-107 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/spl_token_legacy.dart"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72623644dd857a085de2942e145f982f3ccd2fafddb93aa20c5f97e0ee065a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201318 lines \u00D7 2): cw_decred/lib/wallet_service.dart:88-105 | cw_decred/lib/wallet_service.dart:243-255 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet_service.dart"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a26772144002899edcc901357bbe5a0692ac005a43642fe14e5a0eb66f906ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): cw_evm/lib/deuro/deuro_savings.dart:100-117 | cw_evm/lib/deuro/deuro_savings.dart:135-152 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/deuro/deuro_savings.dart"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f032735c665bec7d4cba8df203b569ad92a3492990950bb3e8651a8d59402e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): cw_solana/lib/solana_wallet.dart:648-665 | cw_tron/lib/tron_wallet.dart:153-170 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet.dart\u0060 and \u0060cw_tron/lib/tron_wallet.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 52 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet.dart"},"region":{"startLine":648}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c22450cc0b835eb47c88d8703288209e1d462ef89c4cc9ad3628eea692ebe1d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): lib/exchange/provider/letsexchange_exchange_provider.dart:252-269 | lib/exchange/provider/stealth_ex_exchange_provider.dart:252-269 \u2014 before extracting anything, compare \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/stealth_ex_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 131 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4ee00ebd370f688ea376beb35f651b12fe2df098a7b445459d1b977701ec85"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (4\u201318 lines \u00D7 3): lib/new-ui/widgets/coin_control_page/coin_control_list_item.dart:42-45 | lib/new-ui/widgets/picker.dart:192-209 | lib/new-ui/widgets/picker.dart:277-294 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coin_control_page/coin_control_list_item.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"2402690220023d9648697fd5887058c5b80fab468c6925221ccdfbb13563a230"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 2): lib/new-ui/widgets/send_page/l2_send_external_modal.dart:85-102 | lib/new-ui/widgets/swap_page/swap_send_external_modal.dart:78-94 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/send_page/l2_send_external_modal.dart\u0060 and \u0060lib/new-ui/widgets/swap_page/swap_send_external_modal.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/l2_send_external_modal.dart"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"0907212ad99106c5413963cb5da4379a12484360739208529fd513c2ec18404a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): lib/src/screens/contact/contact_list_page.dart:269-286 | lib/src/screens/contact/contact_list_page.dart:404-421 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/contact/contact_list_page.dart"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"81f3be239839cea930c12d7bd4af54a4088a3459e73f8a194e7f53f7ddbd52bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart:20-37 | lib/src/screens/dashboard/widgets/payjoin_transaction_row.dart:23-40 \u2014 before extracting anything, compare \u0060lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart\u0060 and \u0060lib/src/screens/dashboard/widgets/payjoin_transaction_row.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0ffa46d9b9e2ae696760313ebbfc82bbc0aa16bcb5e7a4f23dff80f680093cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): lib/src/widgets/picker.dart:352-369 | lib/src/widgets/picker.dart:440-457 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/picker.dart"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"064398aec09feedd4e094f13061c05f76067d518a75fdc6c7a6ce03f60f12068"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 5): lib/exchange/provider/chainflip_exchange_provider.dart:135-151 | lib/exchange/provider/letsexchange_exchange_provider.dart:118-134 | lib/exchange/provider/near_Intents_exchange_provider.dart:180-196 | lib/exchange/provider/stealth_ex_exchange_provider.dart:128-144 | lib/exchange/provider/thorchain_exchange.provider.dart:83-99 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 52 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb477d4d51085593369a8970649e2415305ce19e1f892ea5286da1a0492e52e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3): lib/themes/theme_classes/black_theme.dart:52-68 | lib/themes/theme_classes/dark_theme.dart:30-46 | lib/themes/theme_classes/light_theme.dart:30-46 \u2014 before extracting anything, compare \u0060lib/themes/theme_classes/black_theme.dart\u0060 and \u0060lib/themes/theme_classes/dark_theme.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 170 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/theme_classes/black_theme.dart"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e0684420243dd9bd95a343bb4c4d8cd321362007fa4b0b03106da42f6c3ecfb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): cw_core/lib/lnurl.dart:87-103 | cw_core/lib/lnurl.dart:120-136 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/lnurl.dart"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb50cb1897c8a1b03aafdc8ca0536e73baf06ffe3276a24d70d420330556496"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): cw_core/lib/payment_uris.dart:133-149 | cw_core/lib/payment_uris.dart:157-173 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/payment_uris.dart"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"72364dc6c6307ccf92006d5c7304a74295b2f02225f480dcf9b6d32780f89b8b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): cw_monero/lib/monero_wallet_addresses.dart:113-129 | cw_wownero/lib/wownero_wallet_addresses.dart:108-124 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_addresses.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_addresses.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 43 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_addresses.dart"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3d4c9f593db32b9084ab3b4f511339c82b34d1b82f69abeab92b0d349e4ea59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): cw_monero/lib/monero_wallet_service.dart:532-548 | cw_wownero/lib/wownero_wallet_service.dart:414-430 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_service.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 76 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b93ca24e9363efec092ef9f802286f2be19fb974d1e92b5c01b103c24c1c7c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/exchange/provider/letsexchange_exchange_provider.dart:271-287 | lib/exchange/provider/trocador_exchange_provider.dart:355-371 \u2014 before extracting anything, compare \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 48 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"57aa2b5f0e947c802aa44fa8eb472a8b28f9fcbee7abc14f5f6b6c2e93953812"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/exchange/provider/simpleswap_exchange_provider.dart:148-164 | lib/exchange/provider/stealth_ex_exchange_provider.dart:137-153 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/simpleswap_exchange_provider.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a7d9847ddc6480d3771418287c09d24db8303241ad4b2213d3fe65b322b4520"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): lib/exchange/trade.dart:36-52 | lib/exchange/trade_legacy.dart:52-67 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f516cdaa5cd75d263b0af442ffc7063316a369c5855a56cda7aa41c6651e50e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/new-ui/widgets/coins_page/assets_history/history_filters_page.dart:31-47 | lib/new-ui/widgets/coins_page/assets_history/history_swap_providers_page.dart:26-42 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_filters_page.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"97343d87a0b2ecd228ea2131c6cf5fa8c1dddf8201a9139b6fa886c430ac0229"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart:386-402 | lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart:456-472 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c2d8227b69642b3a2d2e7d48ad6942a13c5df8323046de1f94905952df38098"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/new-ui/widgets/hardware_wallet/proceed_on_device_sheet.dart:76-92 | lib/new-ui/widgets/hardware_wallet/sync_key_images_sheet.dart:37-53 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/proceed_on_device_sheet.dart"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"20b43ffcdf2221dcac32e89530531dd84c5179e53b8e7b5a0dda28d554c89b9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201317 lines \u00D7 2): lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart:88-98 | lib/src/screens/connect_device/select_hardware_wallet_account_page.dart:82-98 \u2014 before extracting anything, compare \u0060lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart\u0060 and \u0060lib/src/screens/connect_device/select_hardware_wallet_account_page.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"c79d3a9e1d740fd041f03531bf3d1a3d3b4b0cffce7d467f6d424ee8a73c3c47"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): lib/src/screens/contact/contact_list_page.dart:488-504 | lib/src/screens/dashboard/widgets/header_row.dart:64-79 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/contact/contact_list_page.dart"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc7f5fb88fae1546f19f9a8c148cd3f28fcbcfbb05986f49efe60289d961115"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): lib/src/screens/exchange/widgets/desktop_exchange_cards_section.dart:28-43 | lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart:43-59 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/exchange/widgets/desktop_exchange_cards_section.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"e34231bd9355739c8774902b457340350509e873ca0351e6fac9d2ac25efad2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:166-182 | lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:237-253 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a175fac20f232ce975553380e32115b5b7de3b81cc41cddd55d58f3b1e6af7b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/src/widgets/address_text_field.dart:152-168 | lib/src/widgets/address_text_field.dart:179-195 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/address_text_field.dart"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"79116e1850cb02201d2961111a54e23182c08fb0b83fd74e2fdc04787e48645f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/src/widgets/picker.dart:378-394 | lib/src/widgets/picker.dart:466-482 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/picker.dart"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"50379ab12538e3f05fa235be50ed0f389b74a90bc03f6deaddb44096d4628f95"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/view_model/dashboard/dashboard_view_model.dart:1576-1592 | lib/view_model/settings/connection_sync_view_model.dart:304-320 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":1576}}}],"partialFingerprints":{"codehealthFindingId/v1":"126537fa46000fd1ec601d90e764f2fd3e385844b455dcb3551b66396b25b5b4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/view_model/dashboard/home_settings_view_model.dart:297-314 | lib/view_model/exchange/exchange_view_model.dart:1840-1856 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/home_settings_view_model.dart"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0aa1b9fb8257a6d13bde62f4b73691854d5f45f48ded9c2ae76d14798e26cc0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/view_model/dev/secure_preferences.dart:47-63 | lib/view_model/dev/shared_preferences.dart:73-89 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dev/secure_preferences.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a8c273ee4d89fa0c1b160f50cd7367225b37e4f36a9d40c0ebb4b3ef802088f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): lib/view_model/exchange/exchange_trade_view_model.dart:81-97 | lib/view_model/trade_details_view_model.dart:71-87 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_trade_view_model.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"04d9076be6e2835d51dc206ee8eb6a67ce108003b420b14057bd84ee6f262106"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 12): lib/exchange/provider/chainflip_exchange_provider.dart:140-155 | lib/exchange/provider/changenow_exchange_provider.dart:146-161 | lib/exchange/provider/exolix_exchange_provider.dart:163-178 | lib/exchange/provider/jupiter_exchange_provider.dart:204-219 | lib/exchange/provider/letsexchange_exchange_provider.dart:123-138 | lib/exchange/provider/near_Intents_exchange_provider.dart:185-200 | lib/exchange/provider/simpleswap_exchange_provider.dart:144-159 | lib/exchange/provider/stealth_ex_exchange_provider.dart:133-148 | lib/exchange/provider/swaptrade_exchange_provider.dart:155-170 | lib/exchange/provider/thorchain_exchange.provider.dart:88-103 | lib/exchange/provider/trocador_exchange_provider.dart:198-213 | lib/exchange/provider/xoswap_exchange_provider.dart:267-282 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/jupiter_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 56 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"975e25c2f2583d110f794fb812e1869bb73678d10f9aa04ee9c61b6166e9d2ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3): cw_bitcoin/lib/litecoin_wallet.dart:247-262 | cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart:104-119 | cw_dogecoin/lib/src/dogecoin_wallet.dart:118-133 \u2014 before extracting anything, compare \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart\u0060 and \u0060cw_dogecoin/lib/src/dogecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 86 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b909006080f1c1a2a961c88efb14bd5c67078b57b57490f08fb85ed2490daa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): cw_bitcoin/lib/electrum_transaction_info.dart:154-169 | cw_bitcoin/lib/electrum_wallet.dart:4483-4498 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_transaction_info.dart"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff795b79053a1a47cac68645e25f591891960400f92d1225a34e64faf36d7365"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): cw_decred/lib/api/libdcrwallet.dart:586-601 | cw_decred/lib/api/libdcrwallet.dart:604-619 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"92f980f3c2b60692bf3250b592c18930d975488e73aac1bd85aa74a7da9dfa8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): cw_solana/lib/solana_client.dart:885-900 | cw_solana/lib/solana_client.dart:902-917 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":885}}}],"partialFingerprints":{"codehealthFindingId/v1":"f780e59dfd3228eb6ebda9d75db5186ff33568d3f91a93cd3f7878ca74cf0395"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): cw_zcash/lib/src/zcash_wallet_addresses.dart:178-193 | cw_zcash/lib/src/zcash_wallet_addresses.dart:207-222 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet_addresses.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ec8072691f51fc602071450dfd948e293564f4da4d91979a634fafac202311f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/buy/kryptonim/kryptonim.dart:181-196 | lib/buy/meld/meld_buy_provider.dart:176-191 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/kryptonim/kryptonim.dart"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"12ae3ddd85ecc2add0891f5bb37de204555b109933988588765bc2a319c651f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/exchange/provider/chainflip_exchange_provider.dart:244-259 | lib/exchange/provider/jupiter_exchange_provider.dart:381-396 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/jupiter_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 56 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"8adc1267b04cc16ed36c950db35cdf1c10782a024f90dc686ae1dd3eeb335940"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/exchange/provider/exolix_exchange_provider.dart:251-266 | lib/exchange/provider/trocador_exchange_provider.dart:312-327 \u2014 before extracting anything, compare \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 118 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9ef0ac98c83b7212a9ddb33fc83843887e9e4639c9c6780add0d8cb22d62e69"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/new-ui/pages/bridge/bridge_amount_page.dart:155-170 | lib/new-ui/widgets/floating_amount_input.dart:62-77 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/bridge/bridge_amount_page.dart"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fd7f93ed7bca0409fb56aa061d28f825cce7c43caad2cf650aebff2d3dd5c6e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart:74-88 | lib/new-ui/widgets/receive_page/receive_amount_modal.dart:175-190 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart\u0060 and \u0060lib/new-ui/widgets/receive_page/receive_amount_modal.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 62 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a11293d15836e185d6d4d529495f31c0050d70cf9a2c55a494131e9e2281e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/src/screens/dashboard/widgets/order_row.dart:119-134 | lib/src/screens/dashboard/widgets/trade_row.dart:125-140 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/order_row.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"5737b8b17a7f222900c152309762c9080f9057b76fb7f9ee2e5f6cc9a8683574"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/src/screens/dev/exchange_provider_logs_page.dart:41-56 | lib/src/screens/dev/socket_health_logs_page.dart:27-42 \u2014 before extracting anything, compare \u0060lib/src/screens/dev/exchange_provider_logs_page.dart\u0060 and \u0060lib/src/screens/dev/socket_health_logs_page.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 45 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/exchange_provider_logs_page.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"049c13cef311a1eafc607f9251053c8cfc886abbeb78b0e5bf058a90c5d3fd8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/src/screens/settings/mweb_logs_page.dart:47-62 | lib/src/screens/settings/silent_payments_logs_page.dart:48-63 \u2014 before extracting anything, compare \u0060lib/src/screens/settings/mweb_logs_page.dart\u0060 and \u0060lib/src/screens/settings/silent_payments_logs_page.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/mweb_logs_page.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"c703207945b031178894e9001ccbee2ba487d830d80ae88e9b45390a2f9aa52f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/src/screens/ur/widgets/qr_selection_dialog.dart:66-81 | lib/src/screens/ur/widgets/urqr.dart:155-170 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/ur/widgets/qr_selection_dialog.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f35884c2931319e2220e6236ab87f403f97efa31c5a7a16ac0883e831af6f22"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): lib/utils/address_formatter.dart:121-135 | lib/utils/address_formatter.dart:154-169 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/address_formatter.dart"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"151a70bc0aed7a2f1e09307460929e2ef0f2e5d9ea905221511e06bfe0c825ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/view_model/auth_view_model.dart:89-104 | lib/view_model/set_up_2fa_viewmodel.dart:115-130 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/auth_view_model.dart"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"5913b9cc53237c770c425bd735575a8b54ed9f44ece17bbd7c9a57921c0e045d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/view_model/dashboard/home_settings_view_model.dart:232-247 | lib/view_model/dashboard/home_settings_view_model.dart:274-289 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/home_settings_view_model.dart"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"0233d5c09bcd0bbc4ebddb580b5c7022888207acc1ee305b46a3fed05ef72830"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:115-129 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:174-188 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:232-246 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:290-304 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebbf004b48ed7efb1eac81eb17f44ba324e30d79ca7acbf288eff802ce19c0fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): lib/exchange/provider/exolix_exchange_provider.dart:285-299 | lib/exchange/provider/trocador_exchange_provider.dart:351-365 | lib/exchange/provider/xoswap_exchange_provider.dart:399-413 \u2014 before extracting anything, compare \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 118 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"b932d8fc3d701f1794d576d7ff807b18affe39b818b5040e0772fd9da0696466"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): lib/exchange/provider/letsexchange_exchange_provider.dart:269-283 | lib/exchange/provider/trocador_exchange_provider.dart:353-367 | lib/exchange/provider/xoswap_exchange_provider.dart:401-415 \u2014 before extracting anything, compare \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 48 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed544eb21d6d3046864824e8ccfa08e2de7c42d6a688a3c02d33624b16a85c2b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 3): lib/src/screens/dev/exchange_provider_logs_page.dart:40-54 | lib/src/screens/dev/network_requests.dart:38-51 | lib/src/screens/dev/socket_health_logs_page.dart:26-40 \u2014 before extracting anything, compare \u0060lib/src/screens/dev/exchange_provider_logs_page.dart\u0060 and \u0060lib/src/screens/dev/socket_health_logs_page.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 45 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/exchange_provider_logs_page.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"38444c413afbd6ea214a13dbd5ed914c308797c44bbf29c8e00cbd0d963f2d81"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart:222-236 | cw_dogecoin/lib/src/dogecoin_wallet.dart:171-185 \u2014 before extracting anything, compare \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart\u0060 and \u0060cw_dogecoin/lib/src/dogecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 86 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"6be517c4dbe8b81f86fbaf87bb1fc80cb9f97e3bb55ac970622e89d308be1e40"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): cw_evm/lib/evm_chain_wallet_service.dart:234-248 | cw_evm/lib/evm_chain_wallet_service.dart:275-289 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet_service.dart"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"279720e725f2438db393588b1e9cc8103cb529890679e462ae24667ad419b42d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:770-784 | cw_wownero/lib/wownero_wallet.dart:570-584 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":770}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa04e982600f2fa5a70d4d1391d881cdffc8c245e12526133f4b41596b42407e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): cw_solana/lib/solana_wallet.dart:629-643 | cw_tron/lib/tron_wallet.dart:134-148 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet.dart\u0060 and \u0060cw_tron/lib/tron_wallet.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 52 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet.dart"},"region":{"startLine":629}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca1b9a50929ad54dcad2a084cbf526b9bb9977bf2f5b11704f0ecdc0d3adffa7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/buy/meld/meld_buy_provider.dart:220-234 | lib/buy/onramper/onramper_buy_provider.dart:396-410 \u2014 \u0060lib/buy/meld/meld_buy_provider.dart\u0060 and \u0060lib/buy/onramper/onramper_buy_provider.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 3 separate duplicated blocks between them, totalling at least 45 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/meld/meld_buy_provider.dart"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa2c9af4525ccd59989c53bbef59f9db5ea00f9123f05d06eccbdbf1f67fe297"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/buy/meld/meld_buy_provider.dart:206-220 | lib/buy/onramper/onramper_buy_provider.dart:380-394 \u2014 \u0060lib/buy/meld/meld_buy_provider.dart\u0060 and \u0060lib/buy/onramper/onramper_buy_provider.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 3 separate duplicated blocks between them, totalling at least 45 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/meld/meld_buy_provider.dart"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"27411d14f9e2d5ae8411954b72f50c2c64f0c6d04a3ce11fe50f7d816c7e6d6e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/buy/meld/meld_buy_provider.dart:248-262 | lib/buy/onramper/onramper_buy_provider.dart:432-446 \u2014 \u0060lib/buy/meld/meld_buy_provider.dart\u0060 and \u0060lib/buy/onramper/onramper_buy_provider.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 3 separate duplicated blocks between them, totalling at least 45 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/meld/meld_buy_provider.dart"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce3718ff2f78ab546f1694258fe03e090d3573724291b518528bcb280b264010"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/exchange/provider/simpleswap_exchange_provider.dart:106-120 | lib/exchange/provider/trocador_exchange_provider.dart:156-170 \u2014 before extracting anything, compare \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 45 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/simpleswap_exchange_provider.dart"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"470ff31aef963077a372ec07971ecda1766d00259c1ec6037f099b79cb5d0f96"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/exchange/trade.dart:20-34 | lib/exchange/trade_legacy.dart:35-49 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"29f169505efa03040797fd6320c88a08909b8525f6eb9a1379e2cc1813820a27"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart:401-415 | lib/new-ui/widgets/buy_sell/buy_sell_selector_modal.dart:103-117 \u2014 before extracting anything, compare \u0060lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart\u0060 and \u0060lib/new-ui/widgets/buy_sell/buy_sell_selector_modal.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c722046d1b955feadb0c16d0c801e64f3e47eaa7cbcbf13237242cfe4d89423"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/new-ui/pages/home_page.dart:333-347 | lib/new-ui/pages/wallet_accounts_page.dart:284-298 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/home_page.dart"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f5226ed013173711ac6121884640d85390e56958b63e2c985a1c023644c939"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart:28-42 | lib/new-ui/widgets/anypay/select_recipient_network_sheet.dart:64-78 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart\u0060 and \u0060lib/new-ui/widgets/anypay/select_recipient_network_sheet.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"07032f8c6e794046f10b63614775ec57b49308d0665c380d298410a320addaaf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart:16-30 | lib/new-ui/widgets/receive_page/receive_amount_modal.dart:40-54 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart\u0060 and \u0060lib/new-ui/widgets/receive_page/receive_amount_modal.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 62 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dbee285891be5ff0e62fc45534b80a251039228fa41871d9715fbc86cb96a96"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:333-347 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:399-412 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"2481716931fcc81e506e4a95258dca329dbd4eec0115b08fa44461c568443ab3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/src/widgets/bottom_sheet/base_bottom_sheet_widget.dart:73-87 | lib/src/widgets/bottom_sheet/cake_pay_transaction_sent_bottom_sheet.dart:52-66 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/base_bottom_sheet_widget.dart"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"4668841d7c5d0769ddabef7d35a1db179fb47b911b3ce622cf92f3382c3e27f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/src/widgets/bottom_sheet/cake_pay_transaction_sent_bottom_sheet.dart:215-229 | lib/src/widgets/bottom_sheet/confirm_sending_bottom_sheet_widget.dart:364-378 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/cake_pay_transaction_sent_bottom_sheet.dart"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"4256ada570993c7a4c73ef4131fa3099fefd0cf83ff76508344bba35bba45dcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): lib/view_model/dashboard/dashboard_view_model.dart:143-157 | lib/view_model/dashboard/dashboard_view_model.dart:173-187 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"614a240cd815ead6e618ff50189b1e2da89165cf71b408c86104b7b6c074d1d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 5): lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart:75-88 | lib/new-ui/pages/buy_sell/buy_sell_confirmation_page.dart:19-32 | lib/new-ui/pages/buy_sell/buy_sell_payment_method_page.dart:17-30 | lib/new-ui/pages/buy_sell/buy_sell_provider_page.dart:30-43 | lib/new-ui/widgets/buy_sell/buy_sell_selector_modal.dart:15-28 \u2014 before extracting anything, compare \u0060lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart\u0060 and \u0060lib/new-ui/widgets/buy_sell/buy_sell_selector_modal.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"68cd632aaa46fe0a7e62d00a7aa6ab55965ca1c5690a1da432daa574be59bc59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 4): lib/exchange/provider/exolix_exchange_provider.dart:147-160 | lib/exchange/provider/simpleswap_exchange_provider.dart:127-140 | lib/exchange/provider/swaptrade_exchange_provider.dart:138-151 | lib/exchange/provider/trocador_exchange_provider.dart:178-191 \u2014 before extracting anything, compare \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/swaptrade_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c1931af16c1b8fd1f1c619758e9bd3af423073bf82d843d60f7f0c68fb018b1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201314 lines \u00D7 4): lib/store/settings_store.dart:518-531 | lib/store/settings_store.dart:565-575 | lib/store/settings_store.dart:746-759 | lib/store/settings_store.dart:779-791 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"143f09bea4ef4b37bcde5c63e271bbdf0616eef257ce696c20b8933e37fc6865"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): lib/exchange/provider/sideshift_exchange_provider.dart:248-261 | lib/exchange/provider/simpleswap_exchange_provider.dart:196-209 | lib/exchange/provider/swaptrade_exchange_provider.dart:221-234 \u2014 before extracting anything, compare \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 107 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"733d0093419b0dd2c1dfa8485d8c62495f0b0d130c50719ae13c5df61cd4170a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): lib/src/screens/dev/background_sync_logs_page.dart:39-52 | lib/src/screens/dev/exchange_provider_logs_page.dart:41-54 | lib/src/screens/dev/socket_health_logs_page.dart:27-40 \u2014 before extracting anything, compare \u0060lib/src/screens/dev/exchange_provider_logs_page.dart\u0060 and \u0060lib/src/screens/dev/socket_health_logs_page.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 45 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/background_sync_logs_page.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e92fa1a8e2ec35edf0e34671d020c12af04fe82f55dcd098c7c1edbe6fd55d5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): cw_bitcoin/lib/bitcoin_wallet.dart:512-525 | cw_bitcoin/lib/litecoin_wallet.dart:1562-1575 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/bitcoin_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":512}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0cf8e839c51e449b81188ca93b81dda01741fb1646fdbee996a35b6eaba716e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): cw_bitcoin/lib/electrum.dart:230-243 | cw_bitcoin/lib/electrum.dart:262-275 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e607c7f8db46a7e4bd6465ac282f203c0cd56c09da1179dfbb8a9b7824126b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet.dart:2287-2299 | cw_bitcoin/lib/litecoin_wallet.dart:953-966 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/electrum_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 78 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2287}}}],"partialFingerprints":{"codehealthFindingId/v1":"83101c2fab151047b566cafb9d0f6fffab18c4220785ecf0c0a68d13c5a16f16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet.dart:2592-2603 | cw_bitcoin/lib/electrum_wallet.dart:2665-2678 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2592}}}],"partialFingerprints":{"codehealthFindingId/v1":"800a114c8b011a58718b2ab23f98acc059f356882ac42eb3c0ef34e5791abb45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): cw_core/lib/spl_token_legacy.dart:77-90 | cw_core/lib/tron_token_legacy.dart:73-86 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/spl_token_legacy.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"22cd0b41201709213782d8c05e1bb0b98ea9becb941da2d5b1aaf6cb9632b387"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): cw_decred/lib/api/libdcrwallet.dart:527-540 | cw_decred/lib/api/libdcrwallet.dart:658-671 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb569a153e95ead5506e6e92eee57b50ef01d16fe69f381360770aa09db7d04d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): cw_evm/lib/evm_chain_wallet.dart:631-644 | cw_evm/lib/evm_chain_wallet.dart:659-672 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"5748f80c28b6f5c25673235f21188220a3ca43f75cb18d1415e2205cb66fe13e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): cw_nano/lib/nano_client.dart:100-113 | cw_nano/lib/nano_client.dart:125-138 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e9db0e6e610b946c385adc8ec11aafb5b65f69b0c819c03ebb429e1a826a63c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): cw_solana/lib/solana_wallet_service.dart:37-49 | cw_tron/lib/tron_wallet_service.dart:41-54 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet_service.dart\u0060 and \u0060cw_tron/lib/tron_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet_service.dart"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"746e1c072da7637616a1c551f8e998162fc99a06c34d0d5cca7f16495124fcad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): cw_solana/lib/solana_wallet_service.dart:142-155 | cw_tron/lib/tron_wallet_service.dart:123-136 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet_service.dart\u0060 and \u0060cw_tron/lib/tron_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet_service.dart"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"699bbfbb29596f76916a9ff1c077d7d5636e0299618da8216adc9fa6a28aed82"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): cw_zcash/lib/src/zcash_taddress_rotation.dart:110-123 | cw_zcash/lib/src/zcash_taddress_rotation.dart:154-166 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_taddress_rotation.dart"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"7470280a41c0dc5f04496a1a743cf6ca3d6ddcf34ef6341c6203c9862c424ff9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): cw_zcash/lib/src/zcash_taddress_rotation.dart:437-449 | cw_zcash/lib/src/zcash_wallet.dart:1288-1301 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_taddress_rotation.dart"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2fa214890177943e802c96dc8a015e7c0ac8a0f103430703591ddaa08c932c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/cake_pay/src/widgets/card_item.dart:19-32 | lib/cake_pay/src/widgets/user_card_item.dart:12-25 \u2014 before extracting anything, compare \u0060lib/cake_pay/src/widgets/card_item.dart\u0060 and \u0060lib/cake_pay/src/widgets/user_card_item.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/widgets/card_item.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31c8953ff4f7c6938b1a765ead20648f4e5a38ec2908ad67d6f9f6e0d363185"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): lib/cake_pay/src/widgets/card_item.dart:36-49 | lib/cake_pay/src/widgets/user_card_item.dart:32-44 \u2014 before extracting anything, compare \u0060lib/cake_pay/src/widgets/card_item.dart\u0060 and \u0060lib/cake_pay/src/widgets/user_card_item.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/widgets/card_item.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"58edb7140fd00adf491e407d1980ab6964a49d0dd1a7b50202b87ee365487bd4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:125-138 | lib/exchange/provider/trocador_exchange_provider.dart:174-187 \u2014 before extracting anything, compare \u0060lib/exchange/provider/changenow_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 35 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"76115917571dcbb95a9ac9669a78d25a099d7f863ad16b3a95517d33f4f8690c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/exchange/provider/jupiter_exchange_provider.dart:272-285 | lib/exchange/provider/jupiter_exchange_provider.dart:297-310 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/jupiter_exchange_provider.dart"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"005251931099ba38d38e0080aae581f8ca5caf8d88cc55b42869ef87ed327f5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/exchange/provider/letsexchange_exchange_provider.dart:207-220 | lib/exchange/provider/letsexchange_exchange_provider.dart:260-273 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c34557e0bde6a7cd67638e6053c4418061d79dea2d3ab454961c3022fff21b8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/new-ui/pages/account_education_page.dart:40-54 | lib/new-ui/pages/account_education_page.dart:61-74 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/account_education_page.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8161a0328bcbd7a87bafcdf7626153f1c2d15b9530568878739b834dbcb2aa0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/new-ui/pages/card_customizer.dart:297-310 | lib/src/screens/settings/widgets/settings_theme_choice.dart:81-94 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/card_customizer.dart"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa5627797758edb9074049933bd10dd84061d87e80f2f20dc4134ad170b4c40e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/new-ui/pages/settings_page.dart:341-354 | lib/new-ui/pages/settings_page.dart:419-432 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/settings_page.dart"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"330f0700dbc807e273e3b48e5e9d3b7e1627b7403755a412387bfe62b2b665df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart:646-659 | lib/new-ui/widgets/currency_picker/pill_grid.dart:60-73 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"342b731fc54478392a763029aac9f685c19b573a2164088078bf29c5a3118079"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/src/screens/contact/contact_list_page.dart:254-267 | lib/src/screens/contact/contact_list_page.dart:359-372 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/contact/contact_list_page.dart"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b9a6b316e6e0c00a752aea2b5ae89dbfc8cf17e18083ab5132a9cb84814b194"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/src/screens/contact/contact_list_page.dart:486-499 | lib/src/screens/wallet_list/wallet_list_page.dart:93-106 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/contact/contact_list_page.dart"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"f883bc056f3070eb8393b1db544383fea6fb64346737a20c6399bd14cb39704c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): lib/src/screens/new_wallet/widgets/grouped_wallet_expansion_tile.dart:53-66 | lib/src/screens/new_wallet/widgets/select_button.dart:40-52 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/widgets/grouped_wallet_expansion_tile.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"33a0760b80925fd0092a9f1aaad3838cf12360f4c2e30c3f7d72c34595cce477"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart:65-78 | lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart:101-114 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"8deedb869ffee2de48a696338c94939f7b02728e7ff6865b8dfac2c4b1df3671"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): lib/src/widgets/picker.dart:320-333 | lib/src/widgets/picker.dart:409-421 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/picker.dart"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"4609f04ab675a930648237859ca6261adcdcc3b81896ddda52bcaf4093787069"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201314 lines \u00D7 2): lib/store/settings_store.dart:302-312 | lib/store/settings_store.dart:387-400 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a98a872f0ae02b62de9cdf1f104c09060d7a9e5ee9ba5c96f0dc3ba50b75829"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4): cw_monero/lib/monero_wallet_service.dart:284-296 | cw_monero/lib/monero_wallet_service.dart:390-402 | cw_wownero/lib/wownero_wallet_service.dart:275-287 | cw_wownero/lib/wownero_wallet_service.dart:312-324 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_service.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 76 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"0be5bc431be711eccc97fe096e5d20230f40f89cda01078952e65c173227df04"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4): lib/exchange/provider/exolix_exchange_provider.dart:229-241 | lib/exchange/provider/exolix_exchange_provider.dart:252-264 | lib/exchange/provider/trocador_exchange_provider.dart:290-302 | lib/exchange/provider/trocador_exchange_provider.dart:313-325 \u2014 before extracting anything, compare \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 118 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"dff8a5e19207b375d7b043e8755801dca10eb9510e52b33867970c98e0ebe15f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): cw_bitcoin/lib/bitcoin_wallet_service.dart:119-131 | cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart:85-97 | cw_dogecoin/lib/src/dogecoin_wallet_service.dart:85-97 \u2014 before extracting anything, compare \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart\u0060 and \u0060cw_dogecoin/lib/src/dogecoin_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 59 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet_service.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ce71074d68ddd39b50d019ed3a9ff517ce7e8a6b962827efff6e52e9aba5a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): lib/cake_pay/src/widgets/denominations_amount_widget.dart:81-93 | lib/cake_pay/src/widgets/denominations_amount_widget.dart:114-126 | lib/cake_pay/src/widgets/denominations_amount_widget.dart:147-159 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/widgets/denominations_amount_widget.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"49a1c36942336d7477a303a3abe0e0205c90687f10648ecca19734423eb2a28e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4): lib/entities/evm_transaction_error_fees_handler.dart:51-64 | lib/entities/evm_transaction_error_fees_handler.dart:69-81 | lib/entities/evm_transaction_error_fees_handler.dart:86-98 | lib/entities/evm_transaction_error_fees_handler.dart:99-112 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/evm_transaction_error_fees_handler.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"edbe299f3814ecbb654751b75afc4b2bf34a5558ac17dc4c9779448ab8969b81"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:55-67 | lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:113-125 | lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:188-200 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e9b9d41696e4cbdbad3aa9ce9317413e1f96470302d88a8ba9c787194590b8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet.dart:1578-1590 | cw_bitcoin/lib/electrum_wallet.dart:1613-1624 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1578}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7b667fba5700963b6e322b128978575a7722c119792d255242457fec7de1be4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet_addresses.dart:818-831 | cw_bitcoin/lib/electrum_wallet_addresses.dart:854-866 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":818}}}],"partialFingerprints":{"codehealthFindingId/v1":"382dd9a971b3dbdca2d131ba60b418a701db564ba829489028ea813c12860f5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): cw_evm/lib/hardware/evm_chain_bitbox_credentials.dart:48-60 | cw_evm/lib/hardware/evm_chain_ledger_credentials.dart:45-57 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/hardware/evm_chain_bitbox_credentials.dart"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eface3e62afa500a176c60a825f34d032e85ba63cd38c6c4da761a6e697532f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): cw_monero/lib/monero_wallet_service.dart:151-163 | cw_wownero/lib/wownero_wallet_service.dart:114-126 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_service.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 76 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"b97f67a32325d2a20e3f69729bda5d50649e4e9a0fc4932adf1ddf4f9b53ca4c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): cw_solana/lib/solana_wallet_service.dart:67-79 | cw_tron/lib/tron_wallet_service.dart:65-77 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet_service.dart\u0060 and \u0060cw_tron/lib/tron_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet_service.dart"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"e71cbadeb5d20b65047153728dd65955c98995c430e022494c83be24286ea523"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): cw_solana/lib/solana_wallet_service.dart:120-132 | cw_tron/lib/tron_wallet_service.dart:99-111 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet_service.dart\u0060 and \u0060cw_tron/lib/tron_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet_service.dart"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"df680f9fd61bd6c38e73cfd83f2fc64ab120d4ca9fda115c00522b66798b8f10"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): cw_tron/lib/tron_client.dart:207-219 | cw_tron/lib/tron_client.dart:356-368 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_client.dart"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9cc72f9b3edd1e520386ca8b2326c733ad74d12553ec167b3db95b1b251e59f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): cw_wownero/lib/api/wallet.dart:288-300 | cw_zano/lib/zano_wallet.dart:749-761 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/api/wallet.dart"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac19f6a3b74a3eae2b05095d6e6310d456a61e982af35f86c92e8a1e4958566"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): cw_wownero/lib/wownero_wallet.dart:625-637 | cw_zano/lib/zano_wallet.dart:660-671 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5893619cbb61489976da95298601d2d641d24ffea6bf9d3ecd322fa9c7d16d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/core/address_validator.dart:150-162 | lib/core/address_validator.dart:302-314 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_validator.dart"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"35206a0a33e3f78f0c6d670c9c36d6291be1e801bc599bc98b07eef612dd36de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/entities/qr_scanner.dart:66-78 | lib/new-ui/pages/scan_page.dart:426-438 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/qr_scanner.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"463dd15601442eac07c630419235dc1811dcb0dd9dfd8ee0d91601e818b9e66a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/exchange/provider/chainflip_exchange_provider.dart:212-224 | lib/exchange/provider/sideshift_exchange_provider.dart:303-315 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 37 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"902f25bf1848884a9168b6595cbcb368c80a3bb6533a1a4fa893a2229aecc51d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart:486-498 | lib/new-ui/pages/swap_page.dart:979-991 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9d43692ad504fc99e0fa7b213b25e7d4273f0684bed1e33a57acb6265e9fa38"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/new-ui/widgets/currency_picker/fiat_currency_search_result.dart:22-34 | lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart:279-291 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/fiat_currency_search_result.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"4570c02e8e635d11e7c5bc56a7825dd7539c2b64e462aca509f74cbd81bb1b4f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/src/screens/anonpay_details/anonpay_details_page.dart:60-72 | lib/src/screens/payjoin_details/payjoin_details_page.dart:67-79 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/anonpay_details/anonpay_details_page.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"408353c986abd37679aa685dddb68305a2138a66518906c4c6327a62fe2cdb72"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/src/screens/dashboard/widgets/nft_tile_widget.dart:25-37 | lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart:45-57 \u2014 before extracting anything, compare \u0060lib/src/screens/dashboard/widgets/nft_tile_widget.dart\u0060 and \u0060lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/nft_tile_widget.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cddba0457e851300f1d897abecb95b3816a1a7edebe3691b920b6dec91d577c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/src/screens/dev/secure_preferences_page.dart:56-68 | lib/src/screens/dev/shared_preferences_page.dart:68-80 \u2014 before extracting anything, compare \u0060lib/src/screens/dev/secure_preferences_page.dart\u0060 and \u0060lib/src/screens/dev/shared_preferences_page.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/secure_preferences_page.dart"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ef3bd461574f6490b74636a5b2edac5e255d509f01515b8ab319d7e4bc3980e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/src/screens/new_wallet/new_wallet_page.dart:223-235 | lib/src/screens/new_wallet/new_wallet_page.dart:242-254 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/new_wallet_page.dart"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed0449be9dc3dc44be947119bf1f72a9fc33a902b49ef66058184671bcd8894d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/src/screens/wallet_connect/wc_connections_listing_view.dart:170-182 | lib/src/screens/wallet_connect/wc_connections_listing_view.dart:208-220 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/wc_connections_listing_view.dart"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"43ef4f8e887cbaef576b92ab2414dc16533bfc8df99478debf51b1ce494bac4f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/src/widgets/primary_button.dart:175-187 | lib/src/widgets/primary_button.dart:242-254 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/primary_button.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb60d8603d9e5e584fd4de22be75baff146ddcbf64e2eae33d3344a3d13e42a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/view_model/dashboard/nft_view_model.dart:272-284 | lib/view_model/dashboard/nft_view_model.dart:410-422 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/nft_view_model.dart"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"71c8920c4daea2c2be2aa53dac2922de9343580646916bd9ab7745920de2a22e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/view_model/exchange/exchange_trade_view_model.dart:60-72 | lib/view_model/trade_details_view_model.dart:48-60 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_trade_view_model.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8e21454a99e3c05a4138fc757849f9298b906af25592fe4a8bd0d35b445bd2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/view_model/send/send_view_model.dart:621-633 | lib/view_model/send/send_view_model.dart:659-671 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5b9ac78254ef25e902b06dce01c999385fb6fab877e76169e1c0783f67574d8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 6): lib/exchange/provider/chainflip_exchange_provider.dart:208-219 | lib/exchange/provider/jupiter_exchange_provider.dart:344-355 | lib/exchange/provider/sideshift_exchange_provider.dart:299-310 | lib/exchange/provider/simpleswap_exchange_provider.dart:248-259 | lib/exchange/provider/swaptrade_exchange_provider.dart:246-257 | lib/exchange/provider/thorchain_exchange.provider.dart:161-172 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/jupiter_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 56 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d52778ae6d62fe36b4293ab3547f083776e0eca5cd667e83c2d557a73dc47a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 6): lib/exchange/provider/exolix_exchange_provider.dart:229-240 | lib/exchange/provider/exolix_exchange_provider.dart:252-263 | lib/exchange/provider/exolix_exchange_provider.dart:280-291 | lib/exchange/provider/trocador_exchange_provider.dart:290-301 | lib/exchange/provider/trocador_exchange_provider.dart:313-324 | lib/exchange/provider/trocador_exchange_provider.dart:346-357 \u2014 before extracting anything, compare \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 118 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"5108df220eae5c1302c27ba8313c099e3035387eb41142f5c09311ba60b355fc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5): lib/exchange/provider/simpleswap_exchange_provider.dart:201-212 | lib/exchange/provider/simpleswap_exchange_provider.dart:223-234 | lib/exchange/provider/simpleswap_exchange_provider.dart:251-262 | lib/exchange/provider/swaptrade_exchange_provider.dart:226-237 | lib/exchange/provider/swaptrade_exchange_provider.dart:249-260 \u2014 before extracting anything, compare \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/swaptrade_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 79 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/simpleswap_exchange_provider.dart"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6df63e47300f24a9bdd444b48084dd8426a0d6c04770a2fc6d7effc8d1cb947"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4): cw_decred/lib/api/libdcrwallet.dart:430-441 | cw_decred/lib/api/libdcrwallet.dart:498-509 | cw_decred/lib/api/libdcrwallet.dart:513-524 | cw_decred/lib/api/libdcrwallet.dart:572-583 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee1018d0bd650bb77df39c4b0fcbf18896f2c24ce6c310cc1504c56bb71a19d5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4): cw_monero/lib/monero_wallet_service.dart:235-246 | cw_nano/lib/nano_wallet_service.dart:65-76 | cw_zano/lib/zano_wallet_service.dart:119-130 | cw_zcash/lib/src/zcash_wallet_service.dart:133-144 \u2014 before extracting anything, compare \u0060cw_nano/lib/nano_wallet_service.dart\u0060 and \u0060cw_zano/lib/zano_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 32 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"11a6cf56af0279ffbea684f975a7d27e2aa1448b0cfaea3034b209eca4711924"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4): lib/exchange/provider/chainflip_exchange_provider.dart:211-222 | lib/exchange/provider/sideshift_exchange_provider.dart:253-264 | lib/exchange/provider/sideshift_exchange_provider.dart:275-286 | lib/exchange/provider/sideshift_exchange_provider.dart:302-313 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 37 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"48af2dffd2d78e4b7fb17d4cf6600481f9b2f3407a5b15c3bef22777599e6436"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): cw_core/lib/utils/proxy_socket/insecure.dart:55-66 | cw_core/lib/utils/proxy_socket/secure.dart:62-73 | cw_core/lib/utils/proxy_socket/socks.dart:45-56 \u2014 before extracting anything, compare \u0060cw_core/lib/utils/proxy_socket/insecure.dart\u0060 and \u0060cw_core/lib/utils/proxy_socket/secure.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 34 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_socket/insecure.dart"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"519e9b950a8c4913cfed2b19c14cbdd45d5ebbafc7931aa0519032659052fa49"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): cw_evm/lib/evm_chain_wallet.dart:1241-1252 | cw_solana/lib/solana_wallet.dart:575-586 | cw_tron/lib/tron_wallet.dart:548-559 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet.dart\u0060 and \u0060cw_tron/lib/tron_wallet.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 52 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1241}}}],"partialFingerprints":{"codehealthFindingId/v1":"508c4f08fd84641d1d1d2fa515a5a863335d2248c1a9b2e337a494c2b4b717e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): cw_nano/lib/nano_client.dart:167-178 | cw_nano/lib/nano_client.dart:295-306 | cw_nano/lib/nano_client.dart:405-416 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f34dc7adee899bd02d72ac886547f5aa972e3d56eb79159a13cefd041f80e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): lib/exchange/provider/chainflip_exchange_provider.dart:250-261 | lib/exchange/provider/jupiter_exchange_provider.dart:387-398 | lib/exchange/provider/swaptrade_exchange_provider.dart:288-299 \u2014 before extracting anything, compare \u0060lib/exchange/provider/chainflip_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/jupiter_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 56 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"494c09f6ec68f3983ddd1de3cc91faa6b45d433c40bed1b5e95ead2c0d3d0308"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): lib/exchange/provider/letsexchange_exchange_provider.dart:314-325 | lib/exchange/provider/stealth_ex_exchange_provider.dart:207-218 | lib/exchange/provider/stealth_ex_exchange_provider.dart:260-271 \u2014 before extracting anything, compare \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/stealth_ex_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 131 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"e076f3f30a1df5efe2cf2dc0efc675ca28ea6c957601a97dc7b8dab6a657b37c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 3): lib/src/screens/new_wallet/new_wallet_page.dart:201-211 | lib/src/screens/restore/wallet_restore_from_keys_form.dart:167-178 | lib/src/screens/restore/wallet_restore_from_seed_form.dart:169-180 \u2014 before extracting anything, compare \u0060lib/src/screens/restore/wallet_restore_from_keys_form.dart\u0060 and \u0060lib/src/screens/restore/wallet_restore_from_seed_form.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 48 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/new_wallet_page.dart"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e5525720c1b75c941aa793b958bf987865eba7d71f76c5fc76c64ee39f2224c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): cw_core/lib/node.dart:311-322 | cw_core/lib/node_legacy.dart:201-212 \u2014 before extracting anything, compare \u0060cw_core/lib/node.dart\u0060 and \u0060cw_core/lib/node_legacy.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 50 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"a089491314e1bdb543f59487d4e11085f509bb1ba5a498ceaefd5dd8e48bc97f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): cw_core/lib/node.dart:350-361 | lib/core/wallet_creation_service.dart:78-89 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"04974325f093bbab467849fda71bcdbeecbc1094b094989ef0d48dcca6dd91a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): cw_core/lib/spl_token.dart:145-156 | cw_core/lib/tron_token.dart:119-130 \u2014 before extracting anything, compare \u0060cw_core/lib/spl_token.dart\u0060 and \u0060cw_core/lib/tron_token.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/spl_token.dart"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf083205d81dbbb54097d0c51ddb1258663737d4b3d6322322032766f0ded94c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): cw_decred/lib/api/libdcrwallet.dart:235-246 | cw_decred/lib/api/libdcrwallet.dart:249-260 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec6ec60e334a2dcf15c5d95b9c5f9680b505c2597e25816bbb1d0dc424e18950"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): cw_evm/lib/evm_chain_wallet.dart:645-656 | cw_evm/lib/evm_chain_wallet.dart:674-685 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":645}}}],"partialFingerprints":{"codehealthFindingId/v1":"df5b0d8a0dda5d25b488ab9f81135e892694ae245a06b612d85398346fc4888c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): cw_monero/lib/monero_wallet_service.dart:231-242 | cw_wownero/lib/wownero_wallet_service.dart:223-234 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_service.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 76 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a56f74c3fcea5b36778798250fda82f19a29c47a701d3a84a327198dba4f577"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): cw_monero/lib/monero_wallet_service.dart:452-463 | cw_wownero/lib/wownero_wallet_service.dart:331-342 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_service.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 76 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4fc2b8dffdfbd3836d9a4615c7ec3620a40b44bee338a39cdc0fe8e13d8d8e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): cw_zcash/lib/src/zcash_wallet.dart:1619-1630 | cw_zcash/lib/src/zcash_wallet.dart:1634-1645 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1619}}}],"partialFingerprints":{"codehealthFindingId/v1":"c637a88b5369a5b0da3c55ffac842b0f663a9e79b2a2f011d2b34e65117ecfc3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/cake_pay/src/cards/cake_pay_buy_card_page.dart:619-630 | lib/cake_pay/src/cards/cake_pay_buy_card_page.dart:691-702 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":619}}}],"partialFingerprints":{"codehealthFindingId/v1":"6abaa8f451aee650d767d5dbdda7429f32ddd0a8a62464e463a5520c5032bdf1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): lib/exchange/provider/sideshift_exchange_provider.dart:236-246 | lib/exchange/provider/sideshift_exchange_provider.dart:409-420 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fa5bd5e8418e07696a365ddb0b554a09ab7ffcbadf12500bd9d941164a7a0e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/exchange/provider/stealth_ex_exchange_provider.dart:289-300 | lib/exchange/provider/stealth_ex_exchange_provider.dart:366-377 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/stealth_ex_exchange_provider.dart"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"db276c40d70b1e007a15f316d83da5a8f0c45ee67fff3caf9e3296b831b1802f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/exchange/provider/xoswap_exchange_provider.dart:351-362 | lib/exchange/provider/xoswap_exchange_provider.dart:394-405 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab0b1c47d1769c03477937a797ca670f43f2b2fdb8abf7bc90a14f14829c654"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/new-ui/pages/seed/dismiss_seed_verification_page.dart:13-24 | lib/new-ui/pages/seed/skip_seed_verification_page.dart:14-25 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/seed/dismiss_seed_verification_page.dart"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0049e1fcf78e8691b5dfcdc4ccc4d4716f07eaf3478a9d886466104e03dacda9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): lib/new-ui/pages/seed/pre_seed_page.dart:39-50 | lib/new-ui/pages/seed/seed_backup_reminder_page.dart:26-36 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/seed/pre_seed_page.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b080cd10ea99f818e256f98843d56f365b7803a6497ec12fc97e642d1800a5e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/new-ui/viewmodels/card_customizer/card_customizer_state.dart:119-130 | lib/new-ui/viewmodels/card_customizer/card_customizer_state.dart:159-170 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/viewmodels/card_customizer/card_customizer_state.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ae77749f5296ada3e3283021bc9f5dc579d361c599e57cce9c4b1fc5358d76c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/new-ui/widgets/bridge/transfer_history_row.dart:128-139 | lib/src/screens/dashboard/widgets/order_row.dart:80-91 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/bridge/transfer_history_row.dart"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"fca53a9a5738d15c537619ed378e0ef16a04186ee544cd4e11a7c0511c810feb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/new-ui/widgets/coins_page/cards/cards_view.dart:356-367 | lib/new-ui/widgets/coins_page/cards/cards_view.dart:403-414 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/cards_view.dart"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d20e417ee8e3c6fe97eff1fba397535ee1a7cd590cb7c296bc41158d8950c08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/new-ui/widgets/hardware_wallet/proceed_on_device_sheet.dart:119-130 | lib/new-ui/widgets/hardware_wallet/sync_key_images_sheet.dart:64-75 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/proceed_on_device_sheet.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"4879350895e876d856c3d3e2a5c3d756c9471a40cf4e82af8938e46f352ca319"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart:32-43 | lib/new-ui/widgets/receive_page/receive_amount_modal.dart:56-67 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart\u0060 and \u0060lib/new-ui/widgets/receive_page/receive_amount_modal.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 62 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"2476e1553158921c7ed95df83d10179a5a56fdee1dd681120da60582799e2331"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): lib/src/screens/auth/auth_page.dart:55-66 | lib/src/screens/wallet_unlock/wallet_unlock_page.dart:44-54 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/auth/auth_page.dart"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"884e9a5b8a02355cb1ba4081ef3b2a8ac27ca75a1dae2892a067fd6cc0fbf4a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/src/screens/connect_device/select_hardware_wallet_account_page.dart:59-70 | lib/src/screens/new_wallet/new_wallet_page.dart:144-155 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/select_hardware_wallet_account_page.dart"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f2bfe77686dac7ac4f78640174659e1bf6d352aa59cb9681b585451db0bc59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/src/screens/contact/contact_list_page.dart:468-479 | lib/src/screens/wallet_list/wallet_list_page.dart:75-86 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/contact/contact_list_page.dart"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"de67ffb085bd78d61bbf1b8c43819033afdb5886b9a44881d4a9eef4e08a2e9a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/src/screens/integrations/deuro/widgets/interest_card_widget.dart:33-44 | lib/src/widgets/dashboard_card_widget.dart:43-66 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/integrations/deuro/widgets/interest_card_widget.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c27bcfce042c6cddf7111ae21909a9f08360a9bdaa18351234fd11ec7c6da9fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/src/screens/restore/wallet_restore_from_seed_form.dart:224-235 | lib/src/screens/restore/wallet_restore_from_seed_form.dart:269-280 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_from_seed_form.dart"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cfb0365c24ed0950f4d3d0f9510c937e4cd4467f8072aba8db16cf278bc6450"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): lib/src/screens/wallet/wallet_edit_page.dart:195-206 | lib/src/screens/wallet_connect/wc_pairing_detail_page.dart:143-153 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet/wallet_edit_page.dart"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6a9176c919e0c8d2ab5117f07c347251f7409ba6935d666983ed68807f1431a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/src/widgets/bottom_sheet/add_passphrase_bottom_sheet_widget.dart:126-137 | lib/src/widgets/bottom_sheet/add_passphrase_bottom_sheet_widget.dart:148-159 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/add_passphrase_bottom_sheet_widget.dart"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8b0e7a1d79fdef9ebc434619970bcecb3edf1f6d0a1e649cf5ffa54c5e487f1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/src/widgets/bottom_sheet/cake_pay_card_info_bottom_sheet_widget.dart:57-68 | lib/src/widgets/bottom_sheet/confirm_sending_bottom_sheet_widget.dart:86-97 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/cake_pay_card_info_bottom_sheet_widget.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc675441dd09b2201a5d08111db18fa88b52a489807dbd9665ddc95d7ab1a6bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/store/settings_store.dart:302-313 | lib/store/settings_store.dart:413-424 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"717595aeb60ac92231e58161544d9fa040913c576c3dfdf1a378efbfe1f8b44c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/view_model/dashboard/dashboard_view_model.dart:1529-1540 | lib/view_model/dashboard/dashboard_view_model.dart:1549-1561 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":1529}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f35340115308169698414bd4d7c92f1e4f18b61c3b517063750af49834b55a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): lib/view_model/hardware_wallet/ledger_view_model.dart:92-103 | lib/view_model/hardware_wallet/trezor_connect_view_model.dart:85-96 \u2014 before extracting anything, compare \u0060lib/view_model/hardware_wallet/ledger_view_model.dart\u0060 and \u0060lib/view_model/hardware_wallet/trezor_connect_view_model.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 32 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/ledger_view_model.dart"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b7e75fdf05b9dc8934643045380fa40694ec40125998c4aea694462825dd31"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 6): cw_decred/lib/api/libdcrwallet.dart:332-341 | cw_decred/lib/api/libdcrwallet.dart:385-394 | cw_decred/lib/api/libdcrwallet.dart:429-438 | cw_decred/lib/api/libdcrwallet.dart:496-506 | cw_decred/lib/api/libdcrwallet.dart:512-521 | cw_decred/lib/api/libdcrwallet.dart:571-580 \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"18088cff104d684658ada41033d13c20227913114eba7316e8ba7576bbdb69d3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 6): lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart:77-87 | lib/new-ui/pages/buy_sell/buy_sell_confirmation_page.dart:21-31 | lib/new-ui/pages/buy_sell/buy_sell_payment_method_page.dart:19-29 | lib/new-ui/pages/buy_sell/buy_sell_provider_page.dart:32-42 | lib/new-ui/pages/buy_sell/buy_sell_redirecting_page.dart:37-47 | lib/new-ui/widgets/buy_sell/buy_sell_selector_modal.dart:17-27 \u2014 before extracting anything, compare \u0060lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart\u0060 and \u0060lib/new-ui/widgets/buy_sell/buy_sell_selector_modal.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"78dfd70c44ec239c57ecf48116083907e48c3844b17a4ef89430155e0d317f81"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 5): lib/exchange/provider/exolix_exchange_provider.dart:228-238 | lib/exchange/provider/exolix_exchange_provider.dart:251-261 | lib/exchange/provider/trocador_exchange_provider.dart:259-269 | lib/exchange/provider/trocador_exchange_provider.dart:289-299 | lib/exchange/provider/trocador_exchange_provider.dart:312-322 \u2014 before extracting anything, compare \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 118 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fce0a2c6786509cc79b747a29981684e532f25c680a7672f0065df801b51aa8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 5): lib/exchange/provider/letsexchange_exchange_provider.dart:207-217 | lib/exchange/provider/letsexchange_exchange_provider.dart:260-270 | lib/exchange/provider/letsexchange_exchange_provider.dart:314-324 | lib/exchange/provider/stealth_ex_exchange_provider.dart:207-217 | lib/exchange/provider/stealth_ex_exchange_provider.dart:260-270 \u2014 before extracting anything, compare \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/stealth_ex_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 131 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a40bc6c7a7af794b90fdbbef898aa9c30ca6506e903968b133d037697075c17"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 5): lib/exchange/provider/sideshift_exchange_provider.dart:252-262 | lib/exchange/provider/sideshift_exchange_provider.dart:274-284 | lib/exchange/provider/simpleswap_exchange_provider.dart:200-210 | lib/exchange/provider/simpleswap_exchange_provider.dart:222-232 | lib/exchange/provider/swaptrade_exchange_provider.dart:225-235 \u2014 before extracting anything, compare \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 107 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"96d57f43070e49aca5a6474dafd4272be5c6c2796966b6e04592ca43d467552a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart:19-29 | lib/src/screens/dashboard/widgets/payjoin_transaction_row.dart:22-32 | lib/src/screens/dashboard/widgets/trade_row.dart:31-41 | lib/src/screens/dashboard/widgets/transaction_raw.dart:27-37 \u2014 before extracting anything, compare \u0060lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart\u0060 and \u0060lib/src/screens/dashboard/widgets/payjoin_transaction_row.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eeaaf1209ec410f63de8c232f7848e45fd30e6fefcec981c6358be33a8f0e20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): cw_bitcoin/lib/bitcoin_wallet.dart:513-523 | cw_bitcoin/lib/electrum_wallet.dart:1968-1978 | cw_bitcoin/lib/litecoin_wallet.dart:1563-1573 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/bitcoin_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3c2db82dc76e06d253cc273cb7c335bec2b9dcaf5f32edcfc6c57017eed8cdf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): cw_evm/lib/evm_chain_wallet_service.dart:114-124 | cw_evm/lib/evm_chain_wallet_service.dart:241-251 | cw_evm/lib/evm_chain_wallet_service.dart:282-292 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet_service.dart"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3dbb5a4fb815bda36c7a6eaa66f21861fc5bc9d09048b9e1985a201683696a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 3): cw_nano/lib/nano_wallet_service.dart:63-72 | cw_zano/lib/zano_wallet_service.dart:117-126 | lib/haven/cw_haven.dart:22-32 \u2014 before extracting anything, compare \u0060cw_nano/lib/nano_wallet_service.dart\u0060 and \u0060cw_zano/lib/zano_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 32 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_wallet_service.dart"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"28e1b7a1ff5f16a8ddd97d36d80afb73eb5bd412312d75299fb716bc03b09e09"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 3): lib/cake_pay/src/cards/cake_pay_buy_card_page.dart:134-144 | lib/cake_pay/src/widgets/card_item.dart:42-51 | lib/cake_pay/src/widgets/user_card_item.dart:37-46 \u2014 before extracting anything, compare \u0060lib/cake_pay/src/widgets/card_item.dart\u0060 and \u0060lib/cake_pay/src/widgets/user_card_item.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"a49674c6803b4077bbc613d02937cda5b824539e28e6dd043c79f244ed868997"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): lib/decred/cw_decred.dart:54-64 | lib/nano/cw_nano.dart:150-160 | lib/solana/cw_solana.dart:63-73 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/decred/cw_decred.dart"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"62bdb31f71160d24d4b0e54759b8f89786c06cb672ef0462c8a1c23257827255"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): lib/exchange/provider/letsexchange_exchange_provider.dart:308-318 | lib/exchange/provider/near_Intents_exchange_provider.dart:317-327 | lib/exchange/provider/stealth_ex_exchange_provider.dart:306-316 \u2014 before extracting anything, compare \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/near_Intents_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 44 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bba75b3da70c0151ae7bde73125ad966e3947c3c8bd31b2dd51e673f8f2eb8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): lib/monero/cw_monero.dart:328-338 | lib/wownero/cw_wownero.dart:282-292 | lib/zano/cw_zano.dart:96-106 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaa3eb318ccce57f93e3c0d99c4193825def265c2ec67b700cefe0ba87497014"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 3): lib/src/screens/transaction_details/widgets/textfield_list_row.dart:49-59 | lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart:16-26 | lib/src/widgets/standard_list_status_row.dart:11-19 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/transaction_details/widgets/textfield_list_row.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a8dda1adbf575c4d023822fc3488aee297af7af196c8709a5cd432af48a929a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_bitcoin/lib/hardware/bitbox_service.dart:26-36 | cw_bitcoin/lib/hardware/bitbox_service.dart:79-89 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/hardware/bitbox_service.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89650b2907d079bdc87d354dafe3d41835abf5beb1a3e46bbc956658cae05b4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_core/lib/erc20_token.dart:143-153 | cw_core/lib/tron_token.dart:133-143 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/erc20_token.dart"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ddd4d244b59dbd61259634691a290b15d0fa93c3ba511a1538ea98da824039e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_evm/lib/evm_chain_wallet.dart:799-809 | cw_tron/lib/tron_wallet.dart:249-259 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":799}}}],"partialFingerprints":{"codehealthFindingId/v1":"81e2ffcd61c8c9a53997056209eba0a157085241a38f842fe5dbfd30adf561d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_evm/lib/evm_chain_wallet.dart:894-904 | cw_evm/lib/evm_chain_wallet.dart:919-929 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a1e54f598834a27cb0a21d9a5a7c04a12f5ca41bce512dc90746c008d39b4a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_monero/lib/monero_wallet_addresses.dart:95-105 | cw_wownero/lib/wownero_wallet_addresses.dart:89-99 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_addresses.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_addresses.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 43 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_addresses.dart"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1f453eae171ab3487d605bc0c8d076f447190ce7a9795fe685b995f920813b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/buy/dfx/dfx_buy_provider.dart:383-393 | lib/buy/robinhood/robinhood_buy_provider.dart:203-213 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/dfx/dfx_buy_provider.dart"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac70fd72988fbd526bac64b6ada0b87db2a7cf6da13042bf174bf9c166eae24f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/buy/wyre/wyre_buy_provider.dart:78-88 | lib/buy/wyre/wyre_buy_provider.dart:108-118 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/wyre/wyre_buy_provider.dart"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5209b3a5cec88bf4439e05b9758e668380814811081e8ecd6ab2dbc07893edc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/exchange/provider/exolix_exchange_provider.dart:275-285 | lib/exchange/provider/swaptrade_exchange_provider.dart:244-254 \u2014 before extracting anything, compare \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/swaptrade_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/exolix_exchange_provider.dart"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"97016968ba8b6548351d78f951a47899b4dd46704bfedeb9ab688eaa4ad49a61"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/exchange/provider/swaptrade_exchange_provider.dart:282-292 | lib/exchange/provider/xoswap_exchange_provider.dart:436-446 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swaptrade_exchange_provider.dart"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"221a681ae1912214b5cafa0f270f984217688f80e74ea633f42b57e7a7c836a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): lib/exchange/provider/trocador_exchange_provider.dart:421-431 | lib/exchange/provider/trocador_exchange_provider.dart:433-442 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/trocador_exchange_provider.dart"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b8864c261029880ce8778a9339b6f80d5d858e7550f0a5fd4d4f66e3f0c92ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/exchange/provider/xoswap_exchange_provider.dart:307-317 | lib/exchange/provider/xoswap_exchange_provider.dart:350-360 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"c70b9a19aa9fbcc839df64f4fec67c8f02a2a7ab8dd2d2e6a58c881ee0c68a8c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/exchange/provider/xoswap_exchange_provider.dart:376-386 | lib/exchange/provider/xoswap_exchange_provider.dart:522-532 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"d25d1cf7967de48678e069904b97755aa9d7d2963f86299a6807dbedb71e89b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/new-ui/new_dashboard.dart:86-96 | lib/src/screens/wallet_list/wallet_list_page.dart:344-354 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/new_dashboard.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"700f57195044e09ae24688db55f6d58179e56fd6d00d53b3def1b6bae08e0aa8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/new-ui/pages/buy_sell/buy_sell_provider_page.dart:54-64 | lib/new-ui/pages/buy_sell/buy_sell_redirecting_page.dart:58-69 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/buy_sell/buy_sell_provider_page.dart"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"f997ea06647d647a26b8a97eb526aac6a2f2d883dfe9ae0a1055194f1781e345"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart:58-68 | lib/new-ui/widgets/anypay/select_recipient_network_sheet.dart:99-109 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart\u0060 and \u0060lib/new-ui/widgets/anypay/select_recipient_network_sheet.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fdaafebbeb689e80026068d8f05f6fd25b6164802f9e62d7f6555a987a8bb7f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/new-ui/widgets/coins_page/top_bar_widget/lightning_switcher.dart:51-61 | lib/new-ui/widgets/coins_page/top_bar_widget/lightning_switcher.dart:68-78 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/top_bar_widget/lightning_switcher.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"df0249b9ed571f4352a1b218a0ef0526cf8d13e73785667111a84235be5dec00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/new-ui/widgets/send_page/l2_send_external_modal.dart:121-131 | lib/new-ui/widgets/swap_page/swap_send_external_modal.dart:113-123 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/send_page/l2_send_external_modal.dart\u0060 and \u0060lib/new-ui/widgets/swap_page/swap_send_external_modal.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/l2_send_external_modal.dart"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c72579fb2e831d0c2271deb00692db9a5919348e3b645c6aa37508ef7329e46"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): lib/src/screens/dashboard/pages/nft_details_page.dart:124-133 | lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart:58-68 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_details_page.dart"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3d212b8de11e90e2a07551908b3f0c9d3438dcbaec3ce83a35c6f00bcff91a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/src/screens/dev/background_sync_logs_page.dart:26-36 | lib/src/screens/dev/exchange_provider_logs_page.dart:28-38 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/background_sync_logs_page.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"91b7a068b5348cc42eb37378c6cbd32f07ac1801f8ba7f0f89a0570f67c19ece"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/src/screens/dev/background_sync_logs_page.dart:81-91 | lib/src/screens/dev/background_sync_logs_page.dart:127-137 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/background_sync_logs_page.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"b78fd799913d048323479b67799d7b0735161eaacc13c4d165a3b711abca4fff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/src/screens/settings/widgets/settings_switcher_cell.dart:51-61 | lib/src/widgets/standard_list.dart:32-42 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/widgets/settings_switcher_cell.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd1741927310501e86cb0790e18a18f32bc45b981dff0f0bdaa5a980e5780e1b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/src/screens/setup_2fa/setup_2fa_qr_page.dart:93-103 | lib/src/screens/setup_2fa/setup_2fa_qr_page.dart:143-153 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/setup_2fa/setup_2fa_qr_page.dart"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8ba09462db242defbe154028b1cc318db2b1c970748af6f05588bd43ecf87f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:357-367 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:420-428 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa067418dbeb47feb4d31b3196028ee5ca8a06260d785e1d3ea867b846417a91"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): lib/view_model/settings/mweb_settings_view_model.dart:52-61 | lib/view_model/settings/silent_payments_settings_view_model.dart:37-47 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/mweb_settings_view_model.dart"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cfc6f8b3d75423ea20a7a15f921cb884b7a2d3840c967f86c09c1668c7870eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/view_model/wallet_address_list/wallet_address_list_view_model.dart:298-308 | lib/view_model/wallet_address_list/wallet_address_list_view_model.dart:332-342 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e66a210d7a973d3dcb388929c48afb60e0168d27bae7ad99caa1e5335584b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): lib/view_model/wallet_groups_display_view_model.dart:165-175 | lib/view_model/wallet_list/wallet_list_view_model.dart:244-254 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_groups_display_view_model.dart"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3395e8ff8692abb2d0d50b919fd387eac2dd8d2e6b47de061d4aed2902dfb5a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 7): cw_evm/lib/tokens/arbitrum_tokens.dart:74-83 | cw_evm/lib/tokens/base_tokens.dart:60-69 | cw_evm/lib/tokens/bsc_tokens.dart:74-83 | cw_evm/lib/tokens/ethereum_tokens.dart:96-105 | cw_evm/lib/tokens/polygon_tokens.dart:74-83 | cw_evm/lib/tokens/robinhood_tokens.dart:395-404 | cw_solana/lib/default_spl_tokens.dart:764-773 \u2014 before extracting anything, compare \u0060cw_evm/lib/tokens/arbitrum_tokens.dart\u0060 and \u0060cw_evm/lib/tokens/base_tokens.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 82 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/arbitrum_tokens.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"e66c60aac0aae7c61615bf57d8ca1f563cd62d033b54c9546362ba4eec2f2340"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 5): cw_decred/lib/api/libdcrwallet.dart:412-421 | cw_decred/lib/api/libdcrwallet.dart:527-534 | cw_decred/lib/api/libdcrwallet.dart:587-594 | cw_decred/lib/api/libdcrwallet.dart:605-612 | cw_decred/lib/api/libdcrwallet.dart:658-665 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b3527f261673d3eca7b2dadf06e097e00ccb8da5e3ca94eae2c99b88dba5583"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): cw_decred/lib/api/libdcrwallet.dart:448-457 | cw_decred/lib/api/libdcrwallet.dart:545-554 | cw_decred/lib/api/libdcrwallet.dart:559-568 | cw_decred/lib/api/libdcrwallet.dart:646-655 | cw_decred/lib/api/libdcrwallet.dart:676-685 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"a11a1faeced66e000037d66685e9eb5115d125000f5c4a95ec7e798797a10bfd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): lib/decred/cw_decred.dart:54-64 | lib/monero/cw_monero.dart:329-338 | lib/solana/cw_solana.dart:63-73 | lib/wownero/cw_wownero.dart:283-292 | lib/zano/cw_zano.dart:97-106 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/decred/cw_decred.dart"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f9f576f17fcfe1d4209d2d614b16e8fba3220127b279ab39b373a8fd6a2aba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): lib/new-ui/pages/bridge/bridge_detail_page.dart:42-51 | lib/new-ui/pages/bridge/bridge_history_page.dart:22-31 | lib/new-ui/pages/bridge/bridge_network_page.dart:27-36 | lib/new-ui/pages/bridge/bridge_receive_address_input_page.dart:51-60 | lib/new-ui/pages/bridge/bridge_receiving_wallet_page.dart:39-48 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 5 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/bridge/bridge_detail_page.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"73b12b6e1e296f913b36e4c2ecb9852cc246efd3f72ec041699d443e452d2676"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): cw_bitcoin/lib/bitcoin_wallet_service.dart:125-134 | cw_bitcoin/lib/litecoin_wallet_service.dart:129-138 | cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart:91-100 | cw_dogecoin/lib/src/dogecoin_wallet_service.dart:91-100 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/litecoin_wallet_service.dart\u0060 and \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 46 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet_service.dart"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"24167a971317328026b806814aa5ca61a2fcea5ecdecd3d880ea1e8e9c65e62e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): cw_decred/lib/api/libdcrwallet.dart:347-356 | cw_decred/lib/api/libdcrwallet.dart:360-369 | cw_decred/lib/api/libdcrwallet.dart:373-382 | cw_decred/lib/api/libdcrwallet.dart:400-409 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"eae83adebafa5941b4afea850acbc0dcece20ae1140aef6f1ca1f67714afe8d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): cw_evm/lib/evm_chain_wallet_service.dart:101-110 | cw_evm/lib/evm_chain_wallet_service.dart:230-239 | cw_evm/lib/evm_chain_wallet_service.dart:271-280 | cw_evm/lib/evm_chain_wallet_service.dart:310-319 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet_service.dart"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0da9a2ddaebc2e0cefa1cc35e0aab116ad04961f2d21d8db1c4580cb577953f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): cw_bitcoin/lib/electrum.dart:308-317 | cw_bitcoin/lib/electrum.dart:346-355 | cw_bitcoin/lib/electrum.dart:384-393 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c1db7146fc94d426e5a60e81f281c378d5dbceb8777a99c03304d71936af9ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): cw_decred/lib/api/libdcrwallet.dart:129-138 | cw_decred/lib/api/libdcrwallet.dart:197-206 | cw_decred/lib/api/libdcrwallet.dart:280-289 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"eda4ddb9c6214bd4159fd45e88cb13a53a533b7850972fe92ee6d3d2effebfac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): lib/new-ui/widgets/currency_picker/fiat_currency_search_result.dart:23-32 | lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart:280-289 | lib/new-ui/widgets/currency_picker/single_network_currency_picker.dart:141-150 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/fiat_currency_search_result.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"37b3a1b3146c53253330c81a60238ed84d43dd2201cc81a74ff6acb807bf5654"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 3): lib/utils/token_utilities.dart:376-384 | lib/utils/token_utilities.dart:404-412 | lib/utils/token_utilities.dart:432-441 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/token_utilities.dart"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"4401b50517e56ad2b5d6b7a17ecd5b522715eca5bfe08fd60c0ac90ad47a3764"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 3): lib/view_model/hardware_wallet/bitbox_view_model.dart:129-138 | lib/view_model/hardware_wallet/ledger_view_model.dart:224-232 | lib/view_model/hardware_wallet/trezor_connect_view_model.dart:374-382 \u2014 before extracting anything, compare \u0060lib/view_model/hardware_wallet/ledger_view_model.dart\u0060 and \u0060lib/view_model/hardware_wallet/trezor_connect_view_model.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 32 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/bitbox_view_model.dart"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf965f095c5c4ace0ee69033e6eaf01c86a9a4683d31298b722d3e025e1b4b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): cw_bitcoin/lib/bitcoin_wallet.dart:477-486 | cw_bitcoin/lib/litecoin_wallet.dart:1597-1606 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/bitcoin_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"efb0703267ee94935c640fa6097456057f5db6ee7cf3dc99b46ec3fff43424d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): cw_bitcoin/lib/electrum.dart:334-343 | cw_bitcoin/lib/electrum.dart:372-381 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbff426edb61b998cf5ce2b266dd9f699b438342ffce4e1af734cd04fb4c409b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): cw_evm/lib/clients/evm_chain_client.dart:350-359 | cw_evm/lib/clients/evm_chain_client.dart:412-421 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34d65bcbba3481be199ef01d66b9af39b53d30b89405024bba1fef75d8700b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): cw_monero/lib/monero_subaddress_list.dart:50-59 | cw_wownero/lib/wownero_subaddress_list.dart:49-58 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_subaddress_list.dart\u0060 and \u0060cw_wownero/lib/wownero_subaddress_list.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_subaddress_list.dart"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b58001a5432107b67f1ee1379c4e9b2e4a979b1b6df01d7458c01a27274b478a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u201310 lines \u00D7 2): cw_tron/lib/tron_client.dart:223-232 | cw_tron/lib/tron_client.dart:371-376 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_client.dart"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd8b45ecd222bc6d494123853f9aa62c6027f0491373fab9e5b5e94946f39aef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): cw_zcash/lib/src/zcash_wallet.dart:1528-1537 | cw_zcash/lib/src/zcash_wallet.dart:1559-1568 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1528}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfec9a550845994d50df495f5a61630262c07f866ddb3f39cedd30c30c86046f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/bitcoin/cw_bitcoin.dart:574-583 | lib/bitcoin/cw_bitcoin.dart:590-599 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb0a8edabc6a90f0936351a084ac0ab806d6e9a102f76c005d2380e25c589d32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): lib/exchange/provider/letsexchange_exchange_provider.dart:53-62 | lib/exchange/provider/letsexchange_exchange_provider.dart:84-92 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14f35d094787841d2853f0fd5be66215ab37db3d8c629942322e56b1000f5aa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/exchange/provider/swaptrade_exchange_provider.dart:210-219 | lib/exchange/provider/swaptrade_exchange_provider.dart:314-323 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swaptrade_exchange_provider.dart"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cea9a6994bb8053a4d89467be73f0fedc3c334719704b6a36cfef9ecac6d7e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart:47-56 | lib/new-ui/widgets/anypay/select_recipient_network_sheet.dart:88-97 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart\u0060 and \u0060lib/new-ui/widgets/anypay/select_recipient_network_sheet.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ceef12086095f013ab792956a08e77650def93ba20aed40fd40ac411d02e6b1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart:53-62 | lib/new-ui/widgets/swap_page/refund_address_modal.dart:35-44 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"378e0d39d14e74f5b9d7a1002bcb71ae6321bdba01e9f1179c7235cbe8d97bf4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/new-ui/widgets/send_page/l2_send_external_modal.dart:193-202 | lib/new-ui/widgets/swap_page/swap_send_external_modal.dart:243-252 \u2014 before extracting anything, compare \u0060lib/new-ui/widgets/send_page/l2_send_external_modal.dart\u0060 and \u0060lib/new-ui/widgets/swap_page/swap_send_external_modal.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/l2_send_external_modal.dart"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"86e2ba86f469baac8155789af2c8a80d27f1331b676dee57b959b08591cfa0da"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/new-ui/widgets/send_page/send_address_input.dart:196-205 | lib/src/widgets/address_text_field.dart:229-238 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_address_input.dart"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d8696c4e3b2a43787432eaa4b9048e7da2e0f38949482916c4bcb8f1848c6ba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/new-ui/widgets/send_page/send_address_input.dart:217-226 | lib/src/widgets/address_text_field.dart:266-275 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_address_input.dart"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aa273f3597f2dd2dffd7756e995b54a626d33fdbc4d70a4c750d58520583bd4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/new-ui/widgets/swap_page/provider_options_page.dart:202-211 | lib/src/screens/exchange/widgets/present_provider_picker.dart:89-98 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/provider_options_page.dart"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f3ffc799cebbc15c0c6f93332145d959cf3ea14993b4ba05766f92532a88829"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/src/screens/nano/nano_change_rep_page.dart:126-135 | lib/src/screens/nodes/pow_node_create_or_edit_page.dart:99-108 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nano/nano_change_rep_page.dart"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"38da9e7f6ce260d06d832a62bfb76d5c130cd5c0cdd6e29be2b26a4c23bed2e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/src/screens/restore/wallet_restore_from_keys_form.dart:92-101 | lib/src/screens/restore/wallet_restore_from_seed_form.dart:88-97 \u2014 before extracting anything, compare \u0060lib/src/screens/restore/wallet_restore_from_keys_form.dart\u0060 and \u0060lib/src/screens/restore/wallet_restore_from_seed_form.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 48 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_from_keys_form.dart"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"21da3da49d887c15698d7593e838de857221a0a289fd38643665d3217a42385e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/src/screens/settings/connection_sync_page.dart:31-40 | lib/src/screens/settings/security_backup_page.dart:42-51 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/connection_sync_page.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"f450455268305294a37061c58a11c6985b8c7ced287b07b1b7ebbd3af36d3060"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:76-85 | lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:151-160 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"98310554236ac26ed18589f0054b64bb2e83647ad22a45aa2bfcf7f987563fd1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart:330-338 | lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart:360-369 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"b28dbb19ff527f077553d4d63dab65a38d86c369cbce973debb560a0d981cb57"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/view_model/settings/display_settings_view_model.dart:77-86 | lib/view_model/settings/display_settings_view_model.dart:208-217 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/display_settings_view_model.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"85d305e679a4f0e5ac141cbc98f6d6b9660af908dc9df8f696a7db1b8d2b5791"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 10): cw_decred/lib/api/libdcrwallet.dart:346-354 | cw_decred/lib/api/libdcrwallet.dart:359-367 | cw_decred/lib/api/libdcrwallet.dart:372-380 | cw_decred/lib/api/libdcrwallet.dart:399-407 | cw_decred/lib/api/libdcrwallet.dart:460-468 | cw_decred/lib/api/libdcrwallet.dart:543-551 | cw_decred/lib/api/libdcrwallet.dart:557-565 | cw_decred/lib/api/libdcrwallet.dart:622-630 | cw_decred/lib/api/libdcrwallet.dart:644-652 | cw_decred/lib/api/libdcrwallet.dart:674-682 \u2014 all 10 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3abce5e3822c937e1e22df027b080a01ae529f07fac7a730b805c13626eda7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 7): cw_decred/lib/api/libdcrwallet.dart:447-455 | cw_decred/lib/api/libdcrwallet.dart:461-469 | cw_decred/lib/api/libdcrwallet.dart:544-552 | cw_decred/lib/api/libdcrwallet.dart:558-566 | cw_decred/lib/api/libdcrwallet.dart:623-631 | cw_decred/lib/api/libdcrwallet.dart:645-653 | cw_decred/lib/api/libdcrwallet.dart:675-683 \u2014 all 7 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"96530702bb8da0d6b89116122e6b351ac63d48a7d38f387e61af00138aac8c17"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 5): cw_monero/lib/monero_wallet_service.dart:234-242 | cw_nano/lib/nano_wallet_service.dart:64-72 | cw_wownero/lib/wownero_wallet_service.dart:226-234 | cw_zano/lib/zano_wallet_service.dart:118-126 | cw_zcash/lib/src/zcash_wallet_service.dart:132-140 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_service.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 76 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f80442188fd92a3444016375ba6bc992105a43eb2d2d31ecb02c466fcd0b69d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): lib/src/screens/dashboard/widgets/filter_list_widget.dart:90-98 | lib/src/screens/dashboard/widgets/filter_list_widget.dart:104-112 | lib/src/screens/dashboard/widgets/filter_list_widget.dart:118-126 | lib/src/screens/dashboard/widgets/filter_list_widget.dart:132-140 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/filter_list_widget.dart"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cd5b352959b93cdbdd1493c0ebceb0bf724b0b88597d5ff5ef503e55fb01258"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): cw_monero/lib/monero_wallet.dart:623-631 | cw_wownero/lib/wownero_wallet.dart:466-474 | cw_zano/lib/zano_wallet.dart:563-571 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":623}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d6273c8b1037357774451340d4c2a4216d7666f23f53b35cefa9e8e331c292"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): lib/cake_pay/src/cards/cake_pay_buy_card_page.dart:564-572 | lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart:67-75 | lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart:103-111 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"79585cd596ec64c0f11ce26f79496f54205472ac8abe56b72839cc943f239072"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): lib/exchange/provider/swaptrade_exchange_provider.dart:103-111 | lib/exchange/provider/swaptrade_exchange_provider.dart:210-218 | lib/exchange/provider/swaptrade_exchange_provider.dart:314-322 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swaptrade_exchange_provider.dart"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d845eb0d5ef51d65cb1f9c5240bcb81c2a0b32dc2ab6d7627a76ad7778fda9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart:86-94 | lib/src/screens/connect_device/select_hardware_wallet_account_page.dart:80-88 | lib/src/screens/wallet_unlock/wallet_unlock_page.dart:207-215 \u2014 before extracting anything, compare \u0060lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart\u0060 and \u0060lib/src/screens/connect_device/select_hardware_wallet_account_page.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"1510bd8400d912ac4203fb736256461fcaa059028563d13577511a52323c252a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:313-321 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:381-389 | lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:441-449 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"148d0a364a7ef294e5dec49885f761432f3a1ba9203c947b5577409ec5d04d75"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): lib/src/widgets/base_text_form_field.dart:154-162 | lib/src/widgets/base_text_form_field.dart:164-172 | lib/src/widgets/base_text_form_field.dart:183-191 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/base_text_form_field.dart"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce41357ca5d65b6acb0047b7c9b38f98073e3f6d7d0f6157732ae2a50fe6a1d3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_bitcoin/lib/electrum.dart:427-435 | cw_bitcoin/lib/electrum.dart:454-462 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8e954b77fb02c52ec1ba640fcee071936afef60afb35c776b2c78e438b8eefe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_bitcoin/lib/electrum_transaction_history.dart:71-79 | cw_nano/lib/nano_transaction_history.dart:65-73 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_transaction_history.dart"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b6938a1556f0be6c95f1fdc504d0bfdb945777f49fe699bef35a0a6b12e8d4c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_core/lib/node.dart:176-185 | cw_core/lib/node.dart:190-198 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"aca822098ee5203dd132d777100f44ac9b10d6dd87c5be9b70f8e5f182b3026d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_core/lib/wallet_info_legacy.dart:308-316 | lib/exchange/trade_legacy.dart:157-165 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_info_legacy.dart"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"3180419979d3e82edefef255fee86d3233891d1ebaef81c28765f2b5748dc281"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_decred/lib/api/libdcrwallet.dart:166-174 | cw_decred/lib/api/libdcrwallet.dart:224-232 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"a34b7f2ddf10c64dd73098953a3e7e69a5fcdd4a367e76f3c2e384c58eef1e9e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_decred/lib/api/libdcrwallet.dart:176-184 | cw_decred/lib/api/libdcrwallet.dart:186-194 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f86572af67c7fb6b88c75acd5dfe91e4cd89c7592bcd11dc90766f8d6a3fd07"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_evm/lib/evm_chain_transaction_history.dart:109-117 | cw_tron/lib/tron_transaction_history.dart:66-74 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_transaction_history.dart"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ca9e34def93c838b66e8ac93ac4f0e1019257b85c3fb7c04cb86f56e2ccf4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:91-99 | cw_wownero/lib/wownero_wallet.dart:93-102 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d2034fb138b39ae9aa48823c68d6a0635c2008ce1ad28abbbd2811e4896b68d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:786-793 | cw_wownero/lib/wownero_wallet.dart:586-594 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":786}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b4baf5a311c6c3e6b25c32f0646a6ae32749b52664cb6fb171906fd3d8b1ee3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_monero/lib/monero_wallet_addresses.dart:148-156 | cw_wownero/lib/wownero_wallet_addresses.dart:143-151 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_addresses.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_addresses.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 43 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_addresses.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac4d928ad98ed34f808710cb74ffddff9e60be55315a7c8c582921f9ebda230"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_tron/lib/tron_client.dart:57-65 | cw_tron/lib/tron_client.dart:90-98 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_client.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0c9d632fdf8479d065ff079a170ee8e23a37e26f688bb2b6b7a0ba552db9159"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cw_tron/lib/tron_wallet.dart:442-450 | cw_tron/lib/tron_wallet.dart:524-532 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet.dart"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eef5283b054496c69acb87a3445160c969cc9d50f346ed81837da37ceeb3aee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/exchange/provider/sideshift_exchange_provider.dart:46-54 | lib/exchange/provider/sideshift_exchange_provider.dart:76-84 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a8d0df92cfc3daf022c4a7e3afd3b114d497c406a47defed5ee43643a23c331"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/exchange/provider/sideshift_exchange_provider.dart:83-91 | lib/exchange/provider/simpleswap_exchange_provider.dart:71-79 \u2014 before extracting anything, compare \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 107 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"d54cf3407d63dcf5ead71877e5cce3414bc487a16a66bbd876124e7d52cd3889"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/exchange/provider/sideshift_exchange_provider.dart:356-364 | lib/exchange/provider/simpleswap_exchange_provider.dart:307-315 \u2014 before extracting anything, compare \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 107 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"07da8b973d7f11d7658ee133354c85a225040f28e86c4b983a8337f1a94e3834"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): lib/exchange/provider/stealth_ex_exchange_provider.dart:53-60 | lib/exchange/provider/stealth_ex_exchange_provider.dart:388-396 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/stealth_ex_exchange_provider.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e013b34c29bb92823e247617773ba6fc5d44ff046ac7c98e86b9d8137efc66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/new-ui/pages/seed/seed_backup_reminder_page.dart:30-38 | lib/new-ui/pages/seed/show_keys_disclaimer_page.dart:37-45 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/seed/seed_backup_reminder_page.dart"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d347457d32c367697b45ce266cc849b695f2e1c2a5c0a299a9299374c27038"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/new-ui/widgets/charts_page/chart_modal.dart:89-97 | lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart:103-112 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/charts_page/chart_modal.dart"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b99c4d6752a45a1f5e32f6d2e5a9a9e81427ef4014d45062044a4c023fcd46d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/new-ui/widgets/swap_page/provider_selector_page.dart:67-75 | lib/new-ui/widgets/swap_page/provider_selector_page.dart:77-85 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/provider_selector_page.dart"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"d24554035c56d7cf4c75163f7ab8760f833ca9b0691db9b29925628277546a7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/dashboard/pages/nft_details_page.dart:73-81 | lib/src/screens/dashboard/widgets/nft_tile_widget.dart:39-47 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_details_page.dart"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"01bb36c46096a31e544a8e531938f6dceb2b9b4f5327a7564d122e56bf4e6d54"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/dashboard/pages/nft_import_page.dart:71-79 | lib/src/screens/dashboard/pages/nft_import_page.dart:104-112 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_import_page.dart"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"31fabda0aedeacb31e929731cfcf0a834df62f2bf97d0ac41d500d10bdf6f700"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart:49-59 | lib/src/screens/dashboard/widgets/payjoin_transaction_row.dart:54-62 \u2014 before extracting anything, compare \u0060lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart\u0060 and \u0060lib/src/screens/dashboard/widgets/payjoin_transaction_row.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/anonpay_transaction_row.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"11961fd0fdaf7dfbc7abd5df1ec84d130d28b7fb20f2acc8033b72ff0bf9b11c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/dashboard/widgets/nft_tile_widget.dart:40-48 | lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart:60-68 \u2014 before extracting anything, compare \u0060lib/src/screens/dashboard/widgets/nft_tile_widget.dart\u0060 and \u0060lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/nft_tile_widget.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"408a97afbf0107e2f46e39ab8c921f07eba1ed6d69a41ca97e53e6d0692f4436"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/dev/background_sync_logs_page.dart:270-278 | lib/src/screens/dev/shared_preferences_page.dart:149-157 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/background_sync_logs_page.dart"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a27e75894bd33c5018e9257d59fdf87e21ba767a8474946f0b5310fb11b23b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/dev/secure_preferences_page.dart:47-55 | lib/src/screens/dev/shared_preferences_page.dart:59-67 \u2014 before extracting anything, compare \u0060lib/src/screens/dev/secure_preferences_page.dart\u0060 and \u0060lib/src/screens/dev/shared_preferences_page.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/secure_preferences_page.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"85987e36b0d428e84603f96ec060d03927f53962a81f9642cac15b7ce53fcb0f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/nodes/pow_node_create_or_edit_page.dart:52-60 | lib/src/screens/restore/restore_from_backup_page.dart:43-51 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nodes/pow_node_create_or_edit_page.dart"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"084964973d0b8ad0571cc04819844a71a87a5516cb237826117884d29be23852"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/transaction_details/rbf_details_page.dart:56-64 | lib/src/screens/unspent_coins/unspent_coins_details_page.dart:33-41 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/transaction_details/rbf_details_page.dart"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"065013cf8843a75bccc3d7ff419147d00a9e25ef5a095ecb61cdc8cdb862e6c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/view_model/settings/other_settings_view_model.dart:112-120 | lib/view_model/settings/other_settings_view_model.dart:128-136 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/other_settings_view_model.dart"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d4edc41d2342f65254629f950b29e7081c072a6f9b897fb2f161d9bc95cd2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/view_model/unspent_coins/unspent_coins_list_view_model.dart:162-170 | lib/view_model/unspent_coins/unspent_coins_list_view_model.dart:180-188 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/unspent_coins/unspent_coins_list_view_model.dart"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"30e35f71c5ee94f1570ed627eb13114567eeac32dfc0e9b4575a13b761c77f2c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 11): cw_decred/lib/api/libdcrwallet.dart:332-339 | cw_decred/lib/api/libdcrwallet.dart:385-392 | cw_decred/lib/api/libdcrwallet.dart:413-420 | cw_decred/lib/api/libdcrwallet.dart:429-436 | cw_decred/lib/api/libdcrwallet.dart:496-504 | cw_decred/lib/api/libdcrwallet.dart:512-519 | cw_decred/lib/api/libdcrwallet.dart:527-534 | cw_decred/lib/api/libdcrwallet.dart:571-578 | cw_decred/lib/api/libdcrwallet.dart:587-594 | cw_decred/lib/api/libdcrwallet.dart:605-612 | cw_decred/lib/api/libdcrwallet.dart:658-665 \u2014 all 11 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9554b75f26d6d7e383abf43c7550d8287867ff19c1ea1e82c1ccddffeecedf2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): cw_decred/lib/api/libdcrwallet.dart:141-148 | cw_decred/lib/api/libdcrwallet.dart:177-184 | cw_decred/lib/api/libdcrwallet.dart:187-194 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e4ce83f5100c4e4b911c2a4c211879bf841bb3e4ce1c35eee31dbbb2f225cd4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 3): lib/buy/moonpay/moonpay_provider.dart:366-373 | lib/buy/wyre/wyre_buy_provider.dart:133-139 | lib/buy/wyre/wyre_buy_provider.dart:149-155 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/moonpay/moonpay_provider.dart"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed179427546289bb63c71775073e4b81c01d5d97c112a9e2b0ff39f8939cebb4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): lib/new-ui/pages/home_page.dart:258-265 | lib/new-ui/widgets/coins_page/assets_history/history_modal.dart:62-69 | lib/new-ui/widgets/modal_page_wrapper.dart:61-68 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/home_page.dart"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5428d937f8f699938a82a06db969b823f7d3343d0b940f7e192e0912a1303c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): lib/src/screens/dashboard/pages/nft_details_page.dart:126-133 | lib/src/screens/dashboard/widgets/nft_tile_widget.dart:40-48 | lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart:60-68 \u2014 before extracting anything, compare \u0060lib/src/screens/dashboard/widgets/nft_tile_widget.dart\u0060 and \u0060lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_details_page.dart"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8e251242ced01d508938689f6418d1a83f2ddb5f8cb8abaf9a7316a908c9054"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet.dart:2928-2935 | cw_bitcoin/lib/electrum_wallet.dart:3386-3393 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2928}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe42c97e29b904ad0a153f2e09beed35c0b9fb8bfa4669a07e145588b82daf7f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): cw_bitcoin/lib/hardware/trezor_service.dart:28-35 | cw_evm/lib/hardware/evm_chain_bitbox_service.dart:13-19 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/hardware/trezor_service.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"242e62455a4d1c9ede0f3644b75bd68de43b983cfd511a0630b644bebb11da60"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): cw_core/lib/crypto_currency.dart:1159-1166 | lib/cake_pay/src/models/cake_pay_card.dart:81-88 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":1159}}}],"partialFingerprints":{"codehealthFindingId/v1":"28e979551fbc8e80029cd7db2e5ee9b9609090b11244106ee7215f00968d9537"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): cw_evm/lib/deuro/deuro_savings.dart:91-98 | cw_evm/lib/deuro/deuro_savings.dart:126-133 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/deuro/deuro_savings.dart"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fd1ac520d4c473f5f050806ca875d8f4f19f7d29f8fcbc524b311a9625cfbe1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): cw_evm/lib/evm_chain_transaction_history.dart:100-107 | cw_tron/lib/tron_transaction_history.dart:57-64 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_transaction_history.dart"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"aed5807defda75680c807a7d3597c9cbd5b308c1b7741217921a0506ab00bc69"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (3\u20138 lines \u00D7 3): cw_bitcoin/lib/electrum_transaction_history.dart:64-66 | cw_nano/lib/nano_transaction_history.dart:56-63 | cw_solana/lib/solana_transaction_history.dart:74-81 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_transaction_history.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"bad7a0a199fd77ce639f2f4222741aaa25027d38d17c9d1ef2800e90cd34915b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/core/backup_service.dart:163-171 | lib/core/backup_service.dart:185-192 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"edd7464b314da29fea7e30a1a170191e1033dc223bac8a6c10776a539bba0ded"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/core/backup_service.dart:267-274 | lib/core/backup_service_v3.dart:345-352 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c610af77079b5212fdd927e3430be98d26273971798c0502d3943f05ced410"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:214-221 | lib/exchange/provider/exolix_exchange_provider.dart:213-220 \u2014 before extracting anything, compare \u0060lib/exchange/provider/changenow_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76843d93c18b239dfea681a57158674184443c21d9f0626e58b094173d8ea4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20138 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:291-298 | lib/exchange/provider/exolix_exchange_provider.dart:356-361 \u2014 before extracting anything, compare \u0060lib/exchange/provider/changenow_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"7311d542cccbe1895de7c9fcd7f18a0612fbb4cd4a5442f9477e96fff9a1d58d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/exchange/provider/sideshift_exchange_provider.dart:346-353 | lib/exchange/provider/simpleswap_exchange_provider.dart:297-304 \u2014 before extracting anything, compare \u0060lib/exchange/provider/sideshift_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/simpleswap_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 107 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/sideshift_exchange_provider.dart"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ddf9e65401e08b40a6e8f22482cee82dc616d774e2d906bac738fe351ce0266"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): lib/exchange/provider/swapsxyz_exchange_provider.dart:81-88 | lib/exchange/provider/swapsxyz_exchange_provider.dart:218-224 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"682383789c7a29057c9df177f49283ea3d1551dc2f6a76da1557dc59178c0265"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/src/screens/dashboard/home_settings_page.dart:195-202 | lib/src/screens/integrations/deuro/widgets/savings_card_widget.dart:314-321 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/home_settings_page.dart"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"fecd93504063810d170ddc7f255f568f66c1a7a5812b8c26cf17a29e5a42ad7f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/src/screens/nano/nano_change_rep_page.dart:187-194 | lib/src/screens/ur/animated_ur_page.dart:112-119 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nano/nano_change_rep_page.dart"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"31bb0fb8ae9dbc424b0a9f36d400375a1b664f8fc49c6eb042d1c81b73c4dbe5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): lib/src/screens/nodes/node_create_or_edit_page.dart:65-71 | lib/src/screens/transaction_details/rbf_details_page.dart:135-142 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nodes/node_create_or_edit_page.dart"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a648bbc487d6e568a88e5bec152cc22c4f04443dc5fb9ede453ada8a88e182"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/src/screens/wallet_keys/wallet_keys_page.dart:245-252 | lib/src/screens/wallet_keys/wallet_keys_page.dart:303-310 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_keys/wallet_keys_page.dart"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c2d310e18557b4856679a9df3a449e43d3df89df9c6db6dee8a8ccac426285"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/src/widgets/cake_pay_order_list_card.dart:116-123 | lib/src/widgets/cake_pay_order_list_card.dart:128-135 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/cake_pay_order_list_card.dart"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"2608ee665e2761f779269b364f308252f792ecf6dfd01aed9d352d02ffab8833"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/utils/token_utilities.dart:395-402 | lib/utils/token_utilities.dart:423-430 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/token_utilities.dart"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"af115f0d31521d6c5b367a98c54f9180baf2944eaeac9c0a8539e9a674a8e0fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): cw_bitcoin/lib/psbt/transaction_builder.dart:91-97 | cw_bitcoin/lib/psbt/transaction_builder.dart:101-107 | cw_bitcoin/lib/psbt/transaction_builder.dart:117-123 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/psbt/transaction_builder.dart"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc897dd8ab2c04764733a2c19e4eb9841432c92694eba46617879723b79fa9b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): cw_nano/lib/nano_wallet.dart:397-403 | cw_solana/lib/solana_wallet.dart:628-634 | cw_tron/lib/tron_wallet.dart:133-139 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet.dart\u0060 and \u0060cw_tron/lib/tron_wallet.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 52 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_wallet.dart"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f49bb121cda5d4f6bb6d11ca2375222945d56af403d54e6a2af302fc6cc865a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): lib/new-ui/pages/home_page.dart:267-273 | lib/new-ui/widgets/coins_page/assets_history/history_modal.dart:71-77 | lib/new-ui/widgets/modal_page_wrapper.dart:73-79 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/home_page.dart"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae2d3ac7683de74cf9bb91c7dc78def9c199df44a0c2acb4868701f0df389be9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): lib/src/screens/auth/auth_page.dart:158-164 | lib/src/screens/setup_2fa/setup_2fa_enter_code_page.dart:84-90 | lib/src/screens/wallet_unlock/wallet_unlock_page.dart:141-147 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/auth/auth_page.dart"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"02111bb16176eb12d9f68619a2809bdcb3d275fef67d06a71279979dd78c6dd3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet.dart:230-236 | cw_bitcoin/lib/electrum_wallet.dart:241-247 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"c36d2abaaf5f10f6f29ae8091e1fc27594dd92594260f13bfc25efedf17cc478"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet.dart:2487-2493 | cw_bitcoin/lib/electrum_wallet.dart:2518-2524 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2487}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a8553855490c092c61795474c0473d91d1df9e89960f054841ad2b018450c0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): cw_core/lib/wallet_service.dart:81-87 | cw_core/lib/wallet_service.dart:90-96 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_service.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"29162e724a5badfbf366f5076175c47026ca5628fdd9b16cc39c61b7ebaa1d14"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:242-248 | cw_wownero/lib/wownero_wallet.dart:228-234 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"66f4b0292dd7dc92e17782bf8937f9bd67c7c2e09ecb588a1950827aac3eb6e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): cw_solana/lib/solana_wallet_service.dart:98-104 | cw_tron/lib/tron_wallet_service.dart:145-151 \u2014 before extracting anything, compare \u0060cw_solana/lib/solana_wallet_service.dart\u0060 and \u0060cw_tron/lib/tron_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet_service.dart"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"026deab9a6cf40f0af9f9781e6c1fc2795b508d20d3277a777af62cb19653b71"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/core/wallet_creation_service.dart:105-111 | lib/core/wallet_creation_service.dart:124-130 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/wallet_creation_service.dart"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e5ab32c6109fb69514c85d0cfee4760c41ed12fcebcf14d7a21a49c3d8c9edf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:74-80 | lib/exchange/provider/changenow_exchange_provider.dart:222-228 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c85fe65dc4cb9830752ea2bc92afff7c890e0d6888818073babd7b087fddfdd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:270-276 | lib/exchange/provider/exolix_exchange_provider.dart:336-342 \u2014 before extracting anything, compare \u0060lib/exchange/provider/changenow_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"8556f93effac99901c010fec14b50086c7e1f2331b03b43c06761e2ff3916f8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:279-285 | lib/exchange/provider/changenow_exchange_provider.dart:288-294 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"b06e348da302ae2f16be117b05c11248fa6328ee42378ccc673e5641d030c0e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/exchange/provider/stealth_ex_exchange_provider.dart:229-235 | lib/exchange/provider/stealth_ex_exchange_provider.dart:356-362 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/stealth_ex_exchange_provider.dart"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8deb7b9ca7d2a1266bcd5883584c2cce7f0c5bbe24856fa7f37a24599ab866b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/new-ui/widgets/send_page/send_amount_input.dart:182-188 | lib/new-ui/widgets/swap_page/swap_amount_box.dart:340-348 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_amount_input.dart"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc91d39dc287928819e0b9585560d30fcb37576657e9ee3dfc0c8d463237284"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/src/screens/dashboard/pages/nft_import_page.dart:93-99 | lib/src/screens/dashboard/pages/nft_import_page.dart:125-131 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_import_page.dart"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"6128d3d72a691abad21350c6f0348809ad5e3aac3f9410e5e3279f1391b2ca44"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/src/screens/dashboard/pages/nft_listing_page.dart:117-123 | lib/src/screens/dashboard/pages/nft_listing_page.dart:134-140 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_listing_page.dart"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"db50aae33b245ad83fe070beca5490a8d085546a8452374a98a15d91a8f68bc8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/src/screens/nodes/node_create_or_edit_page.dart:91-97 | lib/src/screens/nodes/pow_node_create_or_edit_page.dart:73-79 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nodes/node_create_or_edit_page.dart"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c9195890b4fb9a20930d47cc1dbc06a6ecdaef11ef041091f4696b731b33dee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/store/settings_store.dart:1426-1432 | lib/store/settings_store.dart:2051-2057 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1426}}}],"partialFingerprints":{"codehealthFindingId/v1":"9feaf7ff4a0d00ecb48e0565bc2b910098f7e02e831f57d4b9dff722379b5db4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/store/settings_store.dart:1434-1440 | lib/store/settings_store.dart:2058-2064 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1434}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf7adeba1f3443612a8d4c84b4d83321b8aef3f12870f9ef69db17f4b94da0e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/view_model/dashboard/dashboard_view_model.dart:161-167 | lib/view_model/dashboard/dashboard_view_model.dart:1438-1444 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"a819a4b3286a12f5e3dc2621af066ab166f525ca6f38bf5a73a216f3c9bde6ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/view_model/wallet_account_list/bitcoin_account_list/bitcoin_account_edit_or_create_view_model.dart:40-46 | lib/view_model/wallet_account_list/monero_account_list/monero_account_edit_or_create_view_model.dart:47-53 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_account_list/bitcoin_account_list/bitcoin_account_edit_or_create_view_model.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"dec2dcc19ff567b96b16f4f77d58e2173daa64868ca115e2fe6d739709f369c4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): cw_decred/lib/wallet_service.dart:225-230 | cw_decred/lib/wallet_service.dart:313-318 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet_service.dart"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3af23eb7faae6812ad29b5a9d672b5bcf976e8290f285dacdc76341dfbb611f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): cw_evm/lib/evm_chain_transaction_history.dart:68-73 | cw_tron/lib/tron_transaction_history.dart:41-46 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_transaction_history.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"98c8fa09469c80da5baccd97e53dc67547de0eed0b592079d9d10d902f06d36c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): cw_evm/lib/evm_chain_wallet.dart:486-491 | cw_solana/lib/solana_wallet.dart:928-933 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ace63848a00446ced1613f78d4ea1c1d99a32bb33f91c1aacf4c38368627ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): cw_monero/lib/monero_wallet_addresses.dart:35-40 | cw_wownero/lib/wownero_wallet_addresses.dart:35-40 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet_addresses.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet_addresses.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 43 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_addresses.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ce4b4dec73f5c4ea05de6e97b2159c2e688681def1e6fc78d58875cfcc03719"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/buy/onramper/onramper_buy_provider.dart:139-144 | lib/buy/onramper/onramper_buy_provider.dart:168-173 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/onramper/onramper_buy_provider.dart"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67f17a4059e5d0bfef9f62293af95ab6158ce53c3f8908ffe0eefd2f653fec7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/exchange/trade.dart:266-271 | lib/exchange/trade_legacy.part.dart:23-28 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade.dart"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"9233184c8fe4b84ff6ade49270b00499faee65c4c5e4b3fcfd0b3009c5e15176"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/exchange/trade.dart:286-291 | lib/exchange/trade_legacy.part.dart:41-46 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade.dart"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"f258e9ff4f0d706e12ff4e8d4f470688b503ee543ead3d30a613e8b42ec1791a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/src/screens/settings/mweb_logs_page.dart:31-36 | lib/src/screens/settings/silent_payments_logs_page.dart:31-36 \u2014 before extracting anything, compare \u0060lib/src/screens/settings/mweb_logs_page.dart\u0060 and \u0060lib/src/screens/settings/silent_payments_logs_page.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/mweb_logs_page.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b7c22a7c18fe853c3e53bebd8461eb3a65628a3cebbbe365af5c8860bc2122"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/view_model/dashboard/transaction_list_item.dart:220-225 | lib/view_model/dashboard/transaction_list_item.dart:228-233 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/transaction_list_item.dart"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"50ee52823a69b93ecf413d1230086d795ce0a52a690c3b56a374c2a8e1a14868"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 7): cw_bitcoin/lib/bitcoin_wallet_service.dart:119-123 | cw_bitcoin/lib/litecoin_wallet_service.dart:102-106 | cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart:85-89 | cw_decred/lib/wallet_service.dart:184-188 | cw_dogecoin/lib/src/dogecoin_wallet_service.dart:85-89 | cw_solana/lib/solana_wallet_service.dart:98-102 | cw_tron/lib/tron_wallet_service.dart:145-149 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/litecoin_wallet_service.dart\u0060 and \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 46 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet_service.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"51b6256ca5afd86158af0d1a389253256ce619bec4219d2e54932bb7d5b8784b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): lib/src/screens/anonpay_details/anonpay_details_page.dart:64-68 | lib/src/screens/payjoin_details/payjoin_details_page.dart:71-75 | lib/src/screens/transaction_details/rbf_details_page.dart:57-61 | lib/src/screens/unspent_coins/unspent_coins_details_page.dart:34-38 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 4 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/anonpay_details/anonpay_details_page.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"2921239ce64ed79c6012bf45b6ffc1fdf6ab7d018301149831774786530c2f2b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): cw_core/lib/erc20_token.dart:182-186 | cw_core/lib/spl_token.dart:187-191 | cw_core/lib/tron_token.dart:165-169 \u2014 before extracting anything, compare \u0060cw_core/lib/spl_token.dart\u0060 and \u0060cw_core/lib/tron_token.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/erc20_token.dart"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0c6339ab18f00c3d55f4d72ab901225926442d3d13445f19fcc422f1d17907a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): lib/exchange/provider/changenow_exchange_provider.dart:281-288 | lib/exchange/provider/changenow_exchange_provider.dart:290-296 | lib/exchange/provider/exolix_exchange_provider.dart:355-359 \u2014 before extracting anything, compare \u0060lib/exchange/provider/changenow_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/exolix_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"995b2a5af60254e4bbe35ab0e00f853653e25662018eef6115803ae4ae9747af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_bitcoin/lib/electrum_wallet_snapshot.dart:75-79 | cw_bitcoin/lib/electrum_wallet_snapshot.dart:87-91 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_snapshot.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"1188e504ebbd0c2fe9c0f01fb7a01f283795ff8954db7c41ae12cbbe866cf78b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_core/lib/amount_converter.dart:37-41 | cw_core/lib/amount_converter.dart:44-48 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/amount_converter.dart"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"f187b8b02b2557ffefbc88a8e9cfdd677a7664aa521ebe36af4931b6323a8f73"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:237-241 | cw_wownero/lib/wownero_wallet.dart:223-227 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"6452d7ecd4193990aec73e5246b69ef38b5bfb92a591dd19ea8ed50e77162794"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_monero/lib/monero_wallet_service.dart:183-187 | cw_monero/lib/monero_wallet_service.dart:555-559 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b4dd73f16ba93c7e35da46f2b93997a6b9799149233457ddede2dda9ee0b413"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_zano/lib/zano_wallet.dart:160-164 | cw_zano/lib/zano_wallet.dart:191-195 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"b03fa1878db8e52076695d8ffc815ef0ca4958c765a875f0111a1f7b3577edc9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/anonpay/anonpay_api.dart:83-87 | lib/exchange/provider/simpleswap_exchange_provider.dart:240-244 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/anonpay/anonpay_api.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d9930bd1e0f0528fac12d90913b6a8d54fdb7a3f89acf3056ceee9072c18c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/buy/wyre/wyre_buy_provider.dart:139-143 | lib/exchange/provider/letsexchange_exchange_provider.dart:224-228 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/wyre/wyre_buy_provider.dart"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"daf6e083b0986136acad019f59b2501490a5682a4dc0f8fe1c3444ca0d03228e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:83-87 | lib/exchange/provider/trocador_exchange_provider.dart:106-110 \u2014 before extracting anything, compare \u0060lib/exchange/provider/changenow_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/trocador_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 35 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"471252744b259f1d29a04aeaf5514b7b5fc7e8c02569212b5f93a15685bdb8d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:230-234 | lib/exchange/provider/sideshift_exchange_provider.dart:292-296 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac73aaa54a8774c34747c1d6d0f74aa7b917d2c638467e2a9789f99d54c499ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/exchange/provider/letsexchange_exchange_provider.dart:341-345 | lib/exchange/provider/stealth_ex_exchange_provider.dart:333-337 \u2014 before extracting anything, compare \u0060lib/exchange/provider/letsexchange_exchange_provider.dart\u0060 and \u0060lib/exchange/provider/stealth_ex_exchange_provider.dart\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 131 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/letsexchange_exchange_provider.dart"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"5706a4a6a569a2c23ee15fe5ef03101d735ea5f6915dc941ecfa8d12e2478066"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/exchange/provider/stealth_ex_exchange_provider.dart:223-227 | lib/exchange/provider/stealth_ex_exchange_provider.dart:339-345 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/stealth_ex_exchange_provider.dart"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"5034b147e1784a563dcdd4362cec8d9f0bd9caf15539b53e5d59c17c22453aaf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/exchange/provider/stealth_ex_exchange_provider.dart:338-342 | lib/exchange/provider/xoswap_exchange_provider.dart:367-371 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/stealth_ex_exchange_provider.dart"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"354a0eb2bcd960283859b9944eba982e29d6783e903d61dea25be74b88419b27"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/src/screens/dev/secure_preferences_page.dart:39-43 | lib/src/screens/dev/shared_preferences_page.dart:51-55 \u2014 before extracting anything, compare \u0060lib/src/screens/dev/secure_preferences_page.dart\u0060 and \u0060lib/src/screens/dev/shared_preferences_page.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/secure_preferences_page.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"d88f2d08a300af80bf5007971af8dd3dc9ff17b74a2b936789557a05c124d458"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/src/screens/nodes/node_create_or_edit_page.dart:51-55 | lib/src/screens/nodes/pow_node_create_or_edit_page.dart:43-47 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nodes/node_create_or_edit_page.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"154e57bc14d4a46a37d9b85d16cbbc4bb67aa392b6f2b2c3f06764aa08268938"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/src/screens/nodes/node_create_or_edit_page.dart:145-149 | lib/src/screens/nodes/pow_node_create_or_edit_page.dart:114-120 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nodes/node_create_or_edit_page.dart"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a7496c8f2907999ce822766981760a4d3e1e1df03e00eba7b75412ea04b0693"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/src/screens/order_details/order_details_page.dart:123-127 | lib/src/screens/trade_details/trade_details_page.dart:116-122 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/order_details/order_details_page.dart"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"77c0ecaf74e1df5a6a9e36ac348c29aeed73b7b0437c9e9e0c468a876e4d7f9f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 3): cw_bitcoin/lib/litecoin_wallet_service.dart:67-97 | cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart:50-80 | cw_dogecoin/lib/src/dogecoin_wallet_service.dart:51-80 \u2014 before extracting anything, compare \u0060cw_bitcoin/lib/litecoin_wallet_service.dart\u0060 and \u0060cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 46 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_service.dart"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"a17568739acd8f1631ea6491e6b0ff8493368b37286bf37267c8472703619cbd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 3): lib/themes/custom_theme_colors/black_theme_custom_colors.dart:5-27 | lib/themes/custom_theme_colors/dark_theme_custom_colors.dart:5-27 | lib/themes/custom_theme_colors/light_theme_custom_colors.dart:5-27 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/custom_theme_colors/black_theme_custom_colors.dart"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab70458ab9a6740f223698d93d5aa26432e375c0b520e0810aa41dd53e66c8d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): cw_core/lib/erc20_token.dart:102-110 | cw_core/lib/node.dart:104-112 | cw_core/lib/spl_token.dart:118-126 | cw_core/lib/tron_token.dart:93-101 \u2014 before extracting anything, compare \u0060cw_core/lib/spl_token.dart\u0060 and \u0060cw_core/lib/tron_token.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/erc20_token.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd14be8c1eacf0dee4a118163c9e5896abedbe5fc7c7304928b1e33f7378125"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): cw_core/lib/get_height_by_date_xmr.dart:404-413 | cw_core/lib/get_height_by_date_zec.dart:399-408 | cw_zano/lib/get_height_by_date.dart:450-459 \u2014 before extracting anything, compare \u0060cw_core/lib/get_height_by_date_zec.dart\u0060 and \u0060cw_zano/lib/get_height_by_date.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/get_height_by_date_xmr.dart"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d9be82ae1b956604de30a3ad2df77366f9f1e0b926c4c771921dbe81d86a4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): cw_core/lib/imported_nft.dart:66-76 | cw_core/lib/node.dart:166-173 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/imported_nft.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc3aeeaa13e5df8eeb61209bf4cc49ca363782288baffe8cd01ddce2418829af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_core/lib/node.dart:324-334 | cw_core/lib/node_legacy.dart:214-224 \u2014 before extracting anything, compare \u0060cw_core/lib/node.dart\u0060 and \u0060cw_core/lib/node_legacy.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 50 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"644f6c315a5828ec5b2fc883148beb885d1fe27de5563cc496882316cec174c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_core/lib/spl_token.dart:178-182 | cw_core/lib/tron_token.dart:156-160 \u2014 before extracting anything, compare \u0060cw_core/lib/spl_token.dart\u0060 and \u0060cw_core/lib/tron_token.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/spl_token.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"553ea35c31546af74f80dcc6148e4ad296668dbaaa3be9fccc13a9d19f415797"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): cw_core/lib/utils/print_verbose.dart:39-45 | cw_mweb/lib/print_verbose.dart:39-45 \u2014 before extracting anything, compare \u0060cw_core/lib/utils/print_verbose.dart\u0060 and \u0060cw_mweb/lib/print_verbose.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/print_verbose.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"c25b545eaa90a22972b9a9cfba32bbdf5cc272110911094cec959aae3494610d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_core/lib/utils/proxy_socket/insecure.dart:17-27 | cw_core/lib/utils/proxy_socket/secure.dart:18-28 \u2014 before extracting anything, compare \u0060cw_core/lib/utils/proxy_socket/insecure.dart\u0060 and \u0060cw_core/lib/utils/proxy_socket/secure.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 34 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_socket/insecure.dart"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb0867d32a8d151a9ef3e3b44ce6244d13f178702acadfb6024a811a93fb6ac9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_core/lib/utils/proxy_socket/insecure.dart:29-39 | cw_core/lib/utils/proxy_socket/secure.dart:30-40 \u2014 before extracting anything, compare \u0060cw_core/lib/utils/proxy_socket/insecure.dart\u0060 and \u0060cw_core/lib/utils/proxy_socket/secure.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 34 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_socket/insecure.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e5f3599eeea0ff9120d832fd2f16cfe1bd1731705c718686f44716a6b81e946"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): cw_core/lib/utils/proxy_socket/insecure.dart:41-53 | cw_core/lib/utils/proxy_socket/socks.dart:31-43 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_socket/insecure.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea76ff017ae8e514d16616dbbeb858f42b2761ef7377144c3db3f8921e0265f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_evm/lib/evm_chain_wallet.dart:467-471 | cw_solana/lib/solana_wallet.dart:909-913 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a716affd6fcb42f936d1b8b8b1b2964efb4649de707bf835a94b317d4e132cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_evm/lib/evm_chain_wallet.dart:793-797 | cw_solana/lib/solana_wallet.dart:211-215 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca17e297560979a4c76c6df0dc8ada6427c3812c9bcacdca33079ebdd09104f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): cw_evm/lib/evm_chain_wallet_addresses.dart:29-38 | cw_tron/lib/tron_wallet_addresses.dart:30-39 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet_addresses.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e927cdf14dd439b58a2e5c1b95ebc6731a22a25a7d9e209a5f9200e28670e65"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): cw_monero/lib/api/wallet.dart:348-354 | cw_wownero/lib/api/wallet.dart:259-265 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/wallet.dart"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"5812e6514f569091c2228797aa72bcdcfc0a42bf954436c393e60284b2dd9b76"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): cw_monero/lib/monero_account_list.dart:83-97 | cw_wownero/lib/wownero_account_list.dart:67-81 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_account_list.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c049a6bec8bd5a8bdb8e9fa735b237a10b92b8f7934b125c901ea47d0a05d8d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): cw_monero/lib/monero_subaddress_list.dart:81-95 | cw_wownero/lib/wownero_subaddress_list.dart:87-101 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_subaddress_list.dart\u0060 and \u0060cw_wownero/lib/wownero_subaddress_list.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_subaddress_list.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a4edb7bd3ff50dc4ef44c9c05012707d862fe29ae18e265e5e97a5044117448"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): cw_nano/lib/nano_wallet_addresses.dart:46-55 | cw_solana/lib/solana_wallet_addresses.dart:28-37 | cw_zano/lib/zano_wallet_addresses.dart:31-40 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_wallet_addresses.dart"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"997588e59169edfd8c9e7c190f129babc67220d4b596c193f07d3af192e336df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): lib/buy/buy_quote.dart:325-334 | lib/exchange/provider/exolix_exchange_provider.dart:457-466 | lib/exchange/provider/stealth_ex_exchange_provider.dart:422-431 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/buy_quote.dart"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"473b65c5ee2a2d359b3332f4d581e6ec315ea2fa751036128b143a93227cb2d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/core/address_resolver/lnurl_pay/lnurlpay_record.dart:50-58 | lib/core/address_resolver/openalias/openalias_record.dart:15-23 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/lnurl_pay/lnurlpay_record.dart"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"2233c229c9bac2865c0c2d8fd8dc12637d050c6561f8e8463b8eaa08bca6b86b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/exchange/provider/changenow_exchange_provider.dart:367-375 | lib/exchange/provider/letsexchange_exchange_provider.dart:430-438 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"71c4178d4c3c1d496ebf02d2b4e95b60d8e334657824b40e11d0773b80b7027f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/new-ui/pages/home_page.dart:81-85 | lib/utils/route_aware.dart:23-27 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/home_page.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"74388f7fc410217c831e962d1cfbb2a63f196ab6fcc59e8d57381825d6be1c94"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): lib/new-ui/widgets/bridge/transfer_history_row.dart:18-33 | lib/view_model/bridge/bridge_details_view_model.dart:158-173 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/bridge/transfer_history_row.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"346a8f73c84ed21e55edc2ee81a8691a8e658d1cd264e878b09dcaa257e3baaa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/new-ui/widgets/coins_page/assets_history/assets_section.dart:80-88 | lib/new-ui/widgets/coins_page/assets_history/history_section.dart:238-246 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/assets_section.dart"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"d738aadfda2cd0bb19d5236065ec980039d424fb8e34e8bdc84c8fa6b5bb6137"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/new-ui/widgets/currency_picker/fiat_currency_picker_sheet.dart:68-72 | lib/new-ui/widgets/currency_picker/single_network_currency_picker.dart:30-34 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/fiat_currency_picker_sheet.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"72e844ca5391e5428154239d8c93ed07d98b9bfbaf5a97ba51ab870df56663b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/src/screens/auth/auth_page.dart:133-137 | lib/src/screens/wallet_unlock/wallet_unlock_page.dart:92-96 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/auth/auth_page.dart"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e0c5c1f6eafa504b5e21aeb3caef6ce915c7a94db671a3ecb86ffb7a742e7a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): lib/src/screens/auth/auth_page.dart:207-211 | lib/src/screens/setup_2fa/setup_2fa_enter_code_page.dart:111-115 | lib/src/screens/wallet_unlock/wallet_unlock_page.dart:104-108 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/auth/auth_page.dart"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"95dcf9b2ce8af33d8ba3a911efc5939006c90d3dbc962756cf9f1d7868ff9420"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/src/screens/dev/background_sync_logs_page.dart:18-24 | lib/src/screens/dev/network_requests.dart:26-32 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/background_sync_logs_page.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"319b26a84f2866e3b715b4e0d872c92000209e4ed52ec445118f08856961f36f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): lib/src/screens/new_wallet/new_wallet_page.dart:52-58 | lib/src/screens/restore/restore_from_backup_page.dart:29-35 | lib/src/screens/restore/wallet_restore_page.dart:58-64 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/new_wallet_page.dart"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"624791b504c1f7c2a7d754f2b66934135d4a7673ed84442b1a638ca4f14ad585"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/src/screens/settings/mweb_logs_page.dart:64-72 | lib/src/screens/settings/silent_payments_logs_page.dart:65-73 \u2014 before extracting anything, compare \u0060lib/src/screens/settings/mweb_logs_page.dart\u0060 and \u0060lib/src/screens/settings/silent_payments_logs_page.dart\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 77 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/mweb_logs_page.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6867e2cdeaa2226aa8711bfa218899eb65ff55bbe383c33acf8213234668314"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/src/screens/setup_2fa/setup_2fa.dart:74-78 | lib/src/screens/setup_2fa/setup_2fa_qr_page.dart:206-210 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/setup_2fa/setup_2fa.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1fa44290e3a6b8ec83134604f0f994a495917e6f0d5fdf6e4dcfb3b8d0c18ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart:468-474 | lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart:261-267 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e8f3c7c18e74ad0378ea1b7444e5cc661ea2c1da04a6ee206d1b09124efbf66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/view_model/bridge/bridge_details_view_model.dart:175-180 | lib/view_model/trade_details_view_model.dart:227-232 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_details_view_model.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff8570a76c3f1f294903ad8e0d0b6ca4063bbb5861df31a59774d08fe23d5415"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): lib/view_model/hardware_wallet/ledger_view_model.dart:105-114 | lib/view_model/hardware_wallet/trezor_connect_view_model.dart:112-121 \u2014 before extracting anything, compare \u0060lib/view_model/hardware_wallet/ledger_view_model.dart\u0060 and \u0060lib/view_model/hardware_wallet/trezor_connect_view_model.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 32 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/ledger_view_model.dart"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"03ba19b525df7f20e39f41b1617b5855c5f821f6f5b72a5db20a46fb41bccc25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/view_model/settings/other_settings_view_model.dart:68-73 | lib/view_model/settings/privacy_settings_view_model.dart:39-44 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/other_settings_view_model.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bcfe029d70bed13814965fddf8c840e43ccfae79b5ae92b03337ca9ace3b59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): lib/view_model/settings/other_settings_view_model.dart:75-83 | lib/view_model/settings/privacy_settings_view_model.dart:46-54 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/other_settings_view_model.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"81f241e053620e9eee71fbfd62fe12ec86fdedd0e533294c77e3a7155349c70a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 5): cw_bitcoin/lib/bitcoin_transaction_priority.dart:82-96 | cw_bitcoin/lib/bitcoin_transaction_priority.dart:135-149 | cw_decred/lib/transaction_priority.dart:15-29 | cw_dogecoin/lib/src/dogecoin_transaction_priority.dart:18-32 | cw_evm/lib/evm_chain_transaction_priority.dart:19-33 \u2014 there are 5 copies across 4 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 5 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_transaction_priority.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a81b0d5cd1e761cbb52a5aa0e6412f793420df76fccfbbc68eb7924a09e92ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 5): cw_bitcoin/lib/bitcoin_transaction_priority.dart:101-120 | cw_bitcoin/lib/bitcoin_transaction_priority.dart:154-173 | cw_decred/lib/transaction_priority.dart:33-52 | cw_dogecoin/lib/src/dogecoin_transaction_priority.dart:37-56 | cw_evm/lib/evm_chain_transaction_priority.dart:37-56 \u2014 there are 5 copies across 4 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 5 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_transaction_priority.dart"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea7317947a9c406c63e2cee8cbc9994d2c928aedfff59b6da3b5cb41d865edc7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): cw_bitcoin/lib/litecoin_wallet.dart:999-1013 | cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart:206-220 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":999}}}],"partialFingerprints":{"codehealthFindingId/v1":"53059ebcf8fd86188879f3c5c386b61c27ae4612aaa2af152db2b54ee3236d7e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:929-939 | cw_wownero/lib/wownero_wallet.dart:708-718 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":929}}}],"partialFingerprints":{"codehealthFindingId/v1":"01a5b418d6d4c8d6ebbfd4b8d617ec9e0a745d550d19079adecc3ef0ecbf70dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:1022-1026 | cw_wownero/lib/wownero_wallet.dart:807-811 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":1022}}}],"partialFingerprints":{"codehealthFindingId/v1":"0498cde7da8694ef54cae36c9415ca6c318a2ef05601fca63687c0bd4d879a6b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): cw_monero/lib/monero_wallet.dart:1028-1033 | cw_wownero/lib/wownero_wallet.dart:813-818 \u2014 before extracting anything, compare \u0060cw_monero/lib/monero_wallet.dart\u0060 and \u0060cw_wownero/lib/wownero_wallet.dart\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 164 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":1028}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f42fad08888c41f93cd786e301ced48576572daf4955dbce05476638416c43b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_solana/lib/solana_transaction_history.dart:19-23 | cw_tron/lib/tron_transaction_history.dart:17-21 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_transaction_history.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"32690d939168e1c7347dcdb65f77818deab2c7559450d42b744c00fa192de47a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 5): lib/bitcoin/cw_bitcoin.dart:58-72 | lib/bitcoin_cash/cw_bitcoin_cash.dart:13-27 | lib/dogecoin/cw_dogecoin.dart:10-24 | lib/nano/cw_nano.dart:91-105 | lib/tron/cw_tron.dart:11-25 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 5 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"334774da892368c4c62f693726e936ec29ab17f3156b80953deea377be2590fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): lib/bitcoin_cash/cw_bitcoin_cash.dart:29-36 | lib/decred/cw_decred.dart:20-27 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin_cash/cw_bitcoin_cash.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"79aed05bb7955b8a1931172c79bcc0f75c56736b1fa6bfcba31bb69d10af44c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/core/amount_parsing_proxy.dart:72-76 | lib/new-ui/widgets/money/money_settings_cubit.dart:50-54 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/amount_parsing_proxy.dart"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"56022c6a23fc7c86822267d95bd599cbbca29e4cbe769e1921aa77bdf4cfce4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): lib/monero/cw_monero.dart:85-89 | lib/wownero/cw_wownero.dart:73-77 | lib/wownero/cw_wownero.dart:79-83 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"1339d47c707d4b28a1b8e88466eaf75ded248bd5a6d2e5bf34284d12c1cfbdea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/monero/cw_monero.dart:112-118 | lib/wownero/cw_wownero.dart:102-108 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c08c03ee55d0b1001720ca699d109e90ae9a32ef25aea3c9a797f0915974ad7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/monero/cw_monero.dart:126-132 | lib/wownero/cw_wownero.dart:116-122 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"19b008604176dcb624da1f2f3d9492e8b708fed79cc68a7fe0064a2deac76cff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/monero/cw_monero.dart:253-265 | lib/wownero/cw_wownero.dart:231-243 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4bbb245d3add9ee2ace75c9020eb58683dccb444712b2991b539d8638d4c53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/monero/cw_monero.dart:341-345 | lib/wownero/cw_wownero.dart:295-299 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fd176764c473baf4cb303cf18b2af673ddc9529aaa5c03f7ce139b6115ae3e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): lib/monero/cw_monero.dart:358-363 | lib/nano/cw_nano.dart:58-63 | lib/wownero/cw_wownero.dart:312-317 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0811f73e37e21f63de8eb79c3cbde2a73b35e9f08a1b29f0a56a62e8927f39b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/monero/cw_monero.dart:365-370 | lib/wownero/cw_wownero.dart:319-324 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a0602ebe2902161af0b7bc959f0665645383cac2d3a2e49ffa5600eb7e48640"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): lib/monero/cw_monero.dart:385-389 | lib/monero/cw_monero.dart:391-395 | lib/wownero/cw_wownero.dart:339-343 | lib/wownero/cw_wownero.dart:345-349 \u2014 \u0060lib/monero/cw_monero.dart\u0060 and \u0060lib/wownero/cw_wownero.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 11 separate duplicated blocks between them, totalling at least 105 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"043e33335d85ff189f0c6e353840077a9963cc7ae2e53a28d6f602b98eec16ed"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): lib/solana/cw_solana.dart:25-37 | lib/tron/cw_tron.dart:27-39 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/solana/cw_solana.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3b0657311f36f21081d93cb6619ebdcedca34cd594778546fa6923e064e2f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): lib/solana/cw_solana.dart:39-45 | lib/tron/cw_tron.dart:41-47 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/solana/cw_solana.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"62d556518e69f1ca8b7593aac998bf26eb8ee6dd1dcb7fe16eb132ced9b0ea9a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): lib/solana/cw_solana.dart:113-117 | lib/zano/cw_zano.dart:19-23 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/solana/cw_solana.dart"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd3b572d6796d1af5da2341b324b5635573e32b3c236bcf170288bbf938cddd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): lib/view_model/exchange/exchange_view_model.dart:1891-1896 | lib/view_model/exchange/exchange_view_model.dart:1930-1935 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1891}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bf1ed37a97f1c548d96790b81e5f1efe0b5d3aba6c9059c29a5da367356d0b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java:46-68 | android/app/src/main/java/com/monero/app/MainActivity.java:45-67 \u2014 before extracting anything, compare \u0060android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java\u0060 and \u0060android/app/src/main/java/com/monero/app/MainActivity.java\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 69 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb58cffe6f6b8dd204360a68d2982c168be2014f47b50f3b08dad186104b3831"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3): android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java:59-74 | android/app/src/main/java/com/cakewallet/haven/MainActivity.java:49-64 | android/app/src/main/java/com/monero/app/MainActivity.java:58-73 \u2014 \u0060android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java\u0060 and \u0060android/app/src/main/java/com/cakewallet/haven/MainActivity.java\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 46 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. Read the line range as the matched WINDOW rather than a finished unit: at \u0060android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java:59\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"a322df12b1d435a732e880d94627dd6763b2ecdc6939adaaa6b81ce62bee9aed"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java:41-52 | android/app/src/main/java/com/cakewallet/haven/MainActivity.java:39-50 | android/app/src/main/java/com/monero/app/MainActivity.java:40-51 \u2014 \u0060android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java\u0060 and \u0060android/app/src/main/java/com/cakewallet/haven/MainActivity.java\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 46 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. Read the line range as the matched WINDOW rather than a finished unit: at \u0060android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java:41\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f6ebed5307952ca19f7a325cb4f9cd58336f400472b84b980591874034684e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java:77-85 | android/app/src/main/java/com/cakewallet/haven/MainActivity.java:67-75 | android/app/src/main/java/com/monero/app/MainActivity.java:76-84 \u2014 \u0060android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java\u0060 and \u0060android/app/src/main/java/com/cakewallet/haven/MainActivity.java\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 46 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdf0239de38ff985fca7c52bff3fef8013f1cace6d6a2dd29e1c123e9dbfbdf7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java:30-38 | android/app/src/main/java/com/cakewallet/haven/MainActivity.java:28-36 | android/app/src/main/java/com/monero/app/MainActivity.java:29-37 \u2014 \u0060android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java\u0060 and \u0060android/app/src/main/java/com/cakewallet/haven/MainActivity.java\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 46 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"c88073074909e9e1c7215fe37036b335d9d6087cf18a47b5731a19894719c114"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): ios/CakeWallet/secRandom.swift:3-12 | macos/CakeWallet/secRandom.swift:3-12 \u2014 before extracting anything, compare \u0060ios/CakeWallet/secRandom.swift\u0060 and \u0060macos/CakeWallet/secRandom.swift\u0060 as WHOLE FILES: 100% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 1 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ios/CakeWallet/secRandom.swift"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"708466ccbf6982965ee9cdf303cd8e7e2662337a687ec0689cf8e566a951eb48"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): ios/CakeWallet/decrypt.swift:9-16 | macos/CakeWallet/decrypt.swift:9-16 \u2014 before extracting anything, compare \u0060ios/CakeWallet/decrypt.swift\u0060 and \u0060macos/CakeWallet/decrypt.swift\u0060 as WHOLE FILES: 100% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 1 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060ios/CakeWallet/decrypt.swift:9\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ios/CakeWallet/decrypt.swift"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bcfda3171b3ac9510ea1ac9c019d41e7456f190a39268153596b5b97c5e29e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): cw_decred/macos/Classes/CwDecredPlugin.swift:11-18 | cw_mweb/macos/Classes/CwMwebPlugin.swift:11-18 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/macos/Classes/CwDecredPlugin.swift"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5a3c84425b3f0639b40d5c77da17321cb6992082d4804455501e95cbe587ca2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): cw_decred/ios/Classes/CwDecredPlugin.swift:5-9 | cw_mweb/ios/Classes/CwMwebPlugin.swift:5-9 | cw_shared_external/ios/Classes/SwiftCwSharedExternalPlugin.swift:5-9 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/ios/Classes/CwDecredPlugin.swift"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e5617671eb8b4c4c4580d8aa39c95685b1dd6b80a07fa80c33f341b00dea3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): cw_decred/macos/Classes/CwDecredPlugin.swift:5-9 | cw_mweb/macos/Classes/CwMwebPlugin.swift:5-9 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/macos/Classes/CwDecredPlugin.swift"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad29c26ee59eda192368d08a15370ace634ae69f2ae0b7cbec4c6f8ec99002f"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: cw_mweb (pub): cw_mweb (pub): abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4f52cab44cbc0d5be0e93af85472ea9709b273086b5951d190fad4d599006873"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: cw_core: cw_core: abstractness 0.11, instability 0.00, distance 0.89 \u2014 zone of pain \u2014 concrete and depended on by 12 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ba023cb280404f7239d53a30b9c8097faa367baa6382dba20a4a047d65c3453e"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: DisplaySettingsViewModelBase (LCOM4 30): DisplaySettingsViewModelBase\u0027s methods fall into 30 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 30 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/display_settings_view_model.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f6213295fb023490c981826e885b40baeccc6123a3e00df8641fe913761de1b"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WalletAddressListViewModelBase (LCOM4 27): WalletAddressListViewModelBase\u0027s methods fall into 27 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 27 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4fc3bd2870e72b2ae121d35e15fe4b87fa5db358de820ce78d57b7099fb13ee"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: MoneroWalletBase (LCOM4 24): MoneroWalletBase\u0027s methods fall into 24 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 24 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"213238a25a6b5a7de7553f5abc5ab2ae331d97a7063ba967eb29a1ed7e56c002"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ExchangeViewModelBase (LCOM4 22): ExchangeViewModelBase\u0027s methods fall into 22 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 22 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"329fa849f4add42e24c37a3fa1125727c4fc77687113558c21a7c070b318b6c3"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SendViewModelBase (LCOM4 18): SendViewModelBase\u0027s methods fall into 18 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 18 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ebaf27843bbb6460beb159fd55f5fd7fc2680b29ecdd2d57794d5027165f3bd"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WowneroWalletBase (LCOM4 17): WowneroWalletBase\u0027s methods fall into 17 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 17 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6637e47b18d4e018d32fe470576f7d253edaa48a07e85719e2d7381debb5136"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: FeesViewModelBase (LCOM4 16): FeesViewModelBase\u0027s methods fall into 16 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 16 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/fees_view_model.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"452049609c3db6291f84a52c8e11832a7feb6c8ecee3ac749325a26a47bb8ca6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: _DigitInputState (LCOM4 14): _DigitInputState\u0027s methods fall into 14 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 14 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/digit_input.dart"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"e31716c676e5ce0646b0785fa6544fde0fd7d410fce77ebec76d07043c5522e6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AlertWithTwoActions (LCOM4 12): AlertWithTwoActions\u0027s methods fall into 12 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 12 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/alert_with_two_actions.dart"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a580bdc7aecc5277a444a21511a0e14a9380ff71cd0ebaa5fc4d005b555f2f86"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BlackTheme (LCOM4 11): BlackTheme\u0027s methods fall into 11 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 11 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/theme_classes/black_theme.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e61f71456a2ebfae1abeca3a4f592d34934688248016ba386cb06fe0429d0e07"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: LightningWallet (LCOM4 10): LightningWallet\u0027s methods fall into 10 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 10 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_wallet.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"443016ab42b7d552c9aafbf0db2173e20a789da43d82f2e68879943c7b16d2e3"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ZcashWalletBase (LCOM4 10): ZcashWalletBase\u0027s methods fall into 10 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 10 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"f51388d69ba5259165ccec1e9d73368d1e5e6cd760ce28db3edf876e73838679"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ZcashWalletAddressesBase (LCOM4 10): ZcashWalletAddressesBase\u0027s methods fall into 10 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 10 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet_addresses.dart"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d2912e78399a57b73c4b9affab8a53910f49e85e5f37068011a4f4a0f28aa6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SwapsXyzExchangeProvider (LCOM4 9): SwapsXyzExchangeProvider\u0027s methods fall into 9 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 9 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/swapsxyz_exchange_provider.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd959ac9519c6ed75e8f2197ab99ca093280e2d498db2df3a4e12fa93640ad29"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AlertWithOneAction (LCOM4 9): AlertWithOneAction\u0027s methods fall into 9 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 9 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/alert_with_one_action.dart"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d2efcb65bb8678e52cba9e570a014afbfdd335331a54f4cdb56982e374032ec"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BitcoinWalletBase (LCOM4 8): BitcoinWalletBase\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d8f3c82a052c88cef8d80721a21df3b3d044d1b8d63700435a006bec79ed211"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: LitecoinWalletBase (LCOM4 8): LitecoinWalletBase\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"34fa7ba04dbf0b97104cdbb4031be975ddf1bf9162e466e1b888c6cf5f7457bd"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: EVMChainWalletBase (LCOM4 8): EVMChainWalletBase\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ade08b7f5c0da28ad533a7e1eea4829128773f63207b33300a192d24ac4cc48"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ZanoWalletBase (LCOM4 8): ZanoWalletBase\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a04c409410e4ec7ff7429d57ed9a14333cd8fc56e2f4e0104f99a49397af0b7"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: MoonPayProvider (LCOM4 8): MoonPayProvider\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/moonpay/moonpay_provider.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"06f7baf1199273de9fe17cbf57158a73284992daa434b9b3563987ec4335796d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: FiatCurrency (LCOM4 8): FiatCurrency\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/fiat_currency.dart"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"bccc44f86bd9fd9dc5f015b2d08862322ce96c76ab95d8a296a99e66e3431983"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TrocadorExchangeProvider (LCOM4 8): TrocadorExchangeProvider\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/trocador_exchange_provider.dart"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c8b238d0f5bed4dbb22d3f25bb5749538d739368797838d0af6f933b32768c6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: QRFormatSelectionDialog (LCOM4 8): QRFormatSelectionDialog\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/ur/widgets/qr_selection_dialog.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"681648b97223dbc431f5d88d3ec1c861f8015ba927eb48bf1a4c2966d1c434df"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: DecredWalletBase (LCOM4 7): DecredWalletBase\u0027s methods fall into 7 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 7 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"6824429f00e73f27ee6676eaf1aeb00c37c2bbf7dff9aed1e552766102767216"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PendingEVMChainTransaction (LCOM4 7): PendingEVMChainTransaction\u0027s methods fall into 7 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 7 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/pending_evm_chain_transaction.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"363da50f6ed09cf9bc51e96312ef3b49fff4c923747de4b8b3f6c3ed59db9946"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SolanaWalletBase (LCOM4 7): SolanaWalletBase\u0027s methods fall into 7 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 7 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"15b9bd16334af37e883fba4077e7df88cab06d98bee31d43b656d1890d67ed90"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CakePayBuyCardPage (LCOM4 7): CakePayBuyCardPage\u0027s methods fall into 7 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 7 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceb96d0d52866705085b9c50f82302eea427e256e3a1c0686941259d336b5b1c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ThreeCheckboxAlert (LCOM4 7): ThreeCheckboxAlert\u0027s methods fall into 7 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 7 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/widgets/three_checkbox_alert_content_widget.dart"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d4aaf6df3afce9a4091ed493cb634d225226dd723bb3bd2b9695a4608a7fe31"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ChangeNowExchangeProvider (LCOM4 7): ChangeNowExchangeProvider\u0027s methods fall into 7 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 7 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/changenow_exchange_provider.dart"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae015243f0c91265021c72c7f5540410bb092c726a3f5d906bd9c7f379f066c7"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: XOSwapExchangeProvider (LCOM4 7): XOSwapExchangeProvider\u0027s methods fall into 7 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 7 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d48e4459e58a9e3ff34d50eb9017abea7484ab0c1d5fc53c09cebd6034d7a3"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ChartsBloc (LCOM4 7): ChartsBloc\u0027s methods fall into 7 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 7 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/viewmodels/charts/charts_bloc.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"98bdb4ae1491fe3bdae86e3e2f68427c18661c753049cf06fa021320e85b1fc4"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BitcoinWalletAddressesBase (LCOM4 6): BitcoinWalletAddressesBase\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet_addresses.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"b862f9d9a6385d72c2aee2548ab9143d81419dfb0b8250621c999fcefa0c1b2a"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CryptoCurrency (LCOM4 6): CryptoCurrency\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f3e98787bfaf1d785c8495adac08bea5d1d289b414457fecdc567400a011ed8"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: NanoWalletBase (LCOM4 6): NanoWalletBase\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_wallet.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca7e399d5448dc8731c41c1b864bfbee1d23cf28b6c3cbcc4327c60c396a9eec"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TronWalletBase (LCOM4 6): TronWalletBase\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"c47f6000dbf145ec5cd46501a6f2dd858c4c917115a2bf237a86d22bf5186d5d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: OnRamperBuyProvider (LCOM4 6): OnRamperBuyProvider\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/onramper/onramper_buy_provider.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e354cba034888dbbdf323ff15e24f45ff20e7d74baa0072a846c6850831f18"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WyreBuyProvider (LCOM4 6): WyreBuyProvider\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/wyre/wyre_buy_provider.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e13b703fef2153a6d5508b9edd45cfc728d9b19bb5e588ee546dc49d362bfff"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PendingLightningTransaction (LCOM4 6): PendingLightningTransaction\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/pending_lightning_transaction.dart"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b0843e1a071555fd5ee28ec3b75f21f5397fe26c21e76b5bb675db885c18eaf"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CWMoneroAccountList (LCOM4 6): CWMoneroAccountList\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6e81a0b2bcd147040d1edb9231d87f478da7db1f8bc8fee6ef4add05e4ad2b0"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CWMoneroSubaddressList (LCOM4 6): CWMoneroSubaddressList\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/monero/cw_monero.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"a39595ecbbc2336961842141a6dc11e442d7a1a954c7e0448cb79611bfc0fa4d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CWNanoAccountList (LCOM4 6): CWNanoAccountList\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"489f2084c57402c3a4d9cdf9100bc7623e53866a7c7a47257a2cd84b8db89509"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CWNanoUtil (LCOM4 6): CWNanoUtil\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a4dbdb6d6d4b82248f843c8c5cf2ee0f05b3c3cec5ed90f3dd8243e131ddca"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: _NewHomePageState (LCOM4 6): _NewHomePageState\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/home_page.dart"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf60d1c5ecb76621c1965f766546ae8617fce7fac0f94f4bff261b76696fda9d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: _CardsViewState (LCOM4 6): _CardsViewState\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/cards_view.dart"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"77eff92f4e99b4c237c5ecfb03a5f53b45e20609814edd3f9871e2cb9e7d80ca"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PendingZcashTransaction (LCOM4 6): PendingZcashTransaction\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/pending_zcash_transaction.dart"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bb4e95e617add1b1617c0d3a5bec18cefefd1dbf1e976179ad54c54a61b9bd5"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SelectDeviceManufacturerPage (LCOM4 6): SelectDeviceManufacturerPage\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/select_device_manufacturer_page.dart"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ab2011a3fb60043e60c9c97cace7034bd26ae7ddecd515f35cd751ab55607bc"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: NFTDetailsPage (LCOM4 6): NFTDetailsPage\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_details_page.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c7514ec97b4cbdcee9e4aad5195b179ba1fbe033ac1692013d50951185eb94c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: _RestoreOptionsBodyState (LCOM4 6): _RestoreOptionsBodyState\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/restore_options_page.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5d39ce827aa0431f56d2923e7ab24b56654eb675da7161084ce6c1e5f5d8eb4"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SupportPage (LCOM4 6): SupportPage\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/support/support_page.dart"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee4ccd32eaad50a70395e00cb2fc100203e727f48fc33d5460c726f6cad10225"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WelcomePage (LCOM4 6): WelcomePage\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/welcome/welcome_page.dart"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6554a98e9bc6bead59d0d81b1589f365e486a09f5b123398bc96dc0c5fd4efb"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CakeTorSocks (LCOM4 6): CakeTorSocks\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/tor/socks.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a5bf26bf9bc4156887634bb6d6cce2a0ece4c84ca391974f10ca4e89d7d38ca"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BridgeViewModelBase (LCOM4 6): BridgeViewModelBase\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cf4e3f34c668a94c226cb7b59e2bc5385eca04a98d59801622bfd27ae48937c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: DashboardViewModelBase (LCOM4 6): DashboardViewModelBase\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"245a610118016e5dfb9952b7671b9daedba3092a31459ff80df11e6312acbff9"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BitboxViewModelBase (LCOM4 6): BitboxViewModelBase\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/bitbox_view_model.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"3785792a26acd8f3c7d9d48fbc9f92f6d2e805ee16a22c7248623530e9d71c2b"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: LedgerViewModelBase (LCOM4 6): LedgerViewModelBase\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/ledger_view_model.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c506e11e30a8b27eb7cbbded7fdf532791dbb17fcadcd6ee947bbe3fa9a456b6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TrezorConnectViewModelBase (LCOM4 6): TrezorConnectViewModelBase\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"98f521885b16000935a2741e534ff12d0fd8cb5152b5532d6db3a243c883477d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CWWowneroAccountList (LCOM4 6): CWWowneroAccountList\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/wownero/cw_wownero.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"02bca72a85132aa69875ff6089327dcedde72fa727773d817e00891d3cdf9f5c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CWWowneroSubaddressList (LCOM4 6): CWWowneroSubaddressList\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/wownero/cw_wownero.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"90c85390117493d5acb201bea06c830a4992d84d8c14e9ae426284b6a1012c8b"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ElectrumWalletBase (LCOM4 5): ElectrumWalletBase\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"02d9b17c233a1799f4801d594b4b180e46ea86011127b3ccc59cd40146698829"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: LitecoinWalletAddressesBase (LCOM4 5): LitecoinWalletAddressesBase\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_addresses.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"197062c9854f784a7aa657eb5f796240b88e8d0893a50941f40c9f965050e7c7"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: DecredPendingTransaction (LCOM4 5): DecredPendingTransaction\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/pending_transaction.dart"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"50e60ff8f65d41803982bb630cce0d6838d3f778bafb8598929fbc6f87ff8c98"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: DecredWalletAddressesBase (LCOM4 5): DecredWalletAddressesBase\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet_addresses.dart"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbbb5069b826730ed8454273d89ac9a0b41772e992afbbe7e172185249044ec3"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TronTRC20TransactionModel (LCOM4 5): TronTRC20TransactionModel\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_transaction_model.dart"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b791d0a95deef97e83f3aca1aec66c8b62498136bfa60e26ea380702a108b3"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BuyProvider (LCOM4 5): BuyProvider\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/buy_provider.dart"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0ac95825911a81f83e18e77900dfcea40f09dbafcac3ac74cb0794ffb3523c7"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CakePayCardsPage (LCOM4 5): CakePayCardsPage\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_cards_page.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfa3e958c731afebd1caa27d6c77a34e8140910692238a06f4407fc7e6457f55"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: InfoPage (LCOM4 5): InfoPage\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/Info_page.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3e736f0287d542dbb334d7477df50ba04ac859a7063ba0185e74d7f939ac8ef"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: NewWalletPage (LCOM4 5): NewWalletPage\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/new_wallet_page.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba663349dabec5919328bd76505a38bedbc13f0579e5f52a3ede41b867041fb"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: FullscreenQRPage (LCOM4 5): FullscreenQRPage\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/receive/fullscreen_qr_page.dart"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecda8aa19542142063caef89e3a345a309a9d22ae32ee89fc18d3a8d5c35ce5d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BackupViewModelBase (LCOM4 5): BackupViewModelBase\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/backup_view_model.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"19000c551979a8478c6354a21b870d3e54d9a2f44ee57bcd09e4fb58b1d8be86"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BuySellViewModelBase (LCOM4 5): BuySellViewModelBase\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/buy/buy_sell_view_model.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"6740c08806e0896a768454d0f8248bf787c84c735f15ef5c22bbfdd78aa488d8"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WalletKeysViewModelBase (LCOM4 5): WalletKeysViewModelBase\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_keys_view_model.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"64499e9a09bbdfa0d51664a1b53add16fce9917b9e553860b34cc082b88a4a99"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PendingNanoTransaction (LCOM4 4): PendingNanoTransaction\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/pending_nano_transaction.dart"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"bee7e439153b2c44f22867927c8d89ab8237c129d32aeb8ae6f6a8f89e445f9c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PendingSolanaTransaction (LCOM4 4): PendingSolanaTransaction\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/pending_solana_transaction.dart"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"3763f282f72005561ddce02c57b1033bb99b80ee7eb194c76545ba3f7ebb7990"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PendingTronTransaction (LCOM4 4): PendingTronTransaction\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/pending_tron_transaction.dart"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0984a5dc6e6236275157321b3c37bfc64867c42a65f3982a07974879dac3e50"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PaymentMethod (LCOM4 4): PaymentMethod\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/payment_method.dart"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea7ff55fbd8379be4ad9c360c014a1fe47ca31137c10747f536dca9ba3e211a4"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: _SqliteErrorHandlerState (LCOM4 4): _SqliteErrorHandlerState\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/db/sqlite_debug.dart"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5abe30f6ea2a45966f884fb35b4cd9856a832ddc3991cf61916aca8324c28ec"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: EvmBitboxCredentials (LCOM4 4): EvmBitboxCredentials\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/hardware/evm_chain_bitbox_credentials.dart"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd3a7570c53393499d6a14a23d40f691cddc77b9b3331bc134ce73d523246761"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: EvmLedgerCredentials (LCOM4 4): EvmLedgerCredentials\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/hardware/evm_chain_ledger_credentials.dart"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5762fc243c6cd16f002101b28f15bce84b0dde5ec90f72aa0f52972c94e62bb"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: EvmTrezorCredentials (LCOM4 4): EvmTrezorCredentials\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/hardware/evm_chain_trezor_credentials.dart"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd7198600cba4a44d73b44e66d42d384be02b5e272d901b71bf3f06fbfe34131"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: LightningAddressType (LCOM4 4): LightningAddressType\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_addres_type.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9132cfa2942da9d11f81dabadc919be1210c0bfdaad529f9a16eab18dbde0c0"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PendingZanoTransaction (LCOM4 4): PendingZanoTransaction\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/model/pending_zano_transaction.dart"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"5366ce1667e6ed4722a55f34564bfa9457bf53f64de66f04d21e9a93d282d4fa"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CardCustomizerBloc (LCOM4 4): CardCustomizerBloc\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/viewmodels/card_customizer/card_customizer_bloc.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb7a4f3050919045ffd80aa77e307953dc9ba8c90ef9bdcc35e4e37ab8462391"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: _MultiNetworkCurrencyPickerState (LCOM4 4): _MultiNetworkCurrencyPickerState\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b15107c3615568b85e633e09570cde9c8c28217fa14b78682e0e651d1d6a12"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: _NFTSendPage (LCOM4 4): _NFTSendPage\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/pages/nft_send_page.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef467bf903c69d4d286586fcf538995b129cb405c7f340769a2ee5948a78b7ab"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SignFormState (LCOM4 4): SignFormState\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/sign_form.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9bbf0acdb45d9b0ccef60ef3b9de39c7c380f5e6f604c29c9f7a116917f22bf"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: VerifyFormState (LCOM4 4): VerifyFormState\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/verify_form.dart"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d266873f43253ddd4555038bc0c4043c777e1ed115f2df0f6eff90c41a92f6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: DEuroSavingsPage (LCOM4 4): DEuroSavingsPage\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/integrations/deuro/savings_page.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"05d8b8a1fb5fc252d725733ad30665520e817807341a829677fead3cc14191d9"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WalletGroupDescriptionPage (LCOM4 4): WalletGroupDescriptionPage\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/wallet_group_description_page.dart"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"03e36ad17852159f0fc25a8afc0f8e7e2b328236af0270d89d9bc1fa1dcaa4d3"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WalletGroupExistingSeedDescriptionPage (LCOM4 4): WalletGroupExistingSeedDescriptionPage\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/wallet_group_existing_seed_description_page.dart"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c4b20553d26813f25534582e23ba01502dbb4d3ff131ad0292d789d980d7c7d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WalletRestoreFromSeedFormState (LCOM4 4): WalletRestoreFromSeedFormState\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_from_seed_form.dart"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"39dbe75ad79e31ee61a6345cd6d13ca40337167cef22dff656b3b6d67349b414"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SeedVerificationPage (LCOM4 4): SeedVerificationPage\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/seed/seed_verification/seed_verification_page.dart"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"07387d92ee19191b216006e5066a85bbdb25a28b25f57c08700d4336b292a39b"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: EvmChainServiceImpl (LCOM4 4): EvmChainServiceImpl\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"8971e5f4db20c3ee586d352bbec3b6e414ff565d322c03115a8787d90083b33b"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WalletKitServiceBase (LCOM4 4): WalletKitServiceBase\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"ece4921be03b0cb09b10db330d9c26ffbc5ad5613285223e9d4c21baf8407e95"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AppStoreBase (LCOM4 4): AppStoreBase\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/app_store.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd8ac3c3c7a127375c4816e7f2508190e3404043b626c86b8fb67dea35c34a30"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BridgeHistoryViewModelBase (LCOM4 4): BridgeHistoryViewModelBase\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_history_view_model.dart"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"b872cf969c9079faa214afd4fe487762243fd2219cb9edaffc6064832e24daf4"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: StartTorViewModelBase (LCOM4 4): StartTorViewModelBase\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/start_tor_view_model.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"e94e70d18f1f4bb4d6e1793dba859014a948f9b2207879437590cf180bca30d6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: MoneroAccountListViewModelBase (LCOM4 4): MoneroAccountListViewModelBase\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_account_list/monero_account_list/monero_account_list_view_model.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc19eac9057f86b04941af7736ca8d1377779c0d43e6df549a95672880290edb"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WalletCreationVMBase (LCOM4 4): WalletCreationVMBase\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_creation_vm.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b297010ab1e3159ec38478a839683f806168d8b97881d802d79ff5423b7e4d2"}},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"13988dc28f8cd875cd44c84f21ab1bf6496178a7e35e5e9635e9e62f990f2684"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"667477001b91ab50b334c2b5d336c125268fb99ff5deb707bde6f9e2748930e5"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8e9f6eab43bd7f73684da39971c1b40c21b6d288cf60136802e9226441caa24a"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9e902cec64547f7b04ede862b9bbedb5b8fe83a7b50eadd3ea8a3f8e8ea0f618"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0c98b7dfa049aa9097f50f113ff094e329101e4731ddaeab056ad077d2611ae0"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c8cf5ba4262ea91cddf41eb37ef94c34a7db5fee0a6e832f061da6a97ae03a1d"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7debfb43d5c5e30774970cafbed0a3f72e65aa9457c3387ec2a91184e1905892"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b50e0f5a05eee56692d72a1596897165708baef805308387fce829f7a7ff8e5"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"39404b42274235639c10edba69c6e8cd1018069c7dc97a251d49fe5f9d449343"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1bbecc164cb4d641730332f4a8288972adde90e677e5401596842cf789cae51b"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"72aed65ac93c4dbbe0b359ed951d4d0ec132de1e7b379841c5bf2a4fdcd9ac70"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d963281c52627d9f4b6d3bdb456275e37905f859fb96fce36b02a5948fd7a8a7"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7211370678bb81115eca51de90c201a3f2099b0a0edf27b09f9bc13f827b17fb"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2b2a1fbb8a8b1a1953764b7649a548d1b67f386dd7820dc6553519a22ce6b020"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b1b91cdbe8f90e3ac4b2647adbfd17507fe49ab77a8a339a4e49e6445203082e"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"586b6ce5e7e3b1c1cae76c521e28d98a2db8fb37162b911b553c3488f9eb03e3"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a12cc82ac2a4d2af859883c3a6209ad4aee1f4f721b93217a51b7cdae1d6093b"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c1c6dd0772764d4536bea6322855146241cbd2e62438f66c6c13b353a6f1507f"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3da062d82c1f9d3691cd5c4b8e58760ccc412a9101d2d3039a12403c98cc379e"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"043f1ffa6ca8a8ac9e3072c01109694aef511aa8bbd5a5b143a9ff6709caa978"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"53d3d07323c4afe29e391b27ee422428d1253f4dff86596b36a62e445537d0e6"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"969c1f212444c4be809799c475cc5cd2753a6a53c1cfc9962ccdf8ed11d62cc2"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"950bb0593eab011b7afdb56cbd51b815adb7a707445b8fa8d39bdc4bc25ee32a"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"37e084f88f27dc2a98f68497770c747dc9eb18f711aa6f8c9085d6814fdbd5eb"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c6413d907c4a9c57ddb8694b90f1d7ff3fd390855360dbe864dc628ee26d4c49"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d728ba9b86e438e6c3b6bbe801fd02b429c0c140e319ac0f8203eec10f217852"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a5582cd7a939cbda69c7abf7ae0b2a97a8fefb51d1bd7334850b8000f90a02e1"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c59439689cea06aa7cde2cff1bf3870bd4c3d4962d3ff222ae99c24cbb63bdb7"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"850821f9fe5e7f54a538d031e6c1729298d2394b19bc82b9d7e00531e5c8ffa6"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0639f6a8214b3dd295b959d95bb4cb843eda0850fcfaf6d6a9f3c17285e6da92"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"46d4db7c2399585223cb7fd9172a53faacaadde6cb847048fe8ac9c70a9bd100"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d94d44c3ed6a2cc190b936051f19f26f9680e3d294d8b651457aee12961b8b06"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b5f71093b251c501db792ce1b207459e8a7cf3eb6ecd1bb0fd20173e6ee13e1f"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5bb41f769b977d15b53584d1aee4797cbc35951420b783086e20eae326778ee6"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cfa5ac4dd2bfe4b606a753898c3825b45db75112e5350b19131bc8020b8c7c74"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"da4da02c56042d160a4417c2829343ca0eefe1fab57f01253af5db18eb3a74bd"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"45ff761752bdebe64346c1601f8b1567a996c3f1cf897b3a1cd638594df6ad9f"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"acc406db5c9b15d701166a7e5997b8a7e67766b527e85f2a5f0d4748f08d9a02"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1614541525da44d5f6105d5601123b08182d7973f95cf463ea4a35b543fc1729"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6cf2eb81ed9ca5478f3cfbc1ff22c691aaf19733416644d170f29654b7c159f9"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"82d5b7455609e2ee6e07aa4e10017133e9499a6e5987848e7187a20a165dee71"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d10fb2e1f67b74d315c4748a9f94bac20f5057d33628fc6b2b1e8577693c1e51"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bd34b15ab464028c8c37ee8b2550356f372201c0673a60a9ce79905fe17f4e1a"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"20cff6a34a6b6710ebd34844127637992d592030c016d1487ef8b64a6d4b495a"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"55ef1f8f827b16fc843df6779046718d55d31587ba9487ad20f58e6e107c8210"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ede067a7ef1e4352692b1e0ac72237ed0de1abdae5c5a41b97438f5075be924a"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7f85834c769611a92a3189ec5d5ce6788d05e002232d65bb5aa522df7d52aa64"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cbf69dffca1697679a184b1c9d51cd32f05d97b8d342ce692b37945542dcda29"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9dd88f9fe0244923d222e2601e38e5bc415959705a2f06346dbb26b980d62353"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b5195cc2fae0abc1bdda39105686dea479d9cd1af9a98bedda8f0d85da228db3"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/send/send_view_model.dart: lib/view_model/send/send_view_model.dart changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in SendViewModelBase.createTransaction at line 688. 4 of those changes were fix/bug commits, and the other 9 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/send/send_view_model.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"489cf2e5d61ccf3807c24a905146e8d3fc4d12ad2106c32dca94961aa8797bbd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/store/settings_store.dart: lib/store/settings_store.dart changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 57 in SettingsStoreBase.reload at line 1841. 1 of those changes was a fix/bug commit, and the other 7 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/store/settings_store.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/settings_store.dart"},"region":{"startLine":1841}}}],"partialFingerprints":{"codehealthFindingId/v1":"796764222c532173ab7a98a09bf335504022c8f6852f6c7e5bbc5000c8e2068c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/exchange/exchange_view_model.dart: lib/view_model/exchange/exchange_view_model.dart changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 57 in ExchangeViewModelBase._createTrade at line 1071. 2 of those changes were fix/bug commits, and the other 6 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/exchange/exchange_view_model.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1071}}}],"partialFingerprints":{"codehealthFindingId/v1":"7351320a7bbd3f78bf7a428a2802120adcffe950f989b67bb8231275f2f4de80"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_bitcoin/lib/electrum_wallet.dart: cw_bitcoin/lib/electrum_wallet.dart changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in ElectrumWalletBase._createUTXOS at line 1144. 3 of those changes were fix/bug commits, and the other 10 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_bitcoin/lib/electrum_wallet.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1144}}}],"partialFingerprints":{"codehealthFindingId/v1":"bac8ed351fdbb4b2f3dfa69712fc9c36feb0e4d65b9b90c2e134e45190fa8248"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/pages/send_page.dart: lib/new-ui/pages/send_page.dart changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in _NewSendPageState.build at line 346. 4 of those changes were fix/bug commits, and the other 7 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/pages/send_page.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"76021ef9f52139513c761f5c562c6ee1103e3afa8d139e0d7282170a7f867658"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/core/address_validator.dart: lib/core/address_validator.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 85 in AddressValidator.getPattern at line 68. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/core/address_validator.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_validator.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ddb49ae0fb9ba0697d70fc2bdb950c54a049f2fcbc40de9b761215826f46bb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/wallet_restore_view_model.dart: lib/view_model/wallet_restore_view_model.dart changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 39 in WalletRestoreViewModelBase.getCredentials at line 128. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/wallet_restore_view_model.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_restore_view_model.dart"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"803d415d0c18ed32f56419c21c376c65fec6d185c42d79c2f572676afeda3f00"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/pages/swap_page.dart: lib/new-ui/pages/swap_page.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 53 in _NewSwapPageState.initState at line 119. 1 of those changes was a fix/bug commit, and the other 3 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/pages/swap_page.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"8714c3190466326415e1cea48e682f5a8e3dd0fd9b28017121df6498c0fa2167"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/wallet_keys_view_model.dart: lib/view_model/wallet_keys_view_model.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in WalletKeysViewModelBase._populateKeysItems at line 151. 1 of those changes was a fix/bug commit, and the other 3 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/wallet_keys_view_model.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_keys_view_model.dart"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"39668e3aeceda0f8d6357302f38c3b3063a5c1ba94191496d74d9d2708aae6c6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/swap_page/swap_amount_box.dart: lib/new-ui/widgets/swap_page/swap_amount_box.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in SwapAmountBoxState.build at line 139. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/swap_page/swap_amount_box.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c4fe6caf2febbbad29458623d704df9c5b2af4c3ddc38c6220206a8009d2f4d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/restore/wallet_restore_from_qr_code.dart: lib/view_model/restore/wallet_restore_from_qr_code.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in WalletRestoreFromQRCode._determineWalletRestoreMode at line 183. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/restore/wallet_restore_from_qr_code.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/restore/wallet_restore_from_qr_code.dart"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"258f22c00e747c67e218d6dc7df7567449018381c9e3414d491f7e5210076695"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_zcash/lib/src/zcash_wallet.dart: cw_zcash/lib/src/zcash_wallet.dart changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ZcashWalletBase.fetchTransactions at line 809. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_zcash/lib/src/zcash_wallet.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":809}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34af8758c7192e9d506dc1a7d27bc654ac25bb9a811fa86bd9441d1cd9058fe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/utils/token_utilities.dart: lib/utils/token_utilities.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in TokenUtilities.getAvailableTokensForNetwork at line 339. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/utils/token_utilities.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/token_utilities.dart"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"e02bd9ed2902b6a227c20edd633758f411e6f44419039faf092cbf2101bf1b81"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/wallet_new_vm.dart: lib/view_model/wallet_new_vm.dart changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in WalletNewVMBase.getCredentials at line 56. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/wallet_new_vm.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_new_vm.dart"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"7587082e96955dd48243160a5e5fb186484eb409b8f5d949b1ff66c27b2e520b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_monero/lib/monero_wallet.dart: cw_monero/lib/monero_wallet.dart changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in MoneroWalletBase._createTransaction at line 430. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_monero/lib/monero_wallet.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"8861ce8189a5a19ff0088c1e02c8032dcb3f7d227dcd8e181c50cf30b2d0db57"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/hardware_wallet/trezor_connect_view_model.dart: lib/view_model/hardware_wallet/trezor_connect_view_model.dart changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in TrezorConnectViewModelBase.connectDevice at line 204. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/hardware_wallet/trezor_connect_view_model.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"30cec9027bccda39c4258f052180c797e2dd0c7d060d5794a84017fb3b9af90c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/pages/receive_page.dart: lib/new-ui/pages/receive_page.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in _NewReceivePageState.build at line 130. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/pages/receive_page.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/receive_page.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"3106c4c037e3bc41509564465cb1547f2e42dd36c1fc0564ed51448d1974a44e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/send_page/send_confirm_sheet.dart: lib/new-ui/widgets/send_page/send_confirm_sheet.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in SendTransactionDetails._buildMainContent at line 197. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/send_page/send_confirm_sheet.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_confirm_sheet.dart"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfce196b4f905c128051028b38b9354473d42aeff9aa63a5f9d5b278dca8579d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_bitcoin/lib/electrum_wallet_addresses.dart: cw_bitcoin/lib/electrum_wallet_addresses.dart changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ElectrumWalletAddressesBase.addBitcoinAddressTypes at line 598. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_bitcoin/lib/electrum_wallet_addresses.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"8130da1b8959ed920dace9af6469d4a9bc24f9faf4c1f2866ae371071a00c640"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/coins_page/cards/cards_view.dart: lib/new-ui/widgets/coins_page/cards/cards_view.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in _CardsViewState._buildCard at line 86. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/coins_page/cards/cards_view.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/cards_view.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"9205cb3d3106d8d5f7e4639fe63e3e1a75fdf0d056fc3f225c3cb1c8ad3bf57d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_solana/lib/solana_client.dart: cw_solana/lib/solana_client.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in SolanaWalletClient._signSPLTokenTransaction at line 1781. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_solana/lib/solana_client.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1781}}}],"partialFingerprints":{"codehealthFindingId/v1":"17d37eee4ed852ec46794e86060f6f2428ea0089835389d32ed5241c2c2c241e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_evm/lib/evm_chain_wallet.dart: cw_evm/lib/evm_chain_wallet.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in EVMChainWalletBase.createCallDataTransaction at line 989. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_evm/lib/evm_chain_wallet.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":989}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f6ac3bd6fb5fd4e7c1e3ea76fd6bd6e8e3efd99be125da34353e1e6ee93dbf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/dashboard/transaction_list_item.dart: lib/view_model/dashboard/transaction_list_item.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in TransactionListItem.formattedFiatAmount at line 188. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/dashboard/transaction_list_item.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/transaction_list_item.dart"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"305a97727b966c89247064f020e455468f40d7090463d3cac43c5fa6f2e98b82"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/receive_page/receive_address_type_selector.dart: lib/new-ui/widgets/receive_page/receive_address_type_selector.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in _ReceiveAddressTypeSelectorState.build at line 36. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/receive_page/receive_address_type_selector.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_address_type_selector.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"f81522a213f7ecde23939b613f6a5d74bebe89ef78f029e61a1488df4b43722e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart: lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in _MultiNetworkPickerBodyState.build at line 266. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5befca18f30699bb9b569a7fbb26fb2c026fa1c8fc8c3aab164cce942fdbc45"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/core/wallet_creation_service.dart: lib/core/wallet_creation_service.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in WalletCreationService._hasSeedPhraseLengthOption at line 76. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/core/wallet_creation_service.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/wallet_creation_service.dart"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"4304b1674192e9afbb382a5d2da59d5bf6341531ff251ebf1133e89dc487e04c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/src/screens/new_wallet/advanced_privacy_settings_page.dart: lib/src/screens/new_wallet/advanced_privacy_settings_page.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in _AdvancedPrivacySettingsBodyState.build at line 123. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/src/screens/new_wallet/advanced_privacy_settings_page.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/advanced_privacy_settings_page.dart"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e993ef9e96f105c4ac741183de49541e195ae9766c804a5e39672afdcbb197"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/pages/card_customizer.dart: lib/new-ui/pages/card_customizer.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in _CardCustomizerState.build at line 172. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/pages/card_customizer.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/card_customizer.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"26dd43f4eb9dbcf9ffc3aa0d1921451ebd1e8aed80ea932b3573c5691534d622"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/coins_page/cards/balance_card.dart: lib/new-ui/widgets/coins_page/cards/balance_card.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in BalanceCard.build at line 57. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/coins_page/cards/balance_card.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/cards/balance_card.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"623555ff4921fe5fdaa875d746e13c2b0baa20fe3c65df6d97051c98ad5b4e98"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/coins_page/assets_history/history_section.dart: lib/new-ui/widgets/coins_page/assets_history/history_section.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in HistorySection.build at line 49. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/coins_page/assets_history/history_section.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_section.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a091a1027879b48d291ec9ab1fed20a201e6f9045e746abc90766a1c2439bac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/src/screens/restore/wallet_restore_page.dart: lib/src/screens/restore/wallet_restore_page.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in _WalletRestorePageBodyState._isValidSeed at line 603. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/src/screens/restore/wallet_restore_page.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_page.dart"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e9080df37b5e1b055b4b21386623f9381b85df1dbdeccca7d499dcc321cbd83"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/exchange/exchange_trade_view_model.dart: lib/view_model/exchange/exchange_trade_view_model.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in ExchangeTradeViewModelBase.paymentUri at line 319. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/exchange/exchange_trade_view_model.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_trade_view_model.dart"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"89c7e66d304d3ed00c3d8c0324832641105367d65cdc54605853176263f1f0d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/pages/scan_page.dart: lib/new-ui/pages/scan_page.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in _ScanPageState.build at line 62. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/pages/scan_page.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/scan_page.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"81b15290dcc89d8eaa98e48fdee9e5d0818ac4e7753a7db4366e637e69b77579"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/receive_page/receive_top_bar.dart: lib/new-ui/widgets/receive_page/receive_top_bar.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in ModalTopBar.build at line 55. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/receive_page/receive_top_bar.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_top_bar.dart"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"a633fed4e756df57dca13d4db457fd8e6d885f02cd9a1f4fa112e7e26a2c95bb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/solana/cw_solana.dart: lib/solana/cw_solana.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in CWSolana.signAndPrepareJupiterSwapTransaction at line 196. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/solana/cw_solana.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/solana/cw_solana.dart"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"64e6de4147428f0c0d36b15f114fcc523b5d5df57efeefd9cf00779287a7d812"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/buy/robinhood/robinhood_buy_provider.dart: lib/buy/robinhood/robinhood_buy_provider.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in RobinhoodBuyProvider.getSignature at line 106. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/buy/robinhood/robinhood_buy_provider.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/robinhood/robinhood_buy_provider.dart"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"1357b15f55da83623363732cdc5777588277a3e0337599f7fe9eabd44e7138db"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/advanced_privacy_settings_view_model.dart: lib/view_model/advanced_privacy_settings_view_model.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in AdvancedPrivacySettingsViewModelBase.hasSeedPhraseLengthOption at line 47. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/advanced_privacy_settings_view_model.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/advanced_privacy_settings_view_model.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3426bcef4155336c6514c397389a0e3883814b85a9bc7c7943a603092497463"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/src/screens/settings/connection_sync_page.dart: lib/src/screens/settings/connection_sync_page.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in ConnectionSyncPage.body at line 31. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/src/screens/settings/connection_sync_page.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/connection_sync_page.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"d60e8daf1d4009e9d2ecda40bba5dcabd7c533eb9b8c94e704e86d32fc934359"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_core/lib/node.dart: cw_core/lib/node.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in Node._uri at line 278. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_core/lib/node.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"91f9decc28ef0e5a0dda37ee1ae1fba89c1f80cb28fad36320e97d1a6eb47361"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_zcash/lib/src/zcash_taddress_rotation.dart: cw_zcash/lib/src/zcash_taddress_rotation.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ZcashTaddressRotation.createAndSweepTAddressesForAccount at line 358. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_zcash/lib/src/zcash_taddress_rotation.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_taddress_rotation.dart"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6715bff2d14f9fc04e38fac0cf04c04887b061d4bdee995eddff2457e50b59d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/send_page/send_amount_input.dart: lib/new-ui/widgets/send_page/send_amount_input.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in _NewSendAmountInputState.build at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/send_page/send_amount_input.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_amount_input.dart"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"9579b4d86482255f2a6a0c858723de8065a3795bd4f379e77f772c504d9a4b42"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/src/screens/settings/other_settings_page.dart: lib/src/screens/settings/other_settings_page.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in OtherSettingsPage.body at line 43. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/src/screens/settings/other_settings_page.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/other_settings_page.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d80c8edf223bdc86028472b27c75dbaf7a097c2e639c0af2a6071663e9d3b716"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/src/screens/dashboard/widgets/menu_widget.dart: lib/src/screens/dashboard/widgets/menu_widget.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in MenuWidgetState._iconFor at line 240. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/src/screens/dashboard/widgets/menu_widget.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/menu_widget.dart"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c6294ed2d3032ac0aa40376db8778d85ea134f8e8c7dd91adb2c6273126e2ff"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/view_model/wallet_groups_display_view_model.dart: lib/view_model/wallet_groups_display_view_model.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in WalletGroupsDisplayViewModelBase.updateWalletInfoSourceList at line 97. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/view_model/wallet_groups_display_view_model.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_groups_display_view_model.dart"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c526c6744c2234f480cecbf3fd93d511f253242859251fefffcbf82b9cf980b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_bitcoin/lib/psbt/transaction_builder.dart: cw_bitcoin/lib/psbt/transaction_builder.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in PSBTTransactionBuild.PSBTTransactionBuild at line 11. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_bitcoin/lib/psbt/transaction_builder.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/psbt/transaction_builder.dart"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"3299537981ea66be5faa50f78dbc15c03a852cbd4036a492c5ca75545fa9324d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/core/backup_service_v3.dart: lib/core/backup_service_v3.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in BackupServiceV3.importBackupFileV3 at line 232. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/core/backup_service_v3.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service_v3.dart"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"519cf6f027026ddde7b93c4f239749fc033e9ab7317498661b94acb14712beb1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/new-ui/widgets/charts_page/chart_header.dart: lib/new-ui/widgets/charts_page/chart_header.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in _ChartHeaderState.build at line 41. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/charts_page/chart_header.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/charts_page/chart_header.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"f435f7eda127685c58128d207727c49170a5c8a10dd39587edaa14b309cf4bdd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: cw_bitcoin/lib/lightning/lightning_wallet.dart: cw_bitcoin/lib/lightning/lightning_wallet.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in LightningWallet.createTransaction at line 205. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_bitcoin/lib/lightning/lightning_wallet.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_wallet.dart"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc03c64d248c2ac3537b741aed99b95681c37589a0679105eddc97e641572ec"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: cw_core/lib/wallet_service.dart: cw_core/lib/wallet_service.dart changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is WalletService.rename at line 36), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201CRevert \u0022Revert \u0022fix: unify encryption across platforms (#3470)\u0022 (#3634)\u0022 (#3635)\u201D; \u201CRevert \u0022fix: unify encryption across platforms (#3470)\u0022 (#3634)\u201D; \u201Cfix: unify encryption across platforms (#3470)\u201D; \u201Csolana nft improvements and other fixes (#3581)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_core/lib/wallet_service.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_service.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d7eff427c7cb71f886ad69018f6bcdd99d3516741df82f54a1e58a2c5fd0e9"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: lib/new-ui/widgets/coins_page/assets_history/history_modal.dart: lib/new-ui/widgets/coins_page/assets_history/history_modal.dart changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 1 (its worst body is HistoryModal.build at line 18), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix: allow taps through transaction history gradient (#3625)\u201D; \u201Cfix(CW-1638): include transaction notes in history CSV export (#3623)\u201D; \u201Cfix tx history scroll behavior (#3549)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- lib/new-ui/widgets/coins_page/assets_history/history_modal.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_modal.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8fcec2a4f0917ab75966ca42994c7b47a445897855f872d9812c7211fe6266e"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: cw_core/lib/encryption_file_utils.dart: cw_core/lib/encryption_file_utils.dart changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 1 (its worst body is XChaCha20MigratingEncryptionFileUtils.write at line 16), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201CRevert \u0022Revert \u0022fix: unify encryption across platforms (#3470)\u0022 (#3634)\u0022 (#3635)\u201D; \u201CRevert \u0022fix: unify encryption across platforms (#3470)\u0022 (#3634)\u201D; \u201Cfix: unify encryption across platforms (#3470)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-23..2026-10-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-23 00:31:09 \u002B02:00\u0027 --until=\u00272026-10-21 00:31:09 \u002B02:00\u0027 --full-history --no-merges -- cw_core/lib/encryption_file_utils.dart\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/encryption_file_utils.dart"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"24a85de1c1c60934784ab1ef019afcc3ae0a7ca00bfc6ba5e77e5396f52e94ea"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 20 significant file(s) lose their only recent owner: lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart, lib/evm/cw_evm.dart, lib/utils/token_utilities.dart, lib/src/screens/wallet_connect/services/chain_service/solana/solana_chain_service.dart, lib/view_model/payment/payment_view_model.dart, lib/src/screens/wallet/wallet_edit_page.dart, integration_test/robots/wallet_keys_robot.dart, lib/new-ui/pages/seed/pre_seed_page.dart (\u002B12 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f6de962f4bbcce453b3a51f48f0cf74762286afac3b6512ef5e57db1e190630d"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 10 significant file(s) lose their only recent owner: lib/new-ui/pages/buy_sell/buy_sell_amount_page.dart, lib/new-ui/pages/coin_control_page.dart, lib/new-ui/pages/buy_sell/buy_sell_provider_page.dart, lib/new-ui/pages/buy_sell/buy_sell_redirecting_page.dart, lib/new-ui/widgets/buy_sell/buy_sell_selector_modal.dart, lib/new-ui/widgets/coins_page/assets_history/assets_history_section.dart, lib/new-ui/widgets/floating_amount_input.dart, lib/new-ui/pages/buy_sell/buy_sell_payment_method_page.dart (\u002B2 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b4b440c1bce59e177e733ad7f8731df7c6bc75a5dccd4214916c94129aa99ced"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 3 significant file(s) lose their only recent owner: cw_zcash/lib/src/zkooltx.dart, cw_zcash/lib/src/zcash_wallet_addresses.dart, cw_zcash/lib/src/migrate.dart. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"fd369df717638bb997518f9960066a8956c69c5b5394ca29aae0bb09dd1ca404"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 3 significant file(s) lose their only recent owner: lib/src/screens/select_options_page.dart, lib/src/widgets/number_text_fild_widget.dart, lib/cake_pay/src/widgets/prepaid_range_amount_widget.dart. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"99fbd28175a887bf8a8969783a812966ce95dd317dbb7c728d4255822e6f5b32"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 2 other contributor(s) are each the sole owner of a small amount of code below the off-boarding threshold \u2014 folded into the bus-factor score and metrics (39 single-owned of 734 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 734 of the 1507 production source files in this repository met that bar). They are anonymized user #5 (1 file(s)), anonymized user #6 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above. The files folded here: cw_bitcoin/lib/coin_selection.dart, lib/view_model/anonpay_details_view_model.dart."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: probably not the best way to tell if this is an mweb address \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_addresses.dart"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f65b41915bf9b9ae8c879a9baf5f6ef2096474cb039c7d7e96dc2484a97046e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove transactions that are above the new restore height! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"6524f9925ea1457b8cf21e8f5a33306d115e62339acf76aa72c90546e36f3c5c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: likely the change address is mweb and just not updated \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1034}}}],"partialFingerprints":{"codehealthFindingId/v1":"56f0a27b5c699e2f30fb6343ae4a86a2d2463dfd4d318aea962e5527f0bb1e92"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: add this variable in \u0060bitcoin_wallet_addresses\u0060 and just add a cast in cw_bitcoin to use it \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e7ef004359f1771c8551da32443ec419c01a49ce085135ea0231dd6badb8b61"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: add this variable in \u0060litecoin_wallet_addresses\u0060 and just add a cast in cw_bitcoin to use it \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2aaeb1ed7a56fa8d160f9dfa60f85b7b975476f6019f30384fa4e7998a6b40a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: feature to change change address type. For now fixed to p2wpkh, the cheapest type \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":808}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b001aa5b9faa885943bcb789b41c7f9e485091676a9aa3e10c5d0a939223364"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO figure out why condition was needed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1063}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdea728d909551b8a4cbcc618fed597dfc34fc762e6d59317b1339e61883230b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: get from server \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1815}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c614dc768df05d590e1ec7613d1c47e82ba84b275d8bf1d4f61d5ed5abc0bd2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // ToDo: (Konsti) Support Taproot, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1849}}}],"partialFingerprints":{"codehealthFindingId/v1":"db3a3aa33742e945e4d08ca9a83d26c584a20d31378480db4c5bb6f120dd9638"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: move me \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"b81214238b6b7027bd6841d880d11df83729f56a508a6999c709c22f71e9fc97"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: uncomment this after we properly derive keys and not use m/84 for \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_receive_page_option.dart"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e132e53cea615dc13af050cd9a484753e52024e10490d44d796cd165a81e7ff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // ToDo: Find out where to get it \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_wallet.dart"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"e08f5809c842e6654657a93d15b1477e36a2195e8413cbb794fe856231165844"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Handle this. send to the main port on a timer? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/payjoin/payjoin_receive_worker.dart"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"f567598b963f1f7d63cc0d53e9a9cf9611df11b1f5e9ed6a0f7f354900a494ff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO set maxFeeRateSatPerVb \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/payjoin/payjoin_receive_worker.dart"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"676387781c4f02523b0fb723cc77a16655ba5e30737dba103154caf90ccced97"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // ToDo: (Konsti) Handle Taproot Inputs \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/psbt/transaction_builder.dart"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"274b3d9c1ab1144f51aea24eda2872e384d755bc9ad2e5af85ee9b4b2cfc0232"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // ToDo: More robust verify \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/psbt/signer.dart"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"b47a817589c22515cbb036af839641520067c27c94d4e14e6d58301207930ba5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement restoreFromKeys \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3222888c9ed0b6ba470cdd4099c83944c50c53178a70fd05e16b1a839139583"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement restoreFromKeys \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_dogecoin/lib/src/dogecoin_wallet_service.dart"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"76dcca83f335a93d133bcb5a356321e16ed5ec35bad82bd1d7dd9958f3eb4ec0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check if it will affect the performance of each wallet \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_addresses.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"2191ae0e3aa7093d8fe3e4ac898dcf0d06a51b956c3223b0eed47622652cde87"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: (refactoring) each wallet would have its path, so \u0060wallet.nodePath\u0060 would be decided based on chain id in Evm wallet \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node_list.dart"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"a960c861b4b77c008b3169134e862aaa8c4efd7b03db89fb997c8055984beeb8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this will return true most of the time, even if the node has useSSL set to true while \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"d93100083e73411eda21c00dc2c46a69c6414c8d45276273ef5bbdb31098c8e6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mrcyjanek): is this needed? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/monero_wallet_utils.dart"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"a329902da23c2023650c0192033830f428d4adb252c2303c2b271483fb88a657"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: Hardcoded values; Works only for monero \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/get_height_by_date.dart"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"1742db7a98f4e94aacbbd26106c6f1e0e9c8d92ca60cddb96619dbfe15a8baf5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use the proxy layer to get the height with a binary search of blocked header heights \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/get_height_by_date.dart"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"63f5249f0a871eb67cb56e67fc86fdbdff3b66d0d58c22db7643e7acf4a50bf4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: enhance all of this global const lists \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/get_height_by_date.dart"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b1def8a9e771d47a4a15b5716ce5eb7a072c56f9943a7a5df0a9ea906150381"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: refactor this \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":1067}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fe1664ad1496ec53ec968b35bbfe9d59db259985a5f125aa5e650be9f1ebbbf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Encrypt this. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cff21cc036f07713dfc9b3df3a75ef66be3d0c62d93d4d3b549968a939f0128"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This step takes a while so should really get more info to the UI \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet.dart"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"3804a7fc94b7c5d0e9b0e615107aa85af4103ad5d47a3486a1daa6b52189931d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Linux. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/api/libdcrwallet.dart"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f9d0923b3f83ba3989dc5a3047a9cc14d424f7d240fc528c9e37e83c9b0dc4f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"298fa8af2995ac0266b1d2a2bbac651e1b6dbab3e6a1cd41488c49a40f5e084e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b1bb84d9c8712a07f809b1d5e05f0138f9dfa8a7d68527dc5cb4137b6b08111"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"a76a3902d627e8dc0cedd2a2bb8cae60ae56d204d972d413149128fa5e981fb1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"79b5a2bd458fec98142a2d1b65311060428b693738dc7fe82dd2651d8f6541c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e5020214d089d907a028e45714423673a338100df3906ee52e93c8e664bdb0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"a13a1a1d2f2424e4d313b3d99053722508791e585d1879d6bd40b53be3ab5b89"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"62dea996a5bd92bbed8da6db8fa6864ecd1b2c5243206c3f57e58ab4567bab18"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f983532e4270e856bb4d94d9ec7460b316cf5f53ae41058d629667c512a3613"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"a54c94af0d5ddd77a1fc79a17dafb90a6669ab4aaecaacb0ddf54548323dd040"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e9c0b594b77b100ff2fc58d0ae271d297570cd20542f8b91dc0a2ae1103d4ed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbca9d966c156a692014c72695dbc7edc5d4502869bf67d82df15831aa0c3ed9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7170853991a7c7173d5481185e7272a780096ac58d361c057759e5a8533e0ed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Exception for wallet list service. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"78383a94f2b278f9d7c3333f9299c6ca8684a408dae9aced097261e8fd58425f"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: hardcoded value \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3945d6a876fa0baa8b0748baa2e737514679c02b5f3374a0fb7721ae960f060"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: hardcoded value \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"328e7e25215c9f7d6f012347002100eda38cb042b560bf4e93ebbc96f7361bd9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mrcyjanek): remove hasUnknownKeyImages when we cleanup coin control \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ecfc46c663bf93755d0b1e330faa45fcd1042b094e9c937e2cc0016ee28a59"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: hardcoded value; \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3ae3303901ccaaaf9f11d1c0c83d6605e08d2fdc4c8c27a5831709e97244729"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: hardcoded value; \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"feaaa93684132360b482a5b453bb32075e4dd9b65e303d90bc4ec729bb8ab1a1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: double-check the logic here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":693}}}],"partialFingerprints":{"codehealthFindingId/v1":"b777e308591f2919adedb732a0496c87fc92ace1ead19a72b79dd39a50374da1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mrcyjanek): safe to remove \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/wallet_manager.dart"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad73e90ddfbc561f4524fe2b8f81f2e4fb3bfa1fc2df05542092320ce162fc7d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mrcyjanek): safe to remove \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/wallet_manager.dart"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"54c5f0c08e03c570810c04b4e236690e68560191f02a62df0662d623395c723d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mrcyjanek): safe to remove \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/api/wallet_manager.dart"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c5670c1616038f9cf2993f7a902e34cb6f91984e0c93be2f38dfd17f071a76"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mrcyjanek): safe to remove \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/api/wallet_manager.dart"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"c02b69e8dfec0f61b2b5fb7ba567e9f12b04cb9daf2d652e890a53062495eeb3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement restoreFromHardwareWallet \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet_service.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"5244a3cc0d19cc023cda1e25d2bb17e23b1958d13e48381f8cf2ee3551321ab7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement restoreFromHardwareWallet \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet_service.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"636e2a2d62f3539fd8e7f7a1f1be211b609dfb7146996e19a6beab8baa19a8ed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO(Further explore fetching images) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1327}}}],"partialFingerprints":{"codehealthFindingId/v1":"9685a3a56583266352bef49c715be4bc40735a859906f2ab8228cebaec51e8b0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mrcyjanek): ... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/api/transaction_history.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"1afe7fd1cfe70e0a3ea432fddbf553ecb94f6f2df5801c5d4bbd31dedce8615c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: for complex transactions we show zano or any other transaction, will fix it later \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/api/model/transfer.dart"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"b51d485748cb6ff3f598c19051a52f616db011dfbd64bcd76acaf5b929705240"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO(mrcyjanek): copy-encrypt \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1734}}}],"partialFingerprints":{"codehealthFindingId/v1":"345c0ca8aac821249c601f8f9e9c525ce6e8c25d353d9286c3be7509081aba4d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO(mrcyjanek): migrate to zkool \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1737}}}],"partialFingerprints":{"codehealthFindingId/v1":"795b877c038cc5161d97b351c6e9e1733c0c005297ef5202f67fe9fc6488b1c5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this could be improved: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"6629d1ce4d8eec33afbc081175b2f77e075037485722d472ab94f98aacca133c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement filter \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_cards_page.dart"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7106abf1a0070f444de3c348b8d811472ef49b2cb4fc58c0241fa3c4ce46dab"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: replace with real logic \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_cards_page.dart"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"658cd2cef1c493fa072f9e2be2f535c6ca08264ac02f75c76330a7d119051784"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: need to have only one place for get(set) mnemonic string length; \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/mnemonic_length.dart"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"7070056ea6739ee42aabb54856e44ec3b9d1b2291e880e81a1e1928719a5783f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement multi-currency resolution if no specific currency is provided. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/address_resolver_service.dart"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb993b8b7298a324eb75457dc345719243c6acd6561d566de83c1ec004106196"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: find a way to add those with the generated secure storage \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/default_settings_migration.dart"},"region":{"startLine":1042}}}],"partialFingerprints":{"codehealthFindingId/v1":"72c70fdfd072a77dd8ae7f94a812d428449ac1621b344d9296910525500ee9ff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: It seems this rate is getting cached, and re-used for different amounts, can we not do this? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/chainflip_exchange_provider.dart"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"f28b0d3896ae2b86250e856a4126b6aaf22ea2280b6483fbca3d3a9b36de4c3f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement collapsedHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36e246df559737f498d0d16af169a1f0ddde0f42868f59d8f7af184e406a8d4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement collapsedHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":756}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dcd1286fb34dffa182e99870b1363cb195557d5346c7c81117a28b2a1b34f9e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expandedHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":759}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c3c55a33cf9f020b99d1665714b79e0aacf8a215991595557c4d2883f01deb6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expandedHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":760}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79666ffbc8fd5e6815b9647c46185a3361c2a231c84dbe1e3aab87ef4e72728"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expansionTileCollapsedHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":763}}}],"partialFingerprints":{"codehealthFindingId/v1":"d78a0cf792ac135e3830d9ce10f877925f6ec7f93d497519abf62c020100e0be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expansionTileCollapsedHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":764}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6d7f13b958be210944fbe9dcb122993440f56672b3b497896fbffbdef0f5a5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expansionTileCollapsedTapHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":767}}}],"partialFingerprints":{"codehealthFindingId/v1":"6169c085288d0e2a6644136f0f24870b53906583292e12cff89c754a980db094"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expansionTileCollapsedTapHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4612459582aa7558e0a514798735b44be54843408c1b10d09905c6b1785f260"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expansionTileExpandedHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffb6ec00edf0f8844fc912f2fe61102e19ee76f233739f0894d48a07cf477394"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expansionTileExpandedHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":772}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b6ee0efa762f43098ff286efcc529b80a40677cd2f4577a54a69d88cb60c6c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expansionTileExpandedTapHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"81b9f10e824d8ad7f0c5db2d365efff9fb021e3d04136113d479305c95a7de01"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement expansionTileExpandedTapHint \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"64570366938d0246c664a2b6c367031ea2fd548272873b891250d1d98a3615a7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement scanTextButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":779}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb5a3e08f821376dffd4dee40f8766e46840ea24c29656549df0f084c3fc295"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement scanTextButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":780}}}],"partialFingerprints":{"codehealthFindingId/v1":"e372a1bc3e6744a33b101ef2ddcf20ab19ccc283baf64a8d6abd7963755f43f7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement lookUpButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":783}}}],"partialFingerprints":{"codehealthFindingId/v1":"6279f5bffc07c01dfc07e5bc9aa8047f1a213b0b5318c9f91a3910085f4725c9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement lookUpButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":1017}}}],"partialFingerprints":{"codehealthFindingId/v1":"09551048a8e79b3497c53bf0f9ab02024caf46743675ebc13ae848dbd904e308"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement lookUpButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"8834e10e536e06dfd5146bab2ad3efab299fa1cbedbf35eebb8b5915c9a04329"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement lookUpButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1017}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f09e0bedeae4d6a958ba44a8405b7e7a263349a7178277a6dc454a6288a93e3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement menuDismissLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":787}}}],"partialFingerprints":{"codehealthFindingId/v1":"082e7cec0a82aba9d38a3dfe2e3960cc1a783dce21b063da5a5073a0d91b1822"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement menuDismissLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"c03a3d0814836dc48774453c7abe7d28fdd4d4ceab4a2579d1030433439d9199"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement menuDismissLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":788}}}],"partialFingerprints":{"codehealthFindingId/v1":"81fa54d1c05164347f061e6ea7c4dcd5bf4e2e73c15cbab183d1a7fd05e7f172"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement menuDismissLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5cd51d38bf37d20205c5a1b30f18018b508bff406c35dae47811041d3c61724"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement searchWebButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":791}}}],"partialFingerprints":{"codehealthFindingId/v1":"354085c811728cbf68cdd2b0a59b03edee40a8cd3b117f987e417c7f8a8a4902"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement searchWebButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":1025}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7575a09ceb6ae0e8c8b7641b92fed0fb00ae49708b8a55c87cd0dc31fe50e29"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement searchWebButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":792}}}],"partialFingerprints":{"codehealthFindingId/v1":"da584da5dba46f99ad5bc22b232e839c27ef812a62b938723a5fcb6efda8ec9a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement searchWebButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1025}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80395a236011333495545b0e372991acc045f4734f3f38cae0f1216e4f3e2c7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement shareButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":795}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc8d531a4e8979745e7aa7938451d02d6cda66cde43f1b15bbd7391e2a281182"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement shareButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":1029}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc056fdb6558fb9fd605b0cb3a6fbb641dd9e66d9c0f3b012e6cfed70a779b21"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement shareButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":796}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3c2ee1ba25eb59c1e56072352b54f4c16234bd831801200fe887ff478efd2e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement shareButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1029}}}],"partialFingerprints":{"codehealthFindingId/v1":"58f679683c69f4de8bf6a66ccffa63925feab7493837bda4f7fb95c0a9cfe1f2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement clearButtonTooltip \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":799}}}],"partialFingerprints":{"codehealthFindingId/v1":"52493744ef3b58994e2b514339afd0d3ba95912d5b73d272055bd266256e1498"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement clearButtonTooltip \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":800}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a64f2b0ca1c1835918b99eb6538b9139500df5bf084b6e8f9df7cea0ec89f29"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement selectedDateLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":803}}}],"partialFingerprints":{"codehealthFindingId/v1":"0724f13131a53e28536d9a737cdb2171a6e8afe0d79244e6857a9804fd8c6f2a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement selectedDateLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"c882a5c35963c08bad97d1c6426eccaf7be9c2b16418281a8d162be4adb004e0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement clearButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":1013}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec5ab1fabc7e5e72c6f003afd3af936ae3a36f38fc312f43b55b66a74705b55"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement clearButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1013}}}],"partialFingerprints":{"codehealthFindingId/v1":"e678e13800e72d15bb6c07b498279048f3bc2688fcc30dc3341f794b0afc13ee"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement backButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":1033}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fbb34ea80001429929be675240dcd6b96f7837e6d6e3cd8c2be5d46af450682"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement backButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1033}}}],"partialFingerprints":{"codehealthFindingId/v1":"9df91c04459d9f43e2a4584c4e874149d7e6f68757e6482d4d3c8122ad1ebd4f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement cancelButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/yoruba_intl.dart"},"region":{"startLine":1037}}}],"partialFingerprints":{"codehealthFindingId/v1":"f98af05e9524c2a01b05d3d152380e3292e81f97fd9a633ab190399778f19af0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement cancelButtonLabel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1037}}}],"partialFingerprints":{"codehealthFindingId/v1":"e37c037783e55069877a4dba7097374a6ad3d5e34446929cab485bcfc24f55e2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO InMemoryPriceSource() - easily implementable w this pattern but idk if we need to optimize this that much \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/model/charts/price_store.dart"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"473c0d5f03cf5382a42530dce0473b7b45e058e55bf22a3426cad53131b1914e"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME we don\u0027t know why a reset is/was needed here, it messes up ui so i removed it \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"aebb49a8e8180045ea2e9e37735f94213fffc67c6328a09e60a5e540be4195c5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"92cc46346324a4438ae8225d38461005354cf3a2f2ec47e1c780e7435c1c8cb2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO(malik1004x): refactor this action. code was copied over from old ui. i don\u0027t like it. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":836}}}],"partialFingerprints":{"codehealthFindingId/v1":"087ba75eb0d7aa44f940bf68391612d618e36cd5f45ac1e0cf179da2f2de92bd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: make a separate variable for memo in payment request model \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":1341}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2c9dd7901e6fe6122d980105feb9b6bdedce7e7f36641a2abf42dea471cc0b7"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: viewmodel doesn\u0027t want to load address name here, so we make it. investigate why later \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/receive_page.dart"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a3732274c4ecde96b80c3070f710ba44ef2e117c7d2af0620b67af1eb5daa8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO find other errors that api returns \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/viewmodels/lightning_username/lightning_username_bloc.dart"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ba14929a21d043bdb70e7e883ac3e05750785a30c9de03cd17288f06fec3788"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack carried over from old ui, we really should just have a boolean in the object \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coin_control_page/coin_control_list_item.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4a4cdf59d3f73b71c751925968101fe0db47c3f096d79512e78ea356c448121"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO refactor chainIconPath to get rid of this ugly thing. it\u0027s needed because arbitrum\u0027s wallet currency isn\u0027t arb \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/assets_section.dart"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"90d7659995bd095f243650aeba200720244403e4a1350ef0c4a9fc4cf816b5e8"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: //FIXME remove after this gets fixed flutter-side \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/top_bar_widget/top_bar.dart"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"6906809c847d6af17cc6883f79b8c25cad5f8ce45d9751c50ee4d4361e85e0a1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check the validity of this code, and if it\u0027s working fine, then no need for \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/reactions/check_connection.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"4398adaf87c0b5203f98fed66dd3394e17b038224f19f34c8b8cceaa886087fe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // ToDo: Localize \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/integrations/deuro/widgets/savings_card_widget.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"393fea2ca5ac3298abf27654ba62891ea7ec5d85aae27a49538805f4b79145f6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: add type (mainnet/testnet) to Node class so when switching wallets the node can be switched to a matching type \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/advanced_privacy_settings_page.dart"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"a40bfec688dcc683f1dc2eef82d5664064ffacf0fcfade305c11075c7122fd73"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: //FIXME i can\u0027t figure out why this was here? it caused back gesture to break \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/seed/wallet_seed_page.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"205226b761f8dc954bc0f039afb9882658c6b06a321da5290c75f3c6c8bf448f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO(David): Find a way to optimize this \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_list/wallet_list_page.dart"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"b046f58fc4a88c5dec96f0901ab3c9ad5b1a7dbf10563207cb07bb3091926e12"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: fixme \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/mobx.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"d67a4904d89e61f631d1c41f421a7f5ad847f92a8b9393129cbdb2356cf98cba"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(malik1004x): integrate these getters with the TransactionInfo object \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/transaction_details_view_model.dart"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"b557b515a70cae7857239e64f383deac978050ed02d61b66498f74710f52c27b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //Dummy user cards // TODO: fetch from API \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/cake_pay/cake_pay_cards_list_view_model.dart"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"d87b2101f832ea2e3d639626174c070bf06e25f214a3ccedb5f2929dccf6ed10"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO should hande other currencies if added \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/cake_pay/cake_pay_buy_card_view_model.dart"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba23c9334620c9b33eb74b665e80eb696382a8558d88934eab982e7c73e4388f"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME these two observables cause duplicated state and are needed because mobx. remove them as part of the refactor and replace with proper getters \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/home_settings_view_model.dart"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7f50516af60bf9d6eeef673bb455ac70ec45f0599bf24c2c8d1894b6781298"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: nano sub-account generation is disabled: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"62a47b0393f0e53a3cd9cf2166e544da78802459948fad7d71233ed77b653b69"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(malik) update this in a saner way during the vm refactor \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"279e6f05817b0fbd0a37ebbd741a800cf07ab7bbcb5826fb062a2d96e5108bdf"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME this caused a bug when switching wallet, i can\u0027t figure out why it\u0027s here? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"56dfc605b9228efb6b90a48b8518cbc56af32688d5f2e76aa0321ca1bd5b933b"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME amount estimation is broken/impossible for ln, konsti suggested this \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1405}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4404b3170427326c313163b1a276fd44301b882a466039c738c480cf27f76be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(Konsti): remove when we enable bluetooth \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/bitbox_view_model.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b54ea791cefe7a2cb0d1eec1c4f78319e9bf3fe1b072cc578c1372d4c78660"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Remove example values when done testing \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/node_list/node_create_or_edit_view_model.dart"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"07c74c436b4ad9fffe387e867dc12f5211ff708be3f15580a7b35cecafe524c4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //  TODO: get from server \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"d79c53d4f86cd4999034fb6f6cd368f56133bef7d01d7daed72dcfda4a627eb0"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME(malik) ideally, this should be done wallet-side. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1203}}}],"partialFingerprints":{"codehealthFindingId/v1":"5888ee119a3ce7657017f42744f7dd4d5abb4d050da29163659b29cbd6ff9715"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO add more patterns \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1732}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa7d5b7e5af8bceb1204ed1bb79bedd7f9c5351668afe9822991119002bbff10"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cc9c5e4927eb5af23c2b768b00cc9f3237e1208136556224d562b840af5251c8"},"properties":{"commitSha":"9b706263a88f61c5cc2614a9a23834cfce3dd53d"},"taxa":[{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b730a59a7531e43ecd0ef94ac9672a3735a4f54053237bf02aa8aca24c1e3025"},"properties":{"commitSha":"9b706263a88f61c5cc2614a9a23834cfce3dd53d"},"taxa":[{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0d917e1ab4b587b861d9e2e0f2da30799cc50649ec6f5e01dc0f04ce13bde09a"},"properties":{"commitSha":"8e4082d6806a89a256f827952036952a9ed21b47"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"06a7c827423634197adfb70ff07c6395ad876022a52c76771f227c30b7a3623c"},"properties":{"commitSha":"3006679560ea83c11deb2e101c316eca28680bb8"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ced1c08ef647bc0e1080825ede63d482634a20bb9e881f75d4f8ee72f38fcd0b"},"properties":{"commitSha":"73588071ba5065a2df37a4d1bf5a041e4e071048"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8062a48b6a4d88461f0c58dca709c6b8e5c7200aadc5fdaa73d92fcd0553fa77"},"properties":{"commitSha":"5082dc20f33ef8472bea8c5d904d2eff14dc334b"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3e68d9d31f2300e34dd5a439432fbe889390c8ca6fa510cca7e57cec99f7d46a"},"properties":{"commitSha":"03d5046b811a263afe0947bd090e7b587d18da3f"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"86b872dce474329c865cd522ff3fb334e5a71d773f2f873c59457ec990f1db3f"},"properties":{"commitSha":"f008403f1f03974d327b369a46783447c7d6e8ad"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2c563343b1089109b1ab51eaeeff1583cad6a94d82dda84c9b5a8579ff3e62e7"},"properties":{"commitSha":"5082dc20f33ef8472bea8c5d904d2eff14dc334b"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4a056171d11c3e175a0e2c509ef0877c121018a2d356588f16ec37326c3b8fdd"},"properties":{"commitSha":"032a8c8c3387ab9cb87d54fc4aa21977dc30266a"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cf1d29033458c1c8597d5e11bc8e03c8f71ffb3fa326fc5f34857377610ebd6f"},"properties":{"commitSha":"9679f91a8c9f63d00500c2b7cc18daf00949bdef"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"83ad83ec5fab9c82f5a22a6b9e97c37258beec54bbb82f0f218ead6947b87455"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fd4a2d19e52a74185bef12de3da45b6920dd4adae487e8512308049f248187ab"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e66c91987ba5bc504b39b740ae2af689a0227226001ac468daed32d40a7a7621"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f903ede30c49075747e910ae5d939e24a7b5a8492fc8404433efdb896494b63c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5ce7027d13c7600098a35f99ed3243c747dc61df82d8c87ab8f5ba61aeb7aa53"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b921795bc0589bb7957e15a8d0cd2277d92adb450386083c1a2baa2f540707ef"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6785478b55793f3164c27409742b7da542a162347069fa3193e5818ee71a264a"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"92f29ccb3e922a5e0108f8118a67fcf3e4ee4a422d6602950507d17b28eb3b68"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0788cfa2bded162394cd4aa794dc05974c3b645f5bc196a44023c619dd695afe"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"38b22d9485027905eb5bb0ac97735399c7c626d1a15efe20fbcbccad14cf2a81"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5ef8ac2f101eb02b3489c81d64813530b234a5b6e39137480cca929415dc3fb9"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e470794a97291b987544cce52f2fa6d91ba1ba4b8c2b768b89f306da3d669403"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3502670271d3cf3e4ea6322a0eae12ea244c52f9454fadeb216bf14d7a8c4940"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5c8dd12b632c1ab797e35c4116882ac5e256134164f78c892bc203d0c1f58874"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f38cf6a773aa988b04fc2005d362e7339f2bca3dce360283e93079d472f32354"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2331713ee5456a0ce6307a74a61ea1cf0da8a9fe685b122645d7b68fc5fc60f2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85da0b5f62e6d730cf25d40b25eb9bdd06c667f98af311d580ed3b3d6ec3c213"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2297a07383264efadb659a090fa580ada6c164f2fd31bdd23b8605e43ea0fd61"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4e0274af0c65b976fda647bf1a80044cab904147b22b58548560aaac5a95e9f5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"06dcbbd10589a1b8043319192669e6e7d52af2f4d21772bf5c3efda8e9510dcb"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6f1410fa56ab29001502086a6945eee35bd6e94f7ed24a18b47e7afa1bead265"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"75126bada4cc769eea4280daf6c4d0b511d44a72a40af08972b0952148fa8a0a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0703a1f9046b5f09e6780368403b9be4fec8a221dd50618d8149aefb7999d551"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"901d118ed5ad84e0e43907b8994061e27cf306c293749b60ce824c84a0347c1c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8fa52e5573ea6800888e8727ad19f3dc3b90ffdbdfa0b62ece98ed1f60b21054"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"865144adf4d91a2dc5c41e0d1df67520d864c6bafe9afd2240cc64af8329701d"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1f447f468380a427ea7ed23dccbeeb69040c640dba132b9f78da56e374864a10"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f9a4cd0b298bc1aeeaceadf580a4469c4980742cd9558ae13f74ee5533728dd0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"71fb4a97d866bd1a29a2cf3628154508dcde4fbc60731984488d4d4c91a0a9ec"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ab157771f07f98ef2d7c5afb5e838fda9b0466a195d15676c5375f37afa0f971"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"955993feea281bee4b66ebaaef0ed809d4ba03c49e2bdfbcd4858997659da82e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"93bb0077ec8463c9f3c5b93ef7ff50f7282f54550e3df5118d4cfa12599f97ab"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"74453567924343e28e6bdb6bd260217b34db62b33f7a154df6a912a2b82c8950"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"89147c796527502cf123cdca9400d7437c42f94b566babd3bb23f64a70d27b94"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c68f7015703f6a6dff561e1d45c438531c08fecadad4cbbef65f1a8c73dc47cf"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d2701e2153d746aae8255475e00ec644dff6930aaae26e99c226cf0598582f79"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1087ec871bc6547506cc4c6d3e7e28f057c26b5d369c44b22db57c2e79ee830e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"53ab039de77f88bfe88a516319da60695e7e3d799ac97489c5d932c52c885946"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f82531d2768d383cbb80e1b22642da491db8388c65bd0637836acece9e67c661"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3df043d4ff433fce82305ce6a648e0f7a4db059218e552d59293b2bef93ddb64"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9e865b1c99ae56ec2739c8f9755b526cb1575a9a003044264705db9db8760435"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a0a8682188c2bbf47ca02c2fc747bf86d5869e500476eae1235136c29216449d"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"92640e1d5e7ee9f4c0f966100195167b9bbfc1634e222cf7f3267970cfde56e1"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"72d592ffee20565ac42fd4337dc9a6e4034bfb75bef75aa4a4c9fc9f87f6fc4c"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b3a084418bf009960cb60f8a7e7b2ae9f4af01cab395139772ad8d0409c1e28e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"11a6635c18834705dfc726cae50e588a102bca8bc5d32aed7840e423ded079b0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f9dc032eb47105d371712b33b07e15a94da48e6fd53e10665879d4308092d1a7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"68f1ff4dcf6d48583a0a12ec5196fc8cfb7bf2587d01854ffdf4dd2c2146b22b"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1745351f912c5603cce96957c53356f8a6d5c2b75e9f069db0bb206ae7086275"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2e1352ff9c2704a8bd2d9cf30a8a3a2db0a0504275edc9474686933cb5cecd4b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c97f3f134e886e8b2e3a25f4eee3a6bfc98bde961b31e60bb484f3517bab59a7"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"67041747eefe3dc3c7d2e1fa69ca58e81ffeef0b1b769a0310aba9077be98e20"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"88d8fc2740f5bf5d343b9d976121b00fc5864e9e6a59c8ec76c7d5b305bbda70"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"24cccdcab8140618334a298fa3799429459548ab6cd77b2f542dc012b3642674"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"80dec62ccf96c0c1354e6dc6631b39bc7490fc2c0736425e25e4928a4ee33da8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b045df28792caee5d933f89dd5e2a460241f27d0b05feb1d635384bbe34db292"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"edb790427b50c6fb5ada39c73ac44f420187c6b1feb56fdc50f911dbc062138d"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5ecbd08802a5f5b27ed061260e6bef6857a6e29b8d382f16cd295e08159633dc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b33d55ad5f29eabea0d0e4979e77cb753f9968654cffc97a5b75c430c955dfd6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7ee8508a4d7172b4e8146ba511701d9a8eab538a419f272242fdd25e9abc96ac"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b982bf21ea471a643572c2ca2fb9ef50af203dd087e924bc00c53069deb8bd78"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3ef10a0c512ea96f64051fad4dc5e5c7b0914017f0c05eee2a8ad0acef7c99c3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f03cd39fc81e551342bfa49ccc36081f410e55e02195df59839cb56b8c35a066"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8258cbc4d36b2c984786b6ee353650670d02959177bcb11b9c68f9b07c6a2b29"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dad3183b1e408ff66cb9120548261dec9c0d2df29f2cd2614c76d95b7b3dd079"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"680180f1cbf7038cbe7141102aed76e4cfd1dbba717ba2aab9b04c643d4f63ec"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a3e7772fdb772e41a4aface4d2a93a0bd4125de10c3c89ae762d96d4f001fab5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0343f9ffe4933cb1d48e062bf96cb59b02fdc7259175ef038a972aa60d6cf713"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90d1ed887417db03bc9a192437f02e867646892519cbc2a87fa13c4b9c5d4817"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"89305897bbc9b1bcd2f0847d7983a185b111fc2fddc33ae78f9b7edb995b40b6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"044a14753254bede51956fdc49ba6a39ff45bd40a4d4589691fd232fce434e62"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6fa8bc76b7a71b9bb4ec35d1cd64e2d51d08ea48542dd9e5ccc2cbb7f7d82989"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6462515f81e61ec27632a1c0b481ec2778fc4a21fbff0202a20468fc7055b9a6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"98dc972c7d5e365fa4022d444d42770fd0015c46ce5dc34fe4dca41b247763dc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"48e3d9f39ad911e25cb5a4b32bee14c7bf3119023dc5e1379b4750aceb05b817"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1f58afa8d13709d335192ec70a7263873cc098e3f1b31b557c8601dad48c8816"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"791d10622e0889c5a83495effe64774d0e8b675d3bbaeb3c5ae354c1fe5f5930"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cc67bfa33ea9eb349b1fdacca983532f50baea4677c44fb201ae0f57950cf5af"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"02fbe314e30fd869900bb1d77204335937069f4d773c3f8bc10433d7b865d250"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a491fe933994a46e043994c2ea2d25fbf60394885dd428c84ead38704bbc162f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a4bcb57695a71c0127af14a6b42b361ecd761b7f1ca4735f100ac14258d329ef"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"66d01ca1bb689d92b2981385941bf7bae3a9744b7d79574b4c09700102a35840"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d610f2b756fefe460a1eafcfbbb1585d785738fdc8a6856704f023ef24423191"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a148a17144ccdfa5beb5def64da2e9868d7a5af639177038ad298dcc80530267"},"taxa":[{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-4","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8aa868a61f71fc23e4e17ce354105e5cb537d8d2d4693f6daee02f7aa8afe6d3"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0c3746489ceeb64b21a9612faf4f92078e90dde64a8e287f53847cd7608d23d0"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"287cd582c07dbc1764142e561299b6ae88ecb40e500aafd5e2cee9db415b914e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8b349d418eeb82d308ad7114310a781faeaf43bdfa5fe0a54ca5937f7971b7a5"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ec3d108bf51dc7b819345a244c7e43e6a328b5786dee9bf74f49d4ac36bb0bd8"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b9da0079edcb4e9ef908cae5bbd5656da02b76d61f2e734372f3ae68fa11f356"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"81565a38ad61d96bf17f42a3060d51b0f3d24a399e5386a4fa44230b11926199"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5ceba4b318b67d22df36861d8c8ce1f84150751928c93e8981d6a2cd703c954b"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ad33518889190d48933934e20139595dbe8ba24e6280838b302877fc73978372"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4a934a2017c8f2107e5bf41920126e69d433b77bbe335fd929f7e485e0de1dec"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"75d9583e72d2463760b2f144eee97653ea4f6ff8585b005b9187be7639dd0dce"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90384a83278dd2bfca38d6a0e0da4daa43438669fed82c5c247878cb92c705f7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"647edf6757c42119e245def26d68cdd13d0cee3f0aad34e4465845d5b7284a21"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"04c3afe1eb1df9e6863b9ed5f551d54a6ec5f30b935e6a73281c361f684928bf"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f9226560b9708af1f016526b610b42f57b94eeb01f13967f44f4264d93312ff4"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9c55368a03da9ea6ed69fc89d4b7e416dbbff0c7df5caadcc109652a6df96dae"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ef3434a1381926b30d461854fe87faa34d996f373bf7e8da4432627e1d728829"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7b9fcc9c1a58f810e94e0c15dc340171095c25af3058f1b13ca3221037820f3c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fc0524eb9075a9b1e7e9939a0096d651a98db0353e18281a87afaa1d4f168921"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"17a079018cbc410f64dc2dad332b3effe04c3449daf3b696fc91ced3475cd64d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dc6f1bdd2628b7ecd1afe8c7034a1a0a94348c7fcc7dfb4cb2a64c18cb1e7646"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7d7e9f03d88144199451da0cb02ee8fd95cf05ed88262ecd41b1fb7c115d6a1a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a3526b934e4fa01742e1c830e31df34773940c07f9b50a21a7e659ab438f47e8"},"taxa":[{"id":"CWE-242","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"74882dbd668ee0c22913ee8815d638e1b7384ed6a8517711640353f30d7c627d"},"taxa":[{"id":"CWE-242","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3966bcaaad297cdb5476d8e60cc3ed299414899498c2f28f0736bc6e96f2805e"},"taxa":[{"id":"CWE-561","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa9e22f167cd5ddea786481b87f7cdb979ffe04e224508c9fd978f61f2df8e12"},"taxa":[{"id":"CWE-561","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1816180e2290820fa95d1cd412302922d97bcfd273b248c0841f8dba4692abbe"},"properties":{"dependency":{"package":"golang.org/x/crypto","version":"0.39.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","GO-2025-4116","GO-2025-4134","GO-2025-4135","GO-2026-5005","GO-2026-5006","GO-2026-5013","GO-2026-5014","GO-2026-5015","GO-2026-5016","GO-2026-5017","GO-2026-5018","GO-2026-5019","GO-2026-5020","GO-2026-5021","GO-2026-5023","GO-2026-5033","GO-2026-5932","GO-2026-6303","GO-2026-6354","GO-2026-6355"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bc95651233a346226d924011b2028fbabf411ce0d8f5d623dd92f2f4bdde4929"},"properties":{"dependency":{"package":"google.golang.org/grpc","version":"1.75.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","GO-2026-4762","GO-2026-6061","GO-2026-6348","GO-2026-6441","GO-2026-6443"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3a0d78369060e3eabbe6f80f0165ac1c9471add569f2157e56922a844e3832db"},"properties":{"dependency":{"package":"github.com/ethereum/go-ethereum","version":"1.14.8","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","GO-2025-3436","GO-2026-4314","GO-2026-4315","GO-2026-4507","GO-2026-4508","GO-2026-4511"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b3aa1e3ae0c6ae37235e2e4c5734dc3d8a51c59222a8b67f72f9b07e8083c37b"},"properties":{"dependency":{"package":"golang.org/x/net","version":"0.41.0","advisory":"[GHSA redacted]","aliases":["BIT-golang-2026-33814","BIT-golang-2026-46600","BIT-golang-2026-78659","BIT-golang-2026-78660","BIT-golang-2026-78663","BIT-golang-2026-78669","BIT-golang-2026-97032","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","GO-2026-4440","GO-2026-4441","GO-2026-4918","GO-2026-5025","GO-2026-5026","GO-2026-5027","GO-2026-5028","GO-2026-5029","GO-2026-5030","GO-2026-5942","GO-2026-6603","GO-2026-6610","GO-2026-6611","GO-2026-6612","GO-2026-6617"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e9c6b3a413e24fa11bbb6c24943b6f887bc9122c75ae39de9131d12921bc57fa"},"properties":{"dependency":{"package":"stdlib","version":"1.24.1","advisory":"GO-2025-3563","aliases":["BIT-golang-2025-0913","BIT-golang-2025-22871","BIT-golang-2025-22873","BIT-golang-2025-22874","BIT-golang-2025-4673","BIT-golang-2025-47906","BIT-golang-2025-47907","BIT-golang-2025-47912","BIT-golang-2025-58183","BIT-golang-2025-58185","BIT-golang-2025-58186","BIT-golang-2025-58187","BIT-golang-2025-58188","BIT-golang-2025-58189","BIT-golang-2025-61723","BIT-golang-2025-61724","BIT-golang-2025-61725","BIT-golang-2025-61726","BIT-golang-2025-61727","BIT-golang-2025-61728","BIT-golang-2025-61729","BIT-golang-2025-61730","BIT-golang-2025-68121","BIT-golang-2026-25679","BIT-golang-2026-27139","BIT-golang-2026-27142","BIT-golang-2026-27145","BIT-golang-2026-32280","BIT-golang-2026-32281","BIT-golang-2026-32282","BIT-golang-2026-32283","BIT-golang-2026-32288","BIT-golang-2026-32289","BIT-golang-2026-33811","BIT-golang-2026-33814","BIT-golang-2026-33818","BIT-golang-2026-39820","BIT-golang-2026-39822","BIT-golang-2026-39823","BIT-golang-2026-39825","BIT-golang-2026-39826","BIT-golang-2026-39836","BIT-golang-2026-42499","BIT-golang-2026-42504","BIT-golang-2026-42505","BIT-golang-2026-42507","BIT-golang-2026-56853","BIT-golang-2026-56857","BIT-golang-2026-56858","BIT-golang-2026-56859","BIT-golang-2026-56860","BIT-golang-2026-56862","BIT-golang-2026-56866","BIT-golang-2026-78659","BIT-golang-2026-78660","BIT-golang-2026-78663","BIT-golang-2026-78667","BIT-golang-2026-78669","BIT-golang-2026-94439","BIT-golang-2026-94440","BIT-golang-2026-94448","BIT-golang-2026-97030","BIT-golang-2026-97031","BIT-golang-2026-97032","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","GO-2025-3749","GO-2025-3750","GO-2025-3751","GO-2025-3849","GO-2025-3956","GO-2025-4006","GO-2025-4007","GO-2025-4008","GO-2025-4009","GO-2025-4010","GO-2025-4011","GO-2025-4012","GO-2025-4013","GO-2025-4014","GO-2025-4015","GO-2025-4155","GO-2025-4175","GO-2026-4337","GO-2026-4340","GO-2026-4341","GO-2026-4342","GO-2026-4403","GO-2026-4601","GO-2026-4602","GO-2026-4603","GO-2026-4864","GO-2026-4865","GO-2026-4869","GO-2026-4870","GO-2026-4918","GO-2026-4946","GO-2026-4947","GO-2026-4970","GO-2026-4971","GO-2026-4976","GO-2026-4977","GO-2026-4980","GO-2026-4981","GO-2026-4982","GO-2026-4986","GO-2026-5026","GO-2026-5037","GO-2026-5038","GO-2026-5039","GO-2026-5856","GO-2026-5972","GO-2026-6088","GO-2026-6089","GO-2026-6090","GO-2026-6091","GO-2026-6218","GO-2026-6599","GO-2026-6600","GO-2026-6603","GO-2026-6604","GO-2026-6605","GO-2026-6607","GO-2026-6608","GO-2026-6609","GO-2026-6610","GO-2026-6611","GO-2026-6612","GO-2026-6613","GO-2026-6617","GO-2026-6809"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8da0507ebb8df2f36f2a336d3179a65ed5cf4da33409c892ff602e638d5b3a6a"},"properties":{"dependency":{"package":"golang.org/x/sys","version":"0.33.0","advisory":"GO-2026-5024","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"26e2707f79d3d8dcb1eaced00d846bb14f8609681ce4035e185f4cf6d94497fa"},"properties":{"dependency":{"package":"golang.org/x/text","version":"0.26.0","advisory":"GO-2026-5970","aliases":["[CVE redacted]","[CVE redacted]","GO-2026-6629"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d935e82f5bf0b25e3b316612197be20a6e1d7bc7a633395a79333c6b300cc505"},"properties":{"dependency":{"package":"github.com/gorilla/websocket","version":"1.4.2","advisory":"[GHSA redacted]","aliases":["GO-2026-6278"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90afb5d5531b8b27476bd9ec2d63f46997b439d46c58eeb2372a65541c548d10"}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c49b7aecf65efda7ff3650536e68c4b42c64c838e4c32a442bad51fa92073cae"}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3f8b6ccfd5e600b8c7f7873cd2c486c218aef30455eb75b7643172485d7ff8a7"}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"70980ac35d035677cd4bb9e3197f2d2e251fc5ac8480cedb4dcbecd7404325f6"}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fe2d688610b51e0a5a02c7c5dd1724a4986e40f2689fb84510e2ec0164c27d6a"}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a73e433316ad59b5d83476d0ee3a87210c889a22f7ec5d31e370ec86c7b79a75"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a79408fb4d0a0f85aefa585e5e99f253edd10e61909a85ce2a27f4e3ecb59f68"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1575e221468bab77c5838812262d4b3e54e16aa47ce6c9920f6f3c3aefd1f2dc"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bffc628c0f6acf203d7214ce92acc68e9cc914c36e769d9fea7602da2bc4ff37"}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"786af9837cb7b644476ec50c4e2a66aced7c2d96580c371e63e340dd6f4b2d8a"}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b664497afb5dfd19ac250878307ea511ba52ceb06b4473e039ebbc31864a7db9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5cfed0ee4e80785ce23c7083cffdead9acc6c64f9dce56a00ca7178bd3d7bee5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6bf6f0bb43412f1030f8b472ac023f34d53b7fbe52a249cc9e942f9433787af9"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"70e71f9299fac3ee20d0ce28967f425be7e140c18a38a4585e93f4de7e196405"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4b9790e095108c717b3827ae444c1977c5ab080688ee1332da01ffaff0c19308"},"taxa":[{"id":"CWE-426","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-693","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"78cbf5a702180b4173fd5334b2d9aab74a5a4e26bb0f0d59cc05751d1dac18d0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ddb7479589bc59eb9e99d12af21e271873ef405f68fc0d045565612927d5cf10"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9e0f3459b79638a37e60cbd02c38023fe12af07a9f4389344a1f2c17a05fb726"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dab6bb3b772e2d29804ca67d49428aa2d168e273bb88e3036199af2663da322a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2de86acf098cbbbb21540db93d78aa1a8192488da7c3c4ba2fbbd4621a3c0466"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d77bfcfd37bf19bdb304e93de0d5dece19d9b9181dfec7b90b39fd16dff86b52"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b73c65635390dd04b358e899d16c3ca814a596b98ac6aa0b38b50611dd8ae56f"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ddb5e5fd85b454c5a60d93b51486bd6400356a4b9c9f55780c548fcc5781d1e6"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e699a3aba470f6ab577089a7f5f29a75b104e1613cc147576c0839ab6c8b345c"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"11693d29883d6f3f5c22cfb9cb9fedc8f71f597d455b265769c6aefb545e4d50"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6545c00f11b94998d3ce4712b36ad16aaa7691164db7c0c1fb52e4be1f26f35c"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"42adfd274157ecf37c066e67f2978a9c87f75e4a3743374b41774b6d09a4e649"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7f17c59c072ced3bb2743f5b8b97d37d71bea17212b1f3077038de13babede25"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"04bab631e37f429830de27e139609aec4987785fc1ff4d81a89d5f7f8e899bbc"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7c34f4fba2c95408b1ab901f2c180611b782e7f1e23c1f687b26119b437076c9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4a2440892c25872cc3e88aa309f43487183a0f9ad822cfc59853f65113f40255"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cacb48dd01ef9a9a327cc7a8d5abf1042eff73cff5a54b2a3615a3f5cee5a130"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"382129851bbd1b90d6500fa3e2f9954f175311b245371c3a889c6cab98d931ee"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c7df5056129da1f2dd4b131015f746c58c696b042eaa03fa29f7c97f5df869e1"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9fb2d6ac385b6075be1eb90f63fae5f3c9c3fde9916fe3cd2d8000fc07fcade7"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8df31337623946ee6fd6830e83b61ed4d5071f0019c9074a601e14337bf61e90"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"208a97c6f7e4f29fb9f8ed6df339b08ab730e8d0ba1d550de5c077ba95cc962f"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d9af4b51d9b4b5f13881ca9fd567691f5a578d5ddcc37aeae3645a3b6de44cb4"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f0e8e65a49220c6301a8194f75c3a049f32357367dede3f72cb2112d162d87b6"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"93d4dd166c09dd933edd16a56b816b28e9b221b77e940abf6898a389e7f7bdae"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"643c496d893e45d7317d4a4652ed97ff3de1a26de9ba8a21b8e1864838bfa255"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5ad3e3a23f86b2c2cb36f04a9469bfa78152276c64d24ca662a4bc3b8c6d06de"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/mnemonics/russian.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cda567a187ed9b4dba3b0890c260eaf0dd3ce12f6dd82e5e2051ef4eb7d660e8"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/mnemonics/japanese.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3de6217bdf6f5e6617bc03710f9237e9fc55cd77354d93a6815779c70e38f11d"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_mnemonic.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34bc643b272befc3052c290ebc5cf49351726dc1b4f735fada3f96ed75acb6a1"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_mnemonic.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90c63dddbe061714cfc39fec01f6876945a810e0e37a27f7b9afe0911ffa910a"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/locales/hausa_intl.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0730d687a0e7717fb781fb5528b94dc56a4240b62fa44f2c893f45a6be95f079"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/mnemonics/portuguese.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13313a18f1cf6a789bb46b3d6cee76a687fdc4181e706cf4b416c01b57da6d5"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/mnemonics/dutch.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8db6bf0910a5985c7cfcf46a49b947b4a0866f2a5dda372e626347825bf4d2fe"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/mnemonics/german.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f533746130aae9624154d29a049015aa64f600f00ef8f8805b4fa49e30061ca9"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/mnemonics/english.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c00e75adc70909a39e5c8f24fcd0ac9d6800bd65739059207c1a956abea00e8"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/mnemonics/spanish.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb58e0694d38ecd991fc059dda3acf5557e75810545a624ea3e4ef57522a7459"}},{"ruleId":"D34","level":"note","message":{"text":"Further orphaned files (smaller): 24 smaller file(s) also have no living knowledge \u2014 folded into the freshness score and metrics rather than raised one row each \u2014 most significant first: lib/entities/fs_migration.dart, cw_monero/lib/mnemonics/chinese_simplified.dart, lib/src/screens/nano/nano_change_rep_page.dart, lib/nano/cw_nano.dart, lib/src/screens/disclaimer/disclaimer_page.dart, lib/src/widgets/seed_widget.dart, cw_nano/lib/nano_wallet_service.dart, lib/buy/wyre/wyre_buy_provider.dart (and 16 more) (34 orphaned of 734 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 734 of the 1507 production source files in this repository met that bar). Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/mnemonics/chinese_simplified.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c6485f29d676c736b7946833b19b08112f3ccb0d8adb33d8b05861bf3f9886b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/fs_migration.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f43686e5ae22e2453fd283aadff30570e19625d74e729cff1e23a9fdc4948fcc"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nano/nano_change_rep_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bd984749577141a27b040dad3ba761fee0052fb60f5a9356258623acd77c0c9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0823472f8401cb9eae048a7db27c7d193ee7969c58d74e848f7a29a624f4696"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/disclaimer/disclaimer_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdebc429f994b9ccb4dc3f28f7237eea60defc63fb22d95ca36bb92ce4a2cb50"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/seed_widget.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32c3c836d852835201859eeba0606503d885edc65ee6a2366c0413b7a5bccba0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_wallet_service.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34fbbc851d66648a8dcbd6d86e3236089a5b58d136790700efd59d16a2ecd23b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/wyre/wyre_buy_provider.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f34872f6e6101d928405b8f3f1e0d7e0a163577ba7c219888a79037040727e9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/palette.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11ce280aa8efd93d39a1f30e8ceb6f88c63de74cac04b2f33aca3bbc0b7813fb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/anonpay/anonpay_api.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de4dca500c29492c5c29361457a3e1908c711a3f84d94d2d3cc627e09f835555"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/validable_annotated_editable_text.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb3d56cb9983e3df516b624104bf8f6a9d932acdb9575deafb589745d62f5fe8"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/widgets/filter_list_widget.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f32941db75acdd864b38c831fd29ec2b54cccfd79ecb1224f1bb950c63075ee"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/auth/cake_pay_verify_otp_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff431481757f2a68a7db072087da1b79dd39f060fd367bf12271f404d2f5a0e1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_choose_derivation.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"823eeb02462cc8270cdf4fedbecc47226feb878d75977f36d9aa0ee67431365e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/setup_pin_code/setup_pin_code.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e67b240796fbe692f6d8c4162eb18e8bfc598b99fd05d72ab6b97657ecc0b02"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tool/localization/localization_constants.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18fed42a2e0644ad194e3b3741837a245d88b5440a03386fe8eb428916656a7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/monero_wallet_utils.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"598e9fda2b41b1234ec70af4baf2d0a1216455da13a9a473adab03330a5c805c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/secret_store_key.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfce705750a34882dab345bfb91d57e2cbd041f9cfa9495f91cc94253f612c38"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/widgets/select_button.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"322ae7f4c725b819fb966ef0f9528e1208f9a0e7e91c7d5a0d05a0d4aa4c6513"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fe4940c3aa055b365530c2846bef7a14f48d6f79a8e91f407c7269657387620"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"android/app/src/main/java/com/monero/app/MainActivity.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b9e98a9a7abdd827520c3985dae04e172bc003c8855fbede3def2b40cf4dbca"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_transaction_history.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8f93f75153dd655c2342417f404c0e62f912fc938353b309c35ee4cbd2654b4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"android/app/src/main/java/com/cakewallet/haven/MainActivity.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fdd9a92c252c488916a45ed7b0b0dbd280df2337c38371da1dbc81c26a62970"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_transaction_history.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f2a5e0ece3fc1950a3fc9933d794fbbd4c1ea6402009e94aa8e6b21b2f6edc3"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: solana_wallet.dart \u2194 tron_wallet.dart: \u0060cw_solana/lib/solana_wallet.dart\u0060 (context cw_solana) and \u0060cw_tron/lib/tron_wallet.dart\u0060 (context cw_tron) sit in DIFFERENT parts of the tree yet change together 82% of the time (9 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u00604cc14956\u0060 Migrate EVM/Sol/TRX tokens to SQL (#3450); \u006000088502\u0060 Improve how wallets are renamed. (#3352); \u0060695829c2\u0060 Token delete bug fix (#2889) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24cec02a8a7a461e9ccbf1fc8aeea8d0e69f5a71bfc6b23584652080f39e3c76"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: evm_chain_wallet.dart \u2194 tron_wallet.dart: \u0060cw_evm/lib/evm_chain_wallet.dart\u0060 (context cw_evm) and \u0060cw_tron/lib/tron_wallet.dart\u0060 (context cw_tron) sit in DIFFERENT parts of the tree yet change together 73% of the time (8 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u00603a04c7ff\u0060 feat: restrict history api calls when toggle is off in privacy settin\u2026; \u00604cc14956\u0060 Migrate EVM/Sol/TRX tokens to SQL (#3450); \u006000088502\u0060 Improve how wallets are renamed. (#3352) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88216237624b7debac0c0a85bd7e4aa61914ba74835b2f19590f72746281770b"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: bitcoin_address_record.dart \u2194 cw_bitcoin.dart: \u0060cw_bitcoin/lib/bitcoin_address_record.dart\u0060 (context cw_bitcoin) and \u0060lib/bitcoin/cw_bitcoin.dart\u0060 (context bitcoin) sit in DIFFERENT parts of the tree yet change together 64% of the time (7 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060547fae89\u0060 show Bitcoin address derivation path (#3177); \u00606378e929\u0060 CW-1157-Use-correct-derivation-paths-for-other-address-types (#2825); \u006077812016\u0060 LCW-1144 cupcake litecoin (#2557) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_address_record.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec8086a43061f2035c47750d2296f8e5fa58ec2a7475942151983b55194e0f3"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: exchange_provider_description.dart \u2194 secret_key.dart: \u0060lib/exchange/exchange_provider_description.dart\u0060 (context exchange) and \u0060tool/utils/secret_key.dart\u0060 (context tool) sit in DIFFERENT parts of the tree yet change together 63% of the time (12 of the 19 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 12 shared commits counted here, the most recent 3 are \u0060cf795bcc\u0060 feat: Integrate Jupiter DEX (#2761); \u00609b1a6244\u0060 Cw 1329 implement near intents dex (#2742); \u0060ef377fb5\u0060 Change Quantex to SwapTrade (#1990) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/exchange_provider_description.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a64cf83c13063b203c066a5941ebf68034c75b2f01050127976bcc291ce2374d"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: trade_filter_store.dart \u2194 exchange_view_model.dart: \u0060lib/store/dashboard/trade_filter_store.dart\u0060 (context store) and \u0060lib/view_model/exchange/exchange_view_model.dart\u0060 (context view_model) sit in DIFFERENT parts of the tree yet change together 58% of the time (11 of the 19 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 11 shared commits counted here, the most recent 3 are \u00609b1a6244\u0060 Cw 1329 implement near intents dex (#2742); \u00601c29be79\u0060 CW-961-Integrate-xoswap (#2060); \u00609cda2c99\u0060 Add Chainflip exchange provider (#1807) (#1970) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/dashboard/trade_filter_store.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24ff3da593da4990352dd47c105133d07e2b3fba4f6b8dd03c0b5a724527d48e"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: trade_state.dart \u2194 trade_details_view_model.dart: \u0060lib/exchange/trade_state.dart\u0060 (context exchange) and \u0060lib/view_model/trade_details_view_model.dart\u0060 (context view_model) sit in DIFFERENT parts of the tree yet change together 54% of the time (7 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u00601c29be79\u0060 CW-961-Integrate-xoswap (#2060); \u00607d11d046\u0060 Integrate LetsExchange exchange provider (#1562); \u0060f279a222\u0060 Cw 682 integrate stealth ex exchange provider (#1575) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade_state.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6cfffc68841e4b9c6b66c4fec23a61013141542d36861e3e0801f2ab0ab6e67"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: trade_state.dart \u2194 exchange_view_model.dart: \u0060lib/exchange/trade_state.dart\u0060 (context exchange) and \u0060lib/view_model/exchange/exchange_view_model.dart\u0060 (context view_model) sit in DIFFERENT parts of the tree yet change together 54% of the time (7 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u00601c29be79\u0060 CW-961-Integrate-xoswap (#2060); \u00607d11d046\u0060 Integrate LetsExchange exchange provider (#1562); \u0060f279a222\u0060 Cw 682 integrate stealth ex exchange provider (#1575) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade_state.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86c09f4aeaa4657e1f7a548767aa645f2d08ca36159f93fc58d4fba1eb55c26d"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: trade_filter_store.dart \u2194 exchange_trade_view_model.dart: \u0060lib/store/dashboard/trade_filter_store.dart\u0060 (context store) and \u0060lib/view_model/exchange/exchange_trade_view_model.dart\u0060 (context view_model) sit in DIFFERENT parts of the tree yet change together 53% of the time (10 of the 19 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u00609b1a6244\u0060 Cw 1329 implement near intents dex (#2742); \u00601c29be79\u0060 CW-961-Integrate-xoswap (#2060); \u00609cda2c99\u0060 Add Chainflip exchange provider (#1807) (#1970) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/dashboard/trade_filter_store.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24dd47a1a040326c9e6ca7f13e8af0f9548a96657854f7a3f25dcf3f27a0b2e5"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: moonpay_provider.dart \u2194 order_details_view_model.dart: \u0060lib/buy/moonpay/moonpay_provider.dart\u0060 (context buy) and \u0060lib/view_model/order_details_view_model.dart\u0060 (context view_model) sit in DIFFERENT parts of the tree yet change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u0060f401dafd\u0060 set launchUrl mode to LaunchMode.externalApplication; \u006078685b74\u0060 Cw 521 moonpay buy (#1335); \u0060133fa298\u0060 Generic fixes (#1245) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/moonpay/moonpay_provider.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63a6586b138ff1c5bbe72455f5f7f5ca9f92c23a7bf7521a98563b71ac53d97d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: electrum_wallet.dart \u2194 litecoin_wallet_addresses.dart: \u0060cw_bitcoin/lib/electrum_wallet.dart\u0060 and \u0060cw_bitcoin/lib/litecoin_wallet_addresses.dart\u0060 change together 58% of the time (7 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u00606378e929\u0060 CW-1157-Use-correct-derivation-paths-for-other-address-types (#2825); \u006020022c03\u0060 CW-994 mweb enhancements (#2204); \u006098babacc\u0060 fix: ltc wallets not syncing (address generation issue) (#2676) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2d4cb2713ab988dc2a47a2a32d48452016b3aaf51caa30f5cd1168f522882a4"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: exchange_trade_view_model.dart \u2194 trade_details_view_model.dart: \u0060lib/view_model/exchange/exchange_trade_view_model.dart\u0060 and \u0060lib/view_model/trade_details_view_model.dart\u0060 change together 54% of the time (14 of the 26 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 14 shared commits counted here, the most recent 3 are \u0060cf795bcc\u0060 feat: Integrate Jupiter DEX (#2761); \u00609b1a6244\u0060 Cw 1329 implement near intents dex (#2742); \u00601c29be79\u0060 CW-961-Integrate-xoswap (#2060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_trade_view_model.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf8bfcb9a0c6fe993e9178fd94f5df31afbb1d5df4963c7191e11d4a9e75ca2a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: exchange_view_model.dart \u2194 trade_details_view_model.dart: \u0060lib/view_model/exchange/exchange_view_model.dart\u0060 and \u0060lib/view_model/trade_details_view_model.dart\u0060 change together 54% of the time (14 of the 26 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 14 shared commits counted here, the most recent 3 are \u0060cf795bcc\u0060 feat: Integrate Jupiter DEX (#2761); \u00609b1a6244\u0060 Cw 1329 implement near intents dex (#2742); \u00601c29be79\u0060 CW-961-Integrate-xoswap (#2060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"38eacfef7958315a693a0d867c64d661ed1b0fa56f774453156e62e2d2a4d204"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: exchange_provider_description.dart \u2194 trade_state.dart: \u0060lib/exchange/exchange_provider_description.dart\u0060 and \u0060lib/exchange/trade_state.dart\u0060 change together 54% of the time (7 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u00601c29be79\u0060 CW-961-Integrate-xoswap (#2060); \u00607d11d046\u0060 Integrate LetsExchange exchange provider (#1562); \u0060f279a222\u0060 Cw 682 integrate stealth ex exchange provider (#1575) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/exchange_provider_description.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dfab35bea80568c095affea1d5f2f892b72b752048ba9842a8249fb64920b3d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: wallet_restore_from_keys_form.dart \u2194 wallet_restore_from_seed_form.dart: \u0060lib/src/screens/restore/wallet_restore_from_keys_form.dart\u0060 and \u0060lib/src/screens/restore/wallet_restore_from_seed_form.dart\u0060 change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00606abefc25\u0060 Cw 773 restoring from qr gives no visual feedback of progress (#1944); \u0060f559b10c\u0060 fix UI validation bug (#439); \u00600fd4f132\u0060 soft keyboard dismisses when generate-name icon is pressed \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/restore/wallet_restore_from_keys_form.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b33ec9ae7c4967763968d8198259eebabd660346216907a6212c01e0e38eb7"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"},"taxa":[{"id":"CICD-SEC-8","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"22da1393acd31ce704dc345293b1c160b21bdf1bdfbba185f295d3f50e81e46a"},"taxa":[{"id":"CICD-SEC-4","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e98dd739bc1bd197648941340c5407e70135edcd93c702ed9e8da54b5c0e1157"},"taxa":[{"id":"CICD-SEC-4","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"544845674832bed34de5aef2e66c16f42264afd77d9ee92d6e8aeba56453a6ed"},"taxa":[{"id":"CICD-SEC-4","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"946532a274ff09db66f0f73a917fa3c15d08b2dcd5a5e9a084805bbeb3f32065"},"taxa":[{"id":"CICD-SEC-4","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3c6fcf5065fa0048556ba8e9d5a112ded9199de8470a30b6f832ea53104e8470"},"taxa":[{"id":"CICD-SEC-4","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0950a791a16043e67dd29fd0e49163a77ac3ad260b2503e118b603d48f6bf261"},"taxa":[{"id":"CICD-SEC-4","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"},"taxa":[{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ace515990e7ee0f17b5c17e44dd168a5bdecf90804a3a3dd845cf05540978013"},"taxa":[{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"AX1","level":"error","message":{"text":"Captive dependency: get_it singleton Setup2FAViewModel captures factory AuthService: \u0060Setup2FAViewModel\u0060 is registered with get_it as a SINGLETON (registerLazySingleton) and is built from \u0060getIt.get\u003CAuthService\u003E(\u0060, whose type \u0060AuthService\u0060 is registered only as a FACTORY (registerFactory, lib/di.dart:585). The singleton is handed one instance when it is built and keeps it for the life of the locator \u2014 the fresh instance per resolve that the factory registration promises never reaches it, and any state that instance carries is shared by every later caller. Resolve \u0060AuthService\u0060 per use, register it as a singleton if one shared instance is meant, or make \u0060Setup2FAViewModel\u0060 a factory too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/di.dart"},"region":{"startLine":615}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc5136b87da4ca1cecdaa737891061d0f13e6c9c6c5f2cb57024f6de0146dc76"}},{"ruleId":"AX1","level":"error","message":{"text":"Captive dependency: get_it singleton WalletListViewModel captures factory WalletLoadingService: \u0060WalletListViewModel\u0060 is registered with get_it as a SINGLETON (registerLazySingleton) and is built from \u0060getIt.get\u003CWalletLoadingService\u003E(\u0060, whose type \u0060WalletLoadingService\u0060 is registered only as a FACTORY (registerFactory, lib/di.dart:422). The singleton is handed one instance when it is built and keeps it for the life of the locator \u2014 the fresh instance per resolve that the factory registration promises never reaches it, and any state that instance carries is shared by every later caller. Resolve \u0060WalletLoadingService\u0060 per use, register it as a singleton if one shared instance is meant, or make \u0060WalletListViewModel\u0060 a factory too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/di.dart"},"region":{"startLine":847}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4623ace6783b928b47c502cf91a42fbb29710e39babca73ff5bdf16b9c2d1fa"}},{"ruleId":"AX1","level":"error","message":{"text":"Captive dependency: get_it singleton WalletListViewModel captures factory WalletManager: \u0060WalletListViewModel\u0060 is registered with get_it as a SINGLETON (registerLazySingleton) and is built from \u0060getIt.get\u003CWalletManager\u003E(\u0060, whose type \u0060WalletManager\u0060 is registered only as a FACTORY (registerFactory, lib/di.dart:438). The singleton is handed one instance when it is built and keeps it for the life of the locator \u2014 the fresh instance per resolve that the factory registration promises never reaches it, and any state that instance carries is shared by every later caller. Resolve \u0060WalletManager\u0060 per use, register it as a singleton if one shared instance is meant, or make \u0060WalletListViewModel\u0060 a factory too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/di.dart"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a0935f1aac4ec7a4221b4f41d838862bf5a4f1d3db92594e719ca83d5fda3f"}},{"ruleId":"C3","level":"note","message":{"text":"Partial audit-trail evidence: An audit marker (an Auditable mixin or interface) was found, but no structural mechanism (a Drift QueryInterceptor recording changes, an audit-log table, collection or model, or per-model @Audited) \u2014 the trail\u0027s completeness can\u0027t be confirmed from the source."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"274a04e524f3228d241c99316455563739cb06cfd10a01e446d00b8a14956083"}},{"ruleId":"DM6","level":"error","message":{"text":"Domain fused to persistence infrastructure: Erc20Token: \u0060Erc20Token\u0060 is a domain concept fused to persistence ON ITS OWN DECLARATION (the hive \u0060@HiveType\u0060/\u0060HiveObject\u0060 mapping) with no separate pure-domain layer \u2014 the domain entity IS the ORM row (active-record), and it carries domain behaviour on the persistence type. A schema/persistence change ripples straight into the domain. Keep the ORM/table mapping on a boundary data-model \u002B a mapper, and the domain entity framework-free (map row\u2194domain through a repository)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/erc20_token_legacy.dart"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"9518d2dacb50d9c3ce0bb1f5d06f750e4f9312cef9fce64a1c1ba010b0119dfc"}},{"ruleId":"DM6","level":"error","message":{"text":"Domain fused to persistence infrastructure: Node: \u0060Node\u0060 is a domain concept fused to persistence ON ITS OWN DECLARATION (the hive \u0060@HiveType\u0060/\u0060HiveObject\u0060 mapping) with no separate pure-domain layer \u2014 the domain entity IS the ORM row (active-record), and it carries domain behaviour on the persistence type. A schema/persistence change ripples straight into the domain. Keep the ORM/table mapping on a boundary data-model \u002B a mapper, and the domain entity framework-free (map row\u2194domain through a repository)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node_legacy.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2363f4b62c12ba2d279d22361f0080ffa963c2265fc1b1e3b7587a55b5cdf20"}},{"ruleId":"DM6","level":"error","message":{"text":"Domain fused to persistence infrastructure: PayjoinSession: \u0060PayjoinSession\u0060 is a domain concept fused to persistence ON ITS OWN DECLARATION (the hive \u0060@HiveType\u0060/\u0060HiveObject\u0060 mapping) with no separate pure-domain layer \u2014 the domain entity IS the ORM row (active-record), and it carries domain behaviour on the persistence type. A schema/persistence change ripples straight into the domain. Keep the ORM/table mapping on a boundary data-model \u002B a mapper, and the domain entity framework-free (map row\u2194domain through a repository)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/payjoin_session.dart"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8cbf307a69a84f2c06d6b8fb97e5e289a2ea1e091b5d01c88a69eacf2968ebc"}},{"ruleId":"DM6","level":"error","message":{"text":"Domain fused to persistence infrastructure: SPLToken: \u0060SPLToken\u0060 is a domain concept fused to persistence ON ITS OWN DECLARATION (the hive \u0060@HiveType\u0060/\u0060HiveObject\u0060 mapping) with no separate pure-domain layer \u2014 the domain entity IS the ORM row (active-record), and it carries domain behaviour on the persistence type. A schema/persistence change ripples straight into the domain. Keep the ORM/table mapping on a boundary data-model \u002B a mapper, and the domain entity framework-free (map row\u2194domain through a repository)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/spl_token_legacy.dart"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f37b44d727453d719cdc1e08f29495cf9702a349348dcadb2aa2803881647054"}},{"ruleId":"DM6","level":"error","message":{"text":"Domain fused to persistence infrastructure: TronToken: \u0060TronToken\u0060 is a domain concept fused to persistence ON ITS OWN DECLARATION (the hive \u0060@HiveType\u0060/\u0060HiveObject\u0060 mapping) with no separate pure-domain layer \u2014 the domain entity IS the ORM row (active-record), and it carries domain behaviour on the persistence type. A schema/persistence change ripples straight into the domain. Keep the ORM/table mapping on a boundary data-model \u002B a mapper, and the domain entity framework-free (map row\u2194domain through a repository)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/tron_token_legacy.dart"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"35efd38b76680c81e48d0153e7c8cf767cb5a5a9055f8bd885025943ab73c2b2"}},{"ruleId":"DM6","level":"error","message":{"text":"Domain fused to persistence infrastructure: UnspentCoinsInfo: \u0060UnspentCoinsInfo\u0060 is a domain concept fused to persistence ON ITS OWN DECLARATION (the hive \u0060@HiveType\u0060/\u0060HiveObject\u0060 mapping) with no separate pure-domain layer \u2014 the domain entity IS the ORM row (active-record), and it carries domain behaviour on the persistence type. A schema/persistence change ripples straight into the domain. Keep the ORM/table mapping on a boundary data-model \u002B a mapper, and the domain entity framework-free (map row\u2194domain through a repository)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/unspent_coins_info.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"b26bdce38f5a7a1d18208d109be44d75a58c7df736fadd37d53c7db93ab192a4"}},{"ruleId":"DM6","level":"error","message":{"text":"Domain fused to persistence infrastructure: WalletInfo: \u0060WalletInfo\u0060 is a domain concept fused to persistence ON ITS OWN DECLARATION (the hive \u0060@HiveType\u0060/\u0060HiveObject\u0060 mapping) with no separate pure-domain layer \u2014 the domain entity IS the ORM row (active-record), and it carries domain behaviour on the persistence type. A schema/persistence change ripples straight into the domain. Keep the ORM/table mapping on a boundary data-model \u002B a mapper, and the domain entity framework-free (map row\u2194domain through a repository)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_info_legacy.dart"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"7140dac6cf5f97c3525267cb92ef2c275bf09a5076651328fd799dda9c598797"}},{"ruleId":"DM6","level":"error","message":{"text":"Domain fused to persistence infrastructure: Contact: \u0060Contact\u0060 is a domain concept fused to persistence ON ITS OWN DECLARATION (the hive \u0060@HiveType\u0060/\u0060HiveObject\u0060 mapping) with no separate pure-domain layer \u2014 the domain entity IS the ORM row (active-record), and it carries domain behaviour on the persistence type. A schema/persistence change ripples straight into the domain. Keep the ORM/table mapping on a boundary data-model \u002B a mapper, and the domain entity framework-free (map row\u2194domain through a repository)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/contact.dart"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"43010534ea8b06cbcf77127f7d681eae23ef8edf97ef0ef6d4f2497355711037"}},{"ruleId":"ED1","level":"error","message":{"text":"Blocking wait inside a handler: PayjoinReceiverWorker.receiveUncheckedProposal: \u0060PayjoinReceiverWorker.receiveUncheckedProposal\u0060 is an event/message handler that blocks the isolate on a synchronous \u0060sleep(...)\u0060 \u2014 it stalls the handler on the clock and serialises throughput, and blocks every other event on that isolate. Await asynchronously (\u0060await Future.delayed(...)\u0060 / \u0060async\u0060/\u0060await\u0060) instead of blocking the handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/payjoin/payjoin_receive_worker.dart"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"f105fb747497e33507eeca1f20dfd2610cfb61a9b2dbe9f62d64ea4b6a8548f3"}},{"ruleId":"GD1","level":"warning","message":{"text":"Unfinished stub \u2014 throws UnimplementedError: \u0060restoreFromHardwareWallet\u0060 is a shipped member whose whole body still throws UnimplementedError \u2014 generated scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet_service.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e92e3e3fba7b718e61821b72116298659633d893fa29310779d5a021dacbc39"}},{"ruleId":"GD1","level":"warning","message":{"text":"Unfinished stub \u2014 throws UnimplementedError: \u0060restoreFromHardwareWallet\u0060 is a shipped member whose whole body still throws UnimplementedError \u2014 generated scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet_service.dart"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"00548ae8a7595a792a3d4f227043c1b4e6b5a14e63fc09944e242e19d3757de8"}},{"ruleId":"GD1","level":"warning","message":{"text":"Unfinished stub \u2014 throws UnimplementedError: \u0060hash\u0060 is a shipped member whose whole body still throws UnimplementedError \u2014 generated scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/encrypt.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9eea756f5f366e8f5512323221e4d27419645df5d80e7afa853da2778774ac5"}},{"ruleId":"IC1","level":"warning","message":{"text":"Hollow method \u2014 returns a constant without doing the work: \u0060getLtcHeightByDate\u0060 looks like it should compute a result but its body just returns a constant \u2014 a placeholder return that was never filled in."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/get_height_by_date.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7dbb06171767562b7b6032895968d4bffc319e1668213b67f77a15c5813632e"}},{"ruleId":"IC1","level":"warning","message":{"text":"Unfinished stub \u2014 throws UnimplementedError: \u0060restoreFromHardwareWallet\u0060 is a shipped member whose whole body throws UnimplementedError \u2014 scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet_service.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9d1007f8ff02cf6f9e0011751ac51c6335e825503cb39ee29a0ec2fc3073faa"}},{"ruleId":"IC1","level":"warning","message":{"text":"Unfinished stub \u2014 throws UnimplementedError: \u0060restoreFromHardwareWallet\u0060 is a shipped member whose whole body throws UnimplementedError \u2014 scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet_service.dart"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"a18f6ed366c8bb85b9b7cbfbae01b5dc16392d7188db3094623beb5528134b07"}},{"ruleId":"IC1","level":"warning","message":{"text":"Unfinished stub \u2014 throws UnimplementedError: \u0060hash\u0060 is a shipped member whose whole body throws UnimplementedError \u2014 scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/encrypt.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a7e984ad68bf65381a71f1e8e434292d58b92edcddf64e77fb43c95036a2945"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060commitUR\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/pending_lightning_transaction.dart"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bf0e776ff6b0d7cb747cb0c586b3a3c2993a265ab08408ac1c4b10beda48270"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060commitUR\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/pending_transaction.dart"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9101d045a1848cd57f82c8901cace04dd107cec866d2de22cac9473770a4c81"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060restoreFromHardwareWallet\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet_service.dart"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3df27bb550e789e39ce7bb4a6c686ce69c05ff9bb7bbce2c4deec8488a98984"}},{"ruleId":"IC1","level":"note","message":{"text":"Blanket warning suppression: \u0060// ignore_for_file: type=lint\u0060 switches every lint off for the whole file \u2014 hidden debt. Ignore the specific lint on the specific line, with a justification, instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/deuro/deuro_savings_gateway_contract.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1ac8b7fb8d68d58a3c9f2f624d9ba5314d9296780e1d004938c7ce4f1288e88"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060commitUR\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/pending_evm_chain_transaction.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce3633064a2fd6d5730fe50803770ace9992d54a15925bcbb4ca2e13d014b4d"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060onStartup\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/wallet.dart"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee3eb239119ae052d82de162a57699b6b79a2ed8a7c01d3bd11d0297c6eef792"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060stop\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e83adc133569c4a2ff40e5b78dcbdd1bf9d0794f555457dea9026e9a0500def"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060commitUR\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/pending_nano_transaction.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"32252fe9168503ec54564e4f3e669e49ad8f802ffbd251ba39cd539b1e7c7a50"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060commitUR\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/pending_solana_transaction.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"116ca5493096f6e4fa06a4352c623ecac556c0aa5f80f6cd77171d8b55a409ce"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060commitUR\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/pending_tron_transaction.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"de7b53ba8b753dc922032cb5402ca5c129ff2a56622b7ba79eea7fa2c9fda905"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060onStartup\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/api/wallet.dart"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf82ccd61517d539612ec87ea5b4398f564242bb4af1c0ac34560e47b90a7e0f"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060commitUR\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/pending_wownero_transaction.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bf4c43886091efcf14f25752b71b5b2dfa58f053ee9721c6f5a48b084435e57"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060commitUR\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/model/pending_zano_transaction.dart"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"16bbe8612a5f58850e03f4817e877d19611d52ebd5fb365b01e89c09a8c3764d"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060restoreFromKeys\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet_service.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"7830dbb5b641ea0b51b65c55b99aa293075462b9cda0dee91f40c30399aa97b0"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060updateBtcNanoWalletInfos\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/default_settings_migration.dart"},"region":{"startLine":1126}}}],"partialFingerprints":{"codehealthFindingId/v1":"87df4c342549ca5ba262ac5c80b18eaba917f3cdb80cb0cae434519337abf1c7"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060create\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/haven/cw_haven.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d223a0c0cc224cc8e24c3ceb472072df943cc7a75aa7b9497924b66366e294e"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060isWalletExit\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/haven/cw_haven.dart"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb1aec4090d23db057798d6e44dc4e63bceedf13d5374b58948150911644a17d"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060openWallet\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/haven/cw_haven.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72fbb6cc934989eb88dfdd71fb8970aa2b1c732cb3338df4c4a64b8ecca86b8"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060rename\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/haven/cw_haven.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"c622f323a2543aa37ad780a0c6b7480e166e831c11d94b3e155189ddbcd62287"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060restoreFromHardwareWallet\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/haven/cw_haven.dart"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"81a7a1f9f724ae77d7b4079640ff5b9bb8a8c2361c3d14baef0fe7604ebd419d"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060restoreFromKeys\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/haven/cw_haven.dart"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"814dde41a449e9254a5f49ff5d4e92cafaf198a34912b33e18c90dadd8211000"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060restoreFromSeed\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/haven/cw_haven.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"96931a19fe4e52f8058a9a63c7ac84be743a2c9f895d8aea5bbdb82a5466003c"}},{"ruleId":"IC1","level":"note","message":{"text":"Member throws UnsupportedError: \u0060copyWith\u0060\u0027s body only throws an UnsupportedError or an UnimplementedError that gives its reason \u2014 sometimes a deliberate refusal, often an unfinished stub. Confirm it\u0027s intentional."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/viewmodels/card_customizer/card_customizer_state.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea2377045ad2bba48ba96d80f2e29bd24a462c1e816f33d6dccd8b1657c1d646"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060_getPrimaryTextColor\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_tile.dart"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"49a84eef405adee6d07ea8cd7f2d0259f009f53f3cc4783c7774d7163247a41b"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_EVM_L2_WALLET_NETWORK_TYPES.md names \u0060cw_evm/lib/clients/evm_chain_client_factory.dart\u0060, but no file or folder \u0060cw_evm/lib/clients/evm_chain_client_factory.dart\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_EVM_L2_WALLET_NETWORK_TYPES.md"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"a118c51beb4a4c1f2394b0324ab516c64e156bf05734308210243b625c01f612"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_EVM_L2_WALLET_NETWORK_TYPES.md names \u0060assets/optimism_node_list.yml\u0060, but no file or folder \u0060assets/optimism_node_list.yml\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_EVM_L2_WALLET_NETWORK_TYPES.md"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"736ccb28ceeb555514869521f10480cfd15f132cc4a27ff8ef0c8600323b02ac"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_NEW_WALLET_TYPES.md names \u0060lib/walletx/cw_walletx.dart\u0060, but no file or folder \u0060lib/walletx/cw_walletx.dart\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_NEW_WALLET_TYPES.md"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ef16ff7c2efaa9a862d0b64866fc201517bd8b542ee1f447fcc4e2dd376f04"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_NEW_WALLET_TYPES.md names \u0060assets/walletx_node_list.yml\u0060, but no file or folder \u0060assets/walletx_node_list.yml\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_NEW_WALLET_TYPES.md"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e134157300d6db26ec147de4116226880d5f2528cb57f2fbc1ffe7696763788"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_NEW_WALLET_TYPES.md names \u0060lib/src/dashboard/widgets/menu_widget.dart\u0060, but no file or folder \u0060lib/src/dashboard/widgets/menu_widget.dart\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_NEW_WALLET_TYPES.md"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4cce3b5ce04d52ee966afef47f98658cc7295a64b3afa8263ac36d29815b1ef"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_NEW_WALLET_TYPES.md names \u0060lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart\u0060, but no file or folder \u0060lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_NEW_WALLET_TYPES.md"},"region":{"startLine":615}}}],"partialFingerprints":{"codehealthFindingId/v1":"277ac0954827160fa9a9f53832f3b5395f14a6ec12938d76a1657fe48d1e03ef"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_NEW_WALLET_TYPES.md names \u0060lib/view_model/restore/restore_from_qr_vm.dart\u0060, but no file or folder \u0060lib/view_model/restore/restore_from_qr_vm.dart\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_NEW_WALLET_TYPES.md"},"region":{"startLine":857}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fc952d04a3780ffca936b1a58b2ce97f69b7ea8ca331f34adb49706c6c3d08b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_NEW_WALLET_TYPES.md names \u0060wallet-secrets-config.json\u0060, but no file or folder \u0060wallet-secrets-config.json\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_NEW_WALLET_TYPES.md"},"region":{"startLine":922}}}],"partialFingerprints":{"codehealthFindingId/v1":"5352c8c2af3c0edbbf4675e3936d98faa5a2fef92e19ce51b0a5c58493085193"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/ADDING_NEW_WALLET_TYPES.md names \u0060lib/walletx/walletx.dart\u0060, but no file or folder \u0060lib/walletx/walletx.dart\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/ADDING_NEW_WALLET_TYPES.md"},"region":{"startLine":975}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8fe2e8c11f3097e6787c8a595be7d85e0d6a731924d36485da43de9e8ceeea0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/builds/IOS.md changes into \u0060cake_wallet/scripts/ios/\u0060, but no such folder exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/builds/IOS.md"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ab9eeb1b8f1e510c3e84365834f3254d27589193312418a2d898bd9c7d09ad2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/builds/MACOS.md changes into \u0060cake_wallet/scripts/macos/\u0060, but no such folder exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/builds/MACOS.md"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"48dc31e22debaad69360a27db98d32dbce06d4e3e258e01053a21e6840ca72d4"}},{"ruleId":"P10","level":"note","message":{"text":"Large public API surface: 24/33 types (73%) declared in the published library are public. For a library, every public type is a stability contract \u2014 keep implementation types off the surface and expose only the intended API."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ed2ba843444ae377c17142f58f714e281e4bd3f183ab100ee1fbef389875d3e6"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 1/4 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060cw_mweb/go\u0060, \u0060ios\u0060, \u0060macos\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060remove\u0060 is async and calls deleteSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_service.dart"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfb97785bcb2bbaa0aedbe9808bf30874cd1c4fdd7a7f6eca261e1ef1fd0eecc"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060repairOldAndroidWallet\u0060 is async and calls listSync, createSync, writeAsBytesSync, readAsBytesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e269208ef127632c45dc78bb90cadbcbac11f83fb7f21f03aa7ccb0714b892b"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060repairOldAndroidWallet\u0060 is async and calls listSync, createSync, writeAsBytesSync, readAsBytesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet_service.dart"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ca85732e96a039ecf385bd0e9069a94e1c4bf93a31292b60a555fa8a7faa5bb"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_getSecrets\u0060 is async and calls readAsBytesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet_api.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d5f454be9cb93ac9d642e546c6cffea9dbfd7e470595ed7b2ae8e93f81064de"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_setSecrets\u0060 is async and calls writeAsBytesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet_api.dart"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"f08f7e55e76b9c9c2b24285a7b6583830b823c023389b69c9f84af9ee630d52e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060importBackupV1\u0060 is async and calls createSync, writeAsBytesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aa80955e9eac8da0d2ddd3e95d29e516f0a3a715f3bb8309cfd3f7ad6d8bbdd"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060importBackupV2\u0060 is async and calls createSync, writeAsBytesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"513a0f8fdf8a353998567f098255dcde9a8cd111718b45eeb72a8a957f5ef80b"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060importTransactionDescriptionDump\u0060 is async and calls readAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"00f8956c902a2ba27fce5332a3d82e4f1715188920105edaa0b491fc1401722d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060importPreferencesDump\u0060 is async and calls readAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"57aba63179072e0052b4557b0c0f838f0b581de32836ded7a97c31eff6e6e6db"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_importKeychainDumpV1\u0060 is async and calls readAsBytesSync, deleteSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc0635f4c12d739cbbdfcf475534cbd7a3991bc91489571c404c9c851c33f536"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060importKeychainDumpV2\u0060 is async and calls readAsBytesSync, deleteSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c41f9b48f59c581ec720b1f55d7d1e4dd57b81b6ab546fc37c50893124f528"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060importBackupFileV3\u0060 is async and calls deleteSync, createSync, writeAsBytesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service_v3.dart"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"4903cdd0fc633ad249e7daaf77ff93fd0a72ead18e50930052343df7224e4d55"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060verifyHardwareWallets\u0060 is async and calls readAsBytesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service_v3.dart"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"356adfaad0d5366c361c589d751633af0002c5408507d7a028a5ea332fde9246"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060exportBackupFileV3\u0060 is async and calls listSync, deleteSync, createSync, writeAsBytesSync, writeAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service_v3.dart"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae7300c3fe9a1f1f8b824b794679693cbd794b9eddd59c1d1723e479b84e7a27"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_writeTempFile\u0060 is async and calls deleteSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/csv_export_service.dart"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"144c4c785b4e3d76d1badc9b97cddd419643b04b731ae0413848e31830aa36af"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_saveToDownloads\u0060 is async and calls deleteSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/csv_export_service.dart"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"315983fd154c4f345701e55158cdb911d00c72f92b739d4b46a67d2080244687"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_removeDb\u0060 is async and calls deleteSync, renameSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/db/sqlite_debug.dart"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f33581dc7efef28f6adc96faf39d0b5d0c25149f4e04a8d7c33f7cc7be2845"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060init\u0060 is async and calls createSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_wallet.dart"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"444c1094f4b0fe7e8fedeb977424962b1a4d9b16a79e0f6c1ea182d1c33c93d6"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060receiveUncheckedProposal\u0060 is async and calls sleep \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/payjoin/payjoin_receive_worker.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d7b1818783a4159bd0836d7d95294334480472d7b4d3f54355710378b00184c"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_runSenderV2\u0060 is async and calls sleep \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/payjoin/payjoin_send_worker.dart"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"29491e9f30c01abce06c6ff0c894b59d204d1816d9f85b234851240e3fad73f1"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060getLegacyZcashAccountIdForName\u0060 is async and calls readAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1617}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1e9f3aa4df711ba109c1e04ed6fdb7f43ae3e35b691b6836d3f3eef21377ecd"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060getZcashAccountIdForName\u0060 is async and calls readAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1632}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8945c234735bb265e3af9ea5d62a735e206456a3dc1afdcfce5bf6445f5ba3"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060saveAccountId\u0060 is async and calls createSync, writeAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1647}}}],"partialFingerprints":{"codehealthFindingId/v1":"259ed372bda9de05e8102271f4970a470f4f6a6622182a018a0687f0e7beb6f2"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060getDbDataPath\u0060 is async and calls createSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1682}}}],"partialFingerprints":{"codehealthFindingId/v1":"bccfdd81d303bae3c0ff0165cb42cba77ffa49a579b2625a5b40d4fa8323de31"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060getDbDataPathLegacyYwallet\u0060 is async and calls createSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":1691}}}],"partialFingerprints":{"codehealthFindingId/v1":"2422f308ecd51db6411217e49fa91058c003c1cec784d44148bc72a2338e1702"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060addShieldedTx\u0060 is async and calls writeAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet_service.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ae3b995ac259c046e734dacc0e64bfb49b8890c262cfec1f3367fb28abb14f0"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060loadShieldTxs\u0060 is async and calls readAsLinesSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet_service.dart"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"d626569db0f97784423f88155d7052418e935f16ff2b87d1a6094757a990793e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_runEmbeddedTor\u0060 is async and calls writeAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/tor/torch.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0923b1ca1657821a07b149be18471fae2f76cc03994eb6c8b87452f8c89b2a9"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_saveException\u0060 is async and calls writeAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/exception_handler.dart"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b07d121504e5cf7a3954ae3ff697a48299544edaab6d14997cc96ed1373460"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060saveBackupFileLocally\u0060 is async and calls deleteSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/backup_view_model.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc1d45537c1ab0789fc836c6b0155f84f9988e0c0a919bd572819d9ca9a0952"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060removeBackupFileLocally\u0060 is async and calls deleteSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/backup_view_model.dart"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"9204ed5f5b91a60ab42f0465f3452d30fa165841931634dbda0ab6e7cc062ef6"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060saveToDownload\u0060 is async and calls deleteSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/backup_view_model.dart"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"64ef9c5aee9c6a552f5d5ba052c0d74ccf88322734c089ec2fa7ad76122928b5"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060_saveState\u0060 is async and calls createSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"a758a80a4aa5ba3a4b85fc19d50b29f101d59a1a142ceac3bf65e854d00824a2"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060getAbbreviatedLogs\u0060 is async and calls readAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/mweb_settings_view_model.dart"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f9d6a121621d54b66c2ebbbd69065048559ebb74cf8084fd9b63e61b82e55c6"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060getAbbreviatedLogs\u0060 is async and calls readAsStringSync \u2014 a blocking call inside async code stalls the isolate\u0027s event loop \u2014 every other event, on Flutter the next frame, waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/silent_payments_settings_view_model.dart"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b937af5d1f84143e9279e141af55667684d7eaec72b59110d00a7db08bb1fc2"}},{"ruleId":"S1","level":"error","message":{"text":"TLS certificate validation disabled: \u0060onBadCertificate\u0060 returning \u0060true\u0060 is set on a TLS client, so every peer certificate is accepted \u2014 including one an attacker presents. Chain, expiry, revocation and hostname are all skipped, so an attacker on the network path can present any certificate and read or rewrite the traffic \u2014 the connection is encrypted to the attacker, not to the intended host. Remove the callback so \u0060dart:io\u0060 validates the peer. If the server presents a self-signed or privately-issued certificate, trust THAT issuer rather than every certificate: load its CA into a \u0060SecurityContext\u0060 (\u0060setTrustedCertificatesBytes\u0060) and pass it as \u0060HttpClient(context: \u2026)\u0060 / \u0060SecureSocket.connect(\u2026, context: \u2026)\u0060, which keeps the chain and hostname checks on. A callback that must exist should compare the presented certificate with a pinned fingerprint, never return \u0060true\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_socket/abstract.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ea769c6237edb3d2d37243f764a9d1b5fe91aa8ba7cd1de0e18ddfe8ed91c8"}},{"ruleId":"S1","level":"warning","message":{"text":"Weak hash algorithm: MD5/SHA1 is computed here, and both are collision-broken. If this digest protects anything \u2014 a signature, an integrity or tamper check, a credential, or any value an attacker can influence \u2014 that is a real weakness: use SHA-256\u002B (\u0060sha256.convert(\u2026)\u0060 from \u0060package:crypto\u0060) for content integrity, or a KDF (bcrypt/Argon2/scrypt) for password storage. If it only derives a non-security identifier (a cache key, an avatar URL, an ETag), collision resistance carries no security consequence here; make that intent explicit instead \u2014 a non-cryptographic hash such as xxhash or murmurhash says it in code \u2014 since the algorithm alone cannot distinguish the two uses. Where a protocol this code does not own fixes the digest (a k-anonymity range query, a legacy signature format), the protocol decides; say so beside the call."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":635}}}],"partialFingerprints":{"codehealthFindingId/v1":"1983f1158058888816c3d99563410155bdd4414d54ea2d8cec4fe5ba17376541"}},{"ruleId":"X1","level":"warning","message":{"text":"\u0060async\u0060 callback passed to \u0060forEach\u0060: \u0060forEach\u0060 takes a \u0060void\u0060 callback and never awaits what it returns, so the Future each \u0060async\u0060 call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that \u0060await\u0060s around this loop still returns early, and a resource it closes next is closed under the work), and an error is never handled \u2014 it surfaces as an uncaught asynchronous error, which terminates a command-line program and reaches only the zone\u0027s error handler in Flutter. Iterate with \u0060for (final item in items) { await \u2026 }\u0060 when the work must run in order, or \u0060await Future.wait(items.map((item) async { \u2026 }))\u0060 when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback\u0027s whole body a \u0060try { \u2026 } catch (e) { \u2026 }\u0060 that handles the failure, so it cannot escape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1301}}}],"partialFingerprints":{"codehealthFindingId/v1":"1661feffe8d43ccac7ceaaa07fb9065dfcc6594184c5755589125a4f3d54769b"}},{"ruleId":"X1","level":"warning","message":{"text":"\u0060async\u0060 callback passed to \u0060forEach\u0060: \u0060forEach\u0060 takes a \u0060void\u0060 callback and never awaits what it returns, so the Future each \u0060async\u0060 call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that \u0060await\u0060s around this loop still returns early, and a resource it closes next is closed under the work), and an error is never handled \u2014 it surfaces as an uncaught asynchronous error, which terminates a command-line program and reaches only the zone\u0027s error handler in Flutter. Iterate with \u0060for (final item in items) { await \u2026 }\u0060 when the work must run in order, or \u0060await Future.wait(items.map((item) async { \u2026 }))\u0060 when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback\u0027s whole body a \u0060try { \u2026 } catch (e) { \u2026 }\u0060 that handles the failure, so it cannot escape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2902}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6146b72ffa6e06f67f41f8f1c06e5f9bbb1ac2ad079eae41416e14ed6540afa"}},{"ruleId":"X1","level":"warning","message":{"text":"\u0060async\u0060 callback passed to \u0060forEach\u0060: \u0060forEach\u0060 takes a \u0060void\u0060 callback and never awaits what it returns, so the Future each \u0060async\u0060 call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that \u0060await\u0060s around this loop still returns early, and a resource it closes next is closed under the work), and an error is never handled \u2014 it surfaces as an uncaught asynchronous error, which terminates a command-line program and reaches only the zone\u0027s error handler in Flutter. Iterate with \u0060for (final item in items) { await \u2026 }\u0060 when the work must run in order, or \u0060await Future.wait(items.map((item) async { \u2026 }))\u0060 when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback\u0027s whole body a \u0060try { \u2026 } catch (e) { \u2026 }\u0060 that handles the failure, so it cannot escape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d8d18b1019cbfeaeda9f82c9149bcc27ea8366ead81206cdcf45a73f936157"}},{"ruleId":"X1","level":"warning","message":{"text":"\u0060async\u0060 callback passed to \u0060forEach\u0060: \u0060forEach\u0060 takes a \u0060void\u0060 callback and never awaits what it returns, so the Future each \u0060async\u0060 call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that \u0060await\u0060s around this loop still returns early, and a resource it closes next is closed under the work), and an error is never handled \u2014 it surfaces as an uncaught asynchronous error, which terminates a command-line program and reaches only the zone\u0027s error handler in Flutter. Iterate with \u0060for (final item in items) { await \u2026 }\u0060 when the work must run in order, or \u0060await Future.wait(items.map((item) async { \u2026 }))\u0060 when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback\u0027s whole body a \u0060try { \u2026 } catch (e) { \u2026 }\u0060 that handles the failure, so it cannot escape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9e4b5840ec9405b9b96ec00662d99d904090b199fa42c831524a70246b9d2e5"}},{"ruleId":"X1","level":"warning","message":{"text":"\u0060async\u0060 callback passed to \u0060forEach\u0060: \u0060forEach\u0060 takes a \u0060void\u0060 callback and never awaits what it returns, so the Future each \u0060async\u0060 call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that \u0060await\u0060s around this loop still returns early, and a resource it closes next is closed under the work), and an error is never handled \u2014 it surfaces as an uncaught asynchronous error, which terminates a command-line program and reaches only the zone\u0027s error handler in Flutter. Iterate with \u0060for (final item in items) { await \u2026 }\u0060 when the work must run in order, or \u0060await Future.wait(items.map((item) async { \u2026 }))\u0060 when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback\u0027s whole body a \u0060try { \u2026 } catch (e) { \u2026 }\u0060 that handles the failure, so it cannot escape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/default_settings_migration.dart"},"region":{"startLine":921}}}],"partialFingerprints":{"codehealthFindingId/v1":"304a0a992e5ebc9426a013bfb250f247c3fd56cf4a12f9e67e7f9c7fb9b20ca1"}},{"ruleId":"X1","level":"warning","message":{"text":"\u0060async\u0060 callback passed to \u0060forEach\u0060: \u0060forEach\u0060 takes a \u0060void\u0060 callback and never awaits what it returns, so the Future each \u0060async\u0060 call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that \u0060await\u0060s around this loop still returns early, and a resource it closes next is closed under the work), and an error is never handled \u2014 it surfaces as an uncaught asynchronous error, which terminates a command-line program and reaches only the zone\u0027s error handler in Flutter. Iterate with \u0060for (final item in items) { await \u2026 }\u0060 when the work must run in order, or \u0060await Future.wait(items.map((item) async { \u2026 }))\u0060 when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback\u0027s whole body a \u0060try { \u2026 } catch (e) { \u2026 }\u0060 that handles the failure, so it cannot escape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/default_settings_migration.dart"},"region":{"startLine":1050}}}],"partialFingerprints":{"codehealthFindingId/v1":"8039141154934a2765ccea23258f9d54b9e4b7fa9865bf129f196c5be44876db"}},{"ruleId":"X1","level":"warning","message":{"text":"\u0060async\u0060 callback passed to \u0060forEach\u0060: \u0060forEach\u0060 takes a \u0060void\u0060 callback and never awaits what it returns, so the Future each \u0060async\u0060 call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that \u0060await\u0060s around this loop still returns early, and a resource it closes next is closed under the work), and an error is never handled \u2014 it surfaces as an uncaught asynchronous error, which terminates a command-line program and reaches only the zone\u0027s error handler in Flutter. Iterate with \u0060for (final item in items) { await \u2026 }\u0060 when the work must run in order, or \u0060await Future.wait(items.map((item) async { \u2026 }))\u0060 when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback\u0027s whole body a \u0060try { \u2026 } catch (e) { \u2026 }\u0060 that handles the failure, so it cannot escape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/default_settings_migration.dart"},"region":{"startLine":1217}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a722187cdebe9bf5807743fc07ee2c668fa068a422d2abe3f66184886bcec9e"}},{"ruleId":"X1","level":"warning","message":{"text":"\u0060async\u0060 callback passed to \u0060forEach\u0060: \u0060forEach\u0060 takes a \u0060void\u0060 callback and never awaits what it returns, so the Future each \u0060async\u0060 call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that \u0060await\u0060s around this loop still returns early, and a resource it closes next is closed under the work), and an error is never handled \u2014 it surfaces as an uncaught asynchronous error, which terminates a command-line program and reaches only the zone\u0027s error handler in Flutter. Iterate with \u0060for (final item in items) { await \u2026 }\u0060 when the work must run in order, or \u0060await Future.wait(items.map((item) async { \u2026 }))\u0060 when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback\u0027s whole body a \u0060try { \u2026 } catch (e) { \u2026 }\u0060 that handles the failure, so it cannot escape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tool/generate_localization.dart"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"62b5a7c788efae42b33b776847fe702295d77067beb2f075eb75396899c6e28b"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!File(path).existsSync() \u0026\u0026 !File(\u0027$path.keys\u0027).existsSync()\u0060 appears character-identically in 5 files \u2014 cw_monero/lib/monero_wallet_service.dart, cw_nano/lib/nano_wallet_service.dart, cw_wownero/lib/wownero_wallet_service.dart, cw_zano/lib/zano_wallet_service.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet_service.dart"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"d67aea956a8946662a3b2892e1db54b470818394ca493abbaa2b05c04c6dd471"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!e.field0.contains(\u0022dns\u0022) \u0026\u0026 !e.field0.contains(\u0022TimedOut\u0022)\u0060 appears character-identically in 2 files \u2014 cw_bitcoin/lib/electrum_wallet_addresses.dart, cw_bitcoin/lib/lightning/lightning_wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_addresses.dart"},"region":{"startLine":1222}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a6a3037c622c07798542db275c18490efa1db6df161da63324f68f16a5623ba"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!priorities.contains(priority) \u0026\u0026 priorities.isNotEmpty\u0060 appears character-identically in 2 files \u2014 lib/view_model/send/fees_view_model.dart, lib/view_model/settings/other_settings_view_model.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/fees_view_model.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c1f22b826bf9b7f0cd3c3b542e5e26687ef119bd390c5dc77473d7c1406050"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!validateMnemonic(credentials.mnemonic) \u0026\u0026 !bip39.validateMnemonic(credentials.mnemonic)\u0060 appears character-identically in 2 files \u2014 cw_bitcoin/lib/bitcoin_wallet_service.dart, cw_bitcoin/lib/litecoin_wallet_service.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet_service.dart"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8053558dd464bd0991ba9729dc16c16ed040a3a8568da5e2d411ffb34c9959a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(!amount.contains(\u0027.\u0027)) \u0026\u0026 (!amount.contains(\u0027,\u0027))\u0060 appears character-identically in 2 files \u2014 cw_core/lib/format_amount.dart, lib/entities/format_amount.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/format_amount.dart"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"05a9f5aaa45259ed12ab0a93caf93aa1fd7d399122c141f3a7bcf9229dc5d70b"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(amount.endsWith(\u0027.\u0027)) || (amount.endsWith(\u0027,\u0027))\u0060 appears character-identically in 2 files \u2014 cw_core/lib/format_amount.dart, lib/entities/format_amount.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/format_amount.dart"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f9a255ebc645ee2dbd992f1900b52407b470346019f6ba1aab05d498c1586e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(token.iconPath == null || token.iconPath!.isEmpty) \u0026\u0026 !token.isPotentialScam\u0060 appears character-identically in 2 files \u2014 cw_evm/lib/evm_chain_wallet.dart, cw_tron/lib/tron_wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1419}}}],"partialFingerprints":{"codehealthFindingId/v1":"46299bc2c12bb2c105b8b4a50203fa9aba8b164fae63ec8bb13aa005365055fa"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060_cachedBlockchainHeight \u003C baseHeight || _cachedBlockchainHeight == 0\u0060 appears character-identically in 2 files \u2014 cw_monero/lib/api/wallet.dart, cw_wownero/lib/api/wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/wallet.dart"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa2a03d007d0f9c958e7ecc2e3ab069cf813d0e2ecd249411e4338275772891"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060_formKey.currentState != null \u0026\u0026 !_formKey.currentState!.validate()\u0060 appears character-identically in 7 files \u2014 lib/cake_pay/src/auth/cake_pay_welcome_page.dart, lib/new-ui/pages/send_page.dart, lib/src/screens/contact/contact_page.dart, lib/src/screens/nano/nano_change_rep_page.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/auth/cake_pay_welcome_page.dart"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"7562d8d6270254fe6be85d7f4a27e85e400382484f0cc5c6b20d3bc894923f9d"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060_hasSuspiciousData(normalizedName) || _hasSuspiciousData(normalizedSymbol) || _hasSuspiciousData(normalizedTitle)\u0060 appears character-identically in 2 files \u2014 cw_evm/lib/evm_chain_wallet.dart, cw_solana/lib/solana_wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0c1d05e3ba59fd9e47a338adb605061be1fb229654b0710055366e03da71069"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060_passphraseFormKey.currentState != null \u0026\u0026 !_passphraseFormKey.currentState!.validate()\u0060 appears character-identically in 2 files \u2014 lib/src/screens/new_wallet/advanced_privacy_settings_page.dart, lib/src/widgets/bottom_sheet/add_passphrase_bottom_sheet_widget.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/advanced_privacy_settings_page.dart"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9dc3dc571057c5facb156cbd345737134dea82d84fe6409aa77f180b9447580"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060appStore.wallet == null || settingsStore.fiatApiMode == FiatApiMode.disabled\u0060 appears character-identically in 2 files \u2014 lib/reactions/fiat_rate_update.dart, lib/reactions/on_current_fiat_change.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/reactions/fiat_rate_update.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f70481084741f48c9949b449447167564fc2d2f4968b8fab5cb0b29d8dca7d2"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060await _biometricAuth.canCheckBiometrics() \u0026\u0026 await _biometricAuth.isAuthenticated()\u0060 appears character-identically in 2 files \u2014 lib/view_model/auth_view_model.dart, lib/view_model/settings/security_settings_view_model.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/auth_view_model.dart"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc2d6b92deaca0fb29484cfdbd7685c643f7260ebb97807c9179790a19848611"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060balance[currency]!.fullBalance != fullBalance || balance[currency]!.available != unlockedBalance || balance[currency]!.frozen != frozenBalan\u2026\u0060 appears character-identically in 2 files \u2014 cw_monero/lib/monero_wallet.dart, cw_wownero/lib/wownero_wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":945}}}],"partialFingerprints":{"codehealthFindingId/v1":"16615a7bce2424537eceea2f36574934aef0fe2ac0fe653103a3ce4939d36051"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060context.mounted \u0026\u0026 Navigator.of(context).canPop()\u0060 appears character-identically in 4 files \u2014 lib/core/wallet_loading_service.dart, lib/src/screens/dashboard/pages/nft_import_page.dart, lib/src/screens/wallet_unlock/wallet_unlock_page.dart, lib/view_model/hardware_wallet/ledger_view_model.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/wallet_loading_service.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"a130f81cfc32b69cba8fba4c60885b235dbe612a69d7c8991f5a3a49a4fdaab1"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060contractAddress != null \u0026\u0026 contractAddress!.isNotEmpty\u0060 appears character-identically in 2 files \u2014 cw_core/lib/payment_uris.dart, lib/core/anypay/anypay_models.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/payment_uris.dart"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e46348740874bb159e9a49f569c15bd355540aa1a18eaff812ead5a550250b6"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060cppCsExp != dartCsExp \u0026\u0026 (Platform.isIOS || Platform.isMacOS)\u0060 appears character-identically in 2 files \u2014 cw_monero/lib/api/wallet_manager.dart, cw_wownero/lib/api/wallet_manager.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/wallet_manager.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"a21add5c23b51ae5601888b256912622cfa0c1b98fa720387915d4fb93d22b9e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060currentState is ExecutedSuccessfullyState || currentState is FailureState\u0060 appears character-identically in 2 files \u2014 lib/cake_pay/src/cards/cake_pay_buy_card_page.dart, lib/src/widgets/bottom_sheet/swap_details_bottom_sheet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_buy_card_page.dart"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"515a725481ffb42db2a8a18cbb3fc5439a7f9e8480f4994e403b131c38352ec8"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060defaultSymbolsUpper.contains(normalizedSymbol) \u0026\u0026 !isTokenWhitelisted\u0060 appears character-identically in 2 files \u2014 cw_evm/lib/evm_chain_wallet.dart, cw_solana/lib/solana_wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ecda5ec30a5882d91a8ffe26f2a8f53c5e4bfc9ef60e62d0ad28c5a1b7ef04d"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060element.accountIndex == i \u0026\u0026 element.isConfirmed == false\u0060 appears character-identically in 2 files \u2014 cw_monero/lib/api/transaction_history.dart, cw_wownero/lib/api/transaction_history.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/api/transaction_history.dart"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f8564a4eab59dda5ac3f942b69136dc0d3259f57f1d8feb3062e34e0fcafa7f"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060element.walletId == id \u0026\u0026 element.accountIndex == walletAddresses.account!.id\u0060 appears character-identically in 2 files \u2014 cw_monero/lib/monero_wallet.dart, cw_wownero/lib/wownero_wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":960}}}],"partialFingerprints":{"codehealthFindingId/v1":"6395b62eec4d256980d3591ee7adc2616892357ffe5594cbd3d8849bef60b3ac"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060element.walletId.contains(id) \u0026\u0026 element.accountIndex == walletAddresses.account!.id\u0060 appears character-identically in 2 files \u2014 cw_monero/lib/monero_wallet.dart, cw_wownero/lib/wownero_wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":790}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a705af90ff72161dfb8fecd7b3e76d5f8e2b782cf4ca8cbf29eecd5b85278a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060element.walletId.contains(id) \u0026\u0026 element.hash.contains(coin.hash) \u0026\u0026 element.vout == coin.vout\u0060 appears character-identically in 2 files \u2014 cw_bitcoin/lib/electrum_wallet.dart, cw_bitcoin/lib/litecoin_wallet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2289}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ba86cd316ca43ea63d2d027605af6468b266099d9d1cf007030c3c2b691d813"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060filename.endsWith(ignore) \u0026\u0026 !filename.contains(\u0022wallets/\u0022)\u0060 appears character-identically in 2 files \u2014 lib/core/backup_service.dart, lib/core/backup_service_v3.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c6e5b1c0447ca4d96067e273c916bd1594ab186709a120d4edecbc4d60528b2"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060formKey.currentState != null \u0026\u0026 formKey.currentState!.validate()\u0060 appears character-identically in 2 files \u2014 lib/new-ui/pages/swap_page.dart, lib/src/widgets/bottom_sheet/swap_confirmation_bottom_sheet.dart. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/swap_page.dart"},"region":{"startLine":872}}}],"partialFingerprints":{"codehealthFindingId/v1":"3976069d62e56d652c4cac02d08a4fe20e8f55e3133a23419def5c6b2c2c4109"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_MyCardsTabState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_searchController\u0060 itself (line 269, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_searchController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_searchController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/cards/cake_pay_cards_page.dart"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ebe84541de9d7e12d5cbcf76ef80333700de549dbf9963e531ba09b08465987"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060FlipCardState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_ctrl\u0060 itself (line 24, \u0060AnimationController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_ctrl.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060AnimationController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_ctrl.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cake_pay/src/widgets/flip_card_widget.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fec22d6dbd72590f3de6160d057acddaaadb6d7b5152ade2d7a2999c698704c"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_LightningUsernamePageState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_controller\u0060 itself (line 34, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_controller.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_controller.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/lightning_username_page.dart"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"1df54689451cb9612170211ab3c06995a95139912821c639f5c8a90aeb66bb20"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_NewAddressesPageState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_searchController\u0060 itself (line 83, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_searchController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_searchController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/addresses_page.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9feaadaeb8ed5e89b81177306f750ba2a175ba1ee7ca342792ea0a8d35f4033"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_BridgeAmountPageState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_amountFocusNode\u0060 itself (line 36, \u0060FocusNode\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_amountFocusNode.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060FocusNode\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_amountFocusNode.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/bridge/bridge_amount_page.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf59385446d7b98f89aa509fc0cc2f3a269d27a33561f30eca41aab2918effa6"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_HardwareWalletTrezorParingSheetState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_paringCodeController\u0060 itself (line 14, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_paringCodeController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_paringCodeController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/trezor_paring_sheet.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c3f1cf7008e2ee98d5c3f1f604ceffd9395ab2d8682567f3f77ffa1bbc2f9d4"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_WalletOptionsScreenState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_passphraseController\u0060 itself (line 439, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_passphraseController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_passphraseController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/hardware_wallet/proceed_on_device_sheet.dart"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eb22aa205bfb2e42a146fa560314a062dc3d8df1dc03da24bda8d8ae6c51973"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_ReceiveAmountModalState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_amountController\u0060 itself (line 28, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_amountController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_amountController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/receive_page/receive_amount_modal.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7060979e4c532de631c613869bebdaeff6fc3eba6c56e6fe1430e2dde2fda76"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_SelectHardwareWalletAccountFormState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_controller\u0060 itself (line 44, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_controller.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_controller.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/select_hardware_wallet_account_page.dart"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"1baaf20a089fa181ccb56a1c7ae45d0bd3c67beb5a8e0d889ba43bb21af689b5"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_MoneroHardwareWalletOptionsFormState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_blockHeightFocusNode\u0060 itself (line 46, \u0060FocusNode\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_blockHeightFocusNode.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060FocusNode\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_blockHeightFocusNode.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"7376f89df31b89227ec5727417a1fb280ad67fba78d8df1e531fb07f68581d01"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_MoneroHardwareWalletOptionsFormState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_walletNameController\u0060 itself (line 47, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_walletNameController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_walletNameController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9102308ccaa17f20122271e7cb393e000878fda67c9c197f3d1ee66efef301e"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_MoneroHardwareWalletOptionsFormState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_passphraseController\u0060 itself (line 48, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_passphraseController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_passphraseController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/monero_hardware_wallet_options_page.dart"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"bef885968328b401c00973b57e60b7b29478114442304d888c2be6904b642723"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_SignPageState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_controller\u0060 itself (line 30, \u0060PageController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_controller.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060PageController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_controller.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/sign_page.dart"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"aead57a420591ae9335f286fce8a7dd4d1e48d262bb4447a298ebcd0dca79fca"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_EditTokenPageBodyState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_contractAddressController\u0060 itself (line 67, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_contractAddressController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_contractAddressController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f77577728750d218f0393f7ad15f4e82be1e4ce173a3190338c5ba1afc8c322"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_EditTokenPageBodyState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_tokenNameController\u0060 itself (line 68, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_tokenNameController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_tokenNameController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc38d2d6d2000745cc66c21707ce08d8fa4240ebd7146cbd5c61b987cb2153da"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_EditTokenPageBodyState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_tokenSymbolController\u0060 itself (line 69, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_tokenSymbolController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_tokenSymbolController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a213a861f0550fb5611e518a222bcbefceffb1fba5064c5dfae8d29c82a249e"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_EditTokenPageBodyState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_tokenDecimalController\u0060 itself (line 70, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_tokenDecimalController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_tokenDecimalController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad41d5c1ae2485b29b021c3446ac788f98d240a68bc840e23b760a87870aabee"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_EditTokenPageBodyState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_tokenIconPathController\u0060 itself (line 71, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_tokenIconPathController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_tokenIconPathController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c96458ea4e9e6efe7a0debca6088a6cad622ebbfe7576a1dbed85d0cb12d45"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_EditTokenPageBodyState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_contractAddressFocusNode\u0060 itself (line 73, \u0060FocusNode\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_contractAddressFocusNode.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060FocusNode\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_contractAddressFocusNode.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e3cb127c10a22414d709cbc1874e4680a56c22c0e5b2db59d4f920fee0d302f"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_EditTokenPageBodyState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_tokenNameFocusNode\u0060 itself (line 74, \u0060FocusNode\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_tokenNameFocusNode.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060FocusNode\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_tokenNameFocusNode.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dashboard/edit_token_page.dart"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"f580257697f1e085819f21a70c919530e588f481f619e927b10375fc0fdc5be4"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_WalletNameFormState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_nameController\u0060 itself (line 90, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_nameController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_nameController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/new_wallet/new_wallet_page.dart"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"be7507a3c017663c64b06a15cac5eb170e7a6dd8c9f7d060c7ca0594a75eb956"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060_RescanPageState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_heightController\u0060 itself (line 26, \u0060TextEditingController\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_heightController.dispose()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060TextEditingController\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_heightController.dispose();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/rescan/rescan_page.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"b578f1dbbcd490e890cd97d1349fbfb7e69b234fc9ee8f291b9e1cb2c1a09f67"}},{"ruleId":"X18","level":"warning","message":{"text":"Owned disposable field is never released: \u0060RootState\u0060 carries a disposal duty \u2014 a \u0060State\u0060, so the framework calls its \u0060dispose()\u0060 when it leaves the tree \u2014 and it creates \u0060_isInactiveController\u0060 itself (line 61, \u0060StreamController.broadcast\u0060), which makes that instance its own. Nothing in the class releases it \u2014 no \u0060_isInactiveController.close()\u0060, no tear-off of it, on any path \u2014 nothing elsewhere in the library releases it through another instance, and it is never handed on as a value (passed positionally, returned, stored, collected), so no other owner can be ending it. Passing it as a named argument does not: a widget or animation never disposes a controller it was given. On what was read, \u0060StreamController.broadcast\u0060 outlives the object that made it \u2014 its listeners, and through them this object and everything it references, stay reachable, and a ticker, timer or subscription keeps calling into a disposed object. Release it where the duty is discharged: \u0060_isInactiveController.close();\u0060 in \u0060dispose()\u0060 before \u0060super.dispose()\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/root/root.dart"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd712c463a1a80a6c38913169f43cfe11370d5c229b325685530c553f2bc958d"}},{"ruleId":"X27","level":"warning","message":{"text":"Collection is structurally changed while it is being enumerated: \u0060urQr.keys\u0060 is a live view over \u0060urQr\u0060 and shares its modification count, and line 34 calls \u0060urQr.remove(\u2026)\u0060 inside the loop body \u2014 a structural change to a \u0060Map\u0060. Dart\u0027s collection iterators check that the collection has not changed since the loop began, so the next \u0060moveNext()\u0060 throws \u0060ConcurrentModificationError\u0060 (an unmodifiable or fixed-length one rejects the change itself with \u0060UnsupportedError\u0060): every pass that reaches this call ends the loop by exception instead of by running out of elements, and the remaining elements are never seen."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/ur/animated_ur_page.dart"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fb0c743282fe0faa29f135e38cb5370290b7fb2d82f46f89e7cd1a4ba2efe31"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/pending_bitcoin_transaction.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"9defd65373f4c53c4a44b9de0b370b3f3c8c6893d4f539e76315c08b5cfa792e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet_addresses.dart"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecb36d0c92139efd00f40f8c9b9f89a0f78644de7b0a62b8a9da859592aacb3f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed47f9b8fcb3498d5535b271d5987795076cd9443b00b49d21cf0ebd5e14eadc"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"09889ca5cfa36a19303a5d98e07eb4284fc025497b6652125c480779f2e70da2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":945}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc09db41a48cdb0e75a98d8f48e0bd3905ecf891d2fae3b3a2d77cafb989edbe"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1356}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f7a939625cf6bf69194bf3bf990355d2f854322697fb853636a4f5df549b36"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1412}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc3ad46c8bdf05f6acc0396851d50fe4716dee292baa17d798dfe10479884aa7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/litecoin_wallet.dart"},"region":{"startLine":1430}}}],"partialFingerprints":{"codehealthFindingId/v1":"73d59551fa5eb7477570caa911f9d6bbe2caf0a8cf15cb4d8fdf763172c18c6a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_snapshot.dart"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1a0b1de089efd5a80a514f7bb5db21ab60dc7cf1fb0b374dd063bd3af160812"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet_snapshot.dart"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"349c0e9cceffb19120c273b77836ca8055db28cfa3aea0bc71bf0821ee399ad3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"3596a63df81d65d125f8514e2f324812f4c3cbc6e7b4751d670589cb8bcc5dc0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"906fa982f7195620cefeaef35d0c21ea4621befbc49a8d95bd88c7d134d5653e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb98126650639178fc7731a7dcc43f28f0dd7bd76da2209809824a4b505c1ce"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":1097}}}],"partialFingerprints":{"codehealthFindingId/v1":"5efc2c3c37d1c8486030abbaaef75e4e2c61f2213bfc63ed999dbbf8f3812e72"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2011}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf94d60103cb1d7698bfd27ae418d4adc4f2d0e669ecdf1f484596f3fd0c9f45"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2106}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cef3754c96a1e054f9c8baa8c24bbb45e460e701989208f5f707cdebd06b1c4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2340}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cad5589b8cfeb261790dfa85d4224e2d20e6d0638da35f2144200ef93d001af"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2460}}}],"partialFingerprints":{"codehealthFindingId/v1":"51059d3e44d49368486c34ddc229c332b417586fd70c6b862e0f07d6d0864f4e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2789}}}],"partialFingerprints":{"codehealthFindingId/v1":"be14466d2e0cf0e55ac0aca469536ec634b7ba483aab5d90d495e98eee6b75c4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3617}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3be3bb6269ada2ad7db047c408ee72be50a6316d06c0b09f06b257dfae0e607"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3709}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e02faf8ee5f4d2011fdba75bbd9ed5aeddd9ed374efbada135d4ecdcf752cc"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":3839}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c26427388825af0dcd61556853483e4c902d3a955a1009c3abfdc4cb44a5039"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":4220}}}],"partialFingerprints":{"codehealthFindingId/v1":"dadabd06715f310efc752ea796ffc3aebb4e684e5f6d82174d9eeb865d885d66"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":4604}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2597b585978ddb62d459bf712a33158278b112699f14475962c95cf1eb7d2e1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eb99a00d40f946401a800affc79654c7a6fe3619f3b342c0a7bd33f6959745b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"93dade1a7ac3de54e1d1a7a9b08f1c28f617380b5d5e0fc5d8140cbf97c3ce5d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"9db47eb5cd6fcd4d146db869ddaa8a7ad0816702592d6795dfc4dd39d9030647"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. On a teardown path letting it propagate is not an option (throwing out of \u0060close()\u0060 masks the failure already in flight and abandons the rest of the cleanup), so make the swallow deliberate instead: narrow the catch to the exception this release can actually raise, and record it through whatever this codebase already uses to report problems \u2014 or, if it truly cannot matter, say why in a comment on the catch."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"972eff6a68909aea23f2ab296f68d9c2f94bf0cc31596c18d996edf5e20f4611"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ff4ad18bd16865c26781de84710c35723a37601a051485ff4a9ac1f3449993e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":800}}}],"partialFingerprints":{"codehealthFindingId/v1":"22dccdabdc3a7429a20b2bedf6bc195d6dff593a855f7f233ae0c4dcbd05653f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":838}}}],"partialFingerprints":{"codehealthFindingId/v1":"d423558a2134483011c305f402f300adf66063884fe65a27b72220afbeaba31e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":845}}}],"partialFingerprints":{"codehealthFindingId/v1":"beae4e28838aff4c4c4d821d4098dc3cadf5ef3fbe30555eda7e1881e4f09370"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":868}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d68e526ab8cd5f069311d9e20112fba914a80e14eaf275487b6d24452915a4a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_wallet_addresses.dart"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fd43fbd161a43b603eb64c325efefde4153ed6c942ea67a618086a2fe65a0c1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_mnemonic.dart"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"68375f522568ad0ba5060c1a820e79e325e9d3dcc7e322373776513941b8e80b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_amount_format.dart"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"306e004409a34b860841cfbd0b63ac3a7c7aa65bc232f93473b78e1877ed7ed5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_address_record.dart"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"c32ddf294daa2b23ec4207cd0436526fc29e1a10f644083caf886f8b79b3c68c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/address_from_output.dart"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"70ee356216e18957d6e5b247de4cb1df4313d37d5747321ad18696eaa119deb3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. On a teardown path letting it propagate is not an option (throwing out of \u0060close()\u0060 masks the failure already in flight and abandons the rest of the cleanup), so make the swallow deliberate instead: narrow the catch to the exception this release can actually raise, and record it through whatever this codebase already uses to report problems \u2014 or, if it truly cannot matter, say why in a comment on the catch."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_wallet.dart"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"5131767c8da69ef8bbc1335b734575d242f300117ba41e324598a52e51354551"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_wallet.dart"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"1642796a7014e505fe7a7edaf67f572bc89e7373f8373dbb688d86c5148ebcad"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/lightning/lightning_wallet.dart"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"e92e7d2b31726bfa862746a321e93ba59a0a484010770c14509f59d6a355510a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/payjoin/payjoin_receive_worker.dart"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cfb2f4649790d043448791fe81d82cf5190b7b613777bb57169429e7d200b51"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/payjoin/manager.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ef53b448ec5c153d7b3ab829adccc5921b689869571ffb645bfb191aba4a918"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/psbt/v0_finalizer.dart"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"e909d0f7ef77b579e62642746c4fb44477a1a16ac6a147bd2e9c4d784882afcb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"e15fdfc133ef7692c6fb4e51f9400290a708c6f4b566002bcccddc8168dec9ec"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/zano_asset.dart"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"7650af11b2a6409e0c811362638ca78a1f195e94f07701af7828f0139741d2c6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_keys_file.dart"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"12d68e2f80bb62c8838664442e2f282b290a4e2a6c3ca010c170ef953c18a2e7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_keys_file.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3a608892f66cefba75e1fda51b2fd434b3886d066d0557db21fb9906908001"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_keys_file.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"715d4bd9f5cd6c35ae238011437db6736677c120b9c0eb2fd353686155bd2921"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/set_app_secure_native.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6755a5d80803e322cc6a55b25a9d3b99f65b641bb82b2ab9cd46b45690ab019"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/root_dir.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f4c732f8bcd5fc2fbb86a074aa3e8bdff6a3c542e73874211a8ec0d10cdc073"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/root_dir.dart"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fc7cf1484d1cc64cdf301eff735f2f52bfaf14458a5fbf2edbca0c17508e961"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/payment_uris.dart"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e7da902ffa8f264789b9737d333317bfb5e1147b81d426642c68e57751905a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node_list.dart"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae6b7b7c739dc170b9f46d414da55d9fdc4e7e83cbd8385623e708cce5e2c471"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b395c842c0884a8af66ece1ab074d5c14528a711aaad6e515bf0a8aac227b9e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"8602dcf671874e294f09b8754d8024aa9ba2aacefcfd04c1eeda9e6f5a8b2f99"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e1fe14079eb40214cf6f9af36cf1782e84231eb0e5fbaea31ef083d6efac47"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"e275c8bf9fdcd654dfabf2e83d21117faff16b739f130a58cdb84fceaa3a5fdb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ae0797a0546e4bac73bd34dd4af2e3cda4776ae87e7b2c7e4f56004a9031309"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"24877cc5d162adab093c72a5461597159de8efce03d7e65b83d1cde62e68777d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/node.dart"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3ae0af35454b4de22cebe69f1577dec46dbb620b581fe530bd87a7024f522f5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/lnurl.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccc958d059c4503e85b9a5eaeead8be42481b4d11a0bfad3241d3a654656446b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/lnurl.dart"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2c42fc9a11f372a426f412188ed6be0dd75634162ae8fe699088da512cb7701"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/lnurl.dart"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff29be471ed1ad7f28fcb9569bcded33deb0c6609cb8a8e57ba709809e8e8d26"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/lnurl.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"28507171558a7046800bf4595693a75a38b320a5896a1ebf0e63123b7f169cde"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/keychain_read_status_native.dart"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f0ba5a732610fff8e965a1e20fb057b9414748b86953b1f31613d95df2af0d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":1079}}}],"partialFingerprints":{"codehealthFindingId/v1":"324fd6b129c9beb7171b5ee2e5811110395f58cfa3b3d3fc1347bba5a4d4104c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":1084}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fe08204d460ae3240c81e42cb99cfcbcba6ec1f82d1da9ac74a61e1e83392d6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":1132}}}],"partialFingerprints":{"codehealthFindingId/v1":"33009a49f58fd1818b542f1f16cfa37074bd67e1ba17abbd7710efc8be39e5a1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/crypto_currency.dart"},"region":{"startLine":1138}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eb616230724c2ef1783ea2e7185407b096340aa137617e9765817378f12c84e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/amount/money.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2b69ab2c545007173f3a9c2936c78ab3c24b560396c30d58963547ffd3ebd74"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/db/sqlite_debug.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"75a17d30919bcfaa284383f71d139c7ca2353e197a73932874f61c7117b941d8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/db/sqlite_debug.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"56872dc4d0aea1f37154ba4302eed23ac43438eb0a16192bcd6263a9a152e629"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/proxy_wrapper.dart"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"563141d9615631e6da04daf53bbd254c2ef820b98c8f7bf723596c0f434b8879"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/utils/file.dart"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc3f0eb84edb4f55c3e519637c254512b930d427a1983552b35fed827bb4c03c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet_service.dart"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8fc9dbc6ac8770c7ae6a4b36024837fdda823ce3ed0c0232603410a29aee3a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_dogecoin/lib/src/dogecoin_wallet.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcc9033972d5c862001327bc5ce234bced52a54b17aa984536320f35f9f612d3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"779d40cffe8ce31638e219fb35dde0e99b7ab7edc826e37e4e5b2b30a28eb3e5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1140}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cf669a0658709d0544b7d8530eacc09aded596271fc576e88e8a32858ee535a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1341}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf569d8b86d72efacacd8a8961a24f7b432ddadfbf6246e79ed89175fa9b2ddb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/evm_chain_wallet.dart"},"region":{"startLine":1430}}}],"partialFingerprints":{"codehealthFindingId/v1":"95effd5b111525817079815af0b62cb1f1fbe090c500e6709126ded0e19d9e52"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"566a0cae5ae4fd0cf8ae8389c1f40925556f49a629ba7ba66ce990a3bd4a90d4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"03ff1a3adf592e392cb4b7d23c47c097803c849d7b8ff731f0d99615e70fd8ea"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9bb0b507cf5e03b123df5b513356139aa6758d54654c2e9e30a726f23873278"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/robinhood_tokens.dart"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"464891c0a70c5fdc3eabf268837b91a7290bce1e0ba643f0f3b99552143fc401"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/polygon_tokens.dart"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"475a02600cb5be67e769782f8d74f7170150c3f4f2dffe85626057cbe4c6dddc"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/ethereum_tokens.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bafa4a7c1ea38387b606c61db1490de4ef1a4be63d13330e5081138740d904e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/bsc_tokens.dart"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e65cad8abae639fef3b82f24c959e1115ff23b3b929e5dab9e754dfb5db850f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/base_tokens.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1053bd229337bdb62fd0df4d975a4eb6b9f1a8c2272d54ae4c06c537d71e917e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/tokens/arbitrum_tokens.dart"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aaea97295538e6599133b71b9fe9807f2c76d60c837bf553ce1458ff13105d7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/utils/evm_chain_formatter.dart"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"f51e33ae37fc4fab4e1eba29ffc6970c220a93c206d95dcb7515581523f2d7c1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_monero/lib/monero_wallet.dart"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e11dde06613e5c1f8f36b68085ff739c929f71f15cde1ff6f1bce6748f5934a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_mweb/lib/cw_mweb.dart"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"794d0e0ceec705b1e7780d2aae77beae0c0a860d791f56c6d1807b20c90dccd8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_wallet.dart"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"720a9a12836d1bb337d839d5bfefbae4aab326bae30b449bb705f9dd3ab23ad5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_wallet.dart"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"423e93589d804e17b557e912e3506bbf7b49f668603484f05c1c9c52dc2196a8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c5f8e1b45193d6a7b356ee1d2ad2baa8855f1bbb32739b311bf50144fa14b19"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"550b83d562a75a079b7706746bb59ec98bcaf80e20d54b21b0044001ff6b66b1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (error)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae2e9d611fff8ccc1cd26f1f78ae52479917b3314b0ec21aa8d51971892acc8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (error)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e55a8c8fc45b69ae7fd79dffd941a79fde96e7a20bfbd00b81f1e38c9ce4666"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_wallet.dart"},"region":{"startLine":764}}}],"partialFingerprints":{"codehealthFindingId/v1":"54624d1b7a275417bf804670d93943da209185ae14a3543ac0f33a61892d21e5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac465c568a6485d9cd38a2267a17836cc10ae6e87c71a67fdb594491414cb393"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"346525e67376a784c18359d55ea16b98cdac29958aeb4fb1bf7150a048f189ee"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e5dc61f73183d0f5373cf8abd70a44a4ce5afebeb5c5c2ec052e6c10aa697e8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1114}}}],"partialFingerprints":{"codehealthFindingId/v1":"822e88fe586866efcc5d6cefde9eb79a0c952742cd6ae79d07a54031177d2b16"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1349}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4ed3f75f063ba34d6e8470330291f3fd7f41b748b9692a8caa5829bf97bfb58"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1749}}}],"partialFingerprints":{"codehealthFindingId/v1":"091d00c8eea94e4585f3d490f13ec90c4f491a39cfd1b9dac9933f9711337d67"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1774}}}],"partialFingerprints":{"codehealthFindingId/v1":"683148f9db855e32152fb43182458497c5bc7957f534594da71e6b344fb00d0a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1776}}}],"partialFingerprints":{"codehealthFindingId/v1":"95bcb6bf98ba19581dbc930d7b122a01c8e03c2402e03affdcafc26502f29dac"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1819}}}],"partialFingerprints":{"codehealthFindingId/v1":"730f075ffd85172e7fe320bd71140d71087b3aca67c35f150ee5c32d4e3ce7ff"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1846}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53e7fec693ee9dcfdf27987584c7155d43e2828fdad8f6c3b6144819d0f3a6f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/solana_client.dart"},"region":{"startLine":1876}}}],"partialFingerprints":{"codehealthFindingId/v1":"81fb26aec607db7b2927cd45eed10a4f14036a05fe44ad70e641f0f55b0ff228"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_solana/lib/default_spl_tokens.dart"},"region":{"startLine":770}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd5ba650c74153bf64351c44e725f17522c89b9fd053105726028e2238e2ff2d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet.dart"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7101cb34783da79749403de391d87df752aa52a55a0a13cbc9ab7ee35a1b6bb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet.dart"},"region":{"startLine":624}}}],"partialFingerprints":{"codehealthFindingId/v1":"5477dbc79811b971146c8fcf81795961e1716d742770e1a6a8b52e5ea068f4f7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_wallet.dart"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"9912b7cc2bd5218b3eca4b0cdefb784266ae767dbc478f58bb1f695da114329e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_client.dart"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2fdd5c73594629ea1828d3c20e4982a0ea7ca67c3dd66343b808aa8fa56f5ac"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_client.dart"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"54c823e93307fc1055bb6f6f088e8e16c71e69568d58479e041e555ea7893422"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/tron_client.dart"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2178fee1124a0be6d37890d1f6e8df683b832d9f7619d4975b40f529da91f0c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_tron/lib/default_tron_tokens.dart"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c30280ca622ab646cc8fbb07a1c22f54b756634b396a5ceb0b152b80dcb3f22"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"1588b8fb7133a9fd81a5ce0cd4e1a2b3a8780f7fb46885c6a091d3cf5209ca5b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_wownero/lib/wownero_wallet.dart"},"region":{"startLine":694}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5899f593b209b01d4955ad64c6d550663c34d94b58a6c7f9032a3327f46235"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet_api.dart"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"05cb840e6e52667392acdd09f3516221ae685f02bdf2d12921126bde3fbdfc76"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet_api.dart"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"69ee5308628acfe9fee5cde3cc5316c763d3769114efeb31a74b817380f4784e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet_api.dart"},"region":{"startLine":596}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8e6e2bba72e85f519493946d8cfacb61e628d50c5e6fac1aabb97c91c783d5b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet_api.dart"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b7c27f74d166047f94f9f0d46840c4f2c595a6a3f62193971e0799d3c3193f6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"f29bf21a11584763f1522e711f04d2fcd9e1c831abdc4af8cb7efb4d4b2e2f1a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_wallet.dart"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b19127d00a0ef52da5506ebd3881a7502bdcc812376fc0d2a30fdc81db609e7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (err)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_utils.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"caab1a4e90e705adfcf19d35224b907b8aeca26816d78e3bf08d07c6837111f8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zano/lib/zano_formatter.dart"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cfbe7244889a6f0157b150151307bedce0673f2e62dc2817563508ddaf82cb9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"0216b185e6516bf60b9b143b902911009ccaff890a0eb9e97da8ff99bee349cb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"926a81ed9b6d45231216f3de99cea53c71658f721c06451ccec8094d550822ca"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":754}}}],"partialFingerprints":{"codehealthFindingId/v1":"04b4fb930a09678d8eaf752fc9e718808ea232b08e76b93f431479daad3b8431"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"c03c47ac805d62ee887963f0926eaf27176cfe9a709d82819d4075f269faa8a5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":774}}}],"partialFingerprints":{"codehealthFindingId/v1":"848e3e89ded879ac66a9d8dd4de1ba3fb082702293d63df64758a931636c9743"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/bitcoin/cw_bitcoin.dart"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"c477f12d5334b7f05d6ef07537186469b2ed1883527a92702ea1941cdb08081d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/kryptonim/kryptonim.dart"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"fae1c4ef5e00aaf227eca4cc4e35054130323441a21fbb3b485a4276c5e011e6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/utilities.dart"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"edcd054b1ba4d6fc1f92d33d69e252f6cd998244ee20229531a21a3b561d5fda"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/universal_address_detector.dart"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e4f0785aad74da57349457fe6371b9565fff4817a162a97f3d5ad75ca79a2ab"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/lightning_invoice_service.dart"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"38dac2bcc98614931184b693b6ab45ce59dac8740ecc32ea7bfebb33f7c6b97c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/layerzero_scan_service.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a214257e3e3ca230982886338f49c76218fc4ee19100b226385bab779652e8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/fiat_conversion_service.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"3179d6baa6ca2606b3058b4f1cfdc447007c05e5c2e4e591c20cf597c07a7705"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffa5c955fa5c681cc0a63a9d9d60785375212335f958ea0314ae0370012d5b17"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/backup_service.dart"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"39e68113feb5cf6fb1108ca25ffd1a46bb70f336a9e866fb48070ad911e25585"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/nostr/nostr_api.dart"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"dff3dce1881e20df707904643269e69f96c73123abef41717715f677aeb098e1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/twitter/twitter_api.dart"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"c19e65606094f91dadac4dd0d6c200b3baed5472d1bf07bceb7820a4376e35e1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/yat/yat_service.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f92652376002fbd3586ee5d971eeaee2b412863acb827576eb85b342f3a1288"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/anypay/anypay_parser.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59e5743f27d3fc66e44891d35ac4fff77befdf080abcb2afebe62a449e478dd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/wallet_manager.dart"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cae42aa0131037be445db9c74934253e1f302a8b036ea85d1082ec3ca31ccab"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/qr_scanner.dart"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"524b8f18f505c05cceb64bc4bcc519582b3003c6cfc1a053961f64b6a5084b63"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/language_service.dart"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea3da49ca0ea33ccdd9b9df4a970da6f0ee4b8e692085b85ac0fb5383a7a6133"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/evm_transaction_error_fees_handler.dart"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4ac8e2e0ba455fd159dbac79a061c6d470dc82ebd18e93cd07542b82353f11b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/default_settings_migration.dart"},"region":{"startLine":854}}}],"partialFingerprints":{"codehealthFindingId/v1":"547f3ae28b587646e7e6183e1a5049fa8b3269800da5f0d984a0cfcf30901ecb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/entities/default_settings_migration.dart"},"region":{"startLine":896}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fd2bd5d6782f63fedd6c80e627c19c5f21ba0cf06115f50e5faf7c2fa8f363e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"a59569d49413260d2c2c940c46694a09a090c06b3366126e5926f81e7bfa4f67"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"80f63de6e5560a4f6e51ab0a2f7e7d5104f0be9b166166f81cac74cb90002537"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":762}}}],"partialFingerprints":{"codehealthFindingId/v1":"14de4275b11685b76693174415f881399deb2e62f25d1294afb7918ab93f5b03"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/trade_legacy.part.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"15323f7df25d8767897a1731541cce3ab13e843a66006f99819a9ccd08bf0c73"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/xoswap_exchange_provider.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"5708561bf4421088c192399a256ef5a88e62c58007b659f27fda45da3040421e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/exchange/provider/jupiter_exchange_provider.dart"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b2089b4787727e7714232c1b50f1e96b2bb138efe8ac6be3126b496af823e05"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"dba91d69d056fd2630b3b35d55a3e0a6c5bea818e4d743d7a7e22cad89ae33a6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"5575b056df61edbfccac4915843a7e8c4fa433db0d456e3cf1210e5252d82416"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6fa09d480ba4bb95fe6d87ba6ce1622ee99c2cab3000af5cb600d20f6b39ab7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"a58d4d75090f4d01281c69bbad842a5b419caad823b3dc4a1f36477256f79d70"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"23acba01d70e94c898c5ba3899da74c1a022b9b8906c0bad326900edbafbc04b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/nano/cw_nano.dart"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"5355c969c03ad96cd707eac8c0e03b92bfb55ef1c86885c9b08a6fdf7f4ff819"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/pages/send_page.dart"},"region":{"startLine":1027}}}],"partialFingerprints":{"codehealthFindingId/v1":"11085222bda64fcdf528389189ef23af5eb8766dcf37441f1ca2325971368162"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/copy_wrapper.dart"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"350d3b42d75d691e8352795afc62541c94661a45b016ac16614e00da6507192b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/changelog_modal.dart"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8a51f6813ff4df8325e4a1e02188b5e56a60429c58bc5002e59e833e2437f2a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/charts_page/asset_grid.dart"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea75c4441f601e8a0d50beed2b03f8e0b62c19dd4528ac8f78f082b88c0f7e9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/zcash_migration_modal.dart"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f4e494add608878766a14cd35cddea70c5095f4b1a514a911c30a47eb5bd781"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee4d81d72bb63e0a3e3f4c48768c576d3f50f71355e66f11a442981c0d90b1d5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"b46a4bce37c56386c95cc36ce5b54a3126c29381b279e526ba47b5b51e02cdf7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/history_section.dart"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"78078775b75233517d9d813e1de8f228a5f461ebc48437559b1eb8781cd68359"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/coins_page/assets_history/assets_section.dart"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff7b1870894f824888b3e4dfe431200fc2578cddd2075fb854bc9a1bc68f6020"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/currency_picker/picker_recents_loader.dart"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"48699ca3c51fab88fb97e9b45827ad6b5ff6a1c665d321c1fa8b75b85608f819"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_confirm_sheet.dart"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dbb66d2fd5ef71a814d8c88c2da29a5c7e410501190b1b60b180194e2375ff7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_address_input.dart"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"66551ae10412d126faea7f0aa39a6cc0a9477d9bbf89ef5f873bdcf6adbb1b23"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/send_address_input.dart"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5073e7782efff5aff87f40a3e350f72e11cb9becd253d28b2f834f472a97f38"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/send_page/fiat_amount_bar.dart"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b443d29afdf8d9ef25ed179794a952a1ee76bf48c27f387a805ccc49b452ac"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_confirm_sheet.dart"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a7e72c3c9e39369260815b040ad3635bc86783268e669d19a811031714b9654"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d6af79d0442240c3d858dc0f9ac87812a4b8b787acad7774ddf2a13b0aac9f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/new-ui/widgets/swap_page/swap_amount_box.dart"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bd47747630aebb72dadb24db756a9d71993fcc7f0928bb4c9315ce00c4375c9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/solana/cw_solana.dart"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddfdd12be72c5c1fdf09787ff28afb23c08f23458712ce4679e17f62ab9fccd9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/connect_device/connect_device_page.dart"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"77423a20024b14c813443d9a8d485c818aaa16f801e4213368e917a4f7fa2d5a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/dev/network_requests.dart"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"354976fafeef1dc64197847a316885dcc6728f00293aa09c0bdfb435190a182b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/integrations/deuro/savings_page.dart"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"b775dfb476b70860b89f78b2d69b03f172ce05450f93a787621799387e4b5e9c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/integrations/deuro/widgets/savings_edit_sheet.dart"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1194f69b2e10d099810c9305d3eec1b4988a00db707946d1bdc8322488a8f0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/nodes/widgets/node_form.dart"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"6182cd6e2b428e34bfdceae59dbf53e67b17ce6beceaa53096db27e18c5e5519"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/settings/widgets/settings_link_provider_cell.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6903e9c33214ca59f4a6dc78ef9e339083af0765b171daa703653d56ee2490b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/setup_2fa/setup_2fa_qr_page.dart"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"f956b465fbb552d199c67d40987c14ab9bc642b8327c60db8fb920dd66c782d6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/setup_2fa/setup_2fa.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b80a62f9f40fe89a8c3d5038ed92cc8546c1586f32710ca63354dea177e7448"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/support/support_page.dart"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"04b28fcdeaa4740fc6ab8b7c7f95ba0f6d612b247f87a489fda8466d82e4cc19"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/support_chat/widgets/chatwoot_widget.dart"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"5177572baf545189b140d9b38a6f0e236b016e62eb692e7307d1e7599b7e83e4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/transaction_details/rbf_details_page.dart"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ed5eeb73150352125c6a321593b8213b34c68980c735f8277a71dec920e3167"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet/wallet_edit_page.dart"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"fed924a1a9aecfafcf0800e7ff6da099bfd2fba5722c2274caa7ece6a31c6de3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"4602bdc875ee3150af84d18bd33658058e6b8981bdbb7a8d90b21871af8b32ee"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a8465692e10badb3998327929414edf19ed9ba8a36bdf03de56578cee946d59"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c917da3cae9b29a17100a2f684d87a828b278344b70bab8e6af8f37edb616e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":579}}}],"partialFingerprints":{"codehealthFindingId/v1":"34051474a6513fdbe3a4d150d07bac9500a59d7f446069e99a1a5a13159b8e5e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":676}}}],"partialFingerprints":{"codehealthFindingId/v1":"d85d78ea102fcbc78262eace0a32fce3defd5fc94da050972b7c454c8e7cc91c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":679}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1190471608c6572863ff6dd53a86b102ab8b8f8e5bdddb115e93bdd45ce4bfd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_service.dart"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd613784c109a7a91e63754e18ba983ea6df01bdc9ecf750dfe79e586520c4a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/utils/eth_utils.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a7c291e8d2f5bb2e04cb7bb0131bd46ea42800bc4aa0b8cb039791448181444"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_list/wallet_list_page.dart"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7c2aa700d718e4cf85fcddf7894f49a123f67ef25bb3c4f2d94401ec4956409"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_list/wallet_list_page.dart"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"52352395d93ff5ce0a7d9319a9667d9ff8290ca0a5206c5ee3c9041f94d249f6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/address_text_field.dart"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"88fe75a1a72e11fb50b39feb2122a196aab0bae7fa0ce3af1018ce1472326ebf"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/widgets/address_text_field.dart"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c9f24bc256c3dce35fe2d5d55afc84406fe3e34454ff6627a0184dc5f737b08"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/bridge_transfers_store.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"3758a9bee8ed8adbc757828e87bb03f82495ee9ed7f624301a31565118b45931"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/bridge_transfers_store.dart"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5d23741e4bfd9c25bf499784e559201e88c5961d7011508cfe663cae1a0912f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/store/dashboard/trades_store.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"c644813308d64b165e62b3fdd83a363bba24f423b551b7a8e297f51ec1094cb0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/core/theme_store.dart"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e9b856fad4622f79c3e5ba6d280c5c32665ebb31fbf7dcd614f076a5179ac4f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/core/theme_store.dart"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"d079e1dafe1e11e7a261e22314d058005fe2fb625e183d1e75de99e6a73f98c0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/core/theme_store.dart"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"719273eb6cc7cb2c082b4d5730da90583832b43d83de2058f20a8edfbc243147"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/themes/core/theme_store.dart"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca977ecd87aea1643141abeaa5cb6e6221b74920a6836f977cab0dadcf20ee23"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/permission_handler.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"8603d0a3179a62b838d44b92fe51e76c73f775e9718ee6bec5b17db984876032"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/payment_request.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f16f494585cd8e088bd93c6d82786ea98a4d193a582f3ad86df405c91c52ef0a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/utils/exception_handler.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"744926f21ac0f6eb2d6dff8ba7828c1b1f2115268184402223c8b2d7cc1e0738"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_groups_display_view_model.dart"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"198f488dbd48d596f5155e39574231e311d30d68a732353fa89b995681e6b08a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/trade_details_view_model.dart"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"cced68e6c251d018bd76d685d4045c128d25fb193b7a822e18f3be62eda00b81"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/payjoin_details_view_model.dart"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"925506d12b8ba1a8f7d17553dadf3299f7bc45751fcf52c2ff9d0e0a7b3b6400"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/order_details_view_model.dart"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"e290851c3a630f30a5cb70a140da356ae8eb331b83620b938cf8a00716dd5964"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/link_view_model.dart"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8b870eb9e5603e8210c208881e93882beb1c31a29784576a4c1afb35140fb27"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ce722778b57624a82d8abf5a52a46ee6cbebe175ab6cbfd92420965a4953ac"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6dfae86fecded018bec9ae2a3a8601fa9b113a8208f2bb4d23fb6f02fcbc199"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6f42d2f59d24d402b2d182a320c1b38354cc6e15ae04ca45c7003e417098cf8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_details_view_model.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f4709ceb2b3d8fc2428e73e1004d19cc1722cc182632d04bfa6b84b332a9371"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_details_view_model.dart"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"db88bfe36f91b2afeb3adb6b5c7f358e2cae401828970c5b62e861bd1e0df1da"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/buy/buy_amount_view_model.dart"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"465bb032f2e7c73cc8428615b0b2bf51b512acb435d09091af4133bed75a4d16"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/transaction_list_item.dart"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"974c666d4402704811ac1586f3c863fca37019956ffe67328655cb13c1b667f3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/home_settings_view_model.dart"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"784bfadea827bec9f5c18891bb576e0088fb07956d4c272f4bf88dc0b5c27386"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bff9a1114c9d27c6838bfe48cb67ba4dd06e268789ff46f04ae0141f2686ca"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":1483}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0b6c56f39f3babbb7d7e0b04eda515eca07da78fedadf559f367eba5f8e3621"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":1660}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d333c0fd6841bf8bd5f79401c89a70b112c070edcf6cd6b29c1c835031af0eb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c83eb4595dd61aadf0332ce4b39764a86c48f8803b64bb414f4d6374b1dc986"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f739293ed6508e0c5e694d6c2664e524c1ec8ae4689b5ca1976aecb12336697"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"3edcb3d5385893ab2357ec5c39094475080d195ce5f6c862f036c7678c50950d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":723}}}],"partialFingerprints":{"codehealthFindingId/v1":"a66bd5f423f30734b40a2e60980b75d6c9b8bc23cd3f6988fe275b2bb4aa254b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a7346328e3e0ff2759ff2817c1b75f7fe92de983720914e4210fe164d0736ed"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"66de6eee4a33b100dc029a7bd094b4192a16737b2fd7e58e1f105e3ab0ee6ce3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae25bf05aae66014c094557ea3e7ba51231f3cb84ef76be20bb8d282bcab2ee2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"202dc36838e81df4869c6ad8b03531c761dea92e485729517883a48d534d84b9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. On a teardown path letting it propagate is not an option (throwing out of \u0060close()\u0060 masks the failure already in flight and abandons the rest of the cleanup), so make the swallow deliberate instead: narrow the catch to the exception this release can actually raise, and record it through whatever this codebase already uses to report problems \u2014 or, if it truly cannot matter, say why in a comment on the catch."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/trezor_connect_view_model.dart"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"b46128ff7d18e282bcda90f2112ff24fa7f24442c3680da83bbc7e62d5ed0aa0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/ledger_view_model.dart"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dac036e45ffc2435616b8054bb2452ebda511011760608f75c3a6fb4b881620"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. On a teardown path letting it propagate is not an option (throwing out of \u0060close()\u0060 masks the failure already in flight and abandons the rest of the cleanup), so make the swallow deliberate instead: narrow the catch to the exception this release can actually raise, and record it through whatever this codebase already uses to report problems \u2014 or, if it truly cannot matter, say why in a comment on the catch."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/hardware_wallet/ledger_view_model.dart"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"40496eb1cf37ea065ccad7fc1df73023eff1346100fe542b3e038d45c0b1ff31"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/integrations/deuro_view_model.dart"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"c826185a3465d8d3130779bffb6815ed87d62f896c3ae98ed6105caf62959e0e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/integrations/deuro_view_model.dart"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"c186fb7d6676fb46bb95764c501b90b0451845ad6cf448eab0e7dc97a9bfb5f8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/node_list/node_list_view_model.dart"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22229d46ac178d9b62564235d24822063446d83f38b71ceb6ebf57ba4e9af97"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/restore/wallet_restore_from_qr_code.dart"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"560549d1464416b837aa6f9b47c72fe8f5a2051275724db163d85ad4cfbd6a9a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/restore/wallet_restore_from_qr_code.dart"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f4bd7a7d603573af74d65780d44420f916855655e2f37127f5f1a1905689b14"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cc415cf8d112b20351c6689c2ae88546657173888012bb1fa1ada72a1b9a96d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"02ecf4dc91c018c5fb881485d4c0366b0ed70f35ccd07e50bedadcfb2584d28f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"da1ff3b19152c1e9250eb1ae366d7d6ec1336ee8b86d800ceb1116d3db40a31a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":1417}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fb7d8ef3aca450bf71ae005b3f813661bb8f3d353b9810f8c0781402f2178c9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/output.dart"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5f68247e063b4c83c18fc508d27312f7afa4a459952b165aa561c06984ec94d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/output.dart"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"3912673f220d335af919501ac3d3e0bee16a75edc2802fd04f9bb557378b8a6c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/settings/display_settings_view_model.dart"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"65deba61c773e2c036b7b70dd80c14e630749de03b81363e5dac491b6d5312e1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/unspent_coins/unspent_coins_details_view_model.dart"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"d787ce467eba4bc7425603d46e6a985d3384513ebfe7f7eb7c8c0f6c1ecb9eb2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/wallet_address_list/wallet_address_list_view_model.dart"},"region":{"startLine":778}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b348eb2880d989d032b9abfeaefd266593e8d4d5e25423b0103d06129482cd"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getScriptHash\u0060 turns every thrown error into \u0060\u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/bitcoin_address_record.dart"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b46169c0565375b298894444b6fac759a6ba7ec9789e37fd1fdb07d25dc84d2"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getTransaction\u0060 turns every thrown error into \u0060{}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"de00cb30f4eaec824e9ee27e1f75a9c7d25bfed42530d930517a6f3223ee9cb9"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060feeRates\u0060 turns every thrown error into \u0060[]\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum.dart"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"229984144a54ff26680630ff118e6de23620743e4cacfa84db861e7eb7876373"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060feeRate\u0060 turns every thrown error into \u00600\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_bitcoin/lib/electrum_wallet.dart"},"region":{"startLine":2011}}}],"partialFingerprints":{"codehealthFindingId/v1":"db83ef6faacb69b3c08930b5362eb38f07d9d8c4cd3cb2605d6f026d73452306"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getSeeds\u0060 turns every thrown error into \u0060\u0022\u0022\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_core/lib/wallet_service.dart"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"493b45e39b0eafa57943bf3ebbd88393bbc90b3cf69e658637186b177f5b7df7"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060walletBirthdayBlockHeight\u0060 answers \u00600\u0060 when \u0060FormatException\u0060 is thrown, with no log or rethrow \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_decred/lib/wallet.dart"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"3beb754be65a2f6194266e14fea4877a3836b94d694fed4578cec70515b1d9d9"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060confirmAllReceivable\u0060 turns every thrown error into \u00600\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":495}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe47b4980c8464e88f2705970f92fbeca9e8d4da40c1ce5f6c9faa960721040b"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getN2Reps\u0060 turns every thrown error into \u0060[]\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"645b649ea6bafa9d71f6396186d94f50178af74cb4add0d5df2d759335008ffb"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getRepScore\u0060 turns every thrown error into \u0060100\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_nano/lib/nano_client.dart"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3f67fe42e8ccfe4681f0af0d991bd8a11fb378afec279f91660e300f7b245a8"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getExchangeRates\u0060 turns every thrown error into \u0060{}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/buy/kryptonim/kryptonim.dart"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6b52a5874de519e6c6eb05e4f7f3a7b8d0690c630300e196d048ca19bbe669c"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getEstimatedGasUnitsForTransaction\u0060 turns every thrown error into \u00600\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/clients/evm_chain_client.dart"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af745a02d7a444cb8eaed2c03d2c5b233ce5cb7b52b27da406838635cfdd88f"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_getDomainFromRelayUrl\u0060 turns every thrown error into \u0060\u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/nostr/nostr_api.dart"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef79f8c7391c72c42163951e43210809246a94cdef63da4766e47d3d869efcb6"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060fetchYatAddress\u0060 turns every thrown error into \u0060[]\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/address_resolver/yat/yat_service.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"47dba824340ead06cbdab6817b97a74b918e24b5d11704f6e67523b3137dade6"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060fetchPrice\u0060 turns every thrown error into \u00600.0\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/core/fiat_conversion_service.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"02fc7c9ac12ae55dc36ebedd22baf094caffedef376a3a9648be8a43e56e19bf"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_fetchFiatApiPriceForToken\u0060 turns every thrown error into \u00600.0\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/evm/cw_evm.dart"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5f4e3bfeea0543e1210e9279dd728ebe99ced213bd3293eea0ddae000a1ad06"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_uaReceivers\u0060 turns every thrown error into \u0060{}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_zcash/lib/src/zcash_wallet.dart"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fababf2c56e3c77b3fc77fbc09697880403666ed70a97fea2e05c3fddb0016c"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getKeyForStoringTopicsForWallet\u0060 turns every thrown error into \u0060\u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/src/screens/wallet_connect/services/walletkit_service.dart"},"region":{"startLine":676}}}],"partialFingerprints":{"codehealthFindingId/v1":"27050c3894eb6a07916afe1ae879910dd22c760382e5db248b6e077f1850b44a"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parseEVMChainAmount\u0060 turns every thrown error into \u00600\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cw_evm/lib/utils/evm_chain_formatter.dart"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b3c1234e9898702271ae6ec1ec86d08765d9ad01abdad8950a9f5673d0b67f1"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060fiatAmountFormatted\u0060 turns every thrown error into \u0060\u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac83942c081664730fc90b4ccaba48698d8fa578b8852f7dc0d8bc8b8f0021dc"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060quoteNativeFiatFeeFormattedForDisplay\u0060 turns every thrown error into \u0060\u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/bridge/bridge_view_model.dart"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"1df2e88e3d34030bd82fdcbce9096bd837dbda8324a0c258fc1a41a86cd00560"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060checkAffectedWallets\u0060 turns every thrown error into \u0060[]\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/dashboard/dashboard_view_model.dart"},"region":{"startLine":1660}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ae0d68a356ceff52d38efe057a46180917447bed8a23d62f840caf52fc6143"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060receiveWallets\u0060 turns every thrown error into \u0060[]\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"707702a74b5cec93eed11aa3ef78138cefa200b29c43046c5b5db27e07768dd7"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060roundedDepositAmount\u0060 turns every thrown error into \u0060\u00220\u0022\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"74590d6d60bbda5329bb2fa3ff72d3a728c581159ab2189cf2d75d8cc2790ab9"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060roundedReceiveAmount\u0060 turns every thrown error into \u0060\u00220\u0022\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/exchange/exchange_view_model.dart"},"region":{"startLine":723}}}],"partialFingerprints":{"codehealthFindingId/v1":"12dcd9c394f7c2e6521ccb8ae68aa78361040d66eb0f6308aa6bba7ca2587031"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_getDEuroFiatAmount\u0060 turns every thrown error into \u0060\u00220.00\u0022\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/integrations/deuro_view_model.dart"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"94cd08b774d92d20fbdd3ce869f8212c59d1b9a777288db4500e14653a6e0418"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060estimatedFeeFiatAmount\u0060 turns every thrown error into \u0060\u00270.00\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/output.dart"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ff825d9a154c0983701750e17fe1924ba825a3759be6b3e3332d3b197c804ba"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060pendingTransactionFiatAmount\u0060 turns every thrown error into \u0060\u00270.00\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c28083c7215955701887bfdae89c935d497e5e09af1cb790969933e11183c8"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060calculateTransactionFiatAmount\u0060 turns every thrown error into \u0060\u00270.00\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"80fd5cf9ebb2bc273002efde0090f4b5e3989545781e87c23ac2e4668644d86a"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060pendingTransactionFeeFiatAmount\u0060 turns every thrown error into \u0060\u00270.00\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the error or rethrow it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment at the \u0060catch\u0060 or in the \u0060///\u0060 doc, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/view_model/send/send_view_model.dart"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"5af4d58cf2cbc543aebf70c0da4037a1f2bc5875fc776c2f46839b36f7e1921f"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1032","guid":"5f21e517-68aa-a650-9a25-5771ef024637","name":"OWASP Top Ten \u2014 Security Misconfiguration category","shortDescription":{"text":"OWASP Top Ten \u2014 Security Misconfiguration category"},"helpUri":"https://cwe.mitre.org/data/definitions/1032.html"},{"id":"CWE-1059","guid":"a2381a08-60f6-9554-a8b8-f3018cfaaca5","name":"Insufficient Technical Documentation","shortDescription":{"text":"Insufficient Technical Documentation"},"helpUri":"https://cwe.mitre.org/data/definitions/1059.html"},{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-214","guid":"b10ad120-fb22-1351-9348-aa23b453e815","name":"CWE-214","shortDescription":{"text":"CWE-214"},"helpUri":"https://cwe.mitre.org/data/definitions/214.html"},{"id":"CWE-242","guid":"5c147e5c-be37-b051-9928-764ef5a8f3d3","name":"CWE-242","shortDescription":{"text":"CWE-242"},"helpUri":"https://cwe.mitre.org/data/definitions/242.html"},{"id":"CWE-250","guid":"52ee12e8-390a-7351-b1e6-388afa694e54","name":"CWE-250","shortDescription":{"text":"CWE-250"},"helpUri":"https://cwe.mitre.org/data/definitions/250.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"Missing Support for Integrity Check","shortDescription":{"text":"Missing Support for Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-426","guid":"7b39d500-c310-9a5d-9a3d-4c2bf49492a3","name":"Untrusted Search Path","shortDescription":{"text":"Untrusted Search Path"},"helpUri":"https://cwe.mitre.org/data/definitions/426.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"Embedded Malicious Code","shortDescription":{"text":"Embedded Malicious Code"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-522","guid":"71fb233e-ce6a-ae57-9419-ef8373540b09","name":"Insufficiently Protected Credentials","shortDescription":{"text":"Insufficiently Protected Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/522.html"},{"id":"CWE-532","guid":"1cd8877a-76e8-ce54-b40b-779af23364a0","name":"Insertion of Sensitive Information into Log File","shortDescription":{"text":"Insertion of Sensitive Information into Log File"},"helpUri":"https://cwe.mitre.org/data/definitions/532.html"},{"id":"CWE-561","guid":"522a7ba7-45e9-ab53-9088-45d86e04b53a","name":"CWE-561","shortDescription":{"text":"CWE-561"},"helpUri":"https://cwe.mitre.org/data/definitions/561.html"},{"id":"CWE-693","guid":"b9b141dc-018a-9c59-8953-1e3c4e020745","name":"Protection Mechanism Failure","shortDescription":{"text":"Protection Mechanism Failure"},"helpUri":"https://cwe.mitre.org/data/definitions/693.html"},{"id":"CWE-732","guid":"1da27e8f-b330-7650-ab63-bd61953eae5d","name":"Incorrect Permission Assignment for Critical Resource","shortDescription":{"text":"Incorrect Permission Assignment for Critical Resource"},"helpUri":"https://cwe.mitre.org/data/definitions/732.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)","shortDescription":{"text":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"Inclusion of Functionality from Untrusted Control Sphere","shortDescription":{"text":"Inclusion of Functionality from Untrusted Control Sphere"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Improper Control of Generation of Code (\u0027Code Injection\u0027)","shortDescription":{"text":"Improper Control of Generation of Code (\u0027Code Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]},{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61","version":"2025","organization":"OWASP Foundation","informationUri":"https://top10.owasp.org/2025/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10:2025 web application security risks."},"taxa":[{"id":"A01:2025","guid":"df693558-c822-0452-8f7b-4d53cb6bcc59","name":"Broken Access Control","shortDescription":{"text":"Broken Access Control"},"helpUri":"https://top10.owasp.org/2025/A01_2025-Broken_Access_Control/"},{"id":"A02:2025","guid":"668dee9e-41bc-6354-97d0-fdf8f40c50c1","name":"Security Misconfiguration","shortDescription":{"text":"Security Misconfiguration"},"helpUri":"https://top10.owasp.org/2025/A02_2025-Security_Misconfiguration/"},{"id":"A03:2025","guid":"168e227c-7735-2e57-bc6e-997affe644c5","name":"Software Supply Chain Failures","shortDescription":{"text":"Software Supply Chain Failures"},"helpUri":"https://top10.owasp.org/2025/A03_2025-Software_Supply_Chain_Failures/"},{"id":"A05:2025","guid":"87e86033-3231-8458-8e4a-5cb82743553a","name":"Injection","shortDescription":{"text":"Injection"},"helpUri":"https://top10.owasp.org/2025/A05_2025-Injection/"},{"id":"A06:2025","guid":"491554d7-b8e4-9652-91a9-53700dc92ece","name":"Insecure Design","shortDescription":{"text":"Insecure Design"},"helpUri":"https://top10.owasp.org/2025/A06_2025-Insecure_Design/"},{"id":"A07:2025","guid":"334ddd78-539d-d35c-83dd-253647eb7eaf","name":"Authentication Failures","shortDescription":{"text":"Authentication Failures"},"helpUri":"https://top10.owasp.org/2025/A07_2025-Authentication_Failures/"},{"id":"A08:2025","guid":"84b0c297-710e-9a5f-9335-936ecb260c36","name":"Software or Data Integrity Failures","shortDescription":{"text":"Software or Data Integrity Failures"},"helpUri":"https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/"},{"id":"A09:2025","guid":"78892bc9-3c98-495d-881c-8af1390d643c","name":"Security Logging \u0026 Alerting Failures","shortDescription":{"text":"Security Logging \u0026 Alerting Failures"},"helpUri":"https://top10.owasp.org/2025/A09_2025-Security_Logging_and_Alerting_Failures/"}]},{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35","organization":"OWASP Foundation","informationUri":"https://owasp.org/www-project-top-10-ci-cd-security-risks/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10 CI/CD Security Risks."},"taxa":[{"id":"CICD-SEC-3","guid":"458c83a6-ebf7-cf55-8cc3-b4d949bbf271","name":"Dependency Chain Abuse","shortDescription":{"text":"Dependency Chain Abuse"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-03-Dependency-Chain-Abuse"},{"id":"CICD-SEC-4","guid":"c859d8ea-8b24-a157-9406-94929c10397a","name":"Poisoned Pipeline Execution (PPE)","shortDescription":{"text":"Poisoned Pipeline Execution (PPE)"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-04-Poisoned-Pipeline-Execution"},{"id":"CICD-SEC-6","guid":"f2ee2486-b260-2952-a41f-6b67fa713940","name":"Insufficient Credential Hygiene","shortDescription":{"text":"Insufficient Credential Hygiene"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-06-Insufficient-Credential-Hygiene"},{"id":"CICD-SEC-8","guid":"b6b2dacf-a168-4957-876e-a8c73ee00eb0","name":"Ungoverned Usage of 3rd Party Services","shortDescription":{"text":"Ungoverned Usage of 3rd Party Services"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-08-Ungoverned-Usage-of-3rd-Party-Services"},{"id":"CICD-SEC-9","guid":"b3d36727-0395-5b51-94c4-5e173d62eab3","name":"Improper Artifact Integrity Validation","shortDescription":{"text":"Improper Artifact Integrity Validation"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-09-Improper-Artifact-Integrity-Validation"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":233,"secretScannerRunsExcluded":0}},"redactionTokens":["A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."]}]}