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.
