diff --git a/defects/bitcoinjs-lib/CLEAN b/defects/bitcoinjs-lib/CLEAN new file mode 100644 index 000000000..06bc848d5 --- /dev/null +++ b/defects/bitcoinjs-lib/CLEAN @@ -0,0 +1,37 @@ +CLEAN — all 5 MOADs scanned 2026-03-31 + +Target: bitcoinjs-lib (bitcoinjs/bitcoinjs-lib) +Source: ~/git/bitcoinjs-lib +Files: ~7800 lines TypeScript across 30 source files + +MOAD-0001 (CWE-407): CLEAN + Reviewed all .includes(), .indexOf(), .find(), .filter() inside loops. + Three candidate sites found, all bounded by Bitcoin consensus rules: + - psbt.ts:2020 getSortedSigs(): pubkeys.map + partialSig.filter = O(P*S) + BUT p2ms max n=20 (consensus enforced in p2ms.ts:146), max 400 comparisons. + - psbt.ts:636 tapScriptSig loop + allHashses.find() = O(S*H) + Both bounded by per-input signature count, realistically <20. + - psbt.ts:1331 pubkeys.map + partialSig.find() = O(P*S) + Same p2ms bounds as above. + - bip371.ts:564 tapLeafScript.find + canFinalizeLeaf (tapScriptSig.find) = O(L*S) + Bounded by taptree depth (max 128 leaves). Not in hot loop. + All array scans are on cryptographic key/signature lists with hard upper bounds. + No adversarial scaling possible. + +MOAD-0002 (Intertangle): CLEAN + __CACHE in psbt.ts is instance-scoped per Psbt object, not shared global state. + _ECCLIB_CACHE in ecc_lib.ts is a global singleton but holds a stateless crypto + interface (no mutable state coupling subsystems). No god objects found. + +MOAD-0003 (Leaked Context): CLEAN + No AsyncLocalStorage, no ThreadLocal, no thread-scoped carriers. + Pure computation library with no request-scoped context. + +MOAD-0004 (Logged Secret): CLEAN + Only console.warn calls found (address.ts:78, address.ts:255, psbt.ts:1700), + all for future segwit version warnings. No secret material logged. + +MOAD-0005 (Thundering Herd): CLEAN + No shared cache with get+miss+compute+put pattern. + __CACHE is per-instance transaction state, not shared-resource caching. + No synchronization issues.