TypeScript Interface for Ethereum
This report summarizes scanner evidence for wevm/viem, a TypeScript project with 3,625 GitHub stars. SynthScan examined 480,895 lines of code across 2793 source files, recording 112 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 0.3 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 78 finding(s).
Are imports declared and package/API names verified? 34 finding(s).
Are wrappers, guards, and repeated structures necessary? 44 finding(s).
Which changes need focused human review? 112 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 112 distinct pattern matches across 6 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/src/account-abstraction.ts | 214 | export async function createVerifyingPaymasterServer( | CODE |
| LOW | test/src/utils.ts | 175 | export async function deployOffchainLookupExample({ | CODE |
| LOW | vectors/src/transaction.ts | 37 | export async function generateTransactionVectors() { | CODE |
| LOW | scripts/generateTempoAbis.ts | 536 | function routerCallbackDataParameter(checkout: string) { | CODE |
| LOW | src/celo/fees.ts | 59 | async function estimateFeePerGasInFeeCurrency( | CODE |
| LOW | src/celo/fees.ts | 85 | async function estimateMaxPriorityFeePerGasInFeeCurrency( | CODE |
| LOW | src/experimental/erc7846/actions/connect.ts | 96 | function formatRequestCapabilities( | CODE |
| LOW | src/experimental/erc7846/actions/connect.ts | 164 | function formatResponseCapabilities( | CODE |
| LOW | …t-abstraction/utils/formatters/userOperationRequest.ts | 11 | export function formatUserOperationRequest( | CODE |
| LOW | …t-abstraction/utils/formatters/userOperationReceipt.ts | 9 | export function formatUserOperationReceipt( | CODE |
| LOW | …ction/utils/userOperation/getUserOperationTypedData.ts | 31 | export function getUserOperationTypedData( | CODE |
| LOW | …raction/actions/bundler/waitForUserOperationReceipt.ts | 69 | export function waitForUserOperationReceipt( | CODE |
| LOW | src/op-stack/serializers.ts | 49 | function serializeTransactionDeposit( | CODE |
| LOW | src/op-stack/utils/getWithdrawalHashStorageSlot.ts | 21 | export function getWithdrawalHashStorageSlot({ | CODE |
| LOW | src/op-stack/utils/extractWithdrawalMessageLogs.ts | 28 | export function extractWithdrawalMessageLogs({ | CODE |
| LOW | src/op-stack/utils/extractTransactionDepositedLogs.ts | 28 | export function extractTransactionDepositedLogs({ | CODE |
| LOW | src/utils/stateOverride.ts | 62 | export function serializeAccountStateOverride( | CODE |
| LOW | src/utils/transaction/serializeTransaction.ts | 392 | function serializeTransactionLegacy( | CODE |
| LOW | src/utils/ens/errors.ts | 11 | export function isNullUniversalResolverError(err: unknown): boolean { | CODE |
| LOW | src/utils/signature/signatureToCompactSignature.ts | 30 | export function signatureToCompactSignature( | CODE |
| LOW | src/utils/signature/compactSignatureToSignature.ts | 30 | export function compactSignatureToSignature({ | CODE |
| LOW | src/utils/signature/recoverTransactionAddress.ts | 31 | export async function recoverTransactionAddress( | CODE |
| LOW | src/utils/signature/serializeCompactSignature.ts | 23 | export function serializeCompactSignature({ | CODE |
| LOW | src/utils/hash/normalizeSignature.test.ts | 100 | test('function submitBlocksWithCallbacks(bool isDataCompressed, bytes calldata data, ((uint16,(uint16,uint16,uint16,byte | CODE |
| LOW | src/utils/hash/normalizeSignature.test.ts | 103 | 'function submitBlocksWithCallbacks(bool isDataCompressed, bytes calldata data, ((uint16,(uint16,uint16,uint16,byt | CODE |
| LOW | src/utils/authorization/serializeAuthorizationList.ts | 16 | export function serializeAuthorizationList( | CODE |
| LOW | src/tempo/Account.ts | 823 | export function getKeyAuthorizationSignPayload( | CODE |
| LOW | src/tempo/internal/utils.ts | 105 | function findDeclaredTokenBySymbol( | CODE |
| LOW | src/tempo/internal/relay/utils.ts | 21 | export function formatFillTransactionRequest( | CODE |
| LOW | src/tempo/internal/relay/utils.ts | 35 | export function normalizeFillTransactionRequest( | CODE |
| LOW | src/tempo/internal/relay/utils.ts | 69 | function normalizeKeyAuthorization(value: unknown) { | CODE |
| LOW | src/tempo/internal/relay/utils.ts | 97 | export function isSerializedTempoTransaction( | CODE |
| LOW | src/tempo/internal/relay/utils.ts | 108 | export function normalizeTempoTransaction( | CODE |
| LOW | src/tempo/internal/relay/accounts.ts | 1205 | async function getSubmittedTransactionHash( | CODE |
| LOW | src/tempo/internal/relay/accounts.ts | 1434 | function isSerializedTempoTransaction(value: unknown): value is Hex.Hex { | CODE |
| LOW | src/tempo/internal/relay/feePayer.accounts.test.ts | 180 | async function configurableKeyAuthorization( | CODE |
| LOW | src/tempo/actions/earn.ts | 3097 | function resolveMinimumShareAmount(parameters: MinimumShareAmountParameters) { | CODE |
| LOW | src/tempo/actions/earn.ts | 3106 | async function assertPreparedZoneRequestChain( | CODE |
| LOW | src/tempo/actions/receivePolicy.ts | 1296 | function assertValidRecoveryAuthority(recoveryAuthority: Address) { | CODE |
| LOW | …sync/utils/paymaster/getApprovalBasedPaymasterInput.ts | 19 | export function getApprovalBasedPaymasterInput( | CODE |
| LOW | src/zksync/actions/claimFailedDeposit.ts | 257 | 'function bridgeRecoverFailedTransfer(uint256 _chainId, address _depositSender, bytes32 _assetId, bytes _assetData | CODE |
| LOW | src/actions/public/call.ts | 541 | function hasStateOverrideForAddress( | CODE |
| LOW | src/actions/public/call.ts | 555 | function toDeploylessCallViaBytecodeData(parameters: { code: Hex; data: Hex }) { | CODE |
| LOW | src/actions/public/call.ts | 568 | function toDeploylessCallViaFactoryData(parameters: { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | test/kzg/lorem-ipsum.txt | 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ultricies orci quam, sit amet eleifend ante fringilla nec. P | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ultricies orci quam, sit amet eleifend ante fringilla nec. P | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 3 | Sed semper elementum massa non viverra. Sed sit amet magna et ipsum tristique vulputate. Pellentesque in libero sem. Sus | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 217 | Fusce vel enim pellentesque, elementum diam eu, vulputate velit. Nunc libero tellus, elementum id quam sit amet, auctor | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 217 | Fusce vel enim pellentesque, elementum diam eu, vulputate velit. Nunc libero tellus, elementum id quam sit amet, auctor | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 219 | Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vestibulum facilisis, purus eu p | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 223 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam eu lacus lectus. Fusce a tellus lacus. Interdum et males | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 223 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam eu lacus lectus. Fusce a tellus lacus. Interdum et males | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 301 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ultricies orci quam, sit amet eleifend ante fringilla nec. P | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 301 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ultricies orci quam, sit amet eleifend ante fringilla nec. P | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 303 | Sed semper elementum massa non viverra. Sed sit amet magna et ipsum tristique vulputate. Pellentesque in libero sem. Sus | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 517 | Fusce vel enim pellentesque, elementum diam eu, vulputate velit. Nunc libero tellus, elementum id quam sit amet, auctor | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 517 | Fusce vel enim pellentesque, elementum diam eu, vulputate velit. Nunc libero tellus, elementum id quam sit amet, auctor | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 519 | Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vestibulum facilisis, purus eu p | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 523 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam eu lacus lectus. Fusce a tellus lacus. Interdum et males | CODE |
| LOW⚡ | test/kzg/lorem-ipsum.txt | 523 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam eu lacus lectus. Fusce a tellus lacus. Interdum et males | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 23 | Mauris ultricies elit urna, vel aliquet purus auctor vitae. Praesent viverra odio tellus, quis posuere nulla aliquet at. | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 23 | Mauris ultricies elit urna, vel aliquet purus auctor vitae. Praesent viverra odio tellus, quis posuere nulla aliquet at. | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 253 | Donec sem nisl, ultrices a tellus ut, pellentesque facilisis nulla. Sed et sapien ut eros condimentum porttitor. Fusce s | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 253 | Donec sem nisl, ultrices a tellus ut, pellentesque facilisis nulla. Sed et sapien ut eros condimentum porttitor. Fusce s | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 287 | Fusce venenatis interdum elit, quis rutrum orci posuere non. In eleifend est quis diam facilisis, ac malesuada massa orn | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 287 | Fusce venenatis interdum elit, quis rutrum orci posuere non. In eleifend est quis diam facilisis, ac malesuada massa orn | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 323 | Mauris ultricies elit urna, vel aliquet purus auctor vitae. Praesent viverra odio tellus, quis posuere nulla aliquet at. | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 323 | Mauris ultricies elit urna, vel aliquet purus auctor vitae. Praesent viverra odio tellus, quis posuere nulla aliquet at. | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 553 | Donec sem nisl, ultrices a tellus ut, pellentesque facilisis nulla. Sed et sapien ut eros condimentum porttitor. Fusce s | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 553 | Donec sem nisl, ultrices a tellus ut, pellentesque facilisis nulla. Sed et sapien ut eros condimentum porttitor. Fusce s | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 587 | Fusce venenatis interdum elit, quis rutrum orci posuere non. In eleifend est quis diam facilisis, ac malesuada massa orn | CODE |
| LOW | test/kzg/lorem-ipsum.txt | 587 | Fusce venenatis interdum elit, quis rutrum orci posuere non. In eleifend est quis diam facilisis, ac malesuada massa orn | CODE |
| LOW | src/utils/abi/encodeAbiParameters.test.ts | 841 | // cast abi-encode "a(string)" "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc faucibus lorem a liber | COMMENT |
| LOW | src/utils/abi/encodeAbiParameters.test.ts | 841 | // cast abi-encode "a(string)" "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc faucibus lorem a liber | COMMENT |
| LOW | src/utils/abi/encodeAbiParameters.test.ts | 852 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc faucibus lorem a libero auctor condimentum. D | CODE |
| LOW | src/utils/abi/encodeAbiParameters.test.ts | 852 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc faucibus lorem a libero auctor condimentum. D | CODE |
| LOW | src/utils/abi/decodeAbiParameters.test.ts | 449 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc faucibus lorem a libero auctor condimentum. Don | CODE |
| LOW | src/utils/abi/decodeAbiParameters.test.ts | 449 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc faucibus lorem a libero auctor condimentum. Don | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/setup.global.ts | 1 | import * as executionInstances from './src/anvil.js' | COMMENT |
| LOW | environments/next/next-env.d.ts | 1 | /// <reference types="next" /> | COMMENT |
| LOW | environments/tsc/tsconfig.json | 1 | { | COMMENT |
| LOW | environments/tsc/tsconfig.json | 21 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when t | COMMENT |
| LOW | environments/tsc/tsconfig.json | 41 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. | COMMENT |
| LOW | environments/tsc/tsconfig.json | 61 | // "noEmit": true, /* Disable emitting files from a compilation. */ | COMMENT |
| LOW | site/pages/experimental/erc7846/connect.md | 101 | // @log: }] | COMMENT |
| LOW | site/pages/experimental/erc7846/connect.md | 141 | // @log: address: '0x90F79bf6EB2c4f870365E785982E1f101E93b906', | COMMENT |
| LOW | …es/account-abstraction/actions/bundler/introduction.md | 1 | # TODO | COMMENT |
| LOW | site/pages/docs/actions/public/simulateCalls.md | 101 | // @log: [ | COMMENT |
| LOW | site/pages/docs/actions/public/simulateCalls.md | 181 | // @log: address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", | COMMENT |
| LOW | site/pages/docs/actions/public/simulateCalls.md | 201 | // @log: }, | COMMENT |
| LOW | site/pages/docs/actions/public/simulateCalls.md | 261 | to: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', | COMMENT |
| LOW | site/pages/docs/actions/public/getBlockReceipts.md | 21 | // @log: { | COMMENT |
| LOW | site/pages/docs/actions/public/watchBlocks.md | 21 | const unwatch = publicClient.watchBlocks( // [!code focus:99] | COMMENT |
| LOW | site/pages/docs/actions/public/fillTransaction.md | 21 | import { account, publicClient } from './client' | COMMENT |
| LOW | …pages/docs/actions/wallet/prepareTransactionRequest.md | 21 | }) | COMMENT |
| LOW | site/pages/docs/glossary/errors.md | 1 | # Errors [Glossary of Errors in viem.] | COMMENT |
| LOW | site/pages/docs/glossary/errors.md | 21 | ### `AbiFunctionNotFoundError` | COMMENT |
| LOW | site/pages/docs/glossary/errors.md | 41 | COMMENT | |
| LOW | site/pages/docs/glossary/errors.md | 61 | ### `ContractFunctionZeroDataError` | COMMENT |
| LOW | site/pages/docs/glossary/errors.md | 81 | ### `EnsAvatarInvalidMetadataError` | COMMENT |
| LOW | site/pages/docs/glossary/errors.md | 101 | ### `IntrinsicGasTooLowError` | COMMENT |
| LOW | site/pages/docs/glossary/errors.md | 121 | ### `InvalidParamsRpcError` | COMMENT |
| LOW | site/pages/docs/glossary/errors.md | 141 | COMMENT | |
| LOW | …-abstraction/actions/bundler/sendUserOperation.test.ts | 721 | COMMENT | |
| LOW | src/utils/buildRequest.ts | 301 | if (error.code === LimitExceededRpcError.code) return true | COMMENT |
| LOW | src/actions/wallet/prepareTransactionRequest.ts | 381 | ) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/tempo/actions/token.test.ts | 3249 | // Step 1: Prepare update quote token (should emit NextQuoteTokenSet) | COMMENT |
| LOW⚡ | src/tempo/actions/token.test.ts | 3255 | // Step 2: Finalize the update (should emit QuoteTokenUpdateFinalized) | COMMENT |
| LOW | src/actions/public/waitForTransactionReceipt.ts | 349 | // We need to check if it has potentially been replaced. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/tempo/actions/token.test.ts | 3249 | // Step 1: Prepare update quote token (should emit NextQuoteTokenSet) | COMMENT |
| LOW⚡ | src/tempo/actions/token.test.ts | 3255 | // Step 2: Finalize the update (should emit QuoteTokenUpdateFinalized) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tempo/Relay.ts | 212 | export function handleRequest( | CODE |